關(guān)于SQL語句中的AND和OR執(zhí)行順序遇到的問題
問題
昨天在寫數(shù)據(jù)庫SQL的時候遇到一個問題。問題的根結(jié)在SQL語句的AND和OR關(guān)鍵字的執(zhí)行優(yōu)先級問題。下面就針對這個問題進行一下測試。
場景
1、有一張學生表Student,表字段包括Id(用戶主鍵)、Name(用戶名)、Grade(年級)、Class(班級)、Sex(性別)。如下:
表結(jié)構(gòu)
2、在表中導入十條測試數(shù)據(jù),如下:
表數(shù)據(jù)
3、現(xiàn)需要查詢出性別為女的1年級女學生,或者性別為女的2班級女學生。SQL語句如下:
select * from student where sex='女' and grade=1 or class=2
但是該sql查詢出來的結(jié)果并不符合要求,執(zhí)行結(jié)果如下:
執(zhí)行結(jié)果
執(zhí)行的結(jié)果中還查詢出了班級為2的男學生,顯然結(jié)果是不正確的。
4、修改下SQL語句,添加上括號。如下:
select * from student where sex='女' and (grade=1 or class=2)
該sql查詢出來的結(jié)果符合要求
分析
從上面的場景中,問題的關(guān)鍵就在于AND和OR的執(zhí)行順序問題。
查閱資料,關(guān)系型運算符優(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)
相關(guān)文章
解決mysql數(shù)據(jù)庫設(shè)置遠程連接權(quán)限執(zhí)行g(shù)rant all privileges on&n
這篇文章主要介紹了解決mysql數(shù)據(jù)庫設(shè)置遠程連接權(quán)限執(zhí)行g(shù)rant all privileges on *.* to 'root'@'%' identified by '密碼' with grant optio報錯,通過本文給大家分享問題原因解析及解決方法,需要的朋友可以參考下2022-11-11如何修改Mysql中g(shù)roup_concat的長度限制
在mysql中,有個函數(shù)叫“group_concat”,平常使用可能發(fā)現(xiàn)不了問題,在處理大數(shù)據(jù)的時候,會發(fā)現(xiàn)內(nèi)容被截取了。怎么解決這一問題呢,下面腳本之家小編給大家?guī)砹薓ysql中g(shù)roup_concat的長度限制問題,感興趣的朋友一起看看吧2018-08-08關(guān)于MySQL?onlinedb數(shù)據(jù)庫的一些查詢語句大全
這篇文章主要給大家介紹了關(guān)于MySQL?onlinedb數(shù)據(jù)庫的一些查詢語句,文中通過代碼實例介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考價值,需要的朋友可以參考下2023-12-12Mysql存在則修改不存在則新增的兩種實現(xiàn)方法實例
mysql語法支持如果數(shù)據(jù)存在則更新,不存在則插入,下面這篇文章主要給大家介紹了關(guān)于Mysql存在則修改不存在則新增的兩種實現(xiàn)方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09windows下安裝mysql8.0.18的教程(社區(qū)版)
本文章簡單介紹一下mysql在windows下的安裝方式,主要介紹了mysql社區(qū)版8.0.18版本,本文給大家介紹的非常詳細,需要的朋友參考下吧2020-01-01MySQL對數(shù)據(jù)表已有表進行分區(qū)表的實現(xiàn)
本文主要介紹對現(xiàn)有的一個表進行創(chuàng)建分區(qū)表,并把數(shù)據(jù)遷移到新表,可以按時間來分區(qū),具有一定的參考價值,感興趣的可以了解一下2021-10-10