MySQL学习笔记 ------ 分组查询

#进阶5:分组查询

/*

语法:

select 分组函数,列(要求出现在group by的后面)

from 表

【where 筛选条件】

group by 分组的列表

【order by 排序的字段】;

注意:查询列表必须特殊,要求是分组函数和group by后出现的字段

特点:

1、和分组函数一同查询的字段必须是group by后出现的字段

2、筛选分为两类:分组前筛选和分组后筛选

针对的表 位置 连接的关键字

分组前筛选 原始表 group by where在group by前

分组后筛选 group by后的结果集 group by后 having在group by后

注意:分组函数做条件肯定是放在having子句中,能用分组前筛选的,优先考虑用分组前筛选

问题1:分组函数做筛选能不能放在where后面

答:不能

问题2:where------group by------having

一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率

3、分组可以按单个字段也可以按多个字段,多个字段之间用逗号分隔且不分顺序

4、可以搭配着排序使用

*/

#引入:查询每个部门的员工个数

SELECT COUNT(*) FROM employees WHERE department_id=90;

#1.简单的分组

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

SELECT AVG(salary),job_id

FROM employees

GROUP BY job_id;

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

SELECT COUNT(*),location_id

FROM departments

GROUP BY location_id;

#案例3:查询每个工种的员工最大工资

SELECT MAX(salary),job_id

FROM employees

GROUP BY job_id;

#2、可以实现分组前的筛选

#案例1:查询邮箱中包含a字符的 每个部门的最高工资

SELECT MAX(salary),department_id

FROM employees

WHERE email LIKE '%a%'

GROUP BY department_id;

#案例2:查询有奖金的每个领导手下员工的平均工资

SELECT AVG(salary),manager_id

FROM employees

WHERE commission_pct IS NOT NULL

GROUP BY manager_id;

#3、分组后筛选

#添加简单筛选条件

#案例:查询哪个部门的员工个数>5

#(1)查询每个部门的员工个数

SELECT COUNT(*),department_id

FROM employees

GROUP BY department_id

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

SELECT COUNT(*),department_id

FROM employees

GROUP BY department_id

HAVING COUNT(*)>2;#having用于分组后的筛选,where用于分组前对原始表的筛选

#添加复杂筛选条件,条件过于复杂时可以拆分开进行

#注意:在原表中有的用where筛选如:有奖金,在原表中没有的用having筛选如:最高工资>12000

#案例2:每个工种有奖金的员工的最高工资>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 MIN(salary),manager_id

FROM employees

WHERE manager_id>102

GROUP BY manager_id

HAVING MIN(salary)>5000;

#4.添加排序

#案例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序

SELECT job_id,MAX(salary) m

FROM employees

WHERE commission_pct IS NOT NULL

GROUP BY job_id

HAVING m>6000

ORDER BY m ;

#5.按多个字段分组

#案例:查询每个工种每个部门的最低工资,并按最低工资降序

SELECT MIN(salary),job_id,department_id

FROM employees

GROUP BY department_id,job_id

ORDER BY MIN(salary) DESC;

#6.按表达式或函数分组

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

SELECT COUNT(*),LENGTH(last_name)

FROM employees

GROUP BY LENGTH(last_name)

HAVING COUNT(*)>5;

#可以使用别名

SELECT COUNT(*) c,LENGTH(last_name) la_name

FROM employees

GROUP BY la_name

HAVING c>5;

#------分组查询总结------#

一、语法

SELECT 分组函数,分组后的字段

FROM 表

【WHERE 筛选条件】

GROUP BY 分组的字段

【HAVING 分组后的筛选】

【ORDER BY 排序列表】

二、特点

使用关键字 筛选的表 位置

分组前筛选 WHERE 原始表 GROUP BY的前面

分组后筛选 HAVING 分组后的结果 GROUP BY 的后面

相关推荐
马克学长7 小时前
SSM青岛恒星科技学院机房管理系统0k0u9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·科技·ssm 框架·教育信息化·机房管理系统·青岛恒星科技学院
7***68438 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
止观止8 小时前
C++20 Concepts:让模板错误信息不再“天书”
c++·c++20·编程技巧·模板编程·concepts
('-')8 小时前
《从根上理解MySQL是怎样运行的》第十章学习笔记
笔记·学习·mysql
L***d6708 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
hd51cc8 小时前
MFC学习笔记 对话框
笔记·学习·mfc
java_logo8 小时前
MySQL Server Docker 容器化部署指南
linux·运维·数据库·docker·容器
likuolei8 小时前
XSL-FO 软件
java·开发语言·前端·数据库
p***95008 小时前
Springboot3 Mybatis-plus 3.5.9
数据库·oracle·mybatis
CS_浮鱼8 小时前
【MySQL】InnoDB存储引擎
数据库·mysql