簡體   English   中英

內部連接條件或在哪里使用?

[英]inner join on condition or using where?

我有這個查詢

SELECT t1.col1
FROM table1 t1
INNER JOIN table2 t2 ON t2.col1 = t1.col1
WHERE t2.col IN (1, 2, 3)

和這個查詢

SELECT t1.col1
FROM table1 t1
INNER JOIN table2 t2 ON t2.col1 = t1.col1 AND t2.col IN (1, 2, 3)

都給我一個相同的執行計划,並告訴我

Using where;

這是否意味着我的第二個查詢已從優化器轉換為第一種形式,並且我應該遵循第一種形式?

有沒有辦法檢查優化器的新查詢?

SQL不是過程語言。 這是一種描述性語言。 查詢描述您要生成的結果集。

使用內部聯接,您的問題中的兩個查詢是相同的-它們在所有情況下都會產生相同的結果集。 首選哪個是風格偏好。 從優化的角度來看,MySQL應該以相同的方式對待兩者。

一種偏愛是單個表上的過濾器更適合WHEREON

對於外部聯接,這兩個查詢是不相同的,您應該使用一個表達您的意圖的查詢。

連接兩個表后的第一個過濾器; 而第二個表使用值過濾作為連接兩個表的條​​件進行連接。 您可以檢查此線程:

SQL連接:where子句與on子句

您可以檢查執行兩個查詢需要花費多少,但是無論如何,您都可以用兩種方式編寫查詢,無論是第一個查詢還是第二個查詢,優化器都會嘗試優化查詢。

我喜歡這個規則:

  • ON ...說明表之間的關系
  • WHERE ... 篩選結果。

這對於LEFT JOIN來說很重要,因為ON不能充當過濾器。

這表明您優化器對待它們的方式相同:

EXPLAIN EXTENDED SELECT ...
SHOW WARNINGS;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM