MySQL多对多关系查询:获取学生所选课程及指定ID课程名称
嘿,刚入门MySQL就啃多对多关系,这可是面试里的常客,选得好!咱们对着你给出的三张表,一步步搞定这两个查询需求~
先确认下三张表的核心结构(避免理解偏差):
- Student表:存学生基本信息,主键为
student_id - Courses表:存课程信息,主键为
course_id - Student_Courses:中间关联表,靠
student_id和course_id的组合关联学生与课程,这两个字段一般设为联合主键
需求1:查询某学生所选的所有课程
这里的“某学生”可以通过姓名或studentID定位,两种场景的写法都给你:
按学生姓名查询
SELECT c.* -- *返回课程所有字段,也可指定具体字段如`course_id, course_name` FROM Student s INNER JOIN Student_Courses sc ON s.student_id = sc.student_id INNER JOIN Courses c ON sc.course_id = c.course_id WHERE s.name = '张三'; -- 替换为目标学生姓名
按学生ID查询(更精准,避免姓名重复)
SELECT c.* FROM Student_Courses sc INNER JOIN Courses c ON sc.course_id = c.course_id WHERE sc.student_id = 1001; -- 替换为目标学生ID
逻辑说明:多对多关系的核心是中间表Student_Courses,它是学生和课程之间的桥梁。用INNER JOIN能确保只返回该学生实际选过的课程,不会出现无关联的无效数据。
需求2:给定studentID,返回该学生所选的所有课程名称
这是需求1的简化版,只需要提取课程名称,调整SELECT字段即可:
SELECT c.course_name FROM Student_Courses sc INNER JOIN Courses c ON sc.course_id = c.course_id WHERE sc.student_id = 1001;
如果想更严谨(防止关联表中存在无效的studentID),可以加上与Student表的关联校验:
SELECT c.course_name FROM Student s INNER JOIN Student_Courses sc ON s.student_id = sc.student_id INNER JOIN Courses c ON sc.course_id = c.course_id WHERE s.student_id = 1001;
小拓展:面试里还可能延伸类似问题,比如“查询没有选任何课程的学生”“查询某门课程的所有学生”,核心逻辑都是用JOIN/LEFT JOIN配合WHERE条件,你可以顺着这个思路多练练~
内容的提问来源于stack exchange,提问作者Zack King
相关产品推荐
相关产品推荐

