MySQL之分组查询

一、语法规则

select  分组函数,列(要求出现在group by后面)
from 表
【where筛选条件】
group by  分组的列表
【order by 子句】
#注意:
#查询列表必须特殊,要求是分组函数和group by后面出现的字段

二、分组查询的特点

1.分组查询中的筛选条件分两类
a.分组前筛选,数据源是原始表,位置在group by子句的前面,使用where关键字
b.分组后筛选,数据源是分组后的结果集,位置在group by子句的后面,使用having关键字
2.分组函数做条件肯定是放在having子句中,能使用分组前筛选的,就优先考虑使用分组前筛选

三、实际案例

1.添加分组前的筛选

#案例1:查询每个工种(job_id)的最高工资
SELECT
	MAX(salary),
	job_id
FROM
	employees
GROUP BY
	job_id;

#案例2:查询每个位置(local_id)上的部门个数
SELECT
	COUNT(*),
	local_id
FROM
	employees
GROUP BY
	local_id;

#案例3:查询邮箱(email)中包含a字符的,每个部门(department_id)的平均工资
SELECT
	AVG(salary),
	department_id
FROM
	employees
WHERE
	email LIKE '%a%'
GROUP BY
	department_id;

#案例4:查询每个领导(manager_id)手下有奖金(commission_pct)的的员工的最高工资
SELECT
	MAX(salary),
	manager_id
FROM
	employees
WHERE
	commission_pct  IS NOT NULL
GROUP BY
	manager_id;

2.添加分组后的筛选

#案例1:查询哪个部门的员工个数大于2
#第一步:查询每个部门员工个数
SELECT
	COUNT(*),
	department_id
FROM
	employees
GROUP BY
	department_id;

#第二步:根据第一步的结果进行筛选,这里就用到了HAVING关键字
SELECT
	COUNT(*),
	department_id
FROM
	employees
GROUP BY
	department_id
HAVING
	COUNT(*) > 2;

#案例2:查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资
#第一步:查询每个工种有奖金的员工的最高工资
SELECT
	MAX(salary),
	job_id
FROM
	employees
WHERE
	commission_pct IS NOT NULL
GROUP BY
	job_id;
#第二步:第一步的结果中找最大工资大于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
GROUP BY
	manager_id;

#第二步:查询第一步中领导编号大于102的
SELECT
	MIN(salary),
	manager_id
FROM
	employees
WHERE
	manager_id>102
GROUP BY
	manager_id;

#第三步:查询第二步结果中最低工资大于5000的
SELECT
	MIN(salary),
	manager_id
FROM
	employees
WHERE
	manager_id>102
GROUP BY
	manager_id
HAVING
	MIN(salary)>5000;

3.按表达式或函数分组

#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选出员工个数>5的有哪些
#第一步:查询每个长度的员工个数
SELECT
	COUNT(*),
	LENGTH(name)
FROM
	employees
GROUP BY
	LENGTH(name);

#第二步:筛选第一步结果员工个数大于5的
SELECT
	COUNT(*),
	LENGTH(name)
FROM
	employees
GROUP BY
	LENGTH(name)
HAVING
	COUNT(*);

4.按多个字段分组

#案例:查询每个部门每个工种的员工的平均工资
SELECT
	AVG(salary),
	department_id,
	job_id
FROM
	employees
GROUP BY
	department_id,
	job_id;

5.分组查询中添加排序

#案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的降序显示
SELECT
	AVG(salary),
	department_id
FROM
	employees
GROUP BY
	job_id,
	department_id
ORDER BY
	AVG(salary) DESC;

分组查询就介绍到这里,如果发现错误或产生疑问请直接提出

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

囿于之间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值