mysql SQL JOIN与从两个表查询之间的差异

yhxst69z  于 2023-03-11  发布在  Mysql
关注(0)|答案(4)|浏览(168)

查询与

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
u59ebvdq

u59ebvdq1#

语法上有一点差异,但是两个查询都在各自表的P_Id字段上执行连接。
在第二个示例中,这是一个隐式连接,您在WHERE子句中将其约束到两个表的P_Id字段。
在第一个示例中,联接是显式的,并且联接子句包含约束,而不是在附加的WHERE子句中。

r3i60tvu

r3i60tvu2#

它们基本上是等价的,一般来说,JOIN关键字使您能够更明确地说明连接的方向(LEFTRIGHT)和类型(INNEROUTERCROSS)。

2q5ifsrm

2q5ifsrm3#

This SO posting很好地解释了ANSI SQL兼容性方面的差异,并且与这里提出的问题有相似之处。
虽然(正如前面所述)两个查询将产生相同的结果,但我发现显式地声明JOIN始终是一个好主意,它更容易理解,尤其是当WHERE子句中存在与JOIN无关的求值时。
显式声明JOIN还可以防止无意中查询笛卡尔乘积。在上面的第二个查询中,如果您(无论出于何种原因)忘记包含WHERE子句,查询将在没有JOIN条件的情况下运行,并返回Persons中的每一行与Orders中的每一行匹配的结果集......这可能不是您想要的结果。

qcuzuvrc

qcuzuvrc4#

区别在于 * 语法 *,而不在于语义 *。
显式JOIN语法:

  • 被认为更具可读性
  • 使您可以以标准方式干净地指定是要INNERLEFT/RIGHT/FULL OUTER还是CROSS联接。这与使用DBMS特定语法(例如,用于左外联接的旧Oracle Persons.P_Id = Orders.P_Id(+)语法)形成对比。

相关问题