SQL中的not exists和not in的区别

378 阅读2分钟

今天加班回来比较晚,没有时间写长篇大论了,补一补之前遗留的技术债吧,对于数据分析人员来说,每天都会写sql,对于常用的not exists和not in,在一些场景下都可以实现在子查询中筛选所需数据的目的,那么两者之间有什么区别呢?

1.查询场景

假设我们有两张表格:

orders (order_id, customer_id, order_date)
order_items (order_id, product_id, quantity)

我们想选取所有的顾客,这些顾客没有购买product_id为10的商品。

2.查询逻辑

使用"NOT EXISTS"的SQL查询如下:

SELECT *
FROM orders o
WHERE NOT EXISTS (
  SELECT 1
  FROM order_items oi
  WHERE oi.order_id = o.order_id
    AND oi.product_id = 10
);

使用"NOT IN"的SQL查询如下:

SELECT *
FROM orders
WHERE customer_id NOT IN (
  SELECT customer_id
  FROM order_items
  WHERE product_id = 10
);

3.性能分析

"NOT IN"将使用内部查询返回的结果列表来匹配值,而"NOT EXISTS"则是使用内部查询的结果集是否为空来确定是否匹配。

在上面的例子中,对于"NOT EXISTS"查询,它是使用一个子查询来检查是否有product_id为10的记录与orders表中的记录相匹配。如果子查询返回结果为空,那么它就会返回orders表中的记录。

对于"NOT IN"查询,它会首先查询order_items表以获取购买了product_id为10的顾客列表,然后将这个列表与orders表中的顾客列表进行比较,以找到那些没有购买product_id为10的商品的顾客。

4.结论

NOT EXISTS更适合处理子查询返回的结果集较大的情况,因为它只需要判断子查询结果集是否为空,而不需要将整个子查询结果集都取出来再进行比较。而对于子查询结果集较小的情况,NOT IN可能更高效,因为它的实现方式比较简单,不需要进行多次查询判断。