exists和join之间的区别,用于检查记录是否存在

yzckvree  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(392)

请看以下示例:

SELECT *
FROM customers
WHERE EXISTS
    (SELECT *
     FROM order_details
     WHERE customers.customer_id = order_details.customer_id)
;

与同类产品有哪些区别 inner join -检索相同结果集的两个表之间的基于查询?
我关心的是技术/性能方面,而不是代码的可读性/可维护性。

dly7yett

dly7yett1#

exists的逻辑工作如下

for x in (select * from customers)
loop
      -- check if x.customer_id exists in order_details table.    
      ---if yes 
          --output the customer tables row
      -- else 
         --ignore 
end if;
end loop;

因此,在exists查询中,计划通常会使用嵌套循环(但不是硬性的快速规则)
join查询的逻辑等价性如下

for x in (select * from customers)
loop
  --for each row in customer 
  -- fetch records from order_details which match this condition
      select * from order_details where customer_id=x.customerid     
end loop;
y53ybaqx

y53ybaqx2#

EXISTS() 称为“半连接”。它开始了一个 JOIN ,但在找到第一个匹配项时停止。因此, EXISTS 会比任何同类产品都快 JOIN .
也, EXISTS( SELECT * ... WHERE ... ) 并不真正关心 * . 它将使用任何最佳索引来发现匹配 WHERE ,则返回1或0(表示“true”或“false”)。
当然,如果 LEFT JOIN 将返回0或1行,不再返回更多行,则没有太多性能差异。除了 LEFT JOIN 将从表中返回值。

lf5gs5x2

lf5gs5x23#

带着一个 EXISTS 子句选择至少存在一个订单明细记录的所有客户。

SELECT * 
FROM customers c
WHERE EXISTS (SELECT * FROM order_details od WHERE od.customer_id = c.customer_id);

加入后,您将再次选择这些客户。但是,只要存在订单详细信息,您就可以经常选择它们。i、 你会有很多复制品。

SELECT c.*
FROM customers c
JOIN order_details od ON c.customer_id = od.customer_id;

可以使用删除结果中的重复项 DISTINCT 为了让每个客户都能再次得到:

SELECT DISTINCT c.*
FROM customers c
JOIN order_details od ON c.customer_id = od.customer_id;

但是为什么要生成所有的副本而只需要再次删除它们呢?别这样。只有当你真的想要加入结果时才加入。
另一种选择,我认为它比 EXISTS 子句是 IN 顺便说一句。这将是我编写查询的方式:

SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM order_details);

相关问题