爲簡單起見,假設全部相關字段都不爲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
INNER JOIN
是您應該使用的ANSI語法。 element
一般認爲它更具可讀性,尤爲是當您鏈接許多表時。 it
若有須要,也能夠輕鬆地將其替換爲OUTER JOIN
。 io
WHERE
語法更面向關係模型。 table
兩個表JOIN
ed的結果是表的笛卡爾積,將對其應用過濾器,該過濾器僅選擇鏈接列匹配的那些行。 循環
使用WHERE
語法更容易看到這一點。 語法
以您的示例爲例,在MySQL(一般在SQL中)中,這兩個查詢是同義詞。
另請注意,MySQL還具備STRAIGHT_JOIN
子句。
使用此子句,您能夠控制JOIN
順序:在外部循環中掃描哪一個表,在內部循環中掃描哪一個表。
您沒法使用WHERE
語法在MySQL中控制此功能。
一旦您須要開始向查詢中添加更多表,隱式聯接(這就是您的第一個查詢所稱的)變得更加混亂,難以閱讀且難以維護。 想象一下在四個或五個不一樣的表上執行相同的查詢和聯接類型……這是一場噩夢。
使用顯式聯接(第二個示例)更加易讀且易於維護。
它們具備不一樣的人類可讀含義。
可是,取決於查詢優化器,它們對計算機可能具備相同的含義。
您應該始終編寫可讀性強的代碼。
也就是說,若是這是內置關係,請使用顯式聯接。 若是要匹配弱關聯的數據,請使用where子句。
隱式鏈接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
但這固然取決於。
其餘人指出,INNER JOIN有助於提升人類可讀性,這是當務之急。 我贊成。 讓我嘗試解釋爲何聯接語法更具可讀性。
基本的SELECT查詢是這樣的:
SELECT stuff FROM tables WHERE conditions
SELECT子句告訴咱們, 正是咱們找回; FROM子句告訴咱們在那裏咱們獲得它,而且在WHERE子句告訴咱們,咱們獲得哪些 。
JOIN是有關表的聲明,說明如何將它們綁定在一塊兒(實際上,其實是綁定到單個表中)。 從語義上講,控制表的任何查詢元素-咱們從那裏獲取東西-都屬於FROM子句(固然,這就是JOIN元素所在的位置)。 將joining-elements放入WHERE子句中,能夠將which和where-from放寬; 這就是爲何首選JOIN語法的緣由。