用集合查询实现同时讲授过07294003和07295007两门课的老师的工号。
时间: 2023-12-14 21:40:21 浏览: 32
假设有两个表,一个是老师表(teacher),包含工号(id)和姓名(name)两个字段;另一个是课程表(course),包含课程号(course_id)、课程名称(course_name)和授课老师的工号(teacher_id)三个字段。
可以使用如下 SQL 语句实现查询同时讲授过07294003和07295007两门课的老师的工号:
```
SELECT teacher.id
FROM teacher
JOIN course ON teacher.id = course.teacher_id
WHERE course.course_id IN ('07294003', '07295007')
GROUP BY teacher.id
HAVING COUNT(DISTINCT course.course_id) = 2;
```
解释一下这个 SQL 语句的意思:
- 首先通过 JOIN 将老师表和课程表连接起来,然后通过 WHERE 子句过滤掉只讲授了其中一门课程或其他课程的老师;
- 接着通过 GROUP BY 子句对老师工号进行分组;
- 最后使用 HAVING 子句,选出同时讲授了两门指定课程的老师。注意这里使用了 COUNT(DISTINCT course.course_id),因为可能存在一位老师同时讲授了多个编号相同的课程,这样就无法通过简单的 COUNT(course.course_id) 来判断是否讲授了两门课程了。
相关问题
查询至少讲授两门课程的教师姓名和其所在的系
可以使用如下 SQL 语句查询至少讲授两门课程的教师姓名和其所在的系:
```
SELECT T.TName, T.TDept
FROM T
WHERE T.Tno IN (
SELECT C.Tno
FROM C
GROUP BY C.Tno
HAVING COUNT(DISTINCT C.Cno) >= 2
);
```
其中,`T` 是教师情况表的表名,`C` 是课程基本表的表名。在这条 SQL 语句中,我们使用子查询来找到至少讲授两门课程的教师的编号,然后将这些编号与教师情况表进行连接,得到这些教师的姓名和所在系。子查询中的 `GROUP BY` 和 `HAVING` 子句用于统计每个教师讲授的不同课程数量,并筛选出讲授至少两门不同课程的教师。
查询没学过"张珊"老师讲授的任一门课程的学生姓名 查询到张珊老师讲的课程
这个问题和上一个问题是相反的,需要查询所有学过其他老师讲授的课程,但是没有学过张珊老师讲授的课程的学生姓名,并查询出张珊老师讲授的课程。假设我们有以下三张表:
1. 学生表(student):包含学生的信息,如学生ID、姓名等。
2. 课程表(course):包含课程的信息,如课程ID、课程名称等。
3. 教师表(teacher):包含教师的信息,如教师ID、姓名等。
这三张表之间可以通过两个中间表(选课表和授课表)来建立关联,中间表的结构如下:
4. 选课表(select_course):包含学生ID和课程ID,表示学生选了哪些课程。
5. 授课表(teach_course):包含教师ID和课程ID,表示教师讲授了哪些课程。
我们需要查询的是所有学过其他老师讲授的课程,但是没有学过张珊老师讲授的课程的学生姓名,并查询出张珊老师讲授的课程,那么我们可以按照以下步骤进行查询:
1. 首先,我们需要找到张珊老师所讲授的所有课程。假设张珊老师的教师ID为1,那么我们可以通过以下SQL语句查询到所有张珊老师讲授的课程:
```
SELECT course_id FROM teach_course WHERE teacher_id = 1;
```
2. 然后,我们需要查询所有学过其他老师讲授的课程,但是没有学过张珊老师讲授的课程的学生姓名。假设我们要查询的是学生姓名,那么我们可以通过以下SQL语句查询:
```
SELECT student.name FROM student WHERE student.id IN
(SELECT select_course.student_id FROM select_course
WHERE select_course.course_id IN
(SELECT teach_course.course_id FROM teach_course WHERE teach_course.teacher_id <> 1)
AND select_course.student_id NOT IN
(SELECT select_course.student_id FROM select_course
WHERE select_course.course_id IN
(SELECT teach_course.course_id FROM teach_course WHERE teach_course.teacher_id = 1)));
```
这条SQL语句的意思是:先查询出所有其他老师讲授的课程ID,然后在选课表中查询出学过这些课程但是没有学过张珊老师讲授的课程的学生ID,最后在学生表中查询出这些学生的姓名。
3. 最后,我们需要查询出张珊老师讲授的课程。假设我们要查询的是课程名称,那么我们可以通过以下SQL语句查询:
```
SELECT course.name FROM course WHERE course.id IN
(SELECT teach_course.course_id FROM teach_course WHERE teach_course.teacher_id = 1);
```
这条SQL语句的意思是:在授课表中查询出张珊老师讲授的课程ID,然后在课程表中查询出这些课程的名称。
这就是一个稍微复杂一些的多表关联查询的例子。希望能对你有所帮助。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)