- MariaDB必知必會
- (美)Ben Forta
- 541字
- 2020-10-30 18:17:41
7.1.3 理解優先級順序
WHERE子句可以包含任何數量的AND和OR操作符。結合使用兩者可以讓你執行高級和復雜的過濾。
然而結合使用AND和OR操作符會產生一個有趣的問題。為了進一步說明,請看一個例子。你需要由供應商1002或1003生產的,且價格高于或等于10的產品。下面的SELECT語句結合使用AND和OR操作符創建了一個WHERE子句:
▼ 輸入

▼ 輸出

▼ 分析
請看列出的結果,返回的數據中有兩行價格低于10。因此,顯然沒有按預期進行過濾。什么原因呢?答案是計算次序。SQL像許多語言一樣在OR之前執行AND操作符。當SQL遇到前面的WHERE子句,它讀取供應商1002生產的產品,而不管其價格是多少,以及任何由供應商1003生產的價格高于或等于10的產品。換句話說AND的優先級更高,操作符被錯誤地結合。
問題的解決方案是顯式使用括號對相關的操作符分組??聪旅孢@個SELECT語句及其輸出:
▼ 輸入

▼ 輸出

▼ 分析
這個SELECT語句和先前的語句僅有的不同是,前兩個WHERE子句的條件被括號括起來了。由于括號比AND和OR有更高的優先級,DBMS首先過濾括號中的OR條件。SQL語句變成了由供應商1002或1003生產的且價格高于或等于10的產品,這正是你想要的。
提示
在WHERE子句中使用括號 無論何時,當你寫的WHERE子句同時包含AND和OR時,顯式使用括號對操作符分組。不要依賴默認的優先級序列,即使這就是你想要的優先級。使用括號沒有壞處,而且這樣做總是可以避免任何歧義。