首页 > 其他分享 >使用 LEFT JOIN 时,将条件写在 ON 子句和 WHERE 子句的区别

使用 LEFT JOIN 时,将条件写在 ON 子句和 WHERE 子句的区别

时间:2024-07-02 17:23:39浏览次数:15  
标签:JOIN ur user 子句 WHERE id delete

1. 条件写在 ON 子句中

当条件写在 ON 子句中时,条件会在进行连接操作时立即应用。这意味着只要左表中的行存在,不论右表中的行是否满足条件,左表的行都会包含在结果集中。如果右表中的行不满足条件,结果集中会显示右表的列为空。

示例

SELECT *
FROM t_user u
LEFT JOIN t_user_role ur ON u.id = ur.user_id AND ur.is_delete = 0;

在这个例子中,即使 ur.is_delete 不为 0,左表 t_user 中的行也会包含在结果集中,只是对应的 t_user_role 表的列会为空。

2. 条件写在 WHERE 子句中

当条件写在 WHERE 子句中时,连接操作首先完成,然后对整个结果集应用 WHERE 子句中的条件。这会导致在 LEFT JOIN 的情况下,如果右表中没有满足条件的行,对应的左表中的行也会被过滤掉。这与 LEFT JOIN 保留左表所有行的初衷相悖。

示例

SELECT *
FROM t_user u
LEFT JOIN t_user_role ur ON u.id = ur.user_id
WHERE ur.is_delete = 0;

在这个例子中,只有 ur.is_delete 为 0 的行会包含在结果集中。如果右表 t_user_role 中的行不满足条件 ur.is_delete = 0,那么这些行将被过滤掉,并且相应的左表 t_user 中的行也会从结果集中移除。

对比总结

ON 子句:保留左表中的所有行,即使右表中没有匹配行,结果集中对应的右表列会显示为 NULL。
WHERE 子句:过滤整个结果集,不保留左表中没有匹配右表条件的行。

实例对比

假设我们有两张表:

t_user:
+----+-------+
| id | name  |
+----+-------+
| 1  | Alice |
| 2  | Bob   |
| 3  | Carol |
+----+-------+

t_user_role:
+----+---------+----------+
| id | user_id | is_delete|
+----+---------+----------+
| 1  | 1       | 0        |
| 2  | 2       | 1        |
| 3  | 3       | 0        |
+----+---------+----------+

条件在 ON 子句中

SELECT u.id, u.name, ur.is_delete
FROM t_user u
LEFT JOIN t_user_role ur ON u.id = ur.user_id AND ur.is_delete = 0;

结果:

+----+-------+----------+
| id | name  | is_delete|
+----+-------+----------+
| 1  | Alice | 0        |
| 2  | Bob   | NULL     |
| 3  | Carol | 0        |
+----+-------+----------+

条件在 WHERE 子句中

SELECT u.id, u.name, ur.is_delete
FROM t_user u
LEFT JOIN t_user_role ur ON u.id = ur.user_id
WHERE ur.is_delete = 0;

结果:

+----+-------+----------+
| id | name  | is_delete|
+----+-------+----------+
| 1  | Alice | 0        |
| 3  | Carol | 0        |
+----+-------+----------+

如上所示,当条件写在 ON 子句中时,t_user 表中的所有行都会保留,而条件写在 WHERE 子句中时,t_user 表中没有满足条件的行会被过滤掉。

标签:JOIN,ur,user,子句,WHERE,id,delete
From: https://www.cnblogs.com/zhangyuanzhuo/p/18280196

相关文章

  • MyBatis中Where标签:揭秘高效SQL构建的秘密
    哈喽,大家好,我是木头左!理解Where标签的基础概念在MyBatis中,<where>标签是用于构建SQL查询语句中的一个非常重要的元素。它允许你在一个动态的SQL语句中添加WHERE子句,而不需要担心SQL语法错误或额外的逗号和AND/OR关键字。使用<where>标签可以让的SQL语句更加简洁、易读,并且能够......
  • Oracle中的GROUP BY 子句
    数据准备--第一步:建表:--删除表(包括数据结构)droptableTMP_EMP;droptableTMP_DEPT;--删除表(不包括数据结构)truncatetableTMP_EMP;truncatetableTMP_DEPT;createtableTMP_DEPT(deptnonumber(10)primarykey,dnamevarchar2(30),loc......
  • MySQL入门学习-连接查询.CROSS JOIN
        CROSSJOIN(交叉连接):返回左表中的所有行,左表中的每一行与右表中的所有行组合,返回的行数等于左表行数乘以右表行数。一、连接查询包括:1.CROSSJOIN(交叉连接):返回左表中的所有行,左表中的每一行与右表中的所有行组合。2.INNERJOIN(内连接):返回左表和右表......
  • MySQL入门学习-连接查询.RIGHT JOIN
        RightsJoin是MySQL中的一种连接查询类型,用于根据右表中的匹配条件,将左表中的数据与右表中的数据进行连接。    一、与其他连接查询相比,RightsJoin具有以下特点:1.连接方向:RightsJoin以右表为主表,左表为从表。连接结果将包含右表中的所有行,而左表......
  • 记录一次代码中的ForkJoinPool.getCommonPoolParallelism()
    @Configuration@Slf4jpublicclassThreadPoolConfig{privatestaticfinalintCORE_POOL_SIZE=6;privatestaticfinalintMAX_POOL_SIZE=12;privatestaticfinalintKEEP_ALIVE_TIME=60;privatestaticfinalintQUEUE_CAPACITY=......
  • mybatis批量更新(where的条件越少,最好是主键,效率越高)
    <updateid="updateBatch"databaseId="sqlserver">updateT_RISK_TASK_SERVICE<trimprefix="set"suffixOverrides=","><trimprefix="TASK_REALITY_START_TIME=case......
  • MySQL入门学习-连接查询.INNER JOIN
        表的连接在数据库中扮演着至关重要的角色。当我们处理多个表之间的关联数据时,连接查询是必不可少的。    假设我们有两个表A和B,它们有一个共同的字段。现在,我们想从A和B中选择出所有匹配的数据。这就是连接查询的作用。    以下是一个基本的......
  • Mybatis-Plus-Join(MPJ连表查询)
    mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到leftjoin或rightjoin的左右连接,你还是得老老实实的打开xml文件,手写上一大段的sql语句一款叫做mybatis-plus-join的工具(后面就简称mpj了),可以不......
  • MySQL where 操作符
    MySqlWHERE操作符号前言在WHERE子句中,你可以使用任何条件对记录进行过滤。准备工作准备users表,并插入数据#创建用户表userscreatetableusers(idintAUTO_INCREMENTnotnullprimarykey,namevarchar(255),ageint,jobvarchar(255),......
  • Java并行世界的钥匙:一文带你了解Java ForkJoin并行框架
    Fork/Join框架是Java7引入的一个并行计算框架,主要用于处理可以通过递归分解成更细小的任务的场景。其基本结构和工作流程可以从以下几个方面进行详细解析:核心类ForkJoinPool:这是一个线程池类,用于执行ForkJoinTask任务。ForkJoinWorkerThread:这是执行任务的具体线程实体......