数据库考题

数据库有考试成绩表scg,包含属性:

存储ID 学号(sno) 科目(cno) 分数(grade)

1 s001 c01 90

2 s001 c02 72

3 s002 c01 95

...

写SQL,求:

a)分数少于60的学号和科目,要求有:学号、科目、分数

b)超过2科分数>=90的人的学号和科目数,按科目数由大到小排序,要求有:学号、科目数(>=90分)

c)每个人成绩最好的三个科目,按学号、分数排序,要求有:学号、科目、分数

d)每科目,前2名的分数差:科目、第一名学号、第二名学号、第一分数、第二分数、分数差

当数据来源为文本文件(tab分割)时,写程序求上题b/c/d,程序语言不限(shell/python/java等均可,或者使用伪代码描述计算步骤

参考答案如下:

a)

SELECT sno, cno, grade
FROM scg
WHERE grade < 60;

b)

SELECT sno, COUNT(cno)
FROM scg
WHERE grade>=90
GROUP BY sno HAVING COUNT(cno)>2
ORDER BY COUNT(cno) DESC;

c)

SELECT TOP 3 sno, cno, grade  
FROM scg
GROUP BY sno
ORDER BY sno, grade;

d)

SELECT cno, first.sno, second.sno, first.grade, second.grade, first.grade-second.grade
FROM 
( 
SELECT TOP 1 * 
FROM scg 
GROUP BY cno 
ORDER BY grade
) first,
  (
SELECT TOP 1 *
FROM
( SELECT TOP 2 * 
FROM scg
GROUP BY cno
ORDER BY grade DESC
) two
GROUP BY two.cno
ORDER BY two.grade
) second
;

你可能感兴趣的:(数据库考题)