MySQL笔记--MySQL分组函数和分组查询

Posted Al_tair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL笔记--MySQL分组函数和分组查询相关的知识,希望对你有一定的参考价值。

mysql分组函数和分组查询

我们已经学习完常见函数,接下来我们涉足分组函数和分组查询,跟上我的步伐!

DQL语言的学习
基础查询
条件查询
排序查询
常见函数
分组函数
分组查询
连接查询
子查询
分页查询
联合查询

进阶5:分组函数

分组函数(聚合函数)
功能:用作统计使用,又称作聚合函数或统计函数或组函数
分类:以下是官方的MySQL5.7给出的表格
在这里插入图片描述

1.简单的使用

使用起来简单,方便!

SELECT SUM(salary) FROM employees   # 691400.00
SELECT AVG(salary) FROM employees   # 6461.682243
SELECT MIN(salary) FROM employees   # 2100.00
SELECT MAX(salary) FROM employees   # 24000.00
SELECT COUNT(salary) FROM employees # 107

# 可以全部放在一起
SELECT SUM(salary) AS "和",AVG(salary) AS "平均" FROM employees

2.参数支持哪些类型

现在我们知道直接用这些函数了,但是我们应该传入什么类型的值呢?

# 注意都是忽略NULL值
SUM(),AVG();  # 支持数值型,
MAX(),MIN();  # 支持数值型,字符型,日期型(但是日期是按日期上的数值大小比较,无关时间早晚)
COUNT();      # 可以计算字符型

3.和distinct搭配

实现去重(DISTINCT)的求和 SUM( )

SELECT SUM(DISTINCT salary) AS "工资" FROM employees; # 397900.00
SELECT COUNT(DISTINCT salary) AS "人数" FROM employees; # 57

4, count 函数的"特殊优待"

# 常用于统计人数(防止受NULL影响)
SELECT COUNT(*) FROM employees;  # 107
# 在每一列前面加1这一列,统计1的行数,所以以此类推括号内放入常量就可以实现统计
SELECT COUNT(1) FROM employees;  # 107
# 拓展 效率
#在 MYISAM 存储引擎下,COUNT(*)效率高
#在 INNODB 存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
#总结:还是用 COUNT(*)比较好!

5.和分组函数一同查询的字段有限制

要求:group by 后的字段
什么是group by 后的字段 ,请看下文分组查询!

案例测试

查询公司员工工资的最大值,最小值,平均值,总和

SELECT MAX(salary) AS MAX, MIN(salary) AS MIN,
	   AVG(salary) AS AVG,SUM(salary) AS SUM 
FROM employees

在这里插入图片描述

查询员工表中的最大入职时间和最小入职时间的相差天数(DATEDIFF)

# 可以用来查询你出生到现在多久了
SELECT DATEDIFF(NOW(),"2000-8-30");  # 7595

# 该题无非是替换上述参数而已
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate))
FROM employees

在这里插入图片描述

查询部门编号为90的员工个数

SELECT COUNT(*) AS "员工个数"
FROM employees 
WHERE department_id = 90;

在这里插入图片描述

进阶6:分组查询

在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析。创建分组是通过GROUP BY子句实现的。与WHERE子句不同,GROUP BY子句用于归纳信息类型,以汇总相关数据。GROUP BY的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

引入:查询每个部门的平均工资

可以使用GROUP BY子句将表中的数据分成若干组
语法
select 分组函数,列(出现在group by的后面)from 表
【where 筛选条件】
group by 分组的列表
【order by 子句】
注意
查询列表必须特殊,要求是分组函数和group by 后出现的字段

# 总部门的平均工资
SELECT AVG(salary) AS ”工资“
from employees;

# 每个部门的平均工资(体现分组思想)
SELECT AVG(salary)
FROM employees
GROUP BY department_id;

在这里插入图片描述

简单的分组查询 easy!(无条件筛选)

案例1:查询每个工种的最高工资

SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;

在这里插入图片描述

案例2:查询每个位置上的部门个数

SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;

在这里插入图片描述

添加分组前筛选条件

案例1:查询邮箱中包含a字符的,每个部门的平均工资

SELECT AVG(salary) AS "工资"
FROM employees
WHERE  email LIKE "%a%"
GROUP BY department_id;

在这里插入图片描述

案例2:查询有奖金的每个领导手下员工的最高工资

SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

在这里插入图片描述

添加分组后筛选条件

如果你觉得复杂的话,可以分成两步骤进行完成它!

案例1:查询哪个部门的员工人数>2

思路:

1.查询每个部门的员工人数

SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;

在这里插入图片描述

2.根据1的结果进行筛选,查询哪个部门的员工人数>2

HACING 新用法
放在全部后面意思指的是在之前的查找结果再进行进一步筛选

SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;

在这里插入图片描述

案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

1.查询每个工种有奖金的员工的最高工资

SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id;

在这里插入图片描述

2.根据1结果继续筛选,最高工资大于12000

SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

在这里插入图片描述

案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及最低工资

SELECT manager_id,MIN(salary)
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000

在这里插入图片描述

添加分组前后筛选条件特点总结

                            数据源                          位置                         关键字
分组前筛选          原始表             group by子句的前面              where
分组后筛选   分组后的结果集      group by子句的后面              having
1.分组函数做条件肯定是放在having子句中

2.能分组前筛选就先考虑分组前筛选

按表达式或函数分组

案例1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工人数>5的有那些?

1.查询每个长度的员工个数

回顾下 LENGTH() 的用法

SELECT COUNT(*),LENGTH(last_name) "名字长度"
FROM employees
GROUP BY LENGTH(last_name);

在这里插入图片描述

2.添加筛选条件

注意mysql 中 group by 和 having 后面是支持别名的,但是where 后面不支持

SELECT COUNT(*),LENGTH(last_name) "名字长度"
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;

在这里插入图片描述

按多个字段进行分组

案例1:查询每个部门每个工种的员工的平均工资

SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id;

在这里插入图片描述

添加排序

案例1:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示(筛选条件:部门编号不为空,平均工资大于10000)

注意位置放置 order by ,where , group by , having


SELECT AVG(salary) AS AVG,department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id,job_id
HAVING AVG > 10000
ORDER BY AVG DESC;

在这里插入图片描述

总结:

我觉得学习MySQL语句更多在于练习,其实概念很简单,可以很快掌握,本章节主要就是涉及分组函数和分组查询,我觉得语句顺序和语句逻辑尤为重要,然后就可以加快学习进度了,多思多练即可,没什么难学的知识点!加油!继续坚持下去!

以上是关于MySQL笔记--MySQL分组函数和分组查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL笔记--- 部分 DQL 语句;条件查询;排序;分组函数;单行处理函数;group by ,having ;

SQL学习笔记 ----Mysql数据库的条件查询

MySQL的分组函数和分组查询

mysql进阶5:分组查询

MySQL学习笔记

十MySQL 聚合函数分组查询及过滤分组