3.1.g 找出在2009年秋季拥有最多选课人数的课程段

来源:互联网 发布:快递打印软件免费版 编辑:程序博客网 时间:2024/05/17 16:11

3.1.g 找出在2009年秋季拥有最多选课人数的课程

【注:本题来自于 数据库系统概念 第六版 机械工程出版社 第三章习题

3.1 使用大学模式,用SQL写出如下查询。

g) 找出在2009年秋季拥有最多选课人数的课程段。

解:满足题意得查询代码如下:

12345678
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:这里小f也给大家提供同一思路下的另一种写法(代码量大些):
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));

可以看出,多使用一些高级查询子句,会使得代码便于阅读理解,也会简化代码量。
1 0