COUNT 顾名思义,就是计数的意思,此函数用处:对表中记录数进行计数。
MySQL COUNT()函数介绍
COUNT()
函数返回表中的行数。 COUNT()
函数允许您对表中符合特定条件的所有行进行计数。
COUNT()
函数的语法如下 -
COUNT(expression)
函数的返回类型为BIGINT
。 如果没有找到匹配的行,则COUNT()
函数返回0
。
COUNT
函数有几种形式:COUNT(*),COUNT(1),COUNT(column), COUNT(DISTINCT column)和COUNT(expression)。
COUNT(*)函数
COUNT(*)
函数返回由SELECT语句返回的结果集中的行数。COUNT(*)
函数计算包含NULL
和非NULL
值的行,即:所有行。
如果使用COUNT(*)
函数对表中的数字行进行计数,而不使用WHERE子句选择其他列,则其执行速度非常快。
这种优化仅适用于MyISAM表,因为MyISAM表的行数存储在information_schema
数据库的tables
表的table_rows
列中; 因此,MySQL可以很快地检索它。
COUNT(1)函数
count(1)这个用法和count(*)的结果是一样的。
COUNT(DISTINCT COLUMN)
MySQL COUNT(DISTINCT column)
返回不包含NULL
值的唯一行数。
COUNT(COLUMN)
MySQL COUNT(column)
返回不包含NULL
值的所有行数。
COUNT(expression)
COUNT(expression)
返回不包含NULL
值的行数,expression 是表达式。
下面来看一下例子:
原表数据:
1、count(*)
SELECT COUNT(*) count FROM t_iov_help_feedback
结果:
可以看到,只要表中存在记录,不管是否有字段为NULL,都会被count出来,查询出来数量为4(全部)。
2、count(1)
SELECT COUNT(1) count FROM t_iov_help_feedback
结果:
可以看到,count(1)这个用法和count(*)的结果是一样的,查询出来数量为4(全部)。
如果表没有主键,那么count(1)比count(*)快;
如果有主键,那么count(主键,联合主键)比count(*)快;
如果表只有一个字段,count(*)最快。
count(1)跟count(主键)一样,只扫描主键。count(*)跟count(非主键)一样,扫描整个表。明显前者更快一些。
3、count(column)
SELECT COUNT(UPLOAD_PICTURES) count FROM t_iov_help_feedback;
结果:
可以看到,将UPLOAD_PICTURES 字段为 NULL 的记录不计算在内,有1条记录为NULL,所以查询出来数量为3。
4、count(DISTINCT column)
SELECT COUNT(DISTINCT UPLOAD_PICTURES) count FROM t_iov_help_feedback;
结果:
可以看到,将UPLOAD_PICTURES 字段为 NULL 的记录不计算在内,以及重复的记录只算1条。
有条记录为NULL,有两条记录UPLOAD_PICTURES 字段值重复(都为“s”),所以查询出来数量为2。
5、count(expression)
expression表示一个表达式,意思是在count中我们可以得到符合特点条件的记录数。
例子1,查询 is_reply=0 的数量:
SELECT COUNT(IF(is_reply=0,1,NULL)) count FROM t_iov_help_feedback;
结果:
可以看到,is_reply=0 的记录是3条,所以查询出来数量为3。
例子2,查询 is_reply=1 的数量:
SELECT COUNT(IF(is_reply=1,1,NULL)) count FROM t_iov_help_feedback;
结果:
可以看到,is_reply=1 的记录是1条,所以查询出来数量为1。
COUNT(IF(is_reply=1,1,NULL)) 语句解析:
IF(表达式1,表达式2,表达式3),
IF() 函数就是一个简单的判断器,它会判断第一个参数是否成立,如果成立,IF函数将返回表达式2,否则返回表达式3。
这里意思是:如果is_reply=1,IF函数将返回1
,否则返回NULL
。 COUNT
函数只计数1
,而不是NULL
值,因此查询根据相应的状态返回记录数。
性能问题:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择,(指没有where的情况);
2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现。
OK,That's all.
欢迎关注微信公众号(Java修炼记):
专注Java技术积累,免费分享Java技术干货、学习笔记、学习资料等,致力于让这里成为一个java知识小站。