left join 会出现多出的行吗?

2022-08-22 10:40:08 浏览数 (2)

昨天微信群里抛出一个SQL问题,瞬间你一嘴我一嘴,好不热闹。

起初我也是这么认为的,你是怎么认为的呢?

然后,小姐姐又补充了上下文

按照文氏图的思路,似乎 left join 后不会增加

但是小姐姐解释说,查询结果确实“诡异”的多出了184行,问题变的 interesting

大家都给出了自己的见解,有人开始追问小姐姐用的是什么数据库,小姐姐说是impala

大部分人认为B表的关联列有重复值,而小姐姐坚定的说没有重复值,但是包含NULL

正当大家激烈的讨论时,小姐姐说问题搞清楚了。

有人说这是impala方言,真的是方言吗?我也不清楚,之前没关注过这种场景,因为一般关联列都是主键,而业务主表的主键一般不包含NULL

为了搞清楚这个问题,我就在 MySQL8 环境下测试了一下。

假设成绩表数据是这样的:(2名学生的姓名缺失)

学生信息表数据是这样的:(3名学生的姓名缺失)

现在要获取每个学生所在的城市信息:

结果居然真的比成绩表(左表)的行数多,为什么呢?因为左表关联列为NULL的行会与右表关联列为NULL 的行去关联,条件就是 NULL = NULL ,所以由 NULL 产生的行数是左表 NULL 的行数 m 乘以 右表 NULL 的行数 n,总行数 = 左表的非空行数 m * n

我认为这并不是 impala 的方言,你认为呢?欢迎留言讨论

- END -

0 人点赞