今天加班回来比较晚,没有时间写长篇大论了,补一补之前遗留的技术债吧,对于数据分析人员来说,每天都会写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可能更高效,因为它的实现方式比较简单,不需要进行多次查询判断。