7.2 分组查询

#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;

以上就是分组查询的内容,下一节将介绍连接查询!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值