【问题标题】:Why does using the "AND" operator works with a JOIN, even without a "WHERE" clause为什么即使没有“WHERE”子句,使用“AND”运算符也能与 JOIN 一起使用
【发布时间】:2016-12-20 12:48:40
【问题描述】:

下午好,我刚刚注意到一些事情。如果我编写一个带有 JOIN 的 mysql 查询,例如:

Select Car, Vendor from Cars JOIN Vendor On Vendor.IdCar=Car.IdCar WHERE  Car="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,因为我很确定在 AND 之前需要 WHERE 子句?

【问题讨论】:

  • 是的,AND 附加到连接子句
  • 有趣的问题。可能是戈登·林诺夫可以解释的;他非常擅长这类事情,并且精通 SQL。
  • 因为AND 应用于您的ON 子句,而不是专门应用于JOIN 子句。虽然它并不完全相同,但它在这里起到了类似的过滤结果的作用。

标签: php mysql join where


【解决方案1】:

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

你展示的语句不是很好的风格,因为它滥用了 join 子句来模拟应该是 where 条件的东西;然而,它会按预期工作。

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

【讨论】:

    【解决方案2】:

    WHEREON 都需要(布尔)条件。布尔条件可以通过将布尔项与ANDORNOT(可能还有())结合起来来构建布尔条件

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是为了便于阅读,所以您可以将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";
        

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

        【讨论】:

        • 虽然一般建议使用 join 子句,但大多数人觉得它更容易阅读。要加入的逗号是 95 之前(或附近的某个地方)!
        • @HoneyBadger 完全正确。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 2020-03-06
        相关资源
        最近更新 更多