2013-05-05 48 views
3

在JOIN子句或WHERE子句中有SQL條件會更好嗎? SQL引擎是否針對任一方式進行了優化?它取決於發動機嗎?JOIN子句中的條件是邪惡SQL

總是可以用WHERE子句中的條件替換JOIN子句中的條件嗎?這裏

的例子來說明我的意思與條件

SELECT  role_.name 
FROM  user_role 
INNER JOIN user ON user_role.user_id_ = user.id AND 
        user_role.user_id_ = @user_id 
INNER JOIN role ON user_role.role_id = role_.id 

SELECT  role_.name 
FROM  user_role 
INNER JOIN user ON user_role.user_id_ = user.id 
INNER JOIN role ON user_role.role_id = role_.id 
WHERE  user.id = @user_id 

回答

6

SQL條件JOIN子句和WHERE如果INNER JOIN使用條件是等價的。

否則,如果像LEFT/RIGHT那樣使用其他JOIN,而不是根據條件匹配行之後,會發生另一個步驟,即添加OUTER ROWS,即不匹配的行。

WHERE條件只是過濾掉所有不匹配的行。

See this thread

+1

假設運不排除在where子句中的NULL那麼你對左/右這是一個很好的與正確的WHERE子句中使用的條件問題假設,但我喜歡陳述假設。 另請注意,爲清楚起見,mysql不支持FULL OUTER JOINS,但sql-server(op選擇了兩個標籤)。 – gillyspy 2013-05-05 05:51:12

+0

這就是我在google上搜索的,如何在JOIN中處理NULL值和WHERE ..感謝您的輸入.. – 2013-05-05 05:52:32

3

有在連接語句的非關鍵條件不僅是OK,最好尤其是在這個查詢,因爲你可以避開一些加入到被進一步連接表中其他表到on子句屬於。

Where子句評估所有連接都已完成 - 它是結果集上的篩選器。但是通過將條件放入連接子句中,您可以停止在他加入時加入的行。

在你的情況下,它沒有任何區別,因爲你沒有任何下面的表格,但我經常使用他的技巧來獲得我的查詢表現。

1

通過查看爲兩個查詢生成的計劃,我們可以看到在INNER JOIN或WHERE子句中具有條件會生成相同的計劃。

但你不能處理外部聯接