SQL語句中OR和AND混合使用的求值順序問題

2021-10-03 21:12:49 字數 1039 閱讀 2240

先來說下場景,本來我的需求是選擇出員工角色為1或3所建立的業務域且業務域id大於100的資料:

結果:然而,返回的結果中有2行domain_id是小於100的。顯然domain_id > 100的這個條件未按預期進行。

在sql語句中的求值順序,優先處理and操作符,再處理or操作符號。所以它先是執行了bds.staff_role = 3

and domain_id > 100 這裡,再執行bds.staff_role = 1 。

dbms看到這段語句時,它的理解是員工角色為3建立的業務域且業務域id大於100的資料,以及員工角色為1建立所有業務域,而不管員工角色為1建立業務域的id是否大於100。

使用圓括號進行明確分組,圓括號具有比and或or操作符更高的求值順序。

輸入:

輸出

這時候dbms首先過濾括號裡面內的or條件語句,sql語句就變成了選擇員工角色為1或3所建立的業務域且業務域id大於100的資料。

可以使用in操作符,功能與or相當,且當or後面的資料量越多時,執行效率會降低。in操作符比一組or操作符效率更高。

sql語句中求值順序:圓括號》and操作符》or操作符。

任何時候使用有and和or操作符的where子句,都應該使用圓括號進行分組,這樣能消除歧義。

SQL語句中case when then的使用

使用語法為 select pro id as id pro title as title pro name as name pro ltime as ltime pro place as place pro linkman as linkman pro address as address pro ...

sql語句中的 和in

今天優化了一段專案中的 的作用就是在使用者表和使用者賬戶表中查出所有有賬戶的使用者,當然查出來的使用者應該是不重複的 distinct一下 這2個表中的記錄大約都為2萬條左右,資料量還是很大的,通過hibernate的轉換出來是這樣的 select from select rownumber ove...

SQL語句中Union和Union all的區別

在資料庫中,union和union all關鍵字都是將兩個結果集合並為乙個,但這兩者從使用和效率上來說都有所不同。union在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。如 select from test union1 union sel...