### 经典SQL练习题解析 #### 1. 查询Student表中的所有记录的Sname、Ssex和Class列。 ```sql SELECT Sname, Ssex, Class FROM Student; ``` **解析**: 此SQL语句从`Student`表中选取`Sname`(学生姓名)、`Ssex`(学生性别)以及`Class`(班级)这三列数据。 #### 2. 查询教师所有的单位即不重复的Depart列。 ```sql SELECT DISTINCT Depart FROM Teacher; ``` **解析**: 使用`DISTINCT`关键字来确保结果集中`Depart`(部门)列的值是唯一的,从而避免了重复的部门信息出现。 #### 3. 查询Student表的所有记录。 ```sql SELECT * FROM Student; ``` **解析**: `*`表示选取所有列,此语句返回`Student`表中的所有数据行。 #### 4. 查询Score表中成绩在60到80之间的所有记录。 ```sql SELECT * FROM Score WHERE Degree BETWEEN 60 AND 80; ``` **解析**: `BETWEEN`关键字用于选择介于两个值之间的数据行。此语句返回`Score`表中成绩(`Degree`)在60到80之间的所有记录。 #### 5. 查询Score表中成绩为85,86或88的记录。 ```sql SELECT * FROM Score WHERE Degree IN (85, 86, 88); ``` **解析**: `IN`关键字用于选择列的值属于特定集合的行。这里返回的是成绩为85、86或88的所有记录。 #### 6. 查询Student表中“95031”班或性别为“女”的同学记录。 ```sql SELECT * FROM Student WHERE Class = '95031' OR Sex = '女'; ``` **解析**: 此语句利用`OR`运算符结合两个条件:要么班级为“95031”,要么性别为“女”。 #### 7. 以Class降序查询Student表的所有记录。 ```sql SELECT * FROM Student ORDER BY Class DESC; ``` **解析**: `ORDER BY`子句用于对结果集进行排序,`DESC`关键字表示降序排序。该语句将根据班级(`Class`)进行降序排列。 #### 8. 以Cno升序、Degree降序查询Score表的所有记录。 ```sql SELECT * FROM Score ORDER BY Cno, Degree DESC; ``` **解析**: 同样使用`ORDER BY`子句进行排序,此处按照课程号(`Cno`)升序排列,若相同则再按成绩(`Degree`)降序排列。 #### 9. 查询“95031”班的学生人数。 ```sql SELECT COUNT(*) FROM Student WHERE Class = '95031'; ``` **解析**: `COUNT(*)`函数用于计算满足条件的行数,这里统计的是班级为“95031”的学生总数。 #### 10. 查询Score表中的最高分的学生学号和课程号。 ```sql SELECT Sno, Cno FROM Score WHERE Degree = (SELECT MAX(Degree) FROM Score); ``` **解析**: 子查询`(SELECT MAX(Degree) FROM Score)`用于找到最高分,外部查询则选取具有该最高分的学生学号(`Sno`)和课程号(`Cno`)。 #### 11. 查询‘3-105’号课程的平均分。 ```sql SELECT AVG(Score) FROM Score WHERE Cno = '3-105'; ``` **解析**: `AVG()`函数用于计算指定列的平均值。这里计算的是课程号为“3-105”的所有成绩的平均值。 #### 12. 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。 ```sql SELECT Cno, AVG(Degree) FROM Score WHERE Cno LIKE '3%' GROUP BY Cno HAVING COUNT(*) > 5; ``` **解析**: `LIKE`关键字用于模糊匹配,此处查找课程号以数字3开头的课程;`GROUP BY`用于分组,`HAVING`用于筛选分组后的数据。此语句首先按课程号(`Cno`)分组,然后计算每门课程的平均分,并仅保留至少有5名学生选修的那些课程。 #### 13. 查询最低分大于70,最高分小于90的Sno列。 ```sql SELECT Sno FROM Score GROUP BY Sno HAVING MIN(Degree) > 70 AND MAX(Degree) < 90; ``` **解析**: 通过`GROUP BY`对每个学生(`Sno`)进行分组,`HAVING`子句用来过滤出最低分大于70且最高分小于90的学生。 #### 14. 查询所有学生的Sname、Cno和Degree列。 ```sql SELECT Student.Sname, Score.Cno, Score.Degree FROM Student, Score WHERE Student.Sno = Score.Sno; ``` **解析**: 使用逗号连接两张表,基于学生学号(`Sno`)进行连接,以获取所有学生的姓名(`Sname`)、课程号(`Cno`)和成绩(`Degree`)。 #### 15. 查询所有学生的Sno、Cname和Degree列。 ```sql SELECT Student.Sno, Course.Cname, Score.Degree FROM Student, Course, Score WHERE Student.Sno = Score.Sno AND Course.Cno = Score.Cno; ``` **解析**: 连接三张表:`Student`、`Course`和`Score`,基于学号和课程号进行关联,以获取所有学生的学号、课程名和成绩。 #### 16. 查询所有学生的Sname、Cname和Degree列。 ```sql SELECT Student.Sname, Course.Cname, Score.Degree FROM Student, Course, Score WHERE Student.Sno = Score.Sno AND Course.Cno = Score.Cno; ``` **解析**: 类似上一条,但这里返回的是学生的姓名而不是学号。 #### 17. 查询“95033”班所选课程的平均分。 ```sql SELECT AVG(Score.Degree) FROM Student, Score WHERE Student.Class = '95033' AND Student.Sno = Score.Sno; ``` **解析**: 对`Student`表中班级为“95033”的学生进行筛选,并与`Score`表通过学号关联,最后计算这些学生的平均分。 #### 18. 查询所有同学的Sno、Cno和Rank列(基于创建的grade表)。 ```sql SELECT Score.Sno, Score.Cno, Grade.rank FROM Score, Grade WHERE Score.Degree BETWEEN Grade.low AND Grade.upp; ``` **解析**: 使用`BETWEEN`来匹配`Score`表中的成绩与`Grade`表中的成绩区间,以此来确定每个成绩对应的等级(`rank`)。 #### 19. 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 ```sql SELECT X.Cno, X.Sno, X.Degree FROM Score X, Score Y WHERE X.Cno = '3-105' AND X.Degree > Y.Degree AND Y.Sno = '109'; ``` **解析**: 使用两个`Score`表别名X和Y进行比较,找出所有在课程“3-105”中成绩高于学生“109”的同学。 #### 20. 查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。 ```sql SELECT * FROM Score WHERE Degree < (SELECT MAX(Degree) FROM Score GROUP BY Sno HAVING COUNT(Cno) > 1); ``` **解析**: 子查询用于找到选修多门课程的学生中的最高分,外部查询则筛选出这些学生的非最高分成绩。 #### 21. 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 ```sql SELECT X.Cno, X.Sno, X.Degree FROM Score X, Score Y WHERE X.Degree > Y.Degree AND Y.Sno = '109' AND Y.Cno = '3-105'; ``` **解析**: 与第19题类似,这里比较的是所有学生在任意课程上的成绩是否高于特定学生在特定课程上的成绩。 #### 22. 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 ```sql SELECT Sno, Sname, Sbirthday FROM Student WHERE EXTRACT(YEAR FROM Sbirthday) = (SELECT EXTRACT(YEAR FROM Sbirthday) FROM Student WHERE Sno = '108'); ``` **解析**: 使用`EXTRACT`函数提取出生日期中的年份,并通过子查询比较与学号为“108”的学生的出生年份是否相同。 #### 23. 查询“张旭”教师任课的学生成绩。 ```sql SELECT Score.Sno, Score.Cno, Score.Degree FROM Score, Teacher, Course WHERE Teacher.Tname = '张旭' AND Teacher.Depart = Course.Tdept AND Course.Cno = Score.Cno; ``` **解析**: 通过`Teacher`表中的教师名字筛选,再通过`Course`表连接到`Score`表,以获取由“张旭”教师授课的所有学生的成绩。 #### 24. 查询选修某课程的同学人数多于5人的教师姓名。 ```sql SELECT DISTINCT Tname FROM Teacher, Course, Score WHERE Teacher.Depart = Course.Tdept AND Course.Cno = Score.Cno GROUP BY Teacher.Tname HAVING COUNT(Score.Sno) > 5; ``` **解析**: 首先通过连接`Teacher`、`Course`和`Score`表,再按教师姓名分组,并筛选出每门课程选修人数超过5人的教师姓名。 #### 25. 查询95033班和95031班全体学生的记录。 ```sql SELECT * FROM Student WHERE Class = '95033' OR Class = '95031'; ``` **解析**: 直接使用`WHERE`子句筛选出班级为“95033”或“95031”的所有学生信息。 #### 26. 查询存在有85分以上成绩的课程Cno. ```sql SELECT Cno FROM Score WHERE Degree >= 85 GROUP BY Cno; ``` **解析**: 通过`GROUP BY`对每门课程进行分组,并筛选出所有成绩在85分以上的课程号。 #### 27. 查询出“计算机系”教师所教课程的成绩表。 ```sql SELECT Score.Sno, Score.Cno, Score.Degree FROM Score, Course, Teacher WHERE Teacher.Prof = '计算机系' AND Teacher.Depart = Course.Tdept AND Course.Cno = Score.Cno; ``` **解析**: 先根据教师所在系别进行筛选,再通过课程表连接到成绩表,以获取所有由“计算机系”教师授课的成绩信息。 #### 28. 查询“计算机系”与“电子工程系”不同职称的教师的Tname和Prof。 ```sql SELECT Tname, Prof FROM Teacher WHERE Prof IN ('计算机系', '电子工程系') GROUP BY Prof, Tname HAVING COUNT(Tname) > 1; ``` **解析**: 通过`IN`关键字筛选出这两个系别的教师,再按职称分组,最后筛选出职称相同的教师姓名。 #### 29. 查询选修编号为“3-105”课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree。 ```sql SELECT X.Cno, X.Sno, X.Degree FROM Score X, Score Y WHERE X.Cno = '3-105' AND X.Degree > Y.Degree AND Y.Cno = '3-245'; ``` **解析**: 通过两个`Score`表的连接和比较,找出课程“3-105”中成绩高于课程“3-245”中的所有学生的记录。
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助