MySQL AND 运算符的用法和OR 运算符的用法

MySQL AND 运算符的用法

当使用 SELECT 查询数据时,如果 WHERE 子句中有多个条件,可以根据需要使用 AND, OR, 或者 NOT 运算符将他们组合起来。

AND 运算规则

AND 运算符是一个双目逻辑运算符,用来组合两个操作数。只有当两个操作数都为真时,结果才返回真,否则返回假或者 NULL

AND 运算符语法:

css 复制代码
a AND b

其中,abAND 的两个操作数,可以是表达式,也可以是值。

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 的值为 value1column_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 表中姓氏为 DAVISactor_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

其中,abOR 的两个操作数,可以是表达式,也可以是值。

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 子句查找姓氏为 ALLENDAVIS 的所有演员:

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 |
+----------+------------+-----------+---------------------+

当组合表达式同时包含 ANDOR 运算符时,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 连接两个比较条件,过滤那些至少满足其中一个比较条件的记录行。

相关推荐
Full Stack Developme1 小时前
SQL 版本历史
数据库·sql
声声codeGrandMaster3 小时前
Django项目入门
后端·mysql·django
千里码aicood3 小时前
【2025】基于springboot+vue的医院在线问诊系统设计与实现(源码、万字文档、图文修改、调试答疑)
vue.js·spring boot·后端
杰克逊的日记4 小时前
mysql数据实时全量+增量迁移
数据库·mysql·数据迁移
yang_love10114 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
Pandaconda4 小时前
【后端开发面试题】每日 3 题(二十)
开发语言·分布式·后端·面试·消息队列·熔断·服务限流
linuxxx1104 小时前
centos7 升级MariaDB 到 10.5 或更高版本
数据库·mariadb
换个网名有点难5 小时前
django怎么配置404和500
数据库·django
鱼樱前端5 小时前
mysql事务、行锁、jdbc事务、数据库连接池
java·后端
Adellle5 小时前
MySQL
数据库·后端·mysql