
我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到JOIN``LEFT JOIN两种连接
1. 学生表(students)
| student_id | student_name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
2. 课程表(courses)
| course_id | course_name |
|---|---|
| 1 | 数学 |
| 2 | 英语 |
| 3 | 物理 |
3. 选课表(student_courses)
| id | student_id | course_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 1 |
| 6 | 3 | 3 |
4. 查询每个学生选修的课程
查询语句
SELECT s.student_name,c.course_name
FROM students s
JOIN student_courses sc ON s.student_id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id
ORDER BY s.student_name;
对于这个查询,会先将 students 表和 student_courses 表进行连接,连接条件是 s.student_id = sc.student_id。这一步会生成一个临时结果集,其中包含了 students 表和 student_courses 表中 student_id 匹配的所有行。
接着,将这个临时结果集再和 courses 表进行连接,连接条件是 sc.course_id = c.course_id。这样就得到了一个包含 students、student_courses 和 courses 表中相关信息的新临时结果集。
最后,SELECT语句对新临时结果集进行选择
查询结果:
| student_name | course_name |
|---|---|
| 张三 | 数学 |
| 张三 | 英语 |
| 李四 | 英语 |
| 李四 | 物理 |
| 王五 | 数学 |
| 王五 | 物理 |
5. 查询选修了某门课程的所有学生
查询语句:
SELECT s.student_name
FROM students s
JOIN student_courses sc ON s.student_id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id
WHERE c.course_name = '数学';
查询结果:
| student_name |
|---|
| 张三 |
| 王五 |
6. 查询每个课程的选课人数
查询语句:
SELECT c.course_name,COUNT(sc.student_id) AS enrollment_count
FROM courses c
LEFT JOIN student_courses sc ON c.course_id = sc.course_id
GROUP BY c.course_name;
查询结果:
| course_name | enrollment_count |
|---|---|
| 数学 | 2 |
| 英语 | 2 |
| 物理 | 2 |
