SQL語句中的AND和OR執行順序問題
問題
昨天在寫資料庫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
2、 class=2
這也就是查詢出1年級的女學生,2班級的學生。不符合最初查詢的要求。
那麼解決辦法就是使用括號區分執行的順序
就如上面場景的第二條語句,查詢條件分為兩部分(並):
1、 sex='女'
2、 (grade=1 or class=2)
相關文章
- SQL中rownum和order by的執行順序的問題SQL
- SQL 語句的執行順序SQL
- SQL語句執行順序SQL
- sql select語法執行順序SQL
- SQL語句各子句的執行順序SQL
- Sql執行順序SQL
- SQL 查詢語句的執行順序解析SQL
- Hive SQL語句的正確執行順序HiveSQL
- GROUPBY 和開窗函式執行順序的問題函式
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- sql mysql 執行順序 (4)MySql
- sql語句執行順序與效能優化(1)SQL優化
- mySQL 執行語句執行順序MySql
- mysql 語句的執行順序MySql
- 一個 MySQL sql 語句執行順序帶來的 bugMySql
- Select語句執行順序
- js基礎進階–promise和setTimeout執行順序的問題JSPromise
- sql語句中#{}和${}的區別SQL
- C++輸出流cout的執行順序問題C++
- SQL語句中not in 和not exist的區別SQL
- SQL語句中exists和in的區別SQL
- 你瞭解一條sql的執行順序嗎SQL
- pipeline的執行順序
- Java for迴圈中語句執行的順序Java
- Jmeter的元件作用域和執行順序JMeter元件
- mysql order by 和 group by 順序問題MySql
- Spring Aop的執行順序Spring
- sql語句中JOIN ON 的使用SQL
- Java面試題:@PostConstruct、init-method和afterPropertiesSet執行順序?Java面試題Struct
- JavaScript執行順序分析JavaScript
- Gradle系列(二) Gradle執行順序和taskGradle
- 關於 Promise 的執行順序Promise
- Python執行緒專題10:queue、多執行緒按順序執行Python執行緒
- 關於describe和test執行順序的翻譯
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- Jetpack Compose的Modifier順序問題Jetpack
- js執行順序Event LoopJSOOP
- 路由的中介軟體執行順序路由