left join 的一些问题,不一定以左表为准,数据行数减少或者数据增多

 

left join 完,行数一定等于左表行数吗? 不一定!!

实验如下:

SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id LIMIT 144

8 rows (134ms)

idcreated_atupdated_ata_ididcreated_atupdated_atb_id
12018-10-09 10:10:10.02018-10-09 10:10:10.0112018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.0222018-10-09 10:10:10.02018-10-09 10:10:10.02
12018-10-09 10:10:10.02018-10-09 10:10:10.0132018-11-05 20:44:00.02018-11-05 20:44:00.01
12018-10-09 10:10:10.02018-10-09 10:10:10.0142018-11-05 20:44:04.02018-11-05 20:44:04.01
32018-10-09 10:10:10.02018-10-09 10:10:10.03    
42018-10-09 10:10:10.02018-10-09 10:10:10.04    
52018-10-09 10:10:10.02018-10-09 10:10:10.05    
62018-10-09 10:10:10.02018-10-09 10:10:10.06    

hdd_test1有6条记录, hdd_test2 有4条记录,直接left join ,产生6条记录,别高兴太早,看下面的查询:

SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id WHERE b.b_id > 1 LIMIT 144

1 row (37ms)查看CSV

idcreated_atupdated_ata_ididcreated_atupdated_atb_id
22018-10-09 10:10:10.02018-10-09 10:10:10.0222018-10-09 10:10:10.02018-10-09 10:10:10.02

 

如图所示,当where 条件在外,会先聚合后过滤,所以结果会变少

 

还有一种情况需要注意,left join 结果的行数也可能大于左表:

SELECT * FROM hdd_test1 LIMIT 144

2 rows (33ms)查看CSV

idcreated_atupdated_ata_id
12018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.02
SELECT * FROM hdd_test2 LIMIT 144

4 rows (34ms)查看CSV

idcreated_atupdated_atb_id
12018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.02
32018-11-05 20:44:00.02018-11-05 20:44:00.01
42018-11-05 20:44:04.02018-11-05 20:44:04.01
SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id LIMIT 144

4 rows (110ms)查看CSV

idcreated_atupdated_ata_ididcreated_atupdated_atb_id
12018-10-09 10:10:10.02018-10-09 10:10:10.0112018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.0222018-10-09 10:10:10.02018-10-09 10:10:10.02
12018-10-09 10:10:10.02018-10-09 10:10:10.0132018-11-05 20:44:00.02018-11-05 20:44:00.01
12018-10-09 10:10:10.02018-10-09 10:10:10.0142018-11-05 20:44:04.02018-11-05 20:44:04.01

看到没? 产生了四条记录,因为这个时候b 有重复的b_id,如果这时候计算a表值的count 或者sum ,结果会比预想的大。

虽然很简单,但是很容易犯错误

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值