上传者: zhangao_fengg
|
上传时间: 2025-07-20 11:33:17
|
文件大小: 35KB
|
文件类型: DOC
根据提供的文档信息,我们可以将其中涉及的SQL习题进行详细解析,从而提炼出与数据库相关的知识点。下面将针对每一个题目进行详细的分析与解答,并解释其背后的数据库操作原理。
### SQL习题解析
#### 1. 查询Student表中的所有记录的Sname、Ssex和Class列。
- **SQL语句**:
```sql
SELECT Sname, Ssex, Class FROM Student;
```
- **知识点**:此题考查的是基本的`SELECT`语句,用于从指定表(这里是`Student`)中选择特定的列(这里选择了`Sname`、`Ssex`和`Class`)。
#### 2. 查询教师所有的单位即不重复的Depart列。
- **SQL语句**:
```sql
SELECT DISTINCT Depart FROM Teacher;
```
- **知识点**:`DISTINCT`关键字用于返回唯一不同的值。本题中通过`DISTINCT`去除了`Depart`列中的重复值。
#### 3. 查询Student表的所有记录。
- **SQL语句**:
```sql
SELECT * FROM Student;
```
- **知识点**:`*`表示选择所有列。此题要求查询整个`Student`表的所有数据行。
#### 4. 查询Score表中成绩在60到80之间的所有记录。
- **SQL语句**:
```sql
SELECT * FROM Score WHERE Degree BETWEEN 60 AND 80;
```
- **知识点**:`BETWEEN`关键字用于选取介于两个值之间的数据范围。这里指定了成绩范围为60到80分。
#### 5. 查询Score表中成绩为85,86或88的记录。
- **SQL语句**:
```sql
SELECT * FROM Score WHERE Degree IN (85, 86, 88);
```
- **知识点**:`IN`关键字用于列出一个列表,在这个列表中的任何值都可以被匹配。这里用于选择成绩为85、86或88的记录。
#### 6. 查询Student表中“95031”班或性别为“女”的同学记录。
- **SQL语句**:
```sql
SELECT * FROM Student WHERE Class = '95031' OR Ssex = '女';
```
- **知识点**:使用`OR`逻辑运算符来组合多个条件。此题中同时考虑了班级和性别两个条件。
#### 7. 以Class降序查询Student表的所有记录。
- **SQL语句**:
```sql
SELECT * FROM Student ORDER BY Class DESC;
```
- **知识点**:`ORDER BY`子句用于对结果集进行排序。`DESC`关键字表示降序排列。
#### 8. 以Cno升序、Degree降序查询Score表的所有记录。
- **SQL语句**:
```sql
SELECT * FROM Score ORDER BY Cno ASC, Degree DESC;
```
- **知识点**:`ORDER BY`可以接受多个字段,先按照`Cno`升序排序,如果`Cno`相同则按照`Degree`降序排序。
#### 9. 查询“95031”班的学生人数。
- **SQL语句**:
```sql
SELECT COUNT(*) FROM Student WHERE Class = '95031';
```
- **知识点**:`COUNT(*)`函数用于计算满足条件的行数,此处用于统计“95031”班的学生总数。
#### 10. 查询Score表中的最高分的学生学号和课程号。
- **SQL语句**:
```sql
SELECT Sno, Cno FROM Score WHERE Degree = (SELECT MAX(Degree) FROM Score);
```
- **知识点**:子查询的应用,外层查询返回最高分对应的学生学号和课程号,内层查询找出最高分。
#### 11. 查询“3-105”号课程的平均分。
- **SQL语句**:
```sql
SELECT AVG(Degree) FROM Score WHERE Cno = '3-105';
```
- **知识点**:`AVG()`函数用于计算平均值,这里计算了特定课程号下的平均成绩。
#### 12. 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
- **SQL语句**:
```sql
SELECT AVG(Degree) FROM Score WHERE Cno LIKE '3%' GROUP BY Cno HAVING COUNT(*) >= 5;
```
- **知识点**:`LIKE`关键字用于模糊匹配,`GROUP BY`用于对结果集进行分组,`HAVING`子句用于过滤分组后的结果,确保每组至少包含5个记录。
#### 13. 查询最低分大于70,最高分小于90的Sno列。
- **SQL语句**:
```sql
SELECT Sno FROM Score GROUP BY Sno HAVING MIN(Degree) > 70 AND MAX(Degree) < 90;
```
- **知识点**:使用`MIN()`和`MAX()`函数结合`HAVING`子句来筛选满足条件的分组。
#### 14. 查询所有学生的Sname、Cno和Degree列。
- **SQL语句**:
```sql
SELECT Sname, Cno, Degree FROM Student JOIN Score ON Student.Sno = Score.Sno;
```
- **知识点**:使用`JOIN`操作连接两个表。此题要求查询学生名字、课程号和成绩,需要从`Student`表和`Score`表中获取信息。
#### 15. 查询所有学生的Sno、Cname和Degree列。
- **SQL语句**:
```sql
SELECT Student.Sno, Course.Cname, Score.Degree FROM Student JOIN Score ON Student.Sno = Score.Sno JOIN Course ON Score.Cno = Course.Cno;
```
- **知识点**:多表连接操作。这里连接了`Student`、`Score`和`Course`三个表,用于查询学生的学号、课程名称和成绩。
#### 16. 查询所有学生的Sname、Cname和Degree列。
- **SQL语句**:
```sql
SELECT Student.Sname, Course.Cname, Score.Degree FROM Student JOIN Score ON Student.Sno = Score.Sno JOIN Course ON Score.Cno = Course.Cno;
```
- **知识点**:多表连接操作。与上一题类似,但是查询的内容是学生的姓名、课程名称和成绩。
#### 17. 查询“95033”班所选课程的平均分。
- **SQL语句**:
```sql
SELECT AVG(Score.Degree) FROM Student JOIN Score ON Student.Sno = Score.Sno WHERE Student.Class = '95033';
```
- **知识点**:表连接与条件筛选结合。这里先连接`Student`和`Score`表,然后通过`WHERE`子句筛选出特定班级的学生,并计算这些学生所选课程的平均分。
#### 18. 假设使用如下命令建立了一个grade表:
- **知识点**:`CREATE TABLE`用于创建新表,`INSERT INTO`用于向表中插入数据。
- 创建grade表后,可以通过以下SQL语句查询所有同学的Sno、Cno和rank列:
```sql
SELECT Score.Sno, Score.Cno, Grade.rank FROM Score JOIN Grade ON Score.Degree BETWEEN Grade.low AND Grade.upp;
```
- **知识点**:使用`BETWEEN`和`JOIN`操作来匹配`Score`表中的成绩与`Grade`表中的等级区间,从而得到学生的学号、课程号和对应的等级。
#### 19. 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
- **SQL语句**:
```sql
SELECT * FROM Score WHERE Cno = '3-105' AND Degree > (SELECT Degree FROM Score WHERE Sno = '109' AND Cno = '3-105');
```
- **知识点**:使用子查询来比较成绩,找到所有选修同一课程但成绩高于特定同学的成绩记录。
#### 20. 查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
- **SQL语句**:
```sql
SELECT * FROM Score WHERE Sno IN (SELECT Sno FROM Score GROUP BY Sno HAVING COUNT(*) > 1) AND Degree != (SELECT MAX(Degree) FROM Score WHERE Sno = Score.Sno);
```
- **知识点**:使用子查询和`IN`操作来找出选修多门课程的同学,然后通过比较成绩来筛选出非最高分的记录。
#### 21. 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
- **SQL语句**:
```sql
SELECT * FROM Score WHERE Degree > (SELECT Degree FROM Score WHERE Sno = '109' AND Cno = '3-105');
```
- **知识点**:使用子查询来比较成绩,找出所有成绩高于特定学号和课程号成绩的记录。
#### 22. 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
- **SQL语句**:
```sql
SELECT Sno, Sname, Sbirthday FROM Student WHERE YEAR(Sbirthday) = (SELECT YEAR(Sbirthday) FROM Student WHERE Sno = '108');
```
- **知识点**:使用`YEAR()`函数来提取出生日期中的年份,并通过子查询比较年份来找出同年出生的同学。
#### 23. 查询“张旭”教师任课的学生成绩。
- **SQL语句**:
```sql
SELECT Student.Sname, Score.Degree FROM Student JOIN Score ON Student.Sno = Score.Sno JOIN Course ON Score.Cno = Course.Cno JOIN Teacher ON Course.Tno = Teacher.Tno WHERE Teacher.Tname = '张旭';
```
- **知识点**:多表连接操作。这里连接了`Student`、`Score`、`Course`和`Teacher`四个表,用于查询特定教师任课的学生成绩。
#### 24. 查询选修某课程的同学人数多于5人的教师姓名。
- **SQL语句**:
```sql
SELECT Teacher.Tname FROM Teacher JOIN Course ON Teacher.Tno = Course.Tno JOIN Score ON Course.Cno = Score.Cno GROUP BY Teacher.Tname HAVING COUNT(DISTINCT Score.Sno) > 5;
```
- **知识点**:多表连接和分组操作。这里需要统计每位教师任课课程中选课人数超过5人的记录。
#### 25. 查询95033班和95031班全体学生的记录。
- **SQL语句**:
```sql
SELECT * FROM Student WHERE Class IN ('95033', '95031');
```
- **知识点**:使用`IN`操作来匹配多个班级。
#### 26. 查询存在有85分以上成绩的课程Cno。
- **SQL语句**:
```sql
SELECT DISTINCT Cno FROM Score WHERE Degree >= 85;
```
- **知识点**:使用`DISTINCT`关键字去除重复的课程号,并通过条件筛选找出所有成绩不低于85分的课程。
#### 27. 查询出“计算机系”教师所教课程的成绩表。
- **SQL语句**:
```sql
SELECT Student.Sname, Score.Degree FROM Student JOIN Score ON Student.Sno = Score.Sno JOIN Course ON Score.Cno = Course.Cno JOIN Teacher ON Course.Tno = Teacher.Tno WHERE Teacher.Depart = '计算机系';
```
- **知识点**:多表连接操作。这里连接了`Student`、`Score`、`Course`和`Teacher`四个表,用于查询特定系别教师所教课程的学生成绩。
#### 28. 查询“计算机系”与“电子工程系”不同职称的教师的Tname和Prof。
- **SQL语句**:
```sql
SELECT Tname, Prof FROM Teacher WHERE Depart IN ('计算机系', '电子工程系') GROUP BY Tname, Prof HAVING COUNT(DISTINCT Depart) = 2;
```
- **知识点**:使用`GROUP BY`和`HAVING`子句来筛选出两个不同系别中的不同职称教师。
#### 29. 查询选修编号为“3-105”课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
- **SQL语句**:
```sql
SELECT Cno, Sno, Degree FROM Score WHERE Cno = '3-105' AND Degree > (SELECT MAX(Degree) FROM Score WHERE Cno = '3-245') ORDER BY Degree DESC;
```
- **知识点**:使用子查询和`ORDER BY`子句来筛选和排序成绩。
#### 30. 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree。
- **SQL语句**:
```sql
SELECT Cno, Sno, Degree FROM Score WHERE Cno = '3-105' AND Degree > (SELECT MAX(Degree) FROM Score WHERE Cno = '3-245');
```
- **知识点**:使用子查询来比较不同课程的成绩。
#### 31. 查询所有教师和同学的name、sex和birthday。
- **SQL语句**:
```sql
SELECT name, sex, birthday FROM Student UNION ALL SELECT name, sex, birthday FROM Teacher;
```
- **知识点**:使用`UNION ALL`操作来合并两个表中的结果,不去除重复行。
#### 32. 查询所有“女”教师和“女”同学的name、sex和birthday。
- **SQL语句**:
```sql
SELECT name, sex, birthday FROM Student WHERE sex = '女' UNION ALL SELECT name, sex, birthday FROM Teacher WHERE sex = '女';
```
- **知识点**:使用`UNION ALL`和`WHERE`子句来筛选特定性别的学生和教师的信息。
#### 33. 查询成绩比该课程平均成绩低的同学的成绩表。
- **SQL语句**:
```sql
SELECT * FROM Score WHERE Degree < (SELECT AVG(Degree) FROM Score WHERE Cno = Score.Cno GROUP BY Cno);
```
- **知识点**:使用子查询来计算每门课程的平均成绩,并与当前成绩进行比较。
#### 34. 查询所有任课教师的Tname和Depart。
- **SQL语句**:
```sql
SELECT Teacher.Tname, Teacher.Depart FROM Teacher JOIN Course ON Teacher.Tno = Course.Tno;
```
- **知识点**:使用`JOIN`操作来连接`Teacher`和`Course`表,获取所有任课教师的信息。
#### 35. 查询所有未讲课的教师的Tname和Depart。
- **SQL语句**:
```sql
SELECT Tname, Depart FROM Teacher LEFT JOIN Course ON Teacher.Tno = Course.Tno WHERE Course.Tno IS NULL;
```
- **知识点**:使用`LEFT JOIN`和`WHERE`子句来找出没有关联课程的教师信息。
#### 36. 查询至少有2名男生的班号。
- **SQL语句**:
```sql
SELECT Class FROM Student WHERE Ssex = '男' GROUP BY Class HAVING COUNT(*) >= 2;
```
- **知识点**:使用`GROUP BY`和`HAVING`子句来统计每班男生的人数,并筛选出至少有2名男生的班级。
#### 37. 查询Student表中不姓“王”的同学记录。
- **SQL语句**:
```sql
SELECT * FROM Student WHERE Sname NOT LIKE '王%';
```
- **知识点**:使用`NOT LIKE`操作来排除姓“王”的学生记录。
#### 38. 查询Student表中每个学生的姓名和年龄。
- **SQL语句**:
```sql
SELECT Sname, YEAR(CURDATE()) - YEAR(Sbirthday) AS Age FROM Student;
```
- **知识点**:使用`YEAR()`函数和`CURDATE()`函数来计算当前日期与出生日期之间的差值,得出年龄。
#### 39. 查询Student表中最大和最小的Sbirthday日期值。
- **SQL语句**:
```sql
SELECT MIN(Sbirthday) AS MinBirthday, MAX(Sbirthday) AS MaxBirthday FROM Student;
```
- **知识点**:使用`MIN()`和`MAX()`函数来找出表中最早和最晚的生日日期。
#### 40. 以班号和年龄从大到小的顺序查询Student表中的全部记录。
- **SQL语句**:
```sql
SELECT *, YEAR(CURDATE()) - YEAR(Sbirthday) AS Age FROM Student ORDER BY Class DESC, Age DESC;
```
- **知识点**:使用`ORDER BY`子句来排序结果集,同时使用`YEAR()`函数和`CURDATE()`函数计算年龄。
#### 41. 查询“男”教师及其所上的课程。
- **SQL语句**:
```sql
SELECT Teacher.Tname, Course.Cname FROM Teacher JOIN Course ON Teacher.Tno = Course.Tno WHERE Teacher.Ssex = '男';
```
- **知识点**:使用`JOIN`操作和`WHERE`子句来查询特定性别的教师及其教授的课程。
#### 42. 查询最高分同学的Sno、Cno和Degree列。
- **SQL语句**:
```sql
SELECT Sno, Cno, Degree FROM Score WHERE Degree = (SELECT MAX(Degree) FROM Score);
```
- **知识点**:使用子查询来找出最高分,并返回相应的学生学号、课程号和成绩。
#### 43. 查询和“李军”同性别的所有同学的Sname。
- **SQL语句**:
```sql
SELECT Sname FROM Student WHERE Ssex = (SELECT Ssex FROM Student WHERE Sname = '李军');
```
- **知识点**:使用子查询来比较性别,找出与特定人同性别的人。
#### 44. 查询和“李军”同性别并同班的同学Sname。
- **SQL语句**:
```sql
SELECT Sname FROM Student WHERE Ssex = (SELECT Ssex FROM Student WHERE Sname = '李军') AND Class = (SELECT Class FROM Student WHERE Sname = '李军');
```
- **知识点**:使用多个子查询来匹配特定的性别和班级,找出符合条件的学生。
#### 45. 查询所有选修“计算机导论”课程的“男”同学的成绩表。
- **SQL语句**:
```sql
SELECT Student.Sname, Score.Degree FROM Student JOIN Score ON Student.Sno = Score.Sno JOIN Course ON Score.Cno = Course.Cno WHERE Course.Cname = '计算机导论' AND Student.Ssex = '男';
```
- **知识点**:多表连接操作。这里连接了`Student`、`Score`和`Course`三个表,用于查询特定性别和课程的学生信息。
通过以上详细的解析,我们不仅能够了解每个SQL习题的具体解答方法,还能够深入理解SQL语言中的各种关键概念和操作技巧,这对于学习和掌握数据库技术至关重要。