共计 3137 个字符,预计需要花费 8 分钟才能阅读完成。
count 函数是用来统计表中或数组中记录的一个函数,下面我来介绍在 mysql 中 count 函数用法。
count(*) 它返回检索行的数目,不论其是否包含 NULL 值。
SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE 子句时,COUNT(*) 被优化到最快的返回速度。
例如:
mysql> SELECT COUNT(*) FROM student;
COUNT(DISTINCT 字段) 这个优化仅适用于 MyISAM 表, 原因是这些表类型会储存一个函数返回记录的精确数量,而且非常容易访问。
对于事务型的存储引擎 (InnoDB, BDB), 存储一个精确行数的问题比较多,原因是可能会发生多重事物处理,
而每个都可能会对行数产生影响。
返回不同的非 NULL 值数目。
若找不到匹配的项,则 COUNT(DISTINCT) 返回 0。
例
创建用于测试的数据表,以进行 count 数据统计:
CREATE TABLE `user` ( `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`password` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
测试数据为:1 name1 123456
2 name2 123456
3 name3 123456
4 name4 NULL
请注意以下查询的返回结果
select count(*) from `user`
select count(name) from `user`
select count(password) from `user`
输出结果:4,4,3
原因分析:
- count(*) 是对行数目进行计数,所以结果为 4。
- count(column_name) 是对列中不为空的行进行计数,所以 count(name)=4,而 count(password)=3。
以上二点,在使用 count 函数时,要注意下。
使用 GROUP BY 对每个 owner 的所有记录分组,没有它,你会得到错误消息:
mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() 和 GROUP BY 以各种方式分类你的数据。下列例子显示出进行动物普查操作的不同方式。
每种动物的数量:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+---------+----------+
每种性别的动物数量:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex | COUNT(*) |
+------+----------+
| NULL | 1 |
| f | 4 |
| m | 4 |
+------+----------+
(在这个输 出中,NULL 表示“未知性别”。)
按种类和性别组合的动物数量:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+
若使用 COUNT(),你不必检索整个表。例如, 前面的查询,当只对狗和猫进行时,应为:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE species = 'dog' OR species = 'cat'
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
+---------+------+----------+
或,如果你仅需要知道已知性别的按性别的动物数目:
mysql> SELECT species, sex, COUNT(*) FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+
顺便提下 mysql 的 DISTINCT 的关键字有很多你想不到的用处
1. 在 count 不重复的记录的时候能用到
比如 SELECT COUNT(DISTINCT id) FROM tablename;
就是计算 talbebname 表中 id 不同的记录有多少条
2, 在需要返回记录不同的 id 的具体值的时候可以用
比如 SELECT DISTINCT id FROM tablename;
返回 talbebname 表中不同的 id 的具体的值
3. 上面的情况 2 对于需要返回 mysql 表中 2 列以上的结果时会有歧义
比如 SELECT DISTINCT id, type FROM tablename;
实际上返回的是 id 与 type 同时不相同的结果, 也就是 DISTINCT 同时作用了两个字段,必须得 id 与 tyoe 都相同的才被排除了, 与我们期望的结果不一样
4. 这时候可以考虑使用 group_concat 函数来进行排除, 不过这个 mysql 函数是在 mysql4.1 以上才支持的
5. 其实还有另外一种解决方式, 就是使用
SELECT id, type, count(DISTINCT id) FROM tablename
虽然这样的返回结果多了一列无用的 count 数据 (或许你就需要这个我说的无用数据)
返回的结果是 只有 id 不同的所有结果和上面的 4 类型可以互补使用, 就是看你需要什么样的数据了