文章目录
- 1. 题目
- 2. 题解
- 3. 反思:GROUP BY + JOIN
1. 题目
-
题目来源:SQL26 汇总各个部门当前员工的title类型的分配数目
-
题目描述
汇总各个部门当前员工的title类型的分配数目,即结果给出部门编号dept_no、dept_name、其部门下所有的员工的title以及该类型title对应的数目count,结果按照dept_no升序排序,dept_no一样的再按title升序排序 -
三张表
-
所需结果
2. 题解
这题还是有些看头,有不少考察点(也有不少槽点)。
主要考察:
1、多表连接:使用 INNER JOIN
找到三张表格的所有匹配项
2、分区去重(分组):使用 GROUP BY
对分区对象进行分组
这题坑就坑在题目有些迷惑性,而且底下很多人给的答案也有问题。
个人解答如下:
SELECT d.dept_no,
d.dept_name,
t.title,
COUNT(*) count
FROM departments d
JOIN dept_emp de
ON d.dept_no = de.dept_no
JOIN titles t
ON de.emp_no = t.emp_no
WHERE de.to_date = '9999-01-01' # 【在职员工】这个条件不能忘
AND t.to_date = '9999-01-01'
GROUP BY d.dept_no, d.dept_name, t.title # 易错:也要对 title 进行分组!!(题目描述很具迷惑性)
ORDER BY d.dept_no ASC, t.title ASC
上面说很坑的原因如下:
题目所求【汇总各个部门当前员工的title类型的分配数目】,一头雾水!可能出题人也知道表述不清,后面又加以解释:【即结果给出部门编号dept_no、dept_name、其部门下所有的员工的title以及该类型title对应的数目count】,到第二遍想了好久才明白 这个 title 的 count 究竟求的是个什么,其实就可以直接理解为emp_no
,即”具体的员工号“,这样就不会出现很多人答案中的COUNT(title)
了。既GROUP BY title
,又COUNT(title)
,奇怪的很。
3. 反思:GROUP BY + JOIN
做这题耗费很多时间,值得终结一下:
1、关于GROUP BY 的使用技巧:
- ① 要快速且要找准分组的对象,看到”各个“、”每一”等关键词要敏感
- ② 对
SELECT语句
的限制,后面的字段要么是分组对象要么是聚合对象,其它多余字段不允许,因此反过来,可以根据这条,来确定分组对象
2、关于JOIN的使用: - ① 注意在字段前在指定特定表格
- ② 区分左右连接:
t_a LEFT JOIN t_b
表示对 t_b 进行行过滤,然后再与t_a
进行列合并;而t_a INNER JOIN t_b
是互相约束,最后再做列合并
文章出处登录后可见!
已经登录?立即刷新