可能重复:
Is there something wrong with joins that don't use the JOIN keyword in SQL or MySQL?
您好,
我总是在没有加入的情况下检索数据......
但是一种方法比另一种方法有好处吗?
select * from a INNER JOIN b on a.a = b.b;
select a.*,b.* from a,b where a.a = b.b;
谢谢!
答案 0 :(得分:8)
使用INNER JOIN
关键字的第一种方法是:
因此,当我看到第二个选项时,我总是畏缩 - 它只是膨胀了你的WHERE
子句,你无法一眼就看出这些表是如何连接的(在哪些字段上)。 / p>
如果您忘记了很长的WHERE子句表达式中的JOIN条件之一,您会突然得到一个混乱的笛卡尔积...使用INNER JOIN
关键字无法做到这一点(必须表达要加入的字段。
答案 1 :(得分:2)
我认为最大的好处是可读性。具有明确命名的连接类型的版本对我来说更容易理解。
答案 2 :(得分:1)
基本上,您正在为JOIN
使用不同的语法。作为最佳实践的问题,最好使用第一种语法(显式JOIN
),因为它更清楚查询的意图是什么,并使代码更容易维护。
答案 3 :(得分:0)
您始终使用联接检索数据。第二个查询使用旧语法,但在后台它仍然是连接:)
答案 4 :(得分:0)
这取决于RDBMS,但在SQL服务器的情况下,我理解利用前一种语法可以实现更好的优化。这不是一个SQL问题,而是一个特定于供应商的问题。
您还可以使用EXPLAIN
(SQL Server:Query Execution Plan)类型函数来帮助您了解是否存在差异。每个查询都是唯一的,我想存储的统计信息可以(并将会)改变行为。
答案 5 :(得分:0)
这些都是联接。它们只是连接的两种不同的语法表示。第一个(使用“Join”关键字,是当前的ANSI标准(我认为是1992年)。
在仅内连接的情况下,两个不同的表示在功能上是相同的,但是后一种ANSI SQL92标准语法在你习惯它之后可以读得很多,因为每个单独的连接条件与连接在一起的中间结果集对相关联。在旧表示中,连接条件与where子句中的整体查询的过滤条件一起,并且不清楚哪个是哪个。这使得识别不良连接条件(例如,将生成非预期的笛卡尔积)变得更加困难。
但更重要的是,在执行 外部 加入时,在某些情况下,旧语法不是等效的,实际上会生成< strong> 错误 结果集。
您应该转换为所有查询的较新语法。