2014-03-26 42 views
-1

我有一個SQL查詢,我有點困惑WHERE子句中的哪些條件先執行。你可以給我執行WHERE子句時涉及的步驟嗎?這裏是我的查詢。SQL與AND或OR Prededence

select * from table where a='a' OR b='b' OR c='c' AND d='d'; 
+1

有疑問時,可使用括號'()' –

+1

即使毫無疑問的,你應該總是使用括號當你混合'ANDs'和'ORs' –

回答

1

這是運算符優先級list

從MySQL文檔

INTERVAL 
BINARY, COLLATE 
! 
- (unary minus), ~ (unary bit inversion) 
^ 
*, /, DIV, %, MOD 
-, + 
<<, >> 
& 
| 
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN 
BETWEEN, CASE, WHEN, THEN, ELSE 
NOT 
&&, AND 
XOR 
||, OR 
= (assignment), := 

因此OR更高的優先級。

您需要推動括號以避免模棱兩可。這將有助於可讀性,但它會沒有他們

SELECT * 
FROM table 
WHERE a='a' OR b='b' OR (c='c' AND d='d'); 
0

AND擁有OR高優先級工作正常。

參考
MySQL: Operator Precedence

運算符優先顯示在下面的列表,從最高優先級到最低。一起顯示在一行上的運算符具有相同的優先級。

&&, AND
XOR
||, OR

1

MySQL文檔:

AND具有更高的優先級,從而,這將首先評估。

通常更喜歡使用大括號來顯示優先級。這使查詢更易讀:

select * from table where a='a' OR b='b' OR (c='c' AND d='d'); 
0

對於SQL Server,在WHERE子句中沒有固定的執行順序。在創建執行計劃之前,這由SQL Query optimizer決定。

Ofcourse,你可以強制使用括號以特定的順序這是一個推薦的做法 混合多個AND/OR條件

1

時,試試這一個

select * from table where d='d' and (a='a' OR b='b' OR c='c'); 
0

是阿南德似乎是因爲你是正確的要求SQL返回其中B ='b'的任何東西,但只有在a = a或b = b或c = c匹配時才顯示結果,則:

WHERE d ='d'子句需要請求WHERE子句如下:

select * from table where d='d' and (a='a' OR b='b' OR c='c'); 

會給你你需要的結果。

感謝