查询与
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
还有这个
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
4条答案
按热度按时间u59ebvdq1#
语法上有一点差异,但是两个查询都在各自表的
P_Id
字段上执行连接。在第二个示例中,这是一个隐式连接,您在
WHERE
子句中将其约束到两个表的P_Id
字段。在第一个示例中,联接是显式的,并且联接子句包含约束,而不是在附加的
WHERE
子句中。r3i60tvu2#
它们基本上是等价的,一般来说,
JOIN
关键字使您能够更明确地说明连接的方向(LEFT
,RIGHT
)和类型(INNER
,OUTER
,CROSS
)。2q5ifsrm3#
This SO posting很好地解释了ANSI SQL兼容性方面的差异,并且与这里提出的问题有相似之处。
虽然(正如前面所述)两个查询将产生相同的结果,但我发现显式地声明JOIN始终是一个好主意,它更容易理解,尤其是当WHERE子句中存在与JOIN无关的求值时。
显式声明JOIN还可以防止无意中查询笛卡尔乘积。在上面的第二个查询中,如果您(无论出于何种原因)忘记包含WHERE子句,查询将在没有JOIN条件的情况下运行,并返回Persons中的每一行与Orders中的每一行匹配的结果集......这可能不是您想要的结果。
qcuzuvrc4#
区别在于 * 语法 *,而不在于语义 *。
显式
JOIN
语法:INNER
、LEFT/RIGHT/FULL OUTER
还是CROSS
联接。这与使用DBMS特定语法(例如,用于左外联接的旧OraclePersons.P_Id = Orders.P_Id(+)
语法)形成对比。