前言 最近发现在处理mysql问题时 , count()函数频繁上镜 , 常常出现在分组统计的情景下 , 但是有时候并不是使用group by分好组就可以直接统计了 , 比如说一个常见的需求 , 统计每个班级男生所占的比例 , 这种情况一般会按照班级分组 , 但是分组内不但要统计班级的人数 , 还要统计男生的人数 , 也就是说统计是有条件的 , 之前确实没有考虑过怎样实心 , 后来查询了资料 , 总结在这里 , 方便日后查找使用 。
mysql中count()函数的一般用法是统计字段非空的记录数 , 所以可以利用这个特点来进行条件统计 , 注意这里如果字段是null就不会统计 , 但是false是会被统计到的 , 记住这一点 , 我们接下来看看几种常见的条件统计写法 。
测试环境
windows 10
welcome to the mysql monitor. commands end with ; or \g.
your mysql connection id is 7
server version: 5.7.21-log mysql community server (gpl)
copyright ? 2000, 2018, oracle and/or its affiliates. all rights reserved.
oracle is a registered trademark of oracle corporation and/or its affiliates. other names may be trademarks of their respective owners.
type ‘help;’ or ‘\h’ for help. type ‘\c’ to clear the current input statement.
准备工作 新建一个mysql数据表a , 包含id和num两个字段
【Mysql中使用count加条件统计的实现示例】mysql> create table a(id int, num int);query ok, 0 rows affected (0.04 sec)插入测试数据 , 为了看count()函数的效果 , 我们插入两个空数据
mysql> insert into a values (1,100),(2,200),(3,300),(4,300),(8,null),(9,null);query ok, 6 rows affected (0.01 sec)records: 6duplicates: 0warnings: 0查询表a中的数据 , 与后面的统计做比较
mysql> select * from a;+----+------+| id | num|+----+------+|1 |100 ||2 |200 ||3 |300 ||4 |300 ||8 | null ||9 | null |+----+------+6 rows in set (0.09 sec)调用count()函数看效果 , 如果使用count(*)会查询出所有的记录数 , 但如果使用count(num)发现只有4条数据 , num为null的记录并没有统计上
mysql> select count(*) from a;+----------+| count(*) |+----------+| 6 |+----------+1 row in set (0.03 sec)mysql> select count(num) from a;+------------+| count(num) |+------------+| 4 |+------------+1 row in set (0.04 sec)
条件统计 count()函数中使用条件表达式加or null来实现 , 作用就是当条件不满足时 , 函数变成了count(null)不会统计数量
mysql> select count(num > 200 or null) from a;+--------------------------+| count(num > 200 or null) |+--------------------------+|2 |+--------------------------+1 row in set (0.22 sec)count()函数中使用if表达式来实现 , 当条件满足是表达式的值为非空 , 条件不满足时表达式值为null;
mysql> select count(if(num > 200, 1, null)) from a;+-------------------------------+| count(if(num > 200, 1, null)) |+-------------------------------+|2 |+-------------------------------+1 row in set (0.05 sec)count()函数中使用case when表达式来实现 , 当条件满足是表达式的结果为非空 , 条件不满足时无结果默认为null;
mysql> select count(case when num > 200 then 1 end) from a;+---------------------------------------+| count(case when num > 200 then 1 end) |+---------------------------------------+|2 |+---------------------------------------+1 row in set (0.07 sec)
总结 使用count()函数实现条件统计的基础是对于值为null的记录不计数 , 常用的有以下三种方式 , 假设统计num大于200的记录
- select count(num > 200 or null) from a;
- select count(if(num > 200, 1, null)) from a
- select count(case when num > 200 then 1 end) from a
-- 展开阅读全文 --
推荐阅读
- MySQL常用命令与内部组件及SQL优化详情
- MySQL索引优化实例分析
- 中元节是几月几日2023
- MySql各种查询方式详解
- 吉祥物的介绍
- 水瓶座男人的爱情:自由而随心
- 狮子座男人的爱情:忠诚而又唯我独尊
- 巨蟹座女生喜欢一个人的表现:关心你的一切
- 什么季节适合养多肉