20

以下有什么显着区别吗?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

SO 用户是否偏好其中之一?

4

7 回答 7

28

没有区别,但是当您有一个带有额外 where 子句进行过滤的大型多连接查询时,第二个的可读性要好得多。
将连接子句和过滤子句分开是一件好事 :)

于 2009-03-27T18:50:43.633 回答
10

前者是 ANSI 89 语法,后者是 ANSI 92。

对于该特定查询,没有区别。但是,对于前者,您无法在复杂查询中将过滤器与连接条件分开,并且指定 LEFT、RIGHT 和 INNER 的语法通常会令人困惑,尤其是当您必须在不同的数据库供应商之间来回切换时。我根本不喜欢旧的语法。

于 2009-03-27T18:55:08.927 回答
4

sql查询引擎没有区别。

为了可读性,如果您使用换行符和缩进,后者更容易阅读。

对于 INNER JOIN,无论您是否将“过滤器”和“连接”放在 ON 或 WHERE 子句中,查询优化器都应该决定首先做什么(它可能选择先进行过滤,然后再进行连接,反之亦然反之亦然

然而,对于 OUTER JOIN,存在差异,有时您希望将条件放在 ON 子句中,有时放在 WHERE 中。将条件放在 OUTER JOIN 的 WHERE 子句中可以将其转换为 INNER JOIN(因为 NULL 的工作方式)

例如,检查以下两个示例之间的可读性:

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

对比

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c 
INNER JOIN order o
   ON  o.customer_id = c.customer_id
   AND o.orderdate >= '2003-01-01'
   AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
   ON  r.order_id = o.order_id
INNER JOIN article a 
   ON  a.article_id = r.article_id
WHERE  c.customer_name LIKE 'A%'
ORDER BY r.price DESC 
于 2009-03-27T18:59:16.920 回答
1

虽然您可以使用两者来执行大多数任务,并且在您的情况下没有任何区别,但我将始终使用第二个。

  1. 这是当前支持的标准
  2. 它在 FROM 子句中保留连接,在 WHERE 子句中保留过滤器
  3. 它使更复杂的 LEFT、RIGHT、FULL OUTER 连接更容易
  4. MSSQL 帮助完全基于该语法,因此更容易获得有关问题查询的帮助
于 2009-03-27T18:59:40.493 回答
1

虽然在技术上没有区别,但使用第一种方法进行连接时需要格外小心。如果你不小心弄错了,你最终可能会在你的 a 和 b 表之间进行笛卡尔连接(一个非常长的内存和 cpu 密集型查询 - 它会将 a 中的每一行与 b 中的所有行匹配。如果 a和 b 是开始的大表)。使用显式 INNER JOIN 既安全又易于阅读。

于 2009-03-27T19:01:53.407 回答
0

没有不同。我发现第一种格式更具可读性,并且仅在进行其他类型的连接(OUTER、LEFT INNER 等)时才使用第二种格式。

于 2009-03-27T18:48:09.383 回答
0

第二种形式是符合 SQL92 的语法。这应该意味着所有当前和未来的数据库供应商都支持它。然而,事实是第一种形式是如此普遍,以至于它也保证存在的时间比我们关心的要长。

否则,它们在数据库如何处理这两者的所有方面都是相同的。

于 2009-03-27T18:55:43.747 回答