奇怪的 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 加入曾经很慢
有一个合乎逻辑的理由更喜欢子查询而不是连接:
在 Shows
和 Orders
之间存在一对多关系,当您切换到联接时,通常必须添加一个 DISTINCT 以删除重复的行 returned。
在您的情况下,这不是必需的,因为您限制为单个订单,但是当您删除 WHERE 条件或将其更改为 return 多行时,您会注意到。
如果没有上下文,这两个查询不会执行相同的操作。如果 Orders.ID
不是唯一的,第一个查询可能会产生错误,因为子查询可以 return 多行。如果 Orders.ID
是唯一的(可能是主键),那么就不会有任何区别 - 无论是结果还是性能(较新版本)。所以在这种情况下,这只是一个偏好问题。通常我更喜欢加入。但在您的示例中,子查询解决方案看起来不错且可读。所以我不会无缘无故重写它。
我遇到了以下 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 加入曾经很慢
有一个合乎逻辑的理由更喜欢子查询而不是连接:
在 Shows
和 Orders
之间存在一对多关系,当您切换到联接时,通常必须添加一个 DISTINCT 以删除重复的行 returned。
在您的情况下,这不是必需的,因为您限制为单个订单,但是当您删除 WHERE 条件或将其更改为 return 多行时,您会注意到。
如果没有上下文,这两个查询不会执行相同的操作。如果 Orders.ID
不是唯一的,第一个查询可能会产生错误,因为子查询可以 return 多行。如果 Orders.ID
是唯一的(可能是主键),那么就不会有任何区别 - 无论是结果还是性能(较新版本)。所以在这种情况下,这只是一个偏好问题。通常我更喜欢加入。但在您的示例中,子查询解决方案看起来不错且可读。所以我不会无缘无故重写它。