MySQL——分组查询

一、语法

SELECT
	分组函数,列(要求出现在GROUP BY的后面) 
FROM
	表
	【 WHERE筛选条件】 
GROUP BY
	分组的列表
	【 HAVING分组后的筛选】
	【 ORDER BY排序列表】;

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

二、案例

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

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

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

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

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

SELECT
	AVG( salary ),
	departmebt_id 
FROM
	employees 
WHERE
	email LIKE '%a%' 
GROUP BY
	department_id;

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

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

案例5:查询哪个部门的员工个数大于2

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

注意:这时是根据employees表进行筛选,而该表中没有COUNT(*)这个字段,所以这种写法是错误的,正确写法如下:

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

三、特点

使用关键字 筛选的表 位置
分组前筛选 where 原始表 group by的前面
分组后筛选 having 分组后的结果 group by 的后面

注意:
①分组函数做条件,一定是放在having子句中
②能用分组前删选的,优先使用分组前筛选

四、扩展

1.按函数分组

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

SELECT
	COUNT(*),
	LENGTH( last_name ) 
FROM
	employees 
GROUP BY
	LENGTH( last_name ) 
HAVING
	COUNT(*)> 5;

2.按多个字段分组

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

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

3.添加排序

案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示

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

尚硅谷公开课学习笔记

你可能感兴趣的:(MySQL)