我們可以根據學生與課程多對多關系的數據庫模型,給出實際的表數據以及對應的查詢結果示例,會用到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 |