mysql 语句中 left join 后过滤数据用 on 还是 where?有啥区别?

在 MySQL 中,LEFT JOIN 用于将左侧表中的所有行与右侧表中的匹配行组合在一起,即使右侧表中没有匹配行也会显示左侧表的数据。

关于在 LEFT JOIN 后过滤数据使用 ON 还是 WHERE 的问题,答案是两种方式都可以用来过滤数据,但它们有不同的作用和应用场景。

  1. 使用 ON 子句过滤

ON 子句用于指定左表和右表之间的连接条件。它指定了 LEFT JOIN 子句连接表的条件,从而限制了结果集。如果想要筛选某些记录,则可以使用 ON 子句。ON 子句指定连接条件的筛选器。当ON子句放在LEFT JOIN后面时,MySQL在连接两个表时,会根据ON子句中的条件进行匹配,只返回符合条件的结果。如果不满足ON子句中的条件,那么右表的值将设置为空值。

例如:

SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL;

这个查询使用 LEFT JOIN 和 ON 子句连接两个表,并使用 WHERE 子句过滤出左表中不存在于右表中的记录。在这个查询中,ON 子句指定了连接条件,WHERE 子句用于过滤出不符合条件的记录。

  1. 使用 WHERE 子句过滤

WHERE 子句用于指定查询的筛选条件,可以在查询结束后,对连接后的结果集进行过滤。如果要筛选基于 LEFT JOIN 的连接结果,则可以在 WHERE 子句中指定筛选条件。

例如:

SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.id AND table2.name = 'John'
WHERE table1.age > 18;

这个查询使用 LEFT JOIN 和 ON 子句连接两个表,并使用 WHERE 子句过滤出左表中年龄大于 18 岁的记录,并且右表中的 name 值必须为 'John'。在这个查询中,ON 子句指定连接条件,WHERE 子句指定额外的筛选条件。

总体来说,使用 ON 子句限制 LEFT JOIN 连接的结果集,而使用 WHERE 子句对连接后的结果集进行过滤。如果要筛选基于连接条件的记录,则使用 ON 子句,如果要进一步过滤结果集,则使用 WHERE 子句。

在 MySQL 中,LEFT JOIN 和 INNER JOIN 都可以使用 ON 子句指定连接条件。

当使用 LEFT JOIN 进行连接时,ON 子句中的连接条件仅限制右表中匹配左表的记录,即 LEFT JOIN 返回的结果集中包含左表中所有的记录,但是右表中没有匹配的记录会被填充为 NULL 值。因此,使用 ON 子句后不会减少结果集的记录数,它仅仅影响了结果集中某些字段的值。

例如:

SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.id

这个查询使用 LEFT JOIN 和 ON 子句连接两个表,结果集中包含了 table1 表中的所有记录,而 table2 表中没有与 table1 表中 id 字段匹配的记录会被填充为 NULL 值。这个查询不会减少结果集的记录数,而只是影响了结果集中某些字段的值。

当使用 INNER JOIN 进行连接时,ON 子句中的连接条件仅返回左表和右表中匹配的记录,即 INNER JOIN 返回的结果集中仅包含左表和右表中都存在的记录。因此,使用 ON 子句后会减少结果集的记录数。

例如:

SELECT *
FROM table1
INNER JOIN table2 ON table1.id = table2.id

这个查询使用 INNER JOIN 和 ON 子句连接两个表,结果集中仅包含了 table1 表和 table2 表中都存在的记录,不符合连接条件的记录会被排除在结果集之外。这个查询会减少结果集的记录数。

总体来说,使用 ON 子句限制 LEFT JOIN 和 INNER JOIN 连接的结果集。但是,LEFT JOIN 不会减少结果集的记录数,而 INNER JOIN 会减少结果集的记录数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL ,可以使用 `UPDATE` 语句来更新表数据。当需要更新多个表数据时,可以使用 `JOIN` 语句将这些表关联起来。 下面是一个例子,演示如何使用 `UPDATE` 和 `JOIN` 语句来更新两个表数据: ``` UPDATE table1 LEFT JOIN table2 ON table1.id = table2.id SET table1.column1 = 'new_value' WHERE table2.column2 = 'some_value'; ``` 在上面的例子,我们使用了 `LEFT JOIN` 来关联 `table1` 和 `table2` 表,并将它们的 `id` 列作为关联条件。然后使用 `SET` 语句来更新 `table1` 表的 `column1` 列。注意,这里使用的是 `table1.column1`,而不是 `table2.column1`,因为我们要更新的是 `table1` 表数据。最后,使用 `WHERE` 语句来指定筛选条件,只有当 `table2` 表的 `column2` 列等于某个值时,才会执行更新操作。 需要注意的是,当使用 `LEFT JOIN` 进行多表关联时,可能会出现某些行在表2不存在的情况。在这种情况下,`UPDATE` 语句仍然会更新 `table1` 表数据,但是没有匹配的行将被设置为 `NULL` 值。如果不想更新这些行,可以添加一个 `WHERE` 条件来排除它们。 另外,需要注意的是,MySQL 的 `UPDATE` 语句是一个非常强大的操作,如果使用不当,可能会导致数据不一致或者数据丢失的问题。因此,在进行更新操作时,一定要谨慎操作,先进行备份,确保不会造成不可逆的后果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值