SQL語句中的AND和OR執(zhí)行順序問題

問題

昨天在寫數(shù)據(jù)庫SQL的時(shí)候遇到一個(gè)問題。問題的根結(jié)在SQL語句的AND和OR關(guān)鍵字的執(zhí)行優(yōu)先級(jí)問題。下面就針對(duì)這個(gè)問題進(jìn)行一下測(cè)試。

場(chǎng)景

1、有一張學(xué)生表Student,表字段包括Id(用戶主鍵)、Name(用戶名)、Grade(年級(jí))、Class(班級(jí))、Sex(性別)。如下:


表結(jié)構(gòu)

2、在表中導(dǎo)入十條測(cè)試數(shù)據(jù),如下:


表數(shù)據(jù)

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

但是該sql查詢出來的結(jié)果并不符合要求,執(zhí)行結(jié)果如下:

執(zhí)行結(jié)果

執(zhí)行的結(jié)果中還查詢出了班級(jí)為2的男學(xué)生,顯然結(jié)果是不正確的。

4、修改下SQL語句,添加上括號(hào)。如下:

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

該sql查詢出來的結(jié)果符合要求,執(zhí)行結(jié)果如下:

執(zhí)行結(jié)果

分析

從上面的場(chǎng)景中,問題的關(guān)鍵就在于AND和OR的執(zhí)行順序問題。
查閱資料,關(guān)系型運(yùn)算符優(yōu)先級(jí)高到低為:NOT >AND >OR
如果where 后面有OR條件的話,則OR自動(dòng)會(huì)把左右的查詢條件分開。
就如上面場(chǎng)景中的第一條語句,他的查詢條件分為兩部分(或):

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

這也就是查詢出1年級(jí)的女學(xué)生,2班級(jí)的學(xué)生。不符合最初查詢的要求。
那么解決辦法就是使用括號(hào)區(qū)分執(zhí)行的順序
就如上面場(chǎng)景的第二條語句,查詢條件分為兩部分(并):

1、 sex='女' 
2、 (grade=1 or class=2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容