为什么使用 "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";

但是不能做外连接(左连接或右连接)

WHEREON 都需要一个(布尔)条件。布尔条件可以通过将布尔项与 ANDORNOT(可能还有 ()

  • WHERE条件 是一个(可选)子句 在查询
  • table-表达式 JOIN table-表达式 ON condition 是一个 operator,它结合了两个 table-expressions,基于 条件.

joininner join 的缩写,因此您要根据 on 子句中的所有条件过滤连接。这与将条件放在 where 子句中具有相同的效果。如果您使用 outer join(左或右),您将获得连接左侧或右侧 table 的所有记录,以及那些不存在的记录的 null 值' 匹配条件,而 where 子句仍然只会 select 那些确实匹配条件的记录。

因为 JOIN 不限于匹配主键;即使是这样,也有复合键需要多列才能匹配,所以你肯定需要 AND 那里。

您显示的语句风格不佳,因为它滥用了 join 子句来模拟应该是 where 条件的内容;然而,它会按预期工作。

如果您要使用 outer 联接,该语句绝对有意义。在这种情况下,join 子句中的布尔表达式 not 在功能上等同于 where 子句中的相同布尔表达式。因此,根据您要使用外部联接查询的内容,您必须使用其中之一。