在 FROM 和 WHERE 子句中连接表

Ste*_* L. 2 join

第一次来这里。

我对加入表格时的最佳实践有疑问。例如,以下两个查询都返回相同的结果:

SELECT i.id, p.first_name, p.last_name
FROM individuals i, profiles p
WHERE i.id = p.individual_id;


SELECT i.id, p.first_name, p.last_name
FROM individuals i INNER JOIN profiles p ON i.id = p.individual_id;
Run Code Online (Sandbox Code Playgroud)

这两种方法的优缺点是什么?请让我知道你的想法。我对性能差异感兴趣,但也对查询的可读性、从一个 RDMS 到另一个 RDMS 的可移植性感兴趣,等等。

谢谢!

M.A*_*Ali 7

两个查询完全相同,应该返回完全相同的结果集并且应该产生完全相同的执行计划。

但是第二个查询使用的是ANSI-92 SQLsyntax 。第一个是使用较旧(非常旧)版本的 SQL 联接。

我可以想到一些您应该使用 ANSI-92 SQL 语法的原因。

  1. 如果有的话,它将子句中的Join Conditions过滤器和实际过滤器分开WHERE
  2. 使用旧语法,您只能拥有INNERCROSS连接的等效项。除了复杂的UNION查询,外连接是不可能的。一些 DBMS 已经(+)在 Oracle*==*SQL Server 中为外连接添加了专有语法,但这些正在或已经被弃用。标准中添加了显式连接和外连接LEFTRIGHT并且FULL几乎所有 DBMS 都采用了这些连接。
  3. 它使查询更具可读性,因此更易于调试。
  4. 现在,大多数开发人员、DBA 和 ORM 都使用 Join 语法。
  5. 当使用 ANSI-92 SQL 语法进行连接时,如果您错过了连接条件,则会出现编译时错误,因此它会强制您提供有效的连接条件,而在旧版本中它不会抛出任何错误,但它只会返回一个CROSS JOIN,根据我的经验,这是旧方法最糟糕的缺点之一。
  6. 当使用旧版本的连接并且您的查询混合了内连接和外连接时,结果集可能总是与您期望的不同。