w3schools.com有以下 SQL 语句示例:
SELECT
Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM
Persons,
Product_Orders
WHERE
Persons.LastName='Hansen' AND Persons.FirstName='Ola'
我不清楚的是产品订单表是如何与人员表连接的。这个 SQL 是否正确,它对发回的结果集意味着什么?
w3schools.com有以下 SQL 语句示例:
SELECT
Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM
Persons,
Product_Orders
WHERE
Persons.LastName='Hansen' AND Persons.FirstName='Ola'
我不清楚的是产品订单表是如何与人员表连接的。这个 SQL 是否正确,它对发回的结果集意味着什么?
它在技术上是正确的,尽管出于几个我不会在这里讨论的原因,我会避免使用这种类型的语法。
该语法通俗地称为“旧式”连接语法,相当于:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons
CROSS JOIN Product_Orders
WHERE Persons.LastName='Hansen' AND Persons.FirstName='Ola'
他们如何“加入”在一起的答案是他们没有。查询的结果是整个 Product_Orders 表与 Persons 表中的“Ola Hanson”行的叉积。老实说,在我能想到的大多数用例中,这没有多大意义。
关于您将在此处获得的结果的真正奇怪之处在于 Product_Orders 表中的 OrderID 不一定与订单上的人一致。它看起来是页面上的遗漏错误——尽管公平地说,该示例旨在演示别名,而不是连接。
W3Schools在这附近的名声并不好。
首先,您必须了解 Joins 的工作原理。从您查询:
在 SQL 语句中提供的两个表之间进行了叉积,您可以从这个 FROM Persons Product_Orders 中看到这一点。
对于 Persons 表中的每条记录,都连接到 Product_Orders 表中的每条记录。如果两个表都很大,这将为您提供一个巨大的临时表。
然后你的过滤器,即限定条件将应用于这个临时表,给你你的结果。
我希望这有帮助。