mysql 聚集函数 count 使用详解
mysql 聚集函数 count 使用详解
本文将探讨以下问题
1.count(*) 、 count(n)、count(null)与count(fieldName)
2.distinct 与 count 连用
3.group by (多个字段) 与 count 实现分组计数
4.case when 语句与 count 连用实现按过滤计数
参考文章:
Select count(*)和Count(1)的区别和执行方式
准备工作
-- 创建表
CREATE TABLE `tb_student` (`id` int(11) NOT NULL,`stu_name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '学生姓名',`tea_name` varchar(255) DEFAULT NULL COMMENT '教师姓名',`stu_class` varchar(255) DEFAULT NULL COMMENT '所在班级名称',`stu_sex` varchar(255) DEFAULT NULL COMMENT '学生性别',`stu_sex_int` tinyint(4) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('0', '小明', '老张', '一班', '男',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('1', '小红', '老张', '一班', '女',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('2', '小刚', '老王', '一班', '男',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('3', '小兰', '老王', '一班', '女',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('4', '小军', '老张', '二班', '男',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('5', '小芳', '老张', '二班', '女',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('6', '小强', '老王', '二班', '男',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('7', '小娜', '老王', '二班', '女',0);
INSERT INTO `tb_student` (`id`, `stu_name`, `tea_name`, `stu_class`, `stu_sex`) VALUES ('8', null, null, null, null,null);
问题一:count(*) 、 count(n)、count(null)与count(fieldName)
我们看一下执行过程:
EXPLAIN SELECT count(0) from tb_student
EXPLAIN SELECT count(*) from tb_student
两次执行结果相同,结果为:
(select_type, table, type, possible_keys, key, key_len, ref, rows, Extra) VALUES ('1', 'SIMPLE', 'tb_student', 'index', NULL, 'stu_sex_int', '2', NULL, '8', 'Using index');
。
此次查询使用了索引stu_sex_int
。我们知道某个字段建立索引之后数据库引擎会对该字段排序并把排序结果作为索引数据存储。查询时候对索引进行
二分查找提高命中率。在使用聚集函数同样也会使用索引。数据库引擎在处理count时,会直接从索引数据(排序结果中)中求排序结果的id最大值。这样一
来会大大提高count的速度。主键也有索引此处为什么没有使用主键的索引?因为stu_sex_int
字段长度更短 为tinyint
类型,查找速度更快。
由此可见 count(*)和count(n) n>=0
的效果相同。
当count的表达式为 NULL
时 不会计数 ,所以count(fieldName) 当fieldName 为null时 不会计数 。比如
select count(stu_name) as count from tb_student; 结果: count=8
select count(id) as count from tb_student; 结果: count=9
select count(null) as count from tb_student ; 结果: count= 0
问题二: distinct 与 count 连用
distinct
的作用是对查询结果去重。distinct fieldA
那么在查询结果中 fieldA
的值不会重复。当 count 内的表达式是distinct时候
所表达的意思就是对被distinct的字段取值类型计。例如:
select distinct stu_class from tb_student;
执行结果:
stu_class |
---|
一班 |
二班 |
select count(distinct stu_class) as count from tb_student;
执行结果:
count |
---|
2 |
问题三:group by (多个字段) 与 count 实现分组计数
group by fieldA
是表示根据 fieldA 的不同取值对查询结果进行分组。比如对于 tb_student
表
根据 stu_sex
的不同取值 (男,女) 可把查询结果分成两组。fieldA
有n个不同的取值,查询结果就会被分成
n组。当分组字段有多个时候group by fieldA,fieldB
会对fieldA 和fieldB 进行排列组合。每个排列组合的
结果作为查询一个的一个分组。如果fileA
的取值有 n 个 fieldB
的取值有 m 个,那么查询结果 将会被分称m*n
组。当count 与 group by 连用时,count是对 group by 结果的各个分组进行计数 。
单个分组条件:
SELECT stu_sex ,COUNT(*) as count from tb_student GROUP BY stu_sex ;
结果为:
stu_sex | count |
---|---|
NULL | 1 |
男 | 4 |
女 | 4 |
多个分组条件:
SELECTstu_sex,stu_class,COUNT(*) AS countFROMtb_studentGROUP BYstu_sex,stu_class
结果为:
stu_sex | stu_class | count |
---|---|---|
NULL | NULL | 1 |
女 | 一班 | 2 |
女 | 二班 | 2 |
男 | 一班 | 2 |
男 | 二班 | 2 |
问题四:case when 语句与 count 连用实现按过滤计数
在上述数据库中如果我们要查每个教师教了多少个 一班
同学 和二班
同学 有两种方法
方法一:对教师和班级分组计数
SELECTtea_name,stu_class,count(*) AS countFROMtb_studentGROUP BYtea_name,stu_class
结果为:
tea_name | stu_class | count |
---|---|---|
NULL | NULL | 1 |
老张 | 一班 | 2 |
老张 | 二班 | 2 |
老王 | 一班 | 2 |
老王 | 二班 | 2 |
这种方法不太直观我们可以把结果行转列更加清晰表达每个教师交每个班的人数
方法二:使用case when 行转列
SELECTtea_name,count(case when stu_class='一班' then 1 else null end ) AS `一班人数` ,count(case when stu_class='二班' then 1 else null end ) AS `一班人数` FROMtb_studentGROUP BYtea_name
结果为:
tea_name | 一班人数 | 一班人数 |
---|---|---|
NULL | 0 | 0 |
老张 | 2 | 2 |
老王 | 2 | 2 |
当关注的计数属性有较多取值时不适合这种用法,比如有100个班级,我们无法去写100个case when 。
文中的不足、错误之处欢迎指正
转载于:https://www.cnblogs.com/gscq073240/articles/6484322.html
mysql 聚集函数 count 使用详解相关推荐
- mysql 聚集函数 count 使用详解(转载)
本文将探讨以下问题 1.count(*) . count(n).count(null)与count(fieldName) 2.distinct 与 count 连用 3.group by (多个字段) ...
- matlab里open命令,matlab函数bwareaopen的详解
matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象 格式:BW2 = bwareaopen(BW,P,conn) 作用:删除二值图像BW中面积小于P的对象,默认情 ...
- mid函数怎么用mysql_MySQL MID()函数的用法详解(代码示例)-mysql教程-学派吧
在MySQL中,MID()函数返回从指定位置开始的子字符串. MID()和SUBSTR()都是SUBSTRING()的同义词. 基本语法是这样的: MID(str,pos,len) 这里,str是字符 ...
- mysql中函数mid_MySQL MID()函数的用法详解(代码示例)
在MySQL中,MID()函数返回从指定位置开始的子字符串. MID()和SUBSTR()都是SUBSTRING()的同义词. 基本语法是这样的:MID(str,pos,len) 这里,str是字符串 ...
- mysql中find_in_set_mysql中find_in_set()函数的使用详解
首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 . 现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那 ...
- mysql命令行查看表的触发器_Mysql事项,视图,函数,触发器命令(详解)
事项开启和使用 //修改表的引擎 alter table a engine=myisam; //开启事务 begin; //关闭自动提交 set autocommit=0; //扣100 update ...
- mysql中 where in 用法详解
https://blog.csdn.net/haibo0668/article/details/52584307 sssss mysql中 where in 用法详解 我是高手高手高高手 2016-0 ...
- python代码大全表解释-python操作列表的函数使用代码详解
python的列表很重要,学习到后面你会发现使用的地方真的太多了.最近在写一些小项目时经常用到列表,有时其中的方法还会忘哎! 所以为了复习写下了这篇博客,大家也可以来学习一下,应该比较全面和详细了 列 ...
- php mysql无限_php+mysql实现无限分类实例详解
php+mysql实现无限分类实例详解 fenlei($arr[$i][0]); //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...
最新文章
- python【蓝桥杯vip练习题库】ADV-308递归输出
- ServiceComb
- mysql 查询一个字段快还是一条记录快_mysql (优化)查询一条再筛选某个字段和直接查询该条的某个字段的效率比较...
- 磊哥最近面试了好多人,聊聊我的感受!(附面试知识点)
- 网络爬虫中的模拟登陆获取数据(实例教学1)
- Spring中Bean管理操作基于XML配置文件方法实现
- LTE学习:MCS(调制与编码策略) CSI(信道状态信息)
- 学python可以做什么-学会Python后都能做什么?介绍五种Python的实用场景
- linux关防火墙和SElinux
- 人工智能时代!Python跃升编程语言第一名!
- 微博评论数据爬取思路及代码分享
- Mac、移动硬盘中拷贝后文件夹和文件都为灰色解决办法
- 设备日常检查(巡检)
- 未来真的可以影响过去吗?人人都能看懂的波粒二象性和延迟选择量子擦除实验解释,通俗易懂量子物理
- Android MTK CAMERA DRIVER 摄像头驱动
- vs登录或者添加账户时说脚本错误
- [Mysql] ROUND函数
- xp找不到局域网内其它计算机,在W10局域网内找不到其它共享电脑的解决方案
- 李宏毅老师机器学习第二部分:回归问题
- datagrid全选
热门文章
- Webx MVC分析
- 如何高效运作机器学习团队(机器学习入门第四篇)
- leveldb - log格式
- unix network programming volume1 sorce code build and get(UNIX網絡編程卷1第三版)
- mysql服务的注册,启动、停止、注销。 [delphi代码实现]
- SoundPool的sample 1 not READY问题
- 数据可视化应用在哪方面
- 企业如何搭建物联卡云平台
- C函数改写成汇编语言函数,帮忙将一个C函数写成汇编语言
- excel vlookup多个条件匹配多列_Excel教程第12课:VLOOKUP函数近似匹配到底怎么回事,原理+操作...