mysql - EXISTS 和 JOIN 检查记录是否存在的区别

标签 mysql sql performance join exists

看下面的例子:

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/

相关文章:

c# - 查询问题 - 在 sql navigator 中运行查询时返回行,但不在我的 c# 程序中

php - CSV 与 MySQL 性能对比

java - 绘制还是使用 JLabel 更好

Java 分析、性能调优和内存分析练习

php - 按 Log_time 排序但按组部分排序?

mysql - 远程数据库正在连接

mysql - 使用远程 MySQL 编辑本地主机网站

SQL 查询列出员工未工作的城市

mysql - 与 MYSQL Sequelize 的一对多关系

mysql - 使用MySQL选取最近三个月的数据