转载地址 Mysql count+if 函数结合使用 - 简简单单2018 - 博客园 (cnblogs.com), https://blog.csdn.net/amazing_happing/article/details/45980073
涉及函数
count函数
mysql中count函数用于统计数据表中的行的总数,或者根据查询结果统计某一列包含的行数,常见的用法如下 count(*) 计算表的总行数包括空值, count(字段名) 计算指定列下的总行数,忽略空值(这点很重要,后面我们将利用这个特性)
if(expr, v1, v2)函数
if(expr, v1, v2) 函数的意思是,如果表达式expr为true(expr<>0 and expr <> NULL),则if()返回的是v1,否则返回v2
组合上述两个函数,可以在一条语句中统计出满足不同条件的行数
业务场景:在一个表中记录了不同出版社所拥有的所有的书,以及每本书对应的类型。
表结构如下:
id press bookName bookTyoe
1 新华出版社 《Thinking in Java》 计算机类
现需统计出不同出版社的里面不同类型的书籍的总量
例:统计不同出版社中文学类书籍数量
select count( if( bookTyoe = ‘文学类’, id, null ) ) from table group by press
分析:当type=1时,会返回对应的id的值,否则放回null,对于指定列的count函数,null是被忽略的,这样就得到了我们想要的统计数量了。
同理,统计不同出版社中科幻类+计算机书籍数量:
select count( if( bookTyoein (‘科幻类’, ‘计算机书籍’), id, null ) ) from table group by press
如果是联表查询,返回结果中的id不是唯一的话,想要去掉重复的id再统计,还可以在if前面加上DISTINCT,即 count( DISTINCT if( type in (2, 3), id, null ) )
等效写法 count( DISTINCT (type = 2 and type = 3) or null )
也可以使用sum+if替代上述写法
select sum( if( bookTyoeinin (‘科幻类’, ‘计算机书籍’), 1, 0 ) )from table group by press
附上count说明案例
select count(*),count(age),count(age=21),count(age = 21 or null),count(age is null),count(age is not null),count(null) from t1;
查询结果是:7,6,7,3,7,7,0
分析:
count(*):很明显是结果集的行数
count(列名):是统计非null的行数
count(age):age不为空的行数
count(age=21):第一行和第二行age都是21,所以表达式age=21的值为1;而第四行age为22,所以age=21的布尔值为0,但是不管age=21的结果是0还是1,这两种结果都不是null,所以答案是7.
count(age=21 or null):第一行和第二行age都是21,所以表达式age=21 or null的值为1;而第四行age为22,所以表达式age=21 or null的值为null,那么这一行在count计算的时候就不会被包括在内了。
count(age is null):age is null的结果0或者1(select age is null ;)这两种结果都不是null值,所以答案还是7
count(age is not null):同上
count(null):因为count统计的是expr不为null的行数,很明显答案是0