2015-11-05 68 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 
; 

編輯:像戈登,我更喜歡明確連接,你可以從我的答案見。但據我所知,性能沒有差別。