目录
前言
数仓实际开发中经常会涉及到多表关联,这个时候就会涉及到on与where的使用。因此本篇文章主要阐述on 和 where之间的区别
一、知识点
left join中关于where和on条件的知识点:
- 多表left join 是会生成一张临时表。
- on后面: 一般是对left join 的右表进行条件过滤,会返回左表中的所有行,而右表中没有匹配上的数据直接补为null。
- on后面:如果存在对左表的筛选条件,无论条件真假,仍返回左表中的所有行,只是会影响右表的匹配值。即:on中针对左表的限制条件只会影响右表的匹配内容,并不影响返回的左表行数。
- where后面:是对两表连接后的数据进行筛选,一般是针对左表的筛选条件。
例如下面的sql:关联表(右表)的筛选条件如果放置在on后面,则下面sql的执行顺序是:B先按照条件进行过滤,再与A表关联;
#主表:A; 关联表:B 关联条件:A.id = B.id 筛选条件:B.id >1
A left join B on A.id = B.id and B.id >1;
筛选条件如果放置在where后面,则下面sql的执行顺序是:A和B先关联,基于生成的临时表再进行where条件过滤。
#主表:A; 关联表:B 关联条件:A.id = B.id 过滤条件
A left join B on A.id = B.id where A.id <> 1
二、测试验证
创建t1 ,t2 两张表
create table if not exists test1( id int comment '用户id',name string comment '用户姓名');
insert