博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 聚集函数 count 使用详解
阅读量:6593 次
发布时间:2019-06-24

本文共 4198 字,大约阅读时间需要 13 分钟。

mysql 聚集函数 count 使用详解

本文将探讨以下问题

1.count(*) 、 count(n)、count(null)与count(fieldName)

2.distinct 与 count 连用
3.group by (多个字段) 与 count 实现分组计数
4.case when 语句与 count 连用实现按过滤计数

参考文章:

准备工作

-- 创建表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

多个分组条件:

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 。

文中的不足、错误之处欢迎指正

转载于:https://www.cnblogs.com/gscq073240/articles/6484322.html

你可能感兴趣的文章
OC Copy基本使用(深拷贝和浅拷贝)
查看>>
老舍:有了小孩以后,才知道一切事情没那么简单
查看>>
SpringBoot参数校验
查看>>
git 教程 : git 是如此的好用 branch
查看>>
03Go 类型总结
查看>>
js 读取 input[type=file] 内容,直接显示文本 | 图片
查看>>
如何用深度学习框架PaddlePaddle实现智能春联
查看>>
PHP To Go 转型手记 (二)
查看>>
新造了一个管理模板代码的工具 -- Pharah
查看>>
一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)
查看>>
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数
查看>>
通用Windows平台应用程序开始恢复Win32功能
查看>>
Airbnb如何简化1000多位工程师的Kubernetes工作流程?
查看>>
AlphaZero进化论:从零开始,制霸所有棋类游戏
查看>>
Scrum Master的成功定义是什么?
查看>>
你的GitHub,怎么和我用的不太一样?
查看>>
Windows Server入门系列37 创建网络共享
查看>>
自己diy封装xp操作系统
查看>>
veritas升级及备份至磁盘两个问题简要说明
查看>>
Scoket:UDP通讯模型
查看>>