查询是否正确?

时间:2012-06-11 19:37:18

标签: mysql

假设我们有一个名为“Persons”的表和另一个名为“Product_Orders”的表。我们将分别给出“p”和“po”的表别名。

现在我们要列出“Ola Hansen”负责的所有订单。

我们使用以下SELECT语句:

SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'

我对OrderID感到困惑,因为它与任何类似的东西都没有比较。

SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'
  AND po.OrderID = p.OrderID.

我错了吗?

3 个答案:

答案 0 :(得分:5)

这里演示的是 join ,但是您使用的网站正在教您过时的隐式连接语法(使用逗号)。我建议不要使用这种语法。而是使用JOIN关键字。

我查看了网站,发现了原来的example code是什么(你的问题没有说清楚):

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p,
Product_Orders AS po
WHERE p.LastName='Hansen' AND p.FirstName='Ola'

他们忘了添加连接条件!

我会使用JOIN这样写:

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p
JOIN Product_Orders AS po
ON po.PersonId = p.Id
WHERE p.LastName = 'Hansen' AND p.FirstName = 'Ola'

现在您可以清楚地看到po.PersonId = p.Id条件指定了两个表之间的关系,并显示了它们应该如何加入。使用JOIN关键字的众多优点之一是难以忘记编写连接条件,并且当它丢失时很明显。

您应该避免使用w3schools.com作为教程。该网站包含许多错误和不良做法。

答案 1 :(得分:0)

SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'
  AND p.PersonID = po.PersonID

答案 2 :(得分:0)

你是对的,在你的第一个查询中,第一个表中的每一行都与第二个表中的每一行连接在一起。这将导致每个订单的结果(忽略该订单是否属于Ola Hansen)。

但是,我怀疑你的桌子人员是否包含指令的外挂钥匙。一个诸如

之类的条款
SELECT po.OrderID, p.LastName, p.FirstName 
FROM Persons AS p, Product_Orders AS po 
WHERE p.LastName='Hansen' AND p.FirstName='Ola'
AND po.PersonID = p.PersonID
假设Product_Orderds中的每一行都包含执行订单的Person的forreign键,那么

会更明智。

相关问题