EXISTS
判断子查询是否至少返回一行记录。
简介
EXISTS 只判断子查询是否至少返回一行,不关心子查询选择了哪些字段。相关子查询会引用外层当前行,常用于判断关联记录是否存在。EXISTS 与 IN 的性能没有固定优劣,应先选择语义清楚的写法,再结合索引和执行计划验证。
基础语法
SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
示例
EXISTS 示例
逐个检查 customers,只保留在 orders 中至少存在一笔关联订单的客户。
示例数据表
表名:
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 |
表名:
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 |
运行结果
| id | name | city | status | phone | nickname |
|---|---|---|---|---|---|
| 101 | Alice | New York | active | 138-0000-0001 | NULL |
| 102 | Bob | Seattle | active | NULL | Bobby |
常见问题
EXISTS 关心子查询返回哪些字段吗?
不关心。EXISTS 只判断子查询是否返回至少一行。
EXISTS 常用于什么场景?
常用于判断某条主表记录是否存在对应的关联记录。
EXISTS 和 IN 一定谁更快吗?
不一定,具体取决于数据量、索引和数据库优化器。先写清楚逻辑更重要。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。