前言
今天为大家分享的是DQL数据查询语言的后续部分知识点,
上一篇博客已经分享了DQL数据查询语言的概念、特点、
基本的SELECT语句、过滤和排序数据以及分组查询!
DQL前文:DQL数据查询语言前文部分
分组查询
(一)、过滤分组Having 子句
1、语法: select 查询列表 from 表 【where 筛选条件】 group by 分组的字段 【order by 排序的字段】;
2、特点:
1、和分组函数一同查询的字段必须是group by后出现的字段
2、筛选分为两类:分组前筛选和分组后筛选
分组前筛选 | 分组后筛选 |
---|---|
针对的是原始表 | 针对的是group by后的结果集 |
where关键字 | having关键字 |
3、分组前筛选:
案例1:查询邮箱中包含a字符的 每个部门的最高工资
SELECT MAX(salary),department_id
FROM t_mysql_employees
WHERE email LIKE '%a%'
GROUP BY department_id;
结果:
案例2:延伸案例1,得出以下结论!
SELECT MAX(salary),manager_id,department_id
FROM t_mysql_employees
WHERE email LIKE '%a%'
GROUP BY department_id;
结论:虽然可以查询出结果,但是结果不一定正确,因为一个部门里面不可能只有一个员工,所以说最好按照查询出来的列名进行分组!
分组后筛选:
案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary)
FROM t_mysql_employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
结果:
(二)、where条件筛选和having条件筛选的区别以及应用场景:
例1:查询员工数大于5的部门
SELECT COUNT(*),department_id
FROM t_mysql_employees
WHERE salary>12000
GROUP BY department_id;
例2:查询员工数大于5的部门
SELECT COUNT(*),department_id
FROM t_mysql_employees
GROUP BY department_id
HAVING salary>12000;
结果如下:
结论:虽然两种方式的最终运行结果是一样的,但是其实内在的使用逻辑不一样,where关键字是先进行条件的判断,再筛选;反之,having关键字是先进行筛选,再进行判断的,只是由于表的设计,所以运行结果一样,并不是说两者之间没有区别,所以容易混淆!
注意:having后带的条件必须是整个sql语句中select查询出来的列!
案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
首先分析题中的条件:
1、每个工种 意思是按照工种分组 group by job_id
2、有奖金 意思是奖金率不为空 使用where条件
3、最高工资>12000 意思是分组后筛选 使用having关键字
<