当前位置: 首页 > news >正文

Mysql中使用count加条件统计

文章目录

  • 前言
  • 测试环境
  • 准备工作
  • 条件统计
  • 总结

前言

最近发现在处理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.

准备工作

  1. 新建一个Mysql数据表a,包含idnum两个字段
mysql> create table a(id int, num int);
Query OK, 0 rows affected (0.04 sec)
  1. 插入测试数据,为了看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: 6  Duplicates: 0  Warnings: 0
  1. 查询表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)
  1. 调用count()函数看效果,如果使用count(*)会查询出所有的记录数,但如果使用count(num)发现只有4条数据,numNULL的记录并没有统计上
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)

条件统计

  1. 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)
  1. 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)
  1. 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的记录

  1. select count(num > 200 or null) from a;
  2. select count(if(num > 200, 1, null)) from a
  3. select count(case when num > 200 then 1 end) from a

相关文章:

  • 排序算法系列之(六)——逐步砍掉树杈的堆排序
  • Mysql5.7版本中数据表字段可用的类型
  • gdb使用watch命令设置数据断点
  • C++自定义全部替换函数replace
  • OSI七层模型中各层协议及作用
  • 时分秒针在一天之内重合多少次
  • Mysql中char和varchar的区别
  • std::bind(一):包装普通函数
  • 雷电模拟器一键宏实现循环点击
  • std::bind(二):包装成员函数
  • .bat批处理(七):PC端从手机内复制文件到本地
  • windows环境下C++代码打印函数堆栈调用情况
  • linux环境下C++代码打印函数堆栈调用情况
  • Mysql中查询当前用户、当前数据库等基础信息
  • Python切割超大日志文件、保留文件最后几行
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • codis proxy处理流程
  • ES学习笔记(12)--Symbol
  • javascript 总结(常用工具类的封装)
  • JS函数式编程 数组部分风格 ES6版
  • Js基础知识(一) - 变量
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • overflow: hidden IE7无效
  • Redux系列x:源码分析
  • Selenium实战教程系列(二)---元素定位
  • socket.io+express实现聊天室的思考(三)
  • 警报:线上事故之CountDownLatch的威力
  • 力扣(LeetCode)357
  • 通过npm或yarn自动生成vue组件
  • 译有关态射的一切
  • 云大使推广中的常见热门问题
  • ionic入门之数据绑定显示-1
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​学习一下,什么是预包装食品?​
  • #Linux(帮助手册)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (多级缓存)多级缓存
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (理论篇)httpmoudle和httphandler一览
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 未来三学期想要修的课 (日記)
  • .form文件_SSM框架文件上传篇
  • .NET BackgroundWorker
  • .NET CORE Aws S3 使用
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 依赖注入和配置系统
  • .Net8 Blazor 尝鲜
  • .NET处理HTTP请求
  • .NET关于 跳过SSL中遇到的问题
  • .NET与 java通用的3DES加密解密方法
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [Angular] 笔记 21:@ViewChild