INNER JOIN ON與WHERE子句

爲簡單起見,假設全部相關字段都不爲NOT NULL優化

你能夠作: this

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

要否則: spa

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

這兩個在MySQL是否以相同的方式工做? code


#1樓

INNER JOIN是您應該使用的ANSI語法。 element

一般認爲它更具可讀性,尤爲是當您鏈接許多表時。 it

若有須要,也能夠輕鬆地將其替換爲OUTER JOINio

WHERE語法更面向關係模型。 table

兩個表JOIN ed的結果是表的笛卡爾積,將對其應用過濾器,該過濾器僅選擇鏈接列匹配的那些行。 循環

使用WHERE語法更容易看到這一點。 語法

以您的示例爲例,在MySQL(一般在SQL中)中,這兩個查詢是同義詞。

另請注意,MySQL還具備STRAIGHT_JOIN子句。

使用此子句,您能夠控制JOIN順序:在外部循環中掃描哪一個表,在內部循環中掃描哪一個表。

您沒法使用WHERE語法在MySQL中控制此功能。


#2樓

一旦您須要開始向查詢中添加更多表,隱式聯接(這就是您的第一個查詢所稱的)變得更加混亂,難以閱讀且難以維護。 想象一下在四個或五個不一樣的表上執行相同的查詢和聯接類型……這是一場噩夢。

使用顯式聯接(第二個示例)更加易讀且易於維護。


#3樓

它們具備不一樣的人類可讀含義。

可是,取決於查詢優化器,它們對計算機可能具備相同的含義。

您應該始終編寫可讀性強的代碼。

也就是說,若是這是內置關係,請使用顯式聯接。 若是要匹配弱關聯的數據,請使用where子句。


#4樓

隱式鏈接ANSI語法較舊,不​​太明顯,不建議使用。

此外,關係代數容許WHERE子句中的謂詞和INNER JOIN互換,所以即便帶有WHERE子句的INNER JOIN查詢也能夠使謂詞由優化程序從新排列。

我建議您以最可行的方式編寫查詢。

有時,這包括使INNER JOIN相對「不完整」,並將某些條件放在WHERE只是爲了使過濾條件列表更易於維護。

例如,代替:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

寫:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

但這固然取決於。


#5樓

其餘人指出,INNER JOIN有助於提升人類可讀性,這是當務之急。 我贊成。 讓我嘗試解釋爲何聯接語法更具可讀性。

基本的SELECT查詢是這樣的:

SELECT stuff
FROM tables
WHERE conditions

SELECT子句告訴咱們, 正是咱們找回; FROM子句告訴咱們在那裏咱們獲得它,而且在WHERE子句告訴咱們,咱們獲得哪些

JOIN是有關表的聲明,說明如何將它們綁定在一塊兒(實際上,其實是綁定到單個表中)。 從語義上講,控制表的任何查詢元素-咱們從那裏獲取東西-都屬於FROM子句(固然,這就是JOIN元素所在的位置)。 將joining-elements放入WHERE子句中,能夠將whichwhere-from放寬; 這就是爲何首選JOIN語法的緣由。

相關文章
相關標籤/搜索