問題
昨天在寫數(shù)據(jù)庫SQL的時候遇到一個問題。問題的根結在SQL語句的AND和OR關鍵字的執(zhí)行優(yōu)先級問題。下面就針對這個問題進行一下測試。
場景
1、有一張學生表Student,表字段包括Id(用戶主鍵)、Name(用戶名)、Grade(年級)、Class(班級)、Sex(性別)。如下:
表結構
2、在表中導入十條測試數(shù)據(jù),如下:
表數(shù)據(jù)
3、現(xiàn)需要查詢出性別為女的1年級女學生,或者性別為女的2班級女學生。SQL語句如下:
select * from student where sex='女' and grade=1 or class=2
但是該sql查詢出來的結果并不符合要求,執(zhí)行結果如下:
執(zhí)行結果
執(zhí)行的結果中還查詢出了班級為2的男學生,顯然結果是不正確的。
4、修改下SQL語句,添加上括號。如下:
select * from student where sex='女' and (grade=1 or class=2)
該sql查詢出來的結果符合要求
分析
從上面的場景中,問題的關鍵就在于AND和OR的執(zhí)行順序問題。
查閱資料,關系型運算符優(yōu)先級高到低為:NOT >AND >OR
如果where 后面有OR條件的話,則OR自動會把左右的查詢條件分開。
就如上面場景中的第一條語句,他的查詢條件分為兩部分(或):
1、sex='女' and grade=1
2、 class=2
這也就是查詢出1年級的女學生,2班級的學生。不符合最初查詢的要求。
那么解決辦法就是使用括號區(qū)分執(zhí)行的順序
就如上面場景的第二條語句,查詢條件分為兩部分(并):
1、 sex='女'
2、 (grade=1 or class=2)
您可能感興趣的文章:- SQL語句執(zhí)行順序圖文介紹
- SQL語句執(zhí)行順序詳解
- SQL語句執(zhí)行深入講解(MySQL架構總覽->查詢執(zhí)行流程->SQL解析順序)
- 從零開始學習SQL查詢語句執(zhí)行順序
- 一文告訴你Sql的執(zhí)行順序是怎樣的