MYSQL中NOT IN和NOT EXISTS

发布于:2025-07-25 ⋅ 阅读:(16) ⋅ 点赞:(0)

    NOT INNOT EXISTS 是 MySQL 中用于排除某些数据的两种常见查询方式。它们的功能相似,都用于返回不满足某一条件的结果,但是它们在内部的实现方式以及某些特定场景下的行为有所不同。

1. NOT IN

    NOT IN 是用来排除在指定值集合中存在的值。通常用来与子查询结合,在查询中排除某些值。

SELECT column_name
FROM table_name
WHERE column_name NOT IN (subquery);

假设有两个表:orderscustomers,我们要找出那些没有下过订单的客户。

SELECT customer_id
FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);

这个查询会返回所有没有出现在 orders 表中的客户 customer_id

如果子查询结果包含 NULLNOT IN 会返回不准确的结果,因为 NULL 代表“未知”,任何与 NULL 比较的结果都会是“未知”(UNKNOWN)。因此,如果子查询结果中包含 NULLNOT IN 可能会导致意外的结果。 

2. NOT EXISTS

    NOT EXISTS 用于检查子查询是否没有返回任何记录。它通常用于子查询中,通过判断子查询是否返回结果来决定是否排除某些数据。

SELECT column_name
FROM table_name
WHERE NOT EXISTS (subquery);

这个查询会返回所有没有在 orders 表中找到相关记录的客户。

NOT EXISTS 不会受 NULL 的影响,因为它仅检查子查询是否返回任何记录。在某些场景下,NOT EXISTS 可以比 NOT IN 更高效,尤其是在子查询中包含 NULL 的情况下,NOT EXISTS 可以避免出现不正确的结果。 

3. 异同总结

    相同点
  • 都是用来排除满足某个条件的数据。
  • 都可用于子查询,返回那些不满足子查询条件的记录。
    不同点

   NOT IN

           如果子查询返回 NULL,可能会影响查询结果,导致意外的“未知”结果。

    NOT IN 通常会将整个结果集加载到内存中,可能导致性能问题,特别是在处理大数据量时。

    NOT EXISTS

           对 NULL 处理更为健壮,不会受到 NULL 的影响。

           通常在处理大数据集时性能更好,尤其是在使用关联子查询时,NOT EXISTS 可以避免不必要的全表扫描。 

    性能差异:

    NOT IN 通常在小数据集上表现良好,但在包含 NULL 或大数据集的情况下,可能会出现性能问题。

    NOT EXISTS 更适用于复杂查询,尤其是在大数据集和 NULL 值的场景下,能够更高效地执行。


网站公告

今日签到

点亮在社区的每一天
去签到