看下面的例子:
SELECT *
FROM customers
WHERE EXISTS
(SELECT *
FROM order_details
WHERE customers.customer_id = order_details.customer_id)
;
检索相同结果集的两个表之间的等效基于内联接
的查询有哪些差异?
我关心的是技术/性能方面,而不是代码的可读性/可维护性。
最佳答案
使用 EXISTS
子句,您可以选择至少存在一个 order_details 记录的所有客户。
SELECT *
FROM customers c
WHERE EXISTS (SELECT * FROM order_details od WHERE od.customer_id = c.customer_id);
通过加入,您可以再次选择这些客户。但是,只要存在 order_detail,您就可以经常选择它们。 IE。你会有很多重复项。
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;
但是为什么生成所有重复项却必须再次删除它们呢?不要这样做。仅当您确实想要加入结果时才加入。
顺便说一下,另一个选项是 IN
子句,我认为它比 EXISTS
子句更具可读性。这将是我编写查询的方式:
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM order_details);
关于mysql - EXISTS 和 JOIN 检查记录是否存在的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53740739/