SQL JOIN:ON vs Equals

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

Lar*_*lum 25

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


Joe*_*orn 9

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

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


Bri*_*edt 5

与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 
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)