赞
踩
count() : 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值
性能对比:
count(*)=count(1)>count(id)>count(字段)
**sum()与count()区别:**
Sum() ---------返回表达式中所有的总和
函数里面的参数是列名的时候,是计算列名的值的相加,而不是有值项的总数。
count() ---------- 返回表中的行数
函数里面的参数是列名的的时候,那么会计算有值项的次数。 (NULL 不计入, 但是’'值计入)
count(1):
InnoDB 遍历全表,但是不取值,server 层对返回的每一行数据新增一个1,然后进行判断累加。包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。
count(*):
返回的行一定不是空。扫描全表,但是不取值,按行累加。包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(字段):
进行全表扫描,然后判断指定字段的值是不是为NULL,不为NULL则累加。只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
**总结**
1.count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
2.count(1)和count(*) 都是检索表中所有记录行的数目,不论其是否包含null值。
3.count(字段)的作用是检索表中的这个字段的非空行数,不统计这个字段值为null的记录。
解释:
COUNT(条件表达式):
不管记录是否满足条件表达式,只要非NULL就加1。
case—when:当条件满足是表达式的结果为非空,条件不满足时无结果默认为NULL
格式:count(case when(条件) then 列名 end)
Count(表达式 Or null) :作用就是当条件不满足时,函数变成了count(null)不会统计数量
具体解释: count在值是NULL是不统计数, (count(‘任意内容’)都会统计出所有记录数,因为count只有在遇见null时不计数,即count(null)==0,因此前者单引号内不管输入什么值都会统计出所有记录数),至于加上or NULL , 很像其他编程里的or运算符,第一个表达式是true就是不执行or后面的表达式,第一个表达式是false 执行or后面的表达式 。
如count(sex= ‘男生’ or NULL) 当sex不为男生时sex= ‘男生’ or NULL 的结果是NULL(结果false,不是 NULL),Count才不会统计上这条记录数
COUNT(IF(is_reply=1,1,NULL)) :当条件满足是表达式的值为非空,条件不满足时表达式值为NULL
格式:
IF(condition,expression_1,expression_2):逻辑为:如果condition为true,返回expression_1,否则
返回expression_2例:COUNT(IF(is_reply=1,1,NULL)) —如果is_reply=1,IF函数将返回1,否则返回NULL。
COUNT函数只计数1,而不是NULL值,因此查询根据相应的状态返回记录数。
具体例子:
表(info)
结果:
方法一(case–when):
select
data,
count(case when result='low' then 1 end) as low,
count(case when result='high' then 1 end) as high
from info
group by data;
方法二(or null):
select
data,
count(result='low' or null) as low,
count(result='high' or null) as high
from info
group by data;
方法三(if 判断):
select
data,
count(if(result='low',1,null)) as low,
count(if(result='high',1,null)) as high
from info
group by data;
补充关于count(1)count(*)原理 引用百度知道专业回答
count(1),其实就是计算一共有多少符合条件的行。 1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。