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
连接两个比较条件,过滤那些至少满足其中一个比较条件的记录行。