鉴于以下表格:
学生((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'错误,所以语法显然已经关闭了,但这与我认为它需要看起来一样接近。
答案 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;