假设有以下四个表: 学生表 Student:包含学生的学号和姓名。 课程表 Course:包含课程的编号和教师工号。 教师表 Teacher:包含教师的工号和姓名。 成绩表 score:包含学号、课程号 四个表联合查询 查询没学过"王二"老师讲授的任一门课程的学生姓
时间: 2024-05-08 15:22:12 浏览: 167
学生、课程、老师、成绩表含数据
姓氏。
可以使用以下 SQL 语句进行查询:
```sql
SELECT DISTINCT LEFT(s.name, 1) as surname
FROM Student s
WHERE s.id NOT IN (
SELECT DISTINCT sc.id
FROM Student sc
JOIN score c ON sc.id = c.sid
JOIN Course co ON c.cid = co.id
JOIN Teacher t ON co.tid = t.id
WHERE t.name = '王二'
)
```
解释一下这个 SQL 语句:
首先从学生表 `Student` 中查询所有学生的姓名,使用 `LEFT(s.name, 1)` 取出姓氏的第一个字符。
然后使用 `NOT IN` 子句排除掉选过 "王二" 老师任课的学生,这个子句的内部查询涉及到了多个表的联合查询:
- 学生表 `Student`
- 成绩表 `score`
- 课程表 `Course`
- 教师表 `Teacher`
具体地,内部查询的过程是这样的:
1. 从学生表 `Student` 中查询所有学生的学号 `id`。
2. 通过成绩表 `score` 将选过课程的学生筛选出来,即查询所有成绩表中的学号 `sid`。
3. 通过课程表 `Course` 将选过 "王二" 老师教授的课程筛选出来,即查询所有课程表中的课程号 `cid`。
4. 通过教师表 `Teacher` 将 "王二" 老师的工号筛选出来,即查询教师表中的工号 `tid`。
5. 将上述四个表联合查询,找到所有选过 "王二" 老师任课的学生的学号。
6. 最后使用 `NOT IN` 子句将这些学生排除掉。
最终,查询结果是所有没有选过 "王二" 老师任课的学生的姓氏的第一个字符。
阅读全文