另一篇传送门:(10条消息) 数据库原理:SQL查询语句练习及解析,加深理解(一)_小许要加油啊~的博客-CSDN博客
一、题目
设有如下三个关系:
关系 学号、姓名、年龄、性别
关系 学号、课程号、成绩
关系 课程号、课程名、任课老师
问:
统计所有学生各自选修的课程门数。
求选修课程号为C4课程的女学生的平均年龄
求Liu老师所授课程的每门课的平均成绩
统计每门课程的学生选修人数
检索学号比Wang同学大,而年龄比他小的同学姓名
在表SC中检索成绩为空值的学生学号和课程号。
检索姓名以L打头的所有学生的姓名和年龄。
求年龄大于女同学平均年龄的男学生姓名和年龄
二、答案和解析
统计所有学生各自选修的课程门数
思路:按学号分组,统计每一个学生选课的书目
SELECT COUNT(*)
FROM SC
GROUP BY Sno
求选修课程号为C4课程的女学生的平均年龄
连接查询:
SELECT AVG(Age)
FROM S,SC
WHERE S.Sno=SC.Sno AND Cno='C4' AND Sex='WOMAN'
嵌套查询:
SELECT AVG(Age)
FROM S
WHERE Sex='WOMAN' AND Sno IN
(SELECT Sno
(FROM SC
WHERE Cno='C4'))
求Liu老师所授课程的每门课的平均成绩
思路:由于是求平均成绩,还需要表示出对应的课程号,所以select语句中有Cno和AVG(Grade)。最后的分组是必要的,把同一节课的成绩分在一组再去求平均才有意义,否则无意义。
SELECT Cno,AVG(Grade)
FROM SC,C
WHERE SC.Cno=C.cno AND Teacher='LIU'
GROUP BY C.Cno
统计每门课程的学生选修人数
SELECT COUNT(Sno)
FROM SC
GROUP BY Cno
检索学号比Wang同学大,而年龄比他小的同学姓名
思路:需要涉及两次S表,故将其分别命名为X和Y,在WHERE语句中需要区分两个表的属性。
SELECT Sname
FROM S X,S Y
WHERE Y.Sname='WANG' AND X.Sno>Y.sno AND X.Age<Y.Age
在表SC中检索成绩为空值的学生学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
检索姓名以L打头的所有学生的姓名和年龄。
SELECT Sname,Age
FROM S
WHERE Sname LIKE 'L%'
求年龄大于女同学平均年龄的男学生姓名和年龄
思路:需要涉及两次S表,故将其分别命名为X和Y,在WHERE语句中需要区分两个表的属性。
SELECT Sname,Age
FROM S X
WHERE X.Sex='MAN' AND X.Age >
(SELECT AVG(Y.Age)
(FROM S Y
WHERE Y.Sex='WOMAN'))