本资料为产品岗位作为日常工作参考,语言口语化
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运算符的优先级问题。