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子句中
②能用分组前删选的,优先使用分组前筛选
案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT
COUNT(*),
LENGTH( last_name )
FROM
employees
GROUP BY
LENGTH( last_name )
HAVING
COUNT(*)> 5;
案例:查询每个部门每个工种的员工的平均工资
SELECT
AVG( salary ),
department_id,
job_id
FROM
employees
GROUP BY
department_id,
job_id;
案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECT
AVG( salary ),
department_id,
job_id
FROM
employees
GROUP BY
department_id,
job_id
ORDER BY
AVG( salary ) DESC;
尚硅谷公开课学习笔记