2015-11-05 87 views
1

考虑下表:MySQL的SELECT左外连接涉案金额超过2个表

学生((PK)studentID,名字,姓氏,性别,出生日期)

课程((PK)courseCode, courseName,classLevel,信用)

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

我想写的是抓住INF查询Ø为每一个学生(Students.studentIDStudents.firstNameStudents.lastName),他们的课程信息(Courses.courseName)和等级(Registration.grade),包括谁学生AREN没有注册类的课程名称和成绩栏中为这些学生返回空值。

据我所知(我还在学习很多),这将需要类似:

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 
; 

我知道这不好,我得到一个“未知列C.courseCode”的错误,所以,语法显然是关闭的,但这是接近我所能达到我认为需要的样子。

回答

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; 
+0

感谢您的帮助。我仍然试图将我在SQL中的工作从我在C中的背景中分离出来(这不断让我兴奋不已)。这工作完美。 何时何时建立别名时不使用“AS”有什么区别?它只是喜欢什么时候缩进等 – user3776749

+1

“可选的。大多数程序员将指定AS关键字时,别名列名,但不别名时表别名。” (见http://www.techonthenet.com/mysql/alias.php) –

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 
; 

编辑:像戈登,我更喜欢明确连接,你可以从我的答案见。但据我所知,性能没有差别。