这篇文章主要介绍了 mysql count 详解及函数实例代码的相关资料, 需要的朋友可以参考下
MySQL 是一个开放源码的小型关联式数据库管理系统,开发者为瑞典 MySQL AB 公司。MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了 MySQL 作为网站数据库。
mysql count 详解
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 类型可以互补使用, 就是看你需要什么样的数据了
来源: http://www.phperz.com/article/17/0311/322226.html