MySQL IN和NOT IN 运算符的用法

MySQL IN 运算符的用法

在使用 SQL 查询的时候,我们可能需要判断一个字段的值是否位于一组值中,这就需要用到 IN 运算符了。

IN 运算符用来检查一个字段或值是否包含在一个集合中,如果值包含在集合中返回 1,否则返回 0。

MySQL IN 语法

IN 是一个双目运算符,它需要 2 个操作数。以下是 IN 运算符的语法:

java 复制代码
expression IN (value1, value2, ...)

用法说明:

expression 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。

(value1, value2, ...) 是一个值列表,多个值之间使用 , 分隔,并使用小括号 () 将它们包围起来。

value1 是具体的值,比如:1, 2, 'A', 'B' 等。

(value1, value2, ...) 最少可以是 1 个值,比如 (1), ('A')。

MySQL IN 运算规则

IN 运算符当左侧的操作数的值是右侧操作数集合列表中的其中一个时, IN 运算符返回 1。否则 返回 0。

IN 运算符其实是多个 OR 运算符组合的简化版本。比如下面的 IN 语句:

java 复制代码
name IN ('Alice', 'Tim', 'Jack')

相当于下面的 OR 语句:

ini 复制代码
name = 'Alice' OR name = 'Tim' OR name = 'Jack'

IN 运算符的运算规则如下:

当左侧和右侧都不是 NULL 时,右侧值列表中包含左侧的值时返回 1,否则返回 0。

scss 复制代码
SELECT 1 IN (1,2),3 IN(1,2),'A'IN('A','B'),'C'IN('A','B');
lua 复制代码
+-------------+-------------+-------------------+-------------------+
| 1 IN (1, 2) | 3 IN (1, 2) | 'A' IN ('A', 'B') | 'C' IN ('A', 'B') |
+-------------+-------------+-------------------+-------------------+
|           1 |           0 |                 1 |                 0 |
+-------------+-------------+-------------------+-------------------+

当左侧操作数为 NULL,返回 NULL。

arduino 复制代码
SELECT NULL IN (1, 2), NULL IN (1, 2, NULL);
sql 复制代码
+----------------+----------------------+
| NULL IN (1, 2) | NULL IN (1, 2, NULL) |
+----------------+----------------------+
|           NULL |                 NULL |
+----------------+----------------------+

当右侧值列表含有 NULL,如果包括左侧的非 NULL 值,返回 1,否则返回 NULL

sql 复制代码
SELECT 1 IN (1, NULL), 2 IN (1, NULL);
sql 复制代码
+----------------+----------------+
| 1 IN (1, NULL) | 2 IN (1, NULL) |
+----------------+----------------+
|              1 |           NULL |
+----------------+----------------+

MySQL IN 实例

在实际开发中,我们会在 SELECT、UPDATE、DELETE 语句中的 WHERE 子句中使用 IN 运算符。在 IN 运算符中,除了与值列表比较,还可能与子查询进行比较。

在以下实例中,我们使用 Sakila 示例数据库中的 actor 表作为演示。

以下查询使用 WHERE 子句查找姓氏为 ALLEN 或 DAVIS 的所有演员。

sql 复制代码
SELECT * FROM actor WHERE last_name IN ('ALLEN',"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 |
+----------+------------+-----------+---------------------+

总结

IN 是一个双目运算符,需要 2 个操作数。

IN 运算符左侧操作数是字段名或者值,右侧操作数是值列表或者子查询结果。

IN 运算符左侧的操作数的值是右侧操作数集合列表中的其中一个时,返回 1。否则 返回 0。

IN 运算符可以看作是多个 OR 运算符组合的简化版本。

IN 运算符的否定操作是 NOT IN。

MySQL NOT IN 使用说明

NOT 是一个逻辑运算符,用来用来否定一个操作。NOT IN 是 IN 的否定操作符。

MySQL NOT IN 语法

NOT IN 和 IN 用法几乎一样,只是在 IN 前面添加一个 NOT 关键字,IN 的否定操作符。 NOT IN 语法如下:

java 复制代码
expression NOT IN (value1, value2, ...)

用法说明:

NOT 是一个否定逻辑运算符。

expression 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。

(value1, value2, ...) 是一个值列表,多个值之间使用 , 分隔,并使用小括号 () 将它们包围起来。

value1 是具体的值,比如:1, 2, 'A', 'B' 等。

(value1, value2, ...) 最少可以是 1 个值,比如 (1), ('A')。

MySQL NOT IN 运算规则

NOT IN 检查一个字段或值是否不包含于一个值列表中,如果值不包含在值列表中,返回 1,否则返回 0。

NOT IN 操作符相当于多个 OR 组合操作的否定操作,比如下面的语句:

java 复制代码
name NOT IN ('Alice', 'Tim', 'Jack')

相当于下面的 NOT 语句:

ini 复制代码
NOT (name = 'Alice' OR name = 'Tim' OR name = 'Jack')

由于 = 的反义词是 <>,因此也相当于下面的语句:

arduino 复制代码
name <> 'Alice' AND name <> 'Tim' AND name <> 'Jack'

NOT IN 运算符的运算规则如下:

当左侧和右侧都没有 NULL 时,右侧值列表不包含左侧的值时返回 1,否则返回 0。

java 复制代码
SELECT 1 NOT IN (1, 2), 3 NOT IN (1, 2), 'A' NOT IN ('A', 'B'), 'C' NOT IN ('A', 'B');
java 复制代码
+-----------------+-----------------+-----------------------+-----------------------+
| 1 NOT IN (1, 2) | 3 NOT IN (1, 2) | 'A' NOT IN ('A', 'B') | 'C' NOT IN ('A', 'B') |
+-----------------+-----------------+-----------------------+-----------------------+
|               0 |               1 |                     0 |                     1 |
+-----------------+-----------------+-----------------------+-----------------------+

当左侧操作数为 NULL,返回 NULL。

arduino 复制代码
SELECT NULL NOT IN (1, 2), NULL NOT IN (1, 2, NULL);
sql 复制代码
+--------------------+--------------------------+
| NULL NOT IN (1, 2) | NULL NOT IN (1, 2, NULL) |
+--------------------+--------------------------+
|               NULL |                     NULL |
+--------------------+--------------------------+

当右侧值列表含有 NULL,如果包含左侧的非 NULL 值,返回 0,否则返回 NULL

arduino 复制代码
SELECT 1 NOT IN (1, NULL), 2 NOT IN (1, NULL);
sql 复制代码
+--------------------+--------------------+
| 1 NOT IN (1, NULL) | 2 NOT IN (1, NULL) |
+--------------------+--------------------+
|                  0 |               NULL |
+--------------------+--------------------+

MySQL NOT IN 实例

在以下实例中,我们使用 Sakila 示例数据库中的语言表 language 表作为演示。

以下查询使用 WHERE 子句查找不是 French 或 German 的所有影片的语言信息。

sql 复制代码
SELECT * FROM language WHERE name NOT IN ('French','German');
yaml 复制代码
+-------------+----------+---------------------+
| language_id | name     | last_update         |
+-------------+----------+---------------------+
|           1 | English  | 2006-02-15 05:02:19 |
|           2 | Italian  | 2006-02-15 05:02:19 |
|           3 | Japanese | 2006-02-15 05:02:19 |
|           4 | Mandarin | 2006-02-15 05:02:19 |
+-------------+----------+---------------------+

同样,如果您执行下面的两个语句,您会发现他们的结果与上面的语句相同。

sql 复制代码
SELECT * FROM language WHERE NOT (name = 'French' OR name = 'German');
SELECT * FROM language WHERE name <> 'French' AND name <> 'German';

总结

NOT IN 是 IN 运算符的否定操作。

NOT IN 检查左侧值是否不包含于右侧的值列表中。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile3 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白803 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库