避坑,Oracle中left join 与 (+) 的区别

下面通过一个演示例子,可以很明显的知晓两者的区别!!!

示例演示:创建两张表分别是: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 过滤,即先连表再过滤。

不存在子查询的条件下,两者的查询结果相同。

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小Java开发者

“是一种鼓励,你懂的”

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值