奇怪的 SQL 代码:为什么他们使用子查询而不是连接?

Weird SQL code: Why do they use a subquery instead of join?

我遇到了以下 MySQL 代码:

SELECT ServiceFee
FROM Shows
WHERE ID = (SELECT ShowID FROM Orders WHERE ID = ?)

这让我感到奇怪,因为编写这段代码的人通常使用 SQL 连接。我会重写它

SELECT ServiceFee
FROM Shows
INNER JOIN Orders ON Shows.ID = Orders.ShowID
WHERE Orders.ID = ?

我的问题:为什么要用子查询编写这段代码以及用连接重写它是否完全安全(在所有情况下产生相同的结果)是否完全安全?

有什么注意事项吗?

不,没有任何警告。事实上,INNER JOIN 查询可能 运行 更快

"Is there any reason why this code was written with a subquery"

很久以前 MySQL 加入曾经很慢

有一个合乎逻辑的理由更喜欢子查询而不是连接:

ShowsOrders 之间存在一对多关系,当您切换到联接时,通常必须添加一个 DISTINCT 以删除重复的行 returned。

在您的情况下,这不是必需的,因为您限制为单个订单,但是当您删除 WHERE 条件或将其更改为 return 多行时,您会注意到。

如果没有上下文,这两个查询不会执行相同的操作。如果 Orders.ID 不是唯一的,第一个查询可能会产生错误,因为子查询可以 return 多行。如果 Orders.ID 是唯一的(可能是主键),那么就不会有任何区别 - 无论是结果还是性能(较新版本)。所以在这种情况下,这只是一个偏好问题。通常我更喜欢加入。但在您的示例中,子查询解决方案看起来不错且可读。所以我不会无缘无故重写它。