MySQL AND 运算符的用法
当使用 SELECT 查询数据时,如果 WHERE 子句中有多个条件,可以根据需要使用 AND, OR, 或者 NOT 运算符将他们组合起来。
AND 运算规则
AND 运算符是一个双目逻辑运算符,用来组合两个操作数。只有当两个操作数都为真时,结果才返回真,否则返回假或者 NULL。
AND 运算符语法:
css
a AND b
其中,a 和 b 是 AND 的两个操作数,可以是表达式,也可以是值。
MySQL 中没有布尔类型,AND 的运算结果是 1, 0, 或着 NULL。
AND 运算符的运算规则如下:
如果两个操作数都不为 0 (FALSE) 并且不为 NULL 时,则 AND 运算的结果为 1。
ini
SELECT 1 AND 1, 1 AND 2;
diff
+---------+---------+
| 1 AND 1 | 1 AND 2 |
+---------+---------+
| 1 | 1 |
+---------+---------+
如果有一个操作数为 0 (FALSE),则 AND 运算的结果为 0。
sql
SELECT 0 AND 0,0 AND 1,0 AND 2,0 AND NULL;
sql
+---------+---------+---------+------------+
| 0 AND 0 | 0 AND 1 | 0 AND 2 | 0 AND NULL |
+---------+---------+---------+------------+
| 0 | 0 | 0 | 0 |
+---------+---------+---------+------------+
两个操作数的前后顺序不影响 AND 操作符的运算结果。
sql
SELECT 1 AND 0, 0 AND 1, 1 AND NULL, NULL AND 1;
sql
+---------+---------+------------+------------+
| 1 AND 0 | 0 AND 1 | 1 AND NULL | NULL AND 1 |
+---------+---------+------------+------------+
| 0 | 0 | NULL | NULL |
+---------+---------+------------+------------+
WHERE 子句中的 AND
在 WHERE 子句中, AND 连接两个比较条件。一般的形式如下:
ini
column_name1 = value1 AND column_name2 = value2
WHERE 子句中的 AND 过滤那些同时满足两个比较条件的记录行。
也就是说,如果数据表中的记录行,必须同时满足字段 column_name1 的值为 value1 和 column_name2 的值为 value2 两个条件,才是符合条件的记录行。
AND 运算符实例
在以下实例中,我们使用 Sakila 示例数据库中的 actor 表作为演示。
以下 SQL 语句在 actor 表中查找姓为 DAVIS 且名为 SUSAN 的所有演员:
ini
SELECT * FROM actor WHERE last_name = 'DAVIS' AND first_name = 'SUSAN';
在这个语句中,查询条件 last_name = 'DAVIS' AND first_name = 'SUSAN' 的意思是过滤表中 last_name 字段的值为 DAVIS,并且 first_name 字段的值为 SUSAN 的所有记录行。
last_name = 'DAVIS' 是一个条件,first_name = 'SUSAN' 也是一个条件,AND 将两者组合在一起,意思是查询的记录行要同时满足这两个条件。
diff
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 101 | SUSAN | DAVIS | 2006-02-15 04:34:33 |
| 110 | SUSAN | DAVIS | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
我们还可以查询 actor 表中姓氏为 DAVIS 且 actor_id 小于 100 的演员信息:
ini
SELECT * FROM actor WHERE last_name = 'DAVIS' AND actor_id < 100;
diff
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 4 | JENNIFER | DAVIS | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
总结
AND 是双目运算符,需要两个布尔操作数。
如果两个操作数都不为 0 (FALSE) 并且不为 NULL 时,则 AND 运算的结果为 1。
如果有一个操作数为 0 (FALSE),则 AND 运算的结果为 0。
如果两个操作数中有一个为 NULL,且另一个不为 0 (FALSE),则返回 NULL。
两个操作数的前后顺序不影响 AND 操作符的运算结果。
WHERE 子句中的 AND 连接两个比较条件,过滤那些同时满足两个比较条件的记录行。
MySQL OR 运算符的用法
OR 运算规则
OR 运算符是一个双目逻辑运算符,用来组合两个操作数。只要两个操作数中的一个为真时,结果就返回真,否则返回假或者 NULL。
OR 运算符语法:
css
A OR B
其中,a 和 b 是 OR 的两个操作数,可以是表达式,也可以是值。
OR 运算符的运算规则如下:
如果两个操作数中至少一个操作数为 1 (TURE),则 OR 运算的结果为 1。
sql
SELECT 1 OR 1, 1 OR 0, 1 OR NULL, 2 OR 0;
sql
+--------+--------+-----------+--------+
| 1 OR 1 | 1 OR 0 | 1 OR NULL | 2 OR 0 |
+--------+--------+-----------+--------+
| 1 | 1 | 1 | 1 |
+--------+--------+-----------+--------+
如果两个操作数都为 0 (FALSE),则 OR 运算的结果为 0。
ini
SELECT 0 OR 0;
diff
+--------+
| 0 OR 0 |
+--------+
| 0 |
+--------+
如果两个操作数有一个为 NULL,另一个为 0 (FALSE) 或者 NULL,则 OR 运算的结果为 NULL。
sql
SELECT NULL OR 0, NULL or NULL;
sql
+-----------+--------------+
| NULL OR 0 | NULL or NULL |
+-----------+--------------+
| NULL | NULL |
+-----------+--------------+
两个操作数的前后顺序不影响 OR 操作符的运算结果。
sql
SELECT 1 OR 0, 0 OR 1, 1 OR NULL, NULL OR 1, 0 OR NULL, NULL OR 0;
sql
+--------+--------+-----------+-----------+-----------+-----------+
| 1 OR 0 | 0 OR 1 | 1 OR NULL | NULL OR 1 | 0 OR NULL | NULL OR 0 |
+--------+--------+-----------+-----------+-----------+-----------+
| 1 | 1 | 1 | 1 | NULL | NULL |
+--------+--------+-----------+-----------+-----------+-----------+
WHERE 子句中的 OR
在 WHERE 子句中, OR 连接两个比较条件。一般的形式如下:
ini
column_name1 = value1 OR column_name2 = value2
WHERE 子句中的 OR 过滤那些的记录行,她们只需要满足两个比较条件中的其中一个即可。
也就是说,如果数据表中的记录行,只要满足字段 column_name1 的值为 value1 或者 column_name2 的值为 value2,就是符合条件的记录行。
MySQL OR 运算符实例
在以下实例中,我们使用 Sakila 示例数据库中的演员表 actor 作为演示。
以下查询使用 WHERE 子句查找姓氏为 ALLEN 或 DAVIS 的所有演员:
ini
SELECT * FROM actor WHERE last_name = 'ALLEN' OR last_name = 'DAVIS';
yaml
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 118 | CUBA | ALLEN | 2006-02-15 04:34:33 |
| 145 | KIM | ALLEN | 2006-02-15 04:34:33 |
| 194 | MERYL | ALLEN | 2006-02-15 04:34:33 |
| 4 | JENNIFER | DAVIS | 2006-02-15 04:34:33 |
| 101 | SUSAN | DAVIS | 2006-02-15 04:34:33 |
| 110 | SUSAN | DAVIS | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+
当组合表达式同时包含 AND 和 OR 运算符时,MySQL 使用运算符优先级来确定运算符的计算顺序。MySQL 首先运算具有更高优先级的运算符。
由于 AND 运算符的优先级高于 OR 运算符,因此 MySQL 在 AND 运算符之前评估运算 OR 符。
ini
SELECT 1 OR 0 AND 0;
sql
+--------------+
| 1 OR 0 AND 0 |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
运算步骤如下:
ini
1 OR 0 AND 0
= 1 OR (0 AND 0)
= 1 OR 0
= 1
如果要更改计算顺序,请使用括号。
ini
SELECT (1 OR 0) AND 0;
sql
+----------------+
| (1 OR 0) AND 0 |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
总结
OR 是双目运算符,需要两个布尔操作数。
如果两个操作数中至少一个操作数为 1 (TURE),则 OR 运算的结果为 1。
如果两个操作数都为 0 (FALSE),则 OR 运算的结果为 0。
如果两个操作数有一个为 NULL,另一个为 0 (FALSE) 或者 NULL,则 OR 运算的结果为 NULL。
两个操作数的前后顺序不影响 OR 操作符的运算结果。
AND 运算符的优先级高于 OR。使用括号更改计算顺序。
WHERE 子句中的 OR 连接两个比较条件,过滤那些至少满足其中一个比较条件的记录行。