mySQL选择包含2个以上表的左外部联接

mySQL选择包含2个以上表的左外部联接,mysql,join,Mysql,Join,鉴于下表: 学生((PK)学生ID、名、姓、性别、出生日期) 课程((PK)课程代码、课程名称、班级级别、学分) 注册((主键,FK)学生ID,(主键,FK)课程代码,年级) 我想写一个查询,获取每个学生的信息(学生.studentID,学生.firstName,学生.lastName),他们的课程信息(课程.courseName)和年级(注册.grade),包括未注册课程的学生,这些学生在courseName和grade列中返回空值 据我所知(我仍在学习很多),这需要: 学生离开外部连接[一些

鉴于下表:

学生((PK)学生ID、名、姓、性别、出生日期)

课程((PK)课程代码、课程名称、班级级别、学分)

注册((主键,FK)学生ID,(主键,FK)课程代码,年级)

我想写一个查询,获取每个学生的信息(学生.studentID学生.firstName学生.lastName),他们的课程信息(课程.courseName)和年级(注册.grade),包括未注册课程的学生,这些学生在courseName和grade列中返回空值

据我所知(我仍在学习很多),这需要:

学生离开外部连接[一些课程和注册的集合]

但我不确定如何使用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”错误,所以语法显然是错误的,但这是我所能得到的最接近我认为它需要的样子。

这就是你需要的吗?(我更喜欢左连接,因为它比左外连接短,但它们是一样的。)


编辑:像Gordon一样,我更喜欢显式连接,正如你从我的回答中看到的那样。但是,据我所知,性能没有差别。

当您使用
左连接时,请从包含所有要保留的行的表开始。在这种情况下,
学生
。然后在所有其他表上使用
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;

谢谢你的帮助。我仍在试图将我在SQL方面的工作与我多年在C方面的背景(这一直在把我搞砸)分开。这很有效。在建立别名时,何时和何时不使用“AS”有什么区别吗?是否只是首选项,如何时缩进等“可选。大多数程序员在别名列名时会指定AS关键字,但在别名表名时不会指定AS关键字。”(请参阅)
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;