EXISTS是 SQL 中的子查询关键字,用来判断子查询是否返回结果:
- 如果子查询有返回数据→
EXISTS结果为TRUE - 如果子查询没有返回数据→
EXISTS结果为FALSE
它的核心特点:只要找到一条匹配数据就停止查询,效率远高于IN,非常适合大数据量查询。
一、基础语法
sql
SELECT 列名 FROM 主表 WHERE EXISTS (子查询);二、最常用场景:关联查询(判断存在性)
示例表
users用户表表格
id name 1 张三 2 李四 3 王五 orders订单表表格
order_id user_id 101 1 102 1 103 2
需求 1:查询【有订单的用户】
sql
SELECT * FROM users WHERE EXISTS ( -- 子查询:关联订单表,判断当前用户是否有订单 SELECT 1 FROM orders WHERE orders.user_id = users.id );✅ 结果:返回张三、李四
需求 2:查询【没有订单的用户】(NOT EXISTS)
sql
SELECT * FROM users WHERE NOT EXISTS ( SELECT 1 FROM orders WHERE orders.user_id = users.id );✅ 结果:返回王五
三、关键细节
子查询里写什么?推荐写
SELECT 1,不要写SELECT *EXISTS只关心有没有结果,不关心查什么字段SELECT 1性能更好
必须关联主表和子表子查询里必须写
子表.字段 = 主表.字段,否则会变成全表判断。EXISTS 和 IN 的区别| 关键字 | 效率 | 适用场景 ||--------|------|----------|| EXISTS | 高(找到即停) | 主表小、子表大 || IN | 低(全表匹配) | 子表结果少 |
等价 IN 写法(对比)
sql
-- 有订单的用户(IN 写法) SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);四、简单示例:不关联表(判断固定条件)
判断是否存在年龄 > 18 的用户:
sql
SELECT * FROM users WHERE EXISTS (SELECT 1 FROM users WHERE age > 18);- 如果有用户满足 → 返回所有用户
- 如果没有 → 返回空
总结
EXISTS= 判断子查询是否有结果- 常用:查询存在 / 不存在关联数据的记录
- 写法:
WHERE EXISTS (子查询关联主表) - 性能:比
IN更好,优先使用