以下是否有任何显着差异?
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用户是否优先选择其中一个?
答案 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)
虽然您可以使用两者执行大多数任务,但在您的情况下没有任何区别,我将始终使用第二个任务。
答案 4 :(得分:1)
虽然技术上没有区别,但您需要特别注意使用第一种方法进行连接。如果你意外地弄错了,你最终可能会在a和b表之间进行笛卡尔连接(一个非常长的内存和cpu密集型查询 - 它将匹配a中的每一行与b中的所有行。如果a和b是开始的大表)。使用明确的INNER JOIN既安全又易于阅读。
答案 5 :(得分:0)
没有区别。我发现第一种格式更具可读性,只有在进行其他类型的连接(OUTER,LEFT INNER等)时才使用第二种格式。
答案 6 :(得分:0)
第二种形式是符合SQL92的语法。这应该意味着所有当前和未来的数据库供应商都支持它。然而,事实是第一种形式是如此普遍,以至于它保证比我们关心的时间更长。
否则它们在数据库处理这两者方面的所有方面都是相同的。