SQL 中 EXISTS 的用法
2026/5/8 18:13:33 网站建设 项目流程

EXISTS是 SQL 中的子查询关键字,用来判断子查询是否返回结果

  • 如果子查询有返回数据EXISTS结果为TRUE
  • 如果子查询没有返回数据EXISTS结果为FALSE

它的核心特点:只要找到一条匹配数据就停止查询,效率远高于IN,非常适合大数据量查询。


一、基础语法

sql

SELECT 列名 FROM 主表 WHERE EXISTS (子查询);

二、最常用场景:关联查询(判断存在性)

示例表

  1. users用户表

    表格

    idname
    1张三
    2李四
    3王五
  2. orders订单表

    表格

    order_iduser_id
    1011
    1021
    1032

需求 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 );

✅ 结果:返回王五


三、关键细节

  1. 子查询里写什么?推荐写SELECT 1,不要写SELECT *

    • EXISTS只关心有没有结果,不关心查什么字段
    • SELECT 1性能更好
  2. 必须关联主表和子表子查询里必须写子表.字段 = 主表.字段,否则会变成全表判断。

  3. 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);
  • 如果有用户满足 → 返回所有用户
  • 如果没有 → 返回空

总结

  1. EXISTS= 判断子查询是否有结果
  2. 常用:查询存在 / 不存在关联数据的记录
  3. 写法:WHERE EXISTS (子查询关联主表)
  4. 性能:比IN更好,优先使用

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询