2016-11-13 35 views
0

我正在學習一門SQL課程,並且遇到麻煩,理解我的教授給出的一個示例,我們的表中通常會有很多錯誤,我們必須糾正,但在這裏我認爲它可能來自我明顯無知這個問題。未知的SQL語法

所以數據庫包含像這樣有組織的三個表:

Student (StudentNumber, Name, Year) 
Course (Code, Name, Hours) 
Results (StudentNumbber, Code, Grade) 

我們要求給後面的「M11104」編碼過程中的一個數據庫查詢servor的學生人數。 這裏給出的解決方案:

Select S. * 
FROM Student S, Results R 
WHERE Code = 'M1105' 
AND S.StudentNumber = R.StudentNumber; 

我只是不明白這是怎麼認爲的工作,首先把SR沒有真正的屬性給定的數據庫和SELECT S.*似乎並不意味着什麼。

+1

偏離主題,但請注意,現在您應該真正使用ANSI連接語法;即無論何時加入表格,都應該使用顯式的'JOIN'子句來完成。見例如http://stackoverflow.com/q/1599050/240733爲例。 – stakx

回答

2

在您的示例中,SR僅被定義爲StudentResults表的別名。使用S.*與說Student.*ALL Columns of the Student Table完全一樣。

1

這被稱爲「別名」。

當你有形式的語句:

SELECT … FROM [tableName] 'anyCharacter'; 

在聲明末尾的性格變得別名的表,例如,您可以使用別名,而不是表名:

SELECT st.Name FROM Student st; 
--  ^^     ^^ 
-- 'st' is an alias for the 'Student' table 
1

SR是別名。 SStudent表或視圖的別名,而RResults表或視圖的別名。 別名用於避免每次在查詢中引用表時輸入表的全名。

SELECT 
    S.StudentNumber, 
    S.Name, 
    S.[Year] 
FROM Students AS S 
INNER JOIN Results AS R ON 
    R.StudentNumber=S.StudentNumber 
WHERE 
    R.Code='M1105' 

逗號語法氣餒,使用JOIN代替:當我們使用可選的AS關鍵字,這樣它變得更加清晰。如果您爲任何表使用別名,那麼您還應該限定對具有該別名的列的所有引用。如果沒有這樣做,可能會在模式更改時導致令人討厭的運行時錯誤(在您的示例中,如果Code列也添加到第二個表中,則突然出現模糊的列異常)。方括號用於引用保留字的對象名稱(語法的部分或內置函數,如YEAR)。