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));
原文地址:https://www.cnblogs.com/zhouie/p/10702612.html