SQL中体会多对多


我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到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。这样就得到了一个包含 studentsstudent_coursescourses 表中相关信息的新临时结果集。

最后,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

你可能感兴趣的:(sql,数据库)