mysql count函数实例

126次阅读
没有评论

共计 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

原因分析:

  1. count(*) 是对行数目进行计数,所以结果为 4。
  2. 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 类型可以互补使用, 就是看你需要什么样的数据了


正文完