mySQL SELECT Left Outer Join涉及2个以上的表

时间:2015-11-05 01:27:56

标签: mysql join

鉴于以下表格:

  

学生((PK)studentID,firstName,lastName,gender,dateOfBirth)

     

课程((PK)courseCode,courseName,classLevel,credit)

     

注册((PK,FK)studentID,(PK,FK)courseCode,年级)

我想写一个查询来抓取每个学生的信息( Students.studentID Students.firstName Students.lastName ),他们的课程信息( Courses.courseName )和成绩( Registration.grade ),包括未注册课程的学生在这些学生的courseName和grade列中返回null值。

据我所知(我还在学习很多),这将需要以下内容:

Students LEFT OUTER JOIN [some aggregate of Courses and Registration]

但我不确定如何使用mySQL语法对其进行格式化。

这就是我所拥有的:

SELECT S.studentID, S.firstName, S.lastName, C.courseName, R.grade
    FROM Courses AS C, Students AS S
    LEFT OUTER JOIN Registration AS R ON S.studentID = R.studentID
    AND R.courseCode = C.courseCode
ORDER BY S.studentID
;

我知道它不正确我得到了一个'Unknown Column C.courseCode'错误,所以语法显然已经关闭了,但这与我认为它需要看起来一样接近。

2 个答案:

答案 0 :(得分:1)

这是你需要的吗? (我更喜欢LEFT JOIN,因为它比LEFT OUTER JOIN短,但它们是相同的。)

SELECT S.studentID, S.firstName, S.lastName, C.courseName, R.grade
    FROM Students AS S
    LEFT JOIN Registration AS R ON S.studentID = R.studentID
    LEFT JOIN Courses AS C ON R.courseCode = C.courseCode
ORDER BY S.studentID
;

编辑:和戈登一样,我更喜欢明确的联接,你可以从我的回答中看到。但是,据我所知,性能没有差异。

答案 1 :(得分:1)

使用left join时,请从包含要保留的所有行的表开始。在这种情况下,students。然后在所有其他表上使用left join

此外,从不from子句中使用逗号。 始终使用明确的join语法。

因此,您的查询应如下所示:

SELECT S.studentID, S.firstName, S.lastName, C.courseName, R.grade
FROM Students S LEFT OUTER JOIN
     Registration R
     ON S.studentID = R.studentID LEFT OUTER JOIN
     Courses AS C, 
     ON R.courseCode = C.courseCode
ORDER BY S.studentID;