我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到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 |