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 的后面

相关推荐
样例过了就是过了几秒前
LeetCode热题100 电话号码的字母组合
数据结构·c++·算法·leetcode·dfs
charlie1145141911 分钟前
2026年IMX6ULL正点原子Alpha开发板学习方案——U-Boot完全移植概览:从官方源码到你的自制板,这条路有多远
linux·学习·嵌入式·uboot·嵌入式linux·工程实践·编程指南
Yusei_05238 分钟前
C++17入门
c++
biubiuibiu10 分钟前
选择适合的硬盘:固态与机械硬盘的对比与推荐
c++·算法
oioihoii13 分钟前
数据库查询优化中的谓词下推策略与成本感知优化实践
服务器·数据库·oracle
Full Stack Developme15 分钟前
MongoDB 应用场景
数据库·mongodb
盐焗西兰花18 分钟前
鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)
学习·华为·harmonyos
学习是生活的调味剂19 分钟前
大模型应用之使用LangChain实现RAG(二)智能客服
服务器·数据库·langchain
LXS_35720 分钟前
案例 —— 机房预约系统
开发语言·c++·学习方法
高梦轩23 分钟前
LNMP 环境部署笔记
linux·笔记