【发布时间】:2014-06-28 05:15:03
【问题描述】:
我希望这个问题已经被多次问过,并且有不同的曲折。不过,我想尝试对这个主题有一个通用而全面的理解。 (它是否属于编程 SO?..)
假设我有一张sports 的桌子和一张matches 的桌子。 matches 等字段中有一个 sport_id 列,这是一个 1:many 关系。
假设我想列出第 X 天有比赛的运动。我可以通过 3 种我能想到的方式来做到这一点..
嵌套查询 - 易于推理?
SELECT *
FROM sports
WHERE id IN (SELECT sport_id FROM matches WHERE <DATE CHECK>)
来自/哪里 - 容易写吗?
SELECT sports.*
FROM sports, matches
WHERE sports.id = matches.sport_id
AND <DATE CHECK>
加入 - 我不是太熟悉,所以请原谅任何错误
SELECT *
FROM sports
JOIN matches ON sports.id = matches.sport_id
WHERE <DATE CHECK>
可能还有其他基于 Join 变体的方法可能更适合这里,可能是内部连接..
我想知道的是如何在
的基础上比较这 3 个- 等效响应(返回相同的行?)
- DB 上的性能
- 它们都是 1 个查询/网络调用还是?
- 这些答案是否依赖于数据库引擎?
- 我该如何选择?
- #2 是#3 的语法糖吗?是#1?或者它们是否在某些/所有情况下优化为 #3?
【问题讨论】:
-
第二个和第三个都是连接——第二个是隐式连接,第三个是显式连接。它们是完全等价的。
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已随 ANSI-92 SQL 标准(超过 20 年前)
标签: sql performance join