#DQL语言
##六、分组查询
###基本语法:
select 分组函数,列(要求出现在group by的后面)
from
表
【where 筛选条件】
group by
分组的列表
【order by 子句】
PS:查询列表必须特殊,要求是分组函数和group by后出现的字段
####一、简单的分组查询
案例一:查询每个工种的最高工资
SELECT
MAX(salary),
job_id
FROM
employees
GROUP BY
job_id;
结果如下图所示:
案例二:查询各个位置上的部门个数
SELECT
COUNT(department_id),
location_id
FROM
departments
GROUP BY
location_id;
PS:大家可以观察到我们在写分组字段时,找的都是问题中"每个/各个"后面的字段,如“各个位置”,那么我们的分组字段就是“位置(location_id)”,大家根据这个规律可以去快速的得出分组字段。
####二、添加筛选条件
案例一:查询邮箱中包含a字符的每个部门的平均工资
SELECT
AVG(salary),
department_id
FROM
employees
WHERE
email LIKE '%a%'
GROUP BY
department_id;
案例二:查询有奖金的每个领导手下员工的最高工资
SELECT
MAX(salary),
manager_id
FROM
employees
WHERE
commission_pct IS NOT NULL
GROUP BY
manager_id;
结果如图:
####三、添加复杂的筛选条件
我们考虑这样一点,假如有其他的筛选条件需要在前面的筛选条件分组筛选后再去筛选,我们该怎么写语句,下面给出案例
案例一:查询哪个部门的员工个数>2
我们分两步走:
①查询每个部门的员工个数
SELECT
COUNT(*),
department_id
FROM
employees
GROUP BY
department_id;
②再查询个数>2的部分
添加HAVING COUNT(*)>2;
整体代码如下:
SELECT
COUNT(*),
department_id
FROM
employees
GROUP BY
department_id
HAVING
COUNT(*)>2;
PS:可能有同学会问,筛选条件"COUNT()>2"能不能放在group by前面去筛选,即添加
WHERE COUNT(*)>2;
这一语句到group by前面,这一做法是否定的,原因在于原始表内没有COUNT()这一字段,是在分组之后才有的,所以我们就不能用where去筛选,而是要在GROUP BY的后面去添加HAVING …(这一点需要大家重视!!!)
再给一个案例
案例二:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
两步走:
①查询查询每个工种有奖金的员工的工种编号和最高工资
SELECT
MAX(salary),
job_id
FROM
employees
WHERE
commission_pct IS NOT NULL
GROUP BY
job_id;
②在①的基础上去筛选最高工资>12000(即在分组后筛选————加having语句)
SELECT
MAX(salary),
job_id
FROM
employees
WHERE
commission_pct IS NOT NULL
GROUP BY
job_id
HAVING
MAX(salary)>12000;
其实,group by后面除了跟字段以外,也可以跟表达式,如下例子:
案例三:按员工的姓名长度进行分组,查询每一组的员工个数,筛选员工个数>5的有哪些组
SELECT
COUNT(*),
LENGTH(last_name)
FROM
employees
GROUP BY
LENGTH(last_name)
HAVING
COUNT(*)>5;
在这题中,group by后面跟的是length表达式。
我们也可以按多个字段进行分组,如下题所示
案例四:查询每个部门每个工种的员工的平均工资
SELECT
AVG(salary),
department_id,
job_id
FROM
employees
GROUP BY
department_id,job_id;
需要分组的多个字段之间只需要用","隔开
总结:
筛选情况 | 数据源 | 位置 | 关键字 |
---|---|---|---|
分组前筛选 | 原始表 | group by子句的前面 | where |
分组后筛选 | 分组后的表 | group by子句的后面 | having |
a.(大招)分组函数作条件肯定是放在having语句中的;
b.能在分组前筛选的,就优先考虑放在分组前筛选.
####四、添加排序查询
案例:查询每个部门每个工种的员工的平均工资,并按平均工资进行排序
SELECT
AVG(salary),
department_id,
job_id
FROM
employees
GROUP BY
department_id,job_id
ORDER BY
AVG(salary) DESC;
以上就是分组查询的内容,下一节将介绍连接查询!
按平均工资进行排序
SELECT
AVG(salary),
department_id,
job_id
FROM
employees
GROUP BY
department_id,job_id
ORDER BY
AVG(salary) DESC;
以上就是分组查询的内容,下一节将介绍连接查询!