为什么使用 "AND" 运算符与 JOIN 一起工作,即使没有 "WHERE" 子句
Why does using the "AND" operator works with a JOIN, even without a "WHERE" clause
下午好,我刚刚注意到一件事。如果我写一个带有 JOIN 的 mysql 查询,例如:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar WHERE Car="Brand"
它将return等于"Brand"的那辆车。
但我注意到,如果我以这种方式构建查询:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar AND Car="Brand"
它将return 与之前的查询相同。请注意,我使用 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,因为我很确定在 AND 之前需要 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";
但是不能做外连接(左连接或右连接)
WHERE
和 ON
都需要一个(布尔)条件。布尔条件可以通过将布尔项与 AND
、OR
和 NOT
(可能还有 (
和 )
)
WHERE
条件 是一个(可选)子句 在查询
- table-表达式
JOIN
table-表达式 ON
condition 是一个 operator,它结合了两个 table-expressions,基于 条件.
join
是 inner join
的缩写,因此您要根据 on
子句中的所有条件过滤连接。这与将条件放在 where
子句中具有相同的效果。如果您使用 outer join
(左或右),您将获得连接左侧或右侧 table 的所有记录,以及那些不存在的记录的 null
值' 匹配条件,而 where
子句仍然只会 select 那些确实匹配条件的记录。
因为 JOIN
不限于匹配主键;即使是这样,也有复合键需要多列才能匹配,所以你肯定需要 AND
那里。
您显示的语句风格不佳,因为它滥用了 join 子句来模拟应该是 where 条件的内容;然而,它会按预期工作。
如果您要使用 outer 联接,该语句绝对有意义。在这种情况下,join 子句中的布尔表达式 not 在功能上等同于 where 子句中的相同布尔表达式。因此,根据您要使用外部联接查询的内容,您必须使用其中之一。
下午好,我刚刚注意到一件事。如果我写一个带有 JOIN 的 mysql 查询,例如:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar WHERE Car="Brand"
它将return等于"Brand"的那辆车。
但我注意到,如果我以这种方式构建查询:
Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar AND Car="Brand"
它将return 与之前的查询相同。请注意,我使用 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,因为我很确定在 AND 之前需要 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";
但是不能做外连接(左连接或右连接)
WHERE
和 ON
都需要一个(布尔)条件。布尔条件可以通过将布尔项与 AND
、OR
和 NOT
(可能还有 (
和 )
)
WHERE
条件 是一个(可选)子句 在查询- table-表达式
JOIN
table-表达式ON
condition 是一个 operator,它结合了两个 table-expressions,基于 条件.
join
是 inner join
的缩写,因此您要根据 on
子句中的所有条件过滤连接。这与将条件放在 where
子句中具有相同的效果。如果您使用 outer join
(左或右),您将获得连接左侧或右侧 table 的所有记录,以及那些不存在的记录的 null
值' 匹配条件,而 where
子句仍然只会 select 那些确实匹配条件的记录。
因为 JOIN
不限于匹配主键;即使是这样,也有复合键需要多列才能匹配,所以你肯定需要 AND
那里。
您显示的语句风格不佳,因为它滥用了 join 子句来模拟应该是 where 条件的内容;然而,它会按预期工作。
如果您要使用 outer 联接,该语句绝对有意义。在这种情况下,join 子句中的布尔表达式 not 在功能上等同于 where 子句中的相同布尔表达式。因此,根据您要使用外部联接查询的内容,您必须使用其中之一。