Join

在 FROM 與 WHERE 子句中連接表

  • July 24, 2016

第一次來電。

我對加入表格時的最佳做法有疑問。例如,以下兩個查詢都返回相同的結果:

SELECT i.id, p.first_name, p.last_name
FROM individuals i, profiles p
WHERE i.id = p.individual_id;


SELECT i.id, p.first_name, p.last_name
FROM individuals i INNER JOIN profiles p ON i.id = p.individual_id;

這兩種方法的優缺點是什麼?請讓我知道你在想什麼。我對性能差異感興趣,而且對查詢的可讀性、從一個 RDMS 到另一個的可移植性等感興趣。

謝謝!

兩個查詢完全相同,應該返回完全相同的結果集,並且應該產生完全相同的執行計劃。

但是第二個查詢使用的是ANSI-92 SQL語法。第一個是使用舊(非常舊)版本的 SQL 連接。

我可以想到一些你應該使用 ANSI-92 SQL 語法的原因。

  1. 如果有的話,它將子句Join Conditions中的過濾器和實際過濾器分開。WHERE
  2. 使用舊語法,您只能有等價的INNERCROSS連接。UNION除了複雜的查詢外,外連接是不可能的。一些 DBMS(+)在 Oracle*==*SQL Server 中為外部連接添加了專有語法,但這些語法正在或已經被棄用。顯式LEFT連接RIGHTFULL外連接已添加到標準中,並且已被幾乎所有 DBMS 採用。
  3. 它使查詢更具可讀性,因此更易於調試。
  4. 現在大多數開發人員、DBA 和 ORM 都使用 Join 語法。
  5. 使用 ANSI-92 SQL 語法進行連接時,如果您錯過了連接條件,則會出現編譯時錯誤,因此它會強制您提供有效的連接條件,而在舊版本中它不會拋出任何錯誤,但它只是返回一個CROSS JOIN,以我的經驗,這是舊方法最糟糕的缺點之一。
  6. 當使用舊版本的聯接並且您的查詢混合了內部聯接和外部聯接時,結果集可能總是不是您期望的那樣。

引用自:https://dba.stackexchange.com/questions/144744