22

统计各个部门的工资记录数

http://www.nowcoder.com/questionTerminal/6a62b6c0a7324350a6d9959fa7c21db3

题目:统计各个部门的工资记录数,给出部门编码dept_no,部门名称dept_name以及次数sum

方法1:嵌套查询,查出一个dept_no,就进行子查询的到对应COUNT()
SELECT dept_no, dept_name, (SELECT COUNT(
)
FROM dept_emp AS de
INNER JOIN salaries AS s
ON de.emp_no=s.emp_no
WHERE de.dept_no=d.dept_no) AS sum
FROM departments AS d;
注意:对于这种情形的子查询,一个部门进去,必须只返回一个值,而且只能查询一个列,可以参考26题的错误示范做对比

方法2:先进行两次内连接,再通过GROUP BY查询
SELECT de.dept_no, de.dept_name, COUNT(*) AS sum
FROM (SELECT *
FROM departments
INNER JOIN dept_emp
ON departments.dept_no=dept_emp.dept_no) AS de
INNER JOIN salaries AS s
ON de.emp_no=s.emp_no
GROUP BY de.dept_no;
注意:这里GROUP BY聚合dept_no,而dept_name看上去不是聚合列(因此似乎不能放进SELECT语句内),但是事实上,由于dept_no是主键,所以一个dept_no只会对应一个dept_name,所以可以认为dept_name是可聚合的,所以可以放进去。特别要注意的是,如果dept_no不是主键,而是联合主键之一或者别的情况,总之dept_no不能唯一确定dept_name,那么即使在表中看上去dept_no和dept_name是一一对应的,也不能将dept_name放进SELECT中,强行放进去,在mysql中也会报错(当然在题库中不会报错)。

补充:内层的内连接,可以省略SELECT (因为内连接自己会生成临时表):
SELECT de.dept_no, de.dept_name, COUNT(
) AS sum
FROM (departments
INNER JOIN dept_emp
ON departments.dept_no=dept_emp.dept_no) AS de
INNER JOIN salaries AS s
ON de.emp_no=s.emp_no
GROUP BY de.dept_no;
补充:还可以进一步省略,直接进行连续内连接:
SELECT d.dept_no, d.dept_name, COUNT(*) AS sum
FROM
(departments AS d
INNER JOIN dept_emp AS de
ON d.dept_no=de.dept_no
INNER JOIN salaries AS s
ON de.emp_no=s.emp_no)
GROUP BY de.dept_no;
注意:连续内连接中一定不要出现WHERE(21题的经验)

方法3:直接三表联查,用WHERE过滤
SELECT d.dept_no, d.dept_name, COUNT(*) AS sum
FROM departments AS d, dept_emp AS de, salaries AS s
WHERE d.dept_no=de.dept_no
AND de.emp_no=s.emp_no
GROUP BY d.dept_no;
备注:三表联查在代码上比进行两次内连接简洁

全部评论
没一条能过的,发你个鸡毛
点赞 回复 分享
发布于 2021-06-30 22:25
没通过的是因为没有排序哈,用order by d.dept_no asc;
点赞 回复 分享
发布于 2021-06-07 10:08
复制提交通过不了
点赞 回复 分享
发布于 2021-05-11 10:15
三表联查和三表内连接不一样?
点赞 回复 分享
发布于 2021-05-02 14:05
select dp.dept_no, dp.dept_name, count(*) sum from departments dp ,dept_emp de , salaries s where dp.dept_no = de.dept_no and de.emp_no = s.emp_no group by de.dept_no order by de.dept_no
点赞 回复 分享
发布于 2021-03-23 10:21
通过不了,我也是这么写的
点赞 回复 分享
发布于 2021-03-20 17:23
为什么运行方法二提示dept_no重复呢
点赞 回复 分享
发布于 2021-03-13 03:50
方法三需要加order by d.dept_no;不然不能通过
点赞 回复 分享
发布于 2020-12-02 22:25
方法二中的分类字段group by 后面为什么用de.dept_name不行呢
点赞 回复 分享
发布于 2020-10-03 13:08
为什么要用d.dept_no 不能用d.dept_name
点赞 回复 分享
发布于 2020-06-19 15:43

相关推荐

抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
评论
50
6
分享

创作者周榜

更多
牛客网
牛客企业服务