MySQL中count函数使⽤⽅法详解
count函数是⽤来统计表中或数组中记录的⼀个函数,下⾯我来介绍在MySQL中count函数⽤法与性能⽐较吧。
count(*) 它返回检索⾏的数⽬,不论其是否包含 NULL值。
SELECT 从⼀个表中检索,⽽不检索其它的列,并且没有 WHERE⼦句时, COUNT(*)被优化到最快的返回速度。
例如:SELECT COUNT(*) FROM student;
COUNT(DISTINCT 字段),返回不同的⾮NULL值数⽬;若不到匹配的项,则COUNT(DISTINCT)返回 0 。
这个优化仅适⽤于 MyISAM表, 原因是这些表类型会储存⼀个函数返回记录的精确数量,⽽且⾮常容易访问。
对于事务型的存储引擎(InnoDB, BDB), 存储⼀个精确⾏数的问题⽐较多,原因是可能会发⽣多重事物处理,
⽽每个都可能会对⾏数产⽣影响。
例,创建⽤于测试的数据表,以进⾏count数据统计:
代码如下复制代码
CREATE TABLE `user` (
`id` int(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`pass` varchar(10) DEFAULT NULL,
count函数怎么统计文字
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
测试数据为:
1 name1 123456
2 name2 123456
3 name3 123456
4 name4  NULL
请注意以下查询的返回结果:
代码如下复制代码
1, count(*) from `user`
2,select count(name) from `user`
3,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类型可以互补使⽤,就是看你需要什么样的数据了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。