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=8select count(id) as count from tb_student; 结果: count=9select 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 |
多个分组条件:
SELECT
stu_sex,
stu_class,
COUNT(*) AS count
FROM
tb_student
GROUP BY
stu_sex,
stu_class
结果为:
| stu_sex | stu_class | count |
|---|---|---|
| NULL | NULL | 1 |
| 女 | 一班 | 2 |
| 女 | 二班 | 2 |
| 男 | 一班 | 2 |
| 男 | 二班 | 2 |
问题四:case when 语句与 count 连用实现按过滤计数
在上述数据库中如果我们要查每个教师教了多少个 一班 同学 和二班同学 有两种方法
方法一:对教师和班级分组计数
SELECT
tea_name,
stu_class,
count(*) AS count
FROM
tb_student
GROUP BY
tea_name,
stu_class
结果为:
| tea_name | stu_class | count |
|---|---|---|
| NULL | NULL | 1 |
| 老张 | 一班 | 2 |
| 老张 | 二班 | 2 |
| 老王 | 一班 | 2 |
| 老王 | 二班 | 2 |
这种方法不太直观我们可以把结果行转列更加清晰表达每个教师交每个班的人数
方法二:使用case when 行转列
SELECT
tea_name,
count(case when stu_class='一班' then 1 else null end ) AS `一班人数` ,
count(case when stu_class='二班' then 1 else null end ) AS `一班人数`
FROM
tb_student
GROUP BY
tea_name
结果为:
| tea_name | 一班人数 | 一班人数 |
|---|---|---|
| NULL | 0 | 0 |
| 老张 | 2 | 2 |
| 老王 | 2 | 2 |
当关注的计数属性有较多取值时不适合这种用法,比如有100个班级,我们无法去写100个case when 。
文中的不足、错误之处欢迎指正
mysql 聚集函数 count 使用详解的更多相关文章
- mysql 聚集函数 count 使用详解(转载)
本文将探讨以下问题 1.count(*) . count(n).count(null)与count(fieldName)2.distinct 与 count 连用3.group by (多个字段) 与 ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- 节点地址的函数list_entry()原理详解
本节中,我们继续讲解,在linux2.4内核下,如果通过一些列函数从路径名找到目标节点. 3.3.1)接下来查看chached_lookup()的代码(namei.c) [path_walk()> ...
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- c++中内存拷贝函数(C++ memcpy)详解
原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...
- 深入MySQL用户自定义变量:使用详解及其使用场景案例
一.前言 在前段工作中,曾几次收到超级话题积分漏记的用户反馈.通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上.计数器的值会影响用户当前行为所获得积分的大小.比如,当用户在某超级话题下连 ...
- MySQL Cluster 配置文件(config.ini)详解
MySQL Cluster 配置文件(config.ini)详解 ################################################################### ...
- (八)open函数的flag详解
3.1.4.open函数的flag详解13.1.4.1.读写权限:O_RDONLY O_WRONLY O_RDWR(1)linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明(譬 ...
随机推荐
- HTTP/1.1 与 HTTP/2.0
HTTP/1.1 与 HTTP/2.0 HTTP/1.1 持久连接 非持久连接
- 使用SharpDevelop配合MonoGame进行游戏开发
SharpDevelop是一款开源的轻量级IDE,它支持众多的语言及项目开发.可以看看支持的项目. 程序本体仅十几MB,打开项目速度飞快. 目前SharpDevelop最高支持C# 5.0,.NET ...
- C语言程序设计(十) 字符串
第十章 字符串 字符串常量是由一对双引号括起来的一个字符串序列 字符串实际就是由若干个有效数字构成且以字符'\0'作为结束的一个字符序列 C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来 ...
- React hooks详解
此篇文章仅是对hooks入门的总结,老鸟略过吧~ React从16.8.X以后增加了一个新特性,react hooks 让我们看看这个新特性又带来了哪些惊喜呢~以下内容我们采取不同方式创建组件来进行对 ...
- 如何查看子线程中的GC Alloc
1)如何查看子线程中的GC Alloc2)Build时,提示安卓NDK异常3)如何获得ParticleSystem产生的三角形数量4)关于图片通道的问题5)GPUSkinning导致模型动画不平滑 M ...
- File类的构造方法:三种重载形式(新手)
//导入的包.import java.io.File;//File类的构造方法 三种重载形式//创建的一个类.public class zylx1 { //公共静态的主方法. public stati ...
- 我的MacbookPro进水了!维修过程记录
电脑进水与解决方案 如果事情有变坏的可能,不管这种可能性有多小,它总会发生.---墨菲定律 进水过程 2020年03月21日日下午3点左右,不小心把水杯碰倒了,水通过电脑右侧的键盘处进入了大概有10毫 ...
- 网络安全从入门到精通(第一章-1)Web服务器通信原理
本文内容 IP地址 域名 端口 HTTP协议 从访客角度看网页浏览器流程 常见服务器系统 路径 Web容器 常见的Web容器 !!!多动手,多动手,只看只听是不行的!!! 1,IP地址:就是计算机在互 ...
- CVE-20117-111882漏洞复现及利用
背景 工程实践题目: 渗透方向:实验班要求 1.利用已有的漏洞,搭建内网实验环境(WEB漏洞或系统漏洞以近两年内的CVE编号为准,每人一个,先报先得,具体由学习委员负责协调),利用工具进行内网渗透攻击 ...
- VUE npm run dev 启动时,报了一大堆错误 Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 7.x
npm run dev 启动时,报了一大堆错误 Module build failed: Error: Missing binding E:\2017VocaSchool\vocationWeb\no ...