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

简介: 避坑,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 过滤,即先连表再过滤。

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

相关文章
|
6月前
|
Oracle 关系型数据库 MySQL
mysql数据库和Oracle的区别
mysql数据库和Oracle的区别
130 1
|
SQL Oracle 关系型数据库
MySQL和Oracle的一些区别
MySQL和Oracle的一些区别
|
SQL Oracle 关系型数据库
解决:Oracle数据库中Left join on 后面为null时匹配不上
解决:Oracle数据库中Left join on 后面为null时匹配不上
298 0
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
433 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
Oracle 关系型数据库 数据库
PostgreSQL和Oracle两种数据库有啥区别?如何选择?
PostgreSQL和Oracle两种数据库有啥区别?如何选择?
502 0
|
6月前
|
SQL Oracle 关系型数据库
Oracle查询优化-left join、right join、inner join、full join和逗号的区别
【1月更文挑战第5天】【1月更文挑战第13篇】实际查询时,多表联查是常规操作,但是连接方式有多种。
493 0
|
Oracle 关系型数据库
Oracle 11g和12c的主要区别
Oracle 11g和12c的主要区别
|
Oracle 关系型数据库 数据库
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
927 0
|
20天前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
138 64
|
10天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
21 7