本資料為產品崗位作為日常工作參考,語言口語化
At 2019/4/26 By David.Yang
運算邏輯
OR運算符可以相互組合多個,在表達式任意一個為TRUE,即返回TRUE
WHERE
boolean_expression
OR
boolean_expression
OR短路求值
使用OR進行條件運算時,多個邏輯條件會逐個運算,直到結果確定時,才會停止剩餘部分的計算。
示例
-- TRUE OR NULL
SELECT 1 = 1 OR 1 / 0;
+----------------+
| 1 = 1 OR 1 / 0 |
+----------------+
| 1 |
+----------------+
1 row in set (0.00 sec)
OR連接兩部分運算邏輯,1 = 1 和 1 / 0
第一部分 1 = 1返回TRUE;
所以真個OR邏輯運算結果為TRUE;
因為短路求值,MYSQL將不會再對剩餘部分進行運算,1 / 0將不會進行求值;
注:
0被認為是false,非零被視為true。
OR運算符演示
我們來統計一下來自南宋和大理國的學生有多少?
SQL
SELECT
*
FROM
students
WHERE
nationality = "南宋"
OR
nationality = "大理國";
條件過濾後,結果集如下
同樣,OR可以組合2個以上的或邏輯運算。
運算符的優先級
正常優先級執行
我們的業務場景當中經常會出現AND OR等組合使用的情況,
MYSQL在處理AND和OR運算邏輯時有優先級,
處理AND運算符的邏輯時優先級高於OR,
所以會之後再進行OR運算符的計算。
示例
SQL
SELECT 1 = 1 OR 1 = 0 AND 0 / 1;
+--------------------------+
| 1 = 1 OR 1 = 0 AND 0 / 1 |
+--------------------------+
| 1 |
+--------------------------+
1 row in set (0.00 sec)
AND優先級高
ϒ對AND運算進行計算,1 = 0 AND 0 / 1,表達式結果轉換為FALSE AND FALSE,所以AND邏輯返回FALSE。
ϒ對OR運算進行計算,1 = 1 OR FALSE,表達式轉換為TRUE OR FALSE,所有返回TRUE
干預優先級執行
我們可以通過調整語法進行優先級的干預,使得執行優先級根據我們的意願進行執行。
怎麼來實現呢?
通過()。
示例
SQL
SELECT (1 = 1 OR 1 = 0) AND 0 / 1;
+----------------------------+
| (1 = 1 OR 1 = 0) AND 0 / 1 |
+----------------------------+
| 0 |
+----------------------------+
1 row in set (0.00 sec)
優先執行()內的運算邏輯
ϒ對括號內()邏輯進行運算,(1 = 1 OR 1 = 0),轉化為TRUE OR FALSE,返回TRUE。
ϒ對AND邏輯進行運算,TRUE AND 0 / 1,轉化為TRUE AND FALSE,返回FALSE;
優先級執行演示
獲得來自南宋或者西夏的學生有哪些,在WHERE條件中使用OR運算邏輯來處理。
SQL
SELECT
*
FROM
students
WHERE
nationality = "南宋"
OR
nationality = "西夏";
得到一下結果
在這個基礎上,我們想再申明需要年齡大於等於16歲,通過年齡來進行一個與邏輯的運算。
SQL
SELECT
*
FROM
students
WHERE
(
nationality = "南宋"
OR
nationality = "西夏"
)
AND
age >= 16;
得到結果集如下
注意,
將乳我們不加括號,不對優先級進行干預會得到一個什麼樣的結果集呢?
SQL
SELECT
*
FROM
students
WHERE
nationality = "南宋"
OR
nationality = "西夏"
AND
age >= 16;
得到結果集如下
這是什麼意思你通過上面的講解應該很清楚吧。
這種查詢方法的意思就是,你想要得到南宋的學生,或者西夏學生且年齡大於等於16的同學。
本篇主要在於對OR運算符的運算機制進行講解,
幫助你明白OR運算時時如何工作的。
稍微注意一下AND和OR運算符的優先級問題。