關(guān)于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é)果符合要求
分析
從上面的場(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)
相關(guān)文章
在Linux環(huán)境下mysql的root密碼忘記解決方法(三種)
這篇文章主要介紹了在Linux環(huán)境下mysql的root密碼忘記解決方法,詳細(xì)的介紹了3種解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12
MySql中取前幾行數(shù)據(jù)使用limit來完成
在mysql中是沒有top關(guān)鍵字的,不過可以用limit來完成此功能,下面舉例為大家詳細(xì)介紹下它的使用方法,不會(huì)的朋友可以學(xué)習(xí)下2013-07-07
mysql8如何設(shè)置不區(qū)分大小寫ubuntu20
這篇文章主要介紹了mysql8如何設(shè)置不區(qū)分大小寫ubuntu20問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
MySQL ClickHouse常用表引擎超詳細(xì)講解
這篇文章主要介紹了MySQL ClickHouse常用表引擎,ClickHouse表引擎中,CollapsingMergeTree和VersionedCollapsingMergeTree都能通過標(biāo)記位按規(guī)則折疊數(shù)據(jù),從而達(dá)到更新和刪除的效果2022-11-11
mysql 臨時(shí)表 cann''t reopen解決方案
MySql關(guān)于臨時(shí)表cann't reopen的問題,本文將提供詳細(xì)的解決方案,需要了解的朋友可以參考下2012-11-11

