SQL JOIN:ON vs Equals

时间:2009-03-27 18:46:02

标签: sql join equals

以下是否有任何显着差异?

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用户是否优先选择其中一个?

7 个答案:

答案 0 :(得分:24)

没有区别,但是如果你有一个带有额外where子句的大型多连接查询,那么第二个的可读性要好得多。
将join子句和filter子句分开是一件好事:)

答案 1 :(得分:8)

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

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

答案 2 :(得分:4)

sql查询引擎没有区别。

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

对于INNER JOIN,如果在ON或WHERE子句中放入“filters”和“join”并不重要,查询优化器应该首先决定要做什么(它可能先选择过滤,稍后再加入) ,反之亦然

但是对于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 

VS

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 

答案 3 :(得分:1)

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

  1. 这是当前支持的标准
  2. 它保持连接FROM子句和WHERE子句中的过滤器
  3. 使更复杂的LEFT,RIGHT,FULL OUTER加入更容易
  4. MSSQL帮助完全基于该语法,因此更容易获得有关您的问题查询的帮助

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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