下午好,我刚注意到一件事。如果我写一个带有JOIN的mysql查询,例如:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar WHERE Car="Brand"
它将返回与"Brand"相等的那辆车。
但是我注意到,如果我这样构建查询:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar AND Car="Brand"
它将返回与前一个查询相同的内容。注意到我使用AND而不是WHERE。我还测试了在PHP查询它的工作。例如:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar AND Car=$brand
代替
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar WHERE Car=$brand
所以我要问的问题是:为什么第二个查询工作?是因为使用了JOIN吗,因为我很确定WHERE子句需要在AND之前?
因为JOIN
不局限于匹配主键;即使它是,也有复合键需要多个列来匹配,所以你肯定需要AND
在那里。
你显示的语句不是很好的风格,因为它滥用连接子句来模拟应该是where条件的东西;然而,它将按预期工作。
如果要使用外部连接,则该语句肯定是有意义的。在这种情况下,连接子句中的布尔表达式在功能上不等同于where子句中的相同布尔表达式。因此,根据您希望通过外部连接查询的内容,必须使用其中之一。WHERE
和ON
都需要一个(布尔)条件。通过将布尔项与AND
、OR
和NOT
(可能还有(
和)
)组合,可以构造布尔条件
-
WHERE
condition是查询 中的子句(可选) - table-expression
JOIN
table-expressionON
condition是基于条件组合两个table-expressions的运算符。
join
是inner join
的缩写,因此您要过滤on
子句中所有条件的连接。这与在where
子句中放置条件具有相同的效果。如果使用outer join
(左或右),您将获得连接左侧或右侧表的所有记录,以及与条件不匹配的记录的null
值,而where
子句仍然只选择与条件匹配的记录。
这是出于可读性的目的,所以你可以把on
子句放在where
子句中,事情就会正确地完成:
Select Car, Vendor from Cars JOIN Vendor where Vendor.IdCar=Car.IdCar AND Car="Brand";
这个也是有效的:
Select Car, Vendor from Cars, Vendor where Vendor.IdCar=Car.IdCar AND Car="Brand";
但不能进行外连接(左连接或右连接)