前言: 为了解答“如何查询选修人数最大的课程号?”和“如何查询员工人数最多的部门编号?”的问题,我用尽各种方式搜索,还是没有找到绝对能解释清楚这个问题的答案。在搜索了近百个答案后,我吸收了很多零散的知识点,结合自己的分析,加上尝试N次的情况下,总算理解清楚并解答出来。我将把我梳理清楚的解题思路与知识点写出来,给这乱七八糟的网页内容多一份精确的答案,帮助迷途羔羊们。
题目来源:数据库系统原理–实验二 数据库定义与操作语言–习题答案
(1)如何查询选修人数最大的课程号?
SELECT courseNo
FROM (
SELECT courseNo,COUNT(studentNo) Snum
FROM Score
GROUP BY courseNo) A
WHERE Snum=(
SELECT MAX(Snum)
FROM(
SELECT courseNo,COUNT(studentNo) Snum
FROM Score
GROUP BY courseNo) A)
要解决这道题,我们得先理解文字意思,一个是查询统计选修人数最大,另一个是查询“统计选修人数最大”对应的课程号。
那么,如何去查询这道题呢?我们需要把思路先理清一下。
为了查询到“统计选修人数最大”对应的课程号,我们得先查询到统计选修人数最大;为了查询到统计选修人数最大,我们得先查询到统计选修人数。
所以,我们要解决问题有3个。
解答:
SELECT courseNo,COUNT(studentNo) Snum
FROM Score
GROUP BY courseNo
SELECT MAX(Snum)
FROM(
SELECT courseNo,COUNT(studentNo) Snum
FROM Score
GROUP BY courseNo) A
SELECT courseNo
FROM (
SELECT courseNo,COUNT(studentNo) Snum
FROM Score
GROUP BY courseNo) A
WHERE Snum=(
SELECT MAX(Snum)
FROM(
SELECT courseNo,COUNT(studentNo) Snum
FROM Score
GROUP BY courseNo) A)
这题用到了sql server 的 COUNT函数、MAX函数、FROM后面可以接查询语句当作虚表。
在这题中,
COUNT函数有生成一个Snum列名,指的是“统计选修人数”的个数;
而MAX函数后面却没有生产新的列名,这是为什么呢?因为在这题中,我们要的是“个数最大”的值,而没用到与最大值新生成的列名,所以可以不用,如果有生产新的列名,那也不影响结果。
FROM后面接的虚表需要把查询语句括号起来,然后用个字母或单词跟在括号后面当作这个虚表的名字。
题目来源:数据库系统原理–第3章练习–习题答案
现有某公司HR(人力资源)系统的关系模式如下:
Emp (emp_id,ename,age,salary,address)
// 职工(职工编号,姓名,年龄,工资,住址)
Dep (dep_id,dname,address)
// 部门(部门编号,部门名称,部门所在地)
Works(emp_id,dep_id,begin_date, end_date)
// 工作(职工编号,部门编号,开始工作日期,离职日期)
注:Works表记录了职工在不同时间段在公司各部门工作的履历,
如果离职日期(end_date)为空,表明该职工目前仍在此部门工作。
(1)查询员工人数最多的部门编号。
--查询员工人数最多的部门编号。
SELECT dep_id
FROM (--把"查询部门编号和职工编号的人数"当作虚表A
SELECT dep_id,COUNT(emp_id) Ce
FROM Works
GROUP BY dep_id)A
WHERE Ce=(--查询虚表A中职工编号的人数Ce的最大值
SELECT MAX(Ce)
FROM (--把"查询部门编号和职工编号的人数"当作虚表A
SELECT dep_id,COUNT(emp_id) Ce
FROM Works
GROUP BY dep_id)A)
注明:
--查询部门编号和职工编号的人数
SELECT dep_id,COUNT(emp_id) Ce
FROM Works
GROUP BY dep_id
如果有更好的方法,在评论区里提出来,供大家参考。如果很有用,我将加进去。
推荐文章