昨天微信群里抛出一个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 -