IN
判断某个值是否属于指定列表或子查询结果。
简介
IN 判断一个值是否等于列表或子查询结果中的任意值,适合替代多个等值 OR 条件。子查询中的重复值不会改变匹配含义。涉及 NULL 时要特别谨慎:NOT IN 若没有命中非 NULL 值,而集合中又含 NULL,判断会变为 UNKNOWN,因而常导致零行返回。
基础语法
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers);
示例
IN 示例
从 customers 子查询取得 id,再返回 customer_id 位于该集合中的订单。
示例数据表
表名:
orders| id | customer_id | product_id | name | department | amount | status | created_at | discount |
|---|---|---|---|---|---|---|---|---|
| 1 | 101 | 201 | Alice | Sales | 1200 | paid | 2026-01-03 | 0 |
| 2 | 102 | 202 | Bob | IT | 900 | pending | 2026-01-08 | 50 |
| 3 | 101 | 201 | Cindy | Sales | 1500 | paid | 2026-02-02 | 100 |
| 4 | 104 | 203 | David | HR | 700 | cancelled | 2026-02-15 | 0 |
表名:
customers| id | name | city | status | phone | nickname |
|---|---|---|---|---|---|
| 101 | Alice | New York | active | 138-0000-0001 | NULL |
| 102 | Bob | Seattle | active | NULL | Bobby |
| 103 | Cindy | Austin | inactive | 138-0000-0003 | NULL |
运行结果
| id | customer_id | product_id | name | department | amount | status | created_at | discount |
|---|---|---|---|---|---|---|---|---|
| 1 | 101 | 201 | Alice | Sales | 1200 | paid | 2026-01-03 | 0 |
| 2 | 102 | 202 | Bob | IT | 900 | pending | 2026-01-08 | 50 |
| 3 | 101 | 201 | Cindy | Sales | 1500 | paid | 2026-02-02 | 100 |
常见问题
IN 适合替代多个 OR 吗?
适合。字段等于多个固定值时,IN 通常比多个 OR 更简洁。
IN 可以接子查询吗?
可以,例如 WHERE customer_id IN (SELECT id FROM customers ...)。
IN 和 EXISTS 怎么选?
固定列表用 IN 很直观;相关子查询或只判断存在性时,EXISTS 往往更清楚。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。