测试环境 oracle 11g
构建测试表:
create table t1(id int ,name1 varchar2(20),name2 varchar2(20));
create table t2(id int ,name1 varchar2(20),name2 varchar2(20));
insert into t1 values(1,'a','b');
insert into t1 values(1,'aa','bb');
insert into t1 values(2,'aa','bb');
insert into t1 values(2,'a','b');
insert into t1 values(3,'a','b');
insert into t1 values(4,'a','b');
insert into t1 values(4,'c','b');
insert into t1 values(5,'a','b');
insert into t1 values(5,'a','b');
insert into t2 values(1,'a','b');
insert into t2 values(2,'aa','bb');
insert into t2 values(2,'a','b');
insert into t2 values(3,'a','b');
insert into t2 values(4,'c','b');
insert into t2 values(5,'a','b');
insert into t2 values(5,'a','b');
insert into t2 values(5,'a','b');
insert into t2 values(4,'aa','bb');
select * from t1 left join t2 on t1.id=t2.id and t1.name1='c';
select * from t1 left join t2 on t1.id=t2.id where t1.name1='c';
查询结果如下:
可以发现 如果过滤条件写在where 中,那么先进行了过滤再进行的连接。
如果直接写在 连接条件,那么,其不会当成过滤条件,而是连接条件直接进行外连接。
这个是外连接的特殊性决定的,不管连接条件与否,总是会返回t1表上的行。满足连接条件才会有t2表上字段的值。
如果是等值连接,那么这两种方式是一样的,因为必须满足and 后面的条件才会进行连接: