暂无图片
暂无图片
15
暂无图片
暂无图片
6
暂无图片

Left Join之后,数据为何变少了?

大数据记事本 2021-03-25
15437

    今天被问到一个问题,通过 left join 对两个表做关联查询,结果中数据量为何比左表的数据量少?按理说数据量应该和左表保持一致呀。看了一下 SQL,大概逻辑如下:

    select 
    a.XX,
    ...,
    b.XX 
    from  a 
    left join b 
    on a.id=b.object_id
    where a.data_date=20210323
    and b.data_date=20210323
    复制
        逻辑很简单,就是用两个表同一天的分区数据做关联,但是结果却比 a 表的数据少了。当把 "where" 换成 "and" 后,结果便正确了。这个原因其实是过滤数据时机的不同。
        下面用 MySQL 创建示例来进行说明,分别创建两个表 dept 和 emp:
      create table dept(
      dept_id int not null AUTO_INCREMENT PRIMARY KEY comment '部门编号',
      dept_name varchar(10) not null default '' comment '部门名称'
      ) comment '部门表';


      create table emp(
      id int not null AUTO_INCREMENT PRIMARY KEY comment '员工编号',
      name varchar(10) not null default '' comment '姓名',
      dept_id int not null default 0 comment '所在部门编号'
      ) comment '员⼯表';


      insert into dept values (1,'财务部'),(2,'销售部'),(3,'研发部'),(4,'后勤部');
      insert into emp values (1,'张三',2),(2,'李四',2),(3,'王五',3),(4,'赵六',0),(5,'旺财',0);
      复制

      当执行如下语句时,结果如下图:

        select a.*,b.* from emp a left join dept b 
        on a.dept_id =b.dept_id
        复制

        如果加上 ' and a.dept_id = 2 ',结果如下:

            可见结果还是以左表为准,只是右边除了 dept_id = 2 的数据,其余都用 NULL 补齐了

            当把 ' and a.dept_id = 2 ' 替换成 ' where a.dept_id = 2 ',结果如下:

            此时结果就比左表数据要少了。

            造成这种现象的原因是:数据库在通过两个表或者多个表返回数据时,都会生成一个中间的临时表, on 后面的过滤条件是在生成临时表进行过滤的,无论 on 条件的是否为真 ,都会返回左表的全部(以 left join 为例),如果右表无法匹配则补空。而 where 后面的过滤条件是在生成临时表之后进行过滤的,只有 where 过滤条件为真的数据才会返回。
        通过 on 过滤的原理如下:

        通过 where 过滤的原理如下:

        文章转载自大数据记事本,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论

        Mr.Cui
        暂无图片
        1年前
        评论
        暂无图片 1
        1年前
        暂无图片 1
        评论
        11 0
        暂无图片
        1年前
        评论
        暂无图片 0
        👍
        1年前
        暂无图片 点赞
        评论
        chengang
        暂无图片
        1年前
        评论
        暂无图片 1
        这个其实用show warnings 看。可以看到优化器已经给你改写成了inner join
        1年前
        暂无图片 1
        评论
        胡敏
        暂无图片
        1年前
        评论
        暂无图片 1
        既然不能阻止皱纹爬上额头,便阻止皱纹爬上心头吧。
        1年前
        暂无图片 1
        评论
        筱悦星辰
        暂无图片
        2年前
        评论
        暂无图片 1
        既然不能阻止皱纹爬上额头,便阻止皱纹爬上心头吧。
        2年前
        暂无图片 1
        评论
        helloword
        暂无图片
        2年前
        评论
        暂无图片 1
        不错不错
        2年前
        暂无图片 1
        评论