下面通过一个演示例子,可以很明显的知晓两者的区别!!!
示例演示:创建两张表分别是:shun_a 表、shun_b 表。
-- 创建表 SHUN_A
create table SHUN_A
(
a_id VARCHAR2(12) not null,
a_name VARCHAR2(12),
a_content VARCHAR2(12),
b_id VARCHAR2(12)
)
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a1', '111', '1', 'b1');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a2', '222', '1', 'b2');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a3', '333', '2', 'b3');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a4', '444', '3', 'b4');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a5', '555', '3', 'b100');
commit;
-- 创建表 SHUN_B
create table SHUN_B
(
b_id VARCHAR2(12) not null,
b_name VARCHAR2(12),
b_flag VARCHAR2(12)
)
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b1', 'b1', '1');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b2', 'b2', '1');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b3', 'b3', '0');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b4', 'b4', '0');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b5', 'b5', '1');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b6', 'b6', '0');
commit;
- 首先执行下面的left join SQL语句。
select a.*, b.b_name, b.b_flag from shun_a a left join shun_b b on a.b_id = b.b_id ;
执行结果如下:
- 执行(+)SQL语句。
select a.*, b.b_name, b.b_flag from shun_a a, shun_b b where a.b_id = b.b_id(+) ;
执行结果如下:
通过上面的两个SQL进行对比发现,两者执行的结果没有什么区别。
在除了连接条件外,没有子查询条件时,两者是一样的,但是有其他条件时不能直接用(+)。
下面演示存在子查询条件的情况:
select a.*, b.b_name, b.b_flag from shun_a a left join shun_b b on a.b_id = b.b_id and b.b_flag = 1; -- 先执行过滤条件,再连接表
注:上面SQL等价于:
SELECT a.*, b.b_name, b.b_flag FROM shun_a a, shun_b b where a.b_id = b.b_id(+) and b.b_flag(+) = 1;
select a.*, b.b_name, b.b_flag from shun_a a, shun_b b where a.b_id = b.b_id(+) and b.b_flag = 1; -- 表连接后再执行过滤条件
总结:
存在子查询的条件下:
left join是先在shun_b表进行 b_flag=1 过滤,再进行表连接。
(+)是在表连接的前提下进行 b_flag=1 过滤,即先连表再过滤。
不存在子查询的条件下,两者的查询结果相同。