2016-01-17 33 views
1

以下查詢都從posts表和users表中選擇數據。 第一個查詢使用連接第二個不......我的問題是你爲什麼要使用JOIN?如果您可以從多個表中選擇而沒有JOIN,爲什麼要使用JOIN?

查詢與JOIN:

SELECT u.*, p.* FROM users AS u 
JOIN posts AS p ON p.user_id=u.user_id 
WHERE u.user_id=1 

查詢而不:

SELECT u.*, p.* FROM users AS u, posts AS p 
WHERE p.user_id=u.user_id 
AND u.user_id=1 
+2

'JOIN'是正確的語法。 FROM子句中的逗號是古老的。我們並沒有使用它們的原因與我們在演講中通常不會使用「你」和「這個」等詞語的原因幾乎相同。 –

+2

第二種類型的查詢用於石器時代並稱爲隱式連接,第一種稱爲顯式連接並在當前日期中使用。 –

+1

@戈登林諾夫你很好地解釋了這一點。 – Jon

回答

3

第二種形式被稱爲隱式加入。首先,隱含連接被大多數s視爲棄用。就我個人而言,我真誠地懷疑任何主要的RDBMS在不久的將來都會放棄對它們的支持,但爲什麼要冒這個風險呢?

其次,顯式連接有一個執行外連接的標準方法。隱式聯接有各種不可讀的解決方案(例如Oracle的(+)語法),但據我所知,沒有什麼標準對可移植性有合理的期望。

第三,我承認這完全是一個味道的問題,他們只是看起來更好。使用顯式連接允許您在邏輯上將查詢中的條件分隔爲將所有表連接在一起所需的「腳手架」以及where子句的實際邏輯條件。通過隱式連接,所有內容都集中到where子句中,並且只需要三到四張表就很難管理。

2

第二個查詢使用連接。這就是逗號在users AS u, posts AS p中的含義。這是一個隱含的連接(隱式,因爲雖然你沒有明確地使用關鍵字JOIN,但你得到了它的效果),也就是所謂的CROSS JOIN,意思是「左表的每一行都與右表中的每一行連接」。

使用JOIN ... ON語法的是(在我的意見)更加明確和可讀性,由於在沒有小部分從WHERE子句移動所述接合條件被直接附連到JOIN,也打開了其他連接類型的語法(LEFT JOIN,默認和INNER JOIN)具有不同的語義。

2

這純粹是一種風格的選擇。這兩個語句將由服務器以相同的方式解釋。

當您在FROM子句中使用逗號(,)時,這隱含地使用CROSS JOIN

如果您在WHERE clause中有許多條件,則可以更清楚地區分旨在連接表(tableA.ID = tableB.tableA_id)的條件與打算過濾的條件。您可以通過將連接條件放在明確的JOIN旁邊來實現此目的。

相關問題