3.1.g 找出在2009年秋季拥有最多选课人数的课程段
3.1.g 找出在2009年秋季拥有最多选课人数的课程
3.1 使用大学模式,用SQL写出如下查询。
g) 找出在2009年秋季拥有最多选课人数的课程段。
注:本题来自于 数据库系统概念 第六版 机械工程出版社 第三章习题
解:满足题意得查询代码如下:
WITH R
AS ( SELECT Course_id, Sec_id, COUNT (Id) AS Cnt_id
FROM Takes NATURAL JOIN Section
WHERE Year = 2009 AND Semester = 'Fall'
GROUP BY Course_id, Sec_id)
SELECT Course_id, Sec_id, Cnt_id
FROM R
WHERE Cnt = (SELECT MAX (Cnt) FROM R);
思路如下:
1-5行:先找出2009年秋季所有开设的课程段以及相对应的选课人数(用SQL更加直白表达出来就是——根据Course_id, Sec_id分组,相应找出2009年秋季各组课程段以及对应的选课人数),记此关系为R
通过上面的查询,我们可能得到的结果(称为 表 或 关系组)应当是如下形式(当然,给出的数据只是一种形式上的表达):
实际上本题要找的最终结果就是从关系R中找出 cnt_id值最大 所对应的那一行数据(对应上表,就是第三行数据)。
这样,问题便简化为从这样一个关系R中根据cnt_id这一列的最大数据找出所在行的元组。
6-8行:
显然,这是一段很容易理解的简单嵌套子查询(关键在于我们要能将R看成一个数据表,with子句就是用来提供定义临时关系的方法)
ps:这里也给大家提供同一思路下的另一种写法(代码量大些):
select course_id,sec_id,count(ID)
from takes
where year= 2009 and semester='Fall'
group by course_id,sec_id
having count(ID)=(select max(num)
from(
select count(ID) as num
from takes
where year = 2009 and semester= 'Fall'
group by course_id,sec_id));