SQL語句中的AND和OR執行順序問題

yd、夜發表於2020-11-26

問題

昨天在寫資料庫SQL的時候遇到一個問題。問題的根結在SQL語句的AND和OR關鍵字的執行優先順序問題。下面就針對這個問題進行一下測試。

場景

1、有一張學生表Student,表欄位包括Id(使用者主鍵)、Name(使用者名稱)、Grade(年級)、Class(班級)、Sex(性別)。如下:


表結構

2、在表中匯入十條測試資料,如下:


表資料

3、現需要查詢出性別為女的1年級女學生,或者性別為女的2班級女學生。SQL語句如下:
    select * from student where sex='女' and grade=1 or class=2

但是該sql查詢出來的結果並不符合要求,執行結果如下:

執行結果

執行的結果中還查詢出了班級為2的男學生,顯然結果是不正確的。

4、修改下SQL語句,新增上括號。如下:

select * from student where sex='女' and (grade=1 or class=2)

該sql查詢出來的結果符合要求,執行結果如下:

執行結果

分析

從上面的場景中,問題的關鍵就在於AND和OR的執行順序問題。
查閱資料,關係型運算子優先順序高到低為:NOT >AND >OR
如果where 後面有OR條件的話,則OR自動會把左右的查詢條件分開。
就如上面場景中的第一條語句,他的查詢條件分為兩部分(或):

1、sex='女' and grade=1
2class=2

這也就是查詢出1年級的女學生,2班級的學生。不符合最初查詢的要求。
那麼解決辦法就是使用括號區分執行的順序
就如上面場景的第二條語句,查詢條件分為兩部分(並):

1、 sex='女' 
2、 (grade=1 or class=2)

相關文章