SQLPathLab
子查询 · 进阶

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
customers
idnamecitystatusphonenickname
101 Alice New York active 138-0000-0001 NULL
102 Bob Seattle active NULL Bobby
103 Cindy Austin inactive 138-0000-0003 NULL
表名:orders
orders
idcustomer_idproduct_idnamedepartmentamountstatuscreated_atdiscount
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

运行结果

result
idnamecitystatusphonenickname
101 Alice New York active 138-0000-0001 NULL
102 Bob Seattle active NULL Bobby

常见问题

EXISTS 关心子查询返回哪些字段吗?

不关心。EXISTS 只判断子查询是否返回至少一行。

EXISTS 常用于什么场景?

常用于判断某条主表记录是否存在对应的关联记录。

EXISTS 和 IN 一定谁更快吗?

不一定,具体取决于数据量、索引和数据库优化器。先写清楚逻辑更重要。

标签

条件判断常用过滤数据

这篇内容是否清楚?