SQL学习 — DQL — 分组查询
5. 分组查询
-
背景:在分组函数的内容中,我们提及和分组函数一起查询的字段会有限制,产生错误。因为分组函数是将所以的参数统计成一个结果,而查询的字段是返回符合条件的个数,那么就会出错。所以引入了分组查询,将表中的相同的内容切分成数块,然后分别进行统计后返回结果,这样就不会单纯返回一个结果。
# 分组查询 /* 工具:可以使用group by子句将表中的数据分成若干组 语法: select 分组函数, 字段(要求出现在group by的后面) from 表名 [where 筛选条件] [group by 分组的字段] [having 筛选条件] [order by 子句] 注意: 1.查询列表比较特殊,要求得是分组函数和出现在group by后的分组字段 特点: 1.分组查询中的筛选条件分为两类: 数据源 关键字 位置 分组前筛选 原始表 where group by子句前 分组后筛选 分组表 having group by子句后 结论:1.分组函数做条件肯定是放在having子句中 2.能用分组前筛选的,就优先考虑使用分组前筛选,提高性能 2.group by子句支持单个字段分组,多个字段分组(多个字段分组没有顺序要求),表达式,函数 3.也可以添加排序,放在整个查询的最后 */
-
简单的分组查询:分组前的筛选用where
# 简单的分组查询:分组前的筛选用where # 案例1:查询每个部门的平均工资 SELECT AVG(salary), department_id FROM employees GROUP BY department_id; # 案例2:查询每个工种的最高工资 SELECT MAX(salary), job_id FROM employees GROUP BY job_id; # 案例3:查询每个位置上的部门个数 SELECT COUNT(*), location_id FROM departments GROUP BY location_id; # 案例4:查询邮箱中包含a字符,每个部门的平均工资 SELECT AVG(salary), email, department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id; # 案例5:查询有奖金的每个领导手下员工的最高工资 SELECT MAX(salary), manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
-
复杂的分组查询:分组后的筛选用having
# 复杂的分组查询:分组后的筛选用having # 案例1:查询哪个部门的员工个数>2 SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*)>2; # having, 指在分组后的表中进行条件筛选,能套用分组函数 # 案例2:查询每个工种有奖金的员工的最高工资>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 WHERE manager_id>102 GROUP BY manager_id HAVING MIN(salary)>5000;
-
按表达式或函数分组 : group by后加表达式或单行函数/分组函数
# 按表达式或函数分组 : group by后加表达式或单行函数/分组函数 # 案例1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些 SELECT last_name ,LENGTH(last_name) AS len_name, COUNT(*) FROM employees GROUP BY len_name # mysql中group by后支持别名 HAVING COUNT(*)>5; # mysql中having后支持别名
-
按多个字段分组:group by后加多个字段进行分组
# 按多个字段分组 # 案例1:查询每个部门每个工种的员工平均工资 SELECT AVG(salary), department_id, job_id FROM employees GROUP BY department_id, job_id;
-
分组后添加排序
# 添加排序 # 案例1:查询每个部门每个工种的员工平均工资,并且按平均工资的高低显示 SELECT AVG(salary), department_id, job_id FROM employees GROUP BY department_id, job_id ORDER BY AVG(salary) DESC;
5.1 分组查询练习
# 将以下内容复制到sql图像化客户端界面进行思考
#1. 查询各 job_id 的员工工资的最大值,最小值,平均值,总和,并按 job_id 升序
#2. 查询员工最高工资和最低工资的差距(DIFFERENCE)
#3. 查询各个管理者手下员工的最低工资,其中最低工资不能低于 6000,没有管理者的员工不计算在内
#4. 查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
#5. 选择具有各个 job_id 的员工人数
5.2 分组查询练习答案
文件名:06SQL_Groupingquery.sql
下载地址:链接:https://pan.baidu.com/s/1_slO9LaDORqLKIQtbLs3Ww?pwd=ccjz
提取码:ccjz