SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
SELECT * FROM TableA, TableB
where TableA.name = TableB.name
哪种方式首选?为什么? 使用像JOIN这样的关键字会有什么性能差异吗?
由于
答案 0 :(得分:11)
第二种方式是从join
关键字存在之前的经典方式。
通常,查询处理器会从两个查询中生成相同的数据库操作,因此性能没有差异。
使用join
更好地描述了您在查询中所做的事情。如果你有很多连接,它也更好,因为连接表和它的条件是彼此相邻的,而不是将所有表放在一个地方而所有条件放在另一个地方。
另一个方面是使用第二种方法更容易错误地进行无界连接,从而产生包含两个表中所有组合的交叉连接。
答案 1 :(得分:3)
使用第一个,原样:
至于表现 - 应该没有区别。
答案 2 :(得分:1)
使用EXPLAIN SELECT …
它取决于所使用的引擎,查询优化器,表上的键;几乎所有的东西
答案 3 :(得分:1)
在某些SQL引擎中,第二种形式(关联联接)被删除。使用第一个表格。
第二个不太明确,导致SQL编写代码时暂停SQL。由于连接匹配要求的顺序与WHERE子句序列匹配,因此在复杂的SQL中管理要困难得多 - 它们(代码中的顺序)必须匹配,否则返回的结果将发生变化,使返回的数据集发生变化当考虑同一级别的元素时,序列不应该改变结果的想法。
当创建包含多个表的连接时,使用第二个表单很快就会很难编码。
编辑:性能:我考虑编码,调试轻松部分个人性能,因此使用第一种形式更容易编辑/调试/维护 - 在开发和维护期间,我只需花费更少的时间来做/理解内容周期。
答案 4 :(得分:0)
大多数当前数据库会将这两个查询优化为完全相同的执行计划。但是,使用第一种语法,它是当前的标准。通过学习和使用此连接语法,当您使用LEFT OUTER JOIN
和RIGHT OUTER JOIN
进行查询时,它会有所帮助。使用旧语法和WHERE子句中的连接变得棘手和有问题。
答案 5 :(得分:0)
在某些常见情况下,仅使用WHERE过滤联接可能效率极低。例如:
SELECT * FROM people p, companies c WHERE p.companyID = c.id AND p.firstName = 'Daniel'
大多数数据库都会完全按字面意思执行此查询,首先使用人员和公司表的笛卡尔积,然后按那些具有匹配的companyID和id字段的数据进行过滤。虽然完全不受约束的产品不存在于存储器中的任何地方,但仅存在一段时间,但其计算确实需要一些时间。
更好的方法是在相关的JOIN中对约束进行分组。这不仅在主观上更容易阅读,而且效率更高。正是如此:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
它有点长,但数据库能够查看ON子句并使用它直接计算完全约束的JOIN,而不是从所有内容开始然后限制。这样计算速度更快(特别是对于大型数据集和/或多表连接)并且需要更少的内存。
我更改了我看到的每个使用“逗号JOIN”语法的查询。在我看来,它存在的唯一目的是简洁。考虑到性能影响,我认为这不是一个令人信服的理由。