2017-06-01 128 views
1

假設您有一個以DepartmentID爲主鍵的部門表和一個以DepartmentID作爲外鍵的員工表。然後,您可以使用這些列具有相同名稱的事實來執行自然聯接,從而允許您從查詢中省略列名稱。 (我沒有評論你是否應該 - 這是一個意見問題 - 只是注意到這個簡寫是SQL語法的一部分。)是否自然加入外鍵名稱的唯一省略號?

SQL語法中有各種其他情況,你可能會參考列名稱的表達式如employee.DepartmentID = department.DepartmentID。是否還有其他一些情況下,某種速記允許您使用列名稱相同的事實來省略列名稱?

+2

自然連接不知道外鍵,只是列名。 – jarlh

+1

用''using'內部連接可以在Oracle中完成。 – Utsav

回答

1

SQL並不直接瞭解外鍵;它只是有外鍵限制,這可以防止您創建無效數據。當你有一個外鍵的時候,你會想要一個約束並對它進行連接,但是數據庫不會自動從另一個派生。

無論如何,當您使用的兩列具有相同名稱的連接:

SELECT ... 
FROM employee 
JOIN department ON employee.DepartmentID = department.DepartmentID 

那麼你可以替換ON子句與USING clause

SELECT ... 
FROM employee 
JOIN department USING (DepartmentID) 

如果有一個USING子句,那麼指定的每個列名都必須存在於數據集中的join-operator的左側和右側。對於每對命名列,表達式「lhs.X = rhs.X」將作爲布爾表達式針對笛卡兒積的每一行進行評估。結果集中只包含所有這些表達式評估爲true的行。
[...]
對於由USING子句標識的每對列,從連接數據集中省略右邊數據集的列。這是USING子句與其等效ON約束之間的唯一區別。

(省略重複列當您使用SELECT *僅事項(我不評論你是否應該或不 - 。這是見仁見智的問題 - 只是指出事實,這速記是SQL語法的一部分))