oracle 连接的使用,Oracle(+)连接与Join连接

一个开发组同事在对旧系统代码进行分析的时候,发现(+)连接语句。这里想说说(+)连接和Join连接的使用。

(+)连接是Oracle一种特有的连接方法,和我们常见的Join系列连接同时使用。(+)连接是一种外连接方式,作为简单连接的一种拓展类型。我们通常理解的连接,是只将符合连接条件的数据集合返回来。而用外连接之后,可以连带将特定数据表的不符合条件行一并返回。

Join系列连接的特点是有专门的连接对象和被连接对象,使用on设置专门的连接条件。而(+)连接的连接条件是放置在where条件列表中的。下面我们通过一些实验,来展示两者的差异和特征。

1、环境准备

我们模拟一个简单的实验环境。

SQL> select * from dept;

DEPTNO DEPTNAME

---------- ----------

1 dept1

2 dept2

3 dept3

SQL> select * from emp;

EMPNO EMPNAMEDEPTNO

---------- -------------------- ----------

1 emp11

2 emp21

3 emp32

4 emp44

两个数据表是使用deptno进行连接,两边分别存在不匹配的内容。如果我们使用最常见的连接方式,结果明显是严格的连接匹配。

SQL> select * from dept, emp where dept.deptno=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

2 dept23 emp32

2、(+)连接实验

(+)连接语句是加入在where条件后的部分,作为查询条件的一部分。

SQL> select * from dept, emp where dept.deptno(+)=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept12 emp21

1 dept11 emp11

2 dept23 emp32

4 emp44

SQL> select * from dept, emp where dept.deptno=emp.deptno(+);

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

2 dept23 emp32

3 dept3

两个例子可以告诉我们(+)使用的特点,(+)连接的结果是将(+)号对面的数据表不符合记录的结果也输出出来。

(+)连接实质上是一种外连接Outer Join的现象,通过不同的位置来对应不同方向的结果。

3、Join系列连接

我们经常使用的Join功能要强大的多,而且可读性好一些。Join的特征是将连接条件通过专门的on子句进行说明,而不是放置在where子句里面。

ü左连接Join

左连接left join是保证from子句中的数据表全部显示。

SQL> select * from dept

2left join emp

3on dept.deptno=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

2 dept23 emp32

3 dept3

ü右连接Join

右连接right join是保证Join的数据表全部显示。对该子句笔者认为可以变通为left join,这样似乎更容易看懂。

SQL> select * from dept

2right join emp

3on dept.deptno=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept12 emp21

1 dept11 emp11

2 dept23 emp32

4 emp44

ü全连接full join

全连接是将两个数据表中符合连接条件或者不符合连接条件的全部列出。注意:不符合连接条件的结果是不会进行链接的。

SQL> select * from dept

2full join emp

3on dept.deptno=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

2 dept23 emp32

4 emp44

3 dept3

ü内连接inner join

内连接就类似与我们传统where的连接方式了,返回严格符合条件的数据列。

SQL> select * from dept

2inner join emp

3on dept.deptno=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

2 dept23 emp32

ü笛卡尔积连接Cross Join

Cross Join是进行全匹配,两两之间进行笛卡尔积运算。

SQL> select * from dept

2cross join emp

3;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

1 dept13 emp32

1 dept14 emp44

2 dept21 emp11

2 dept22 emp21

2 dept23 emp32

2 dept24 emp44

3 dept31 emp11

3 dept32 emp21

3 dept33 emp32

3 dept34 emp44

12 rows selected

SQL> select * from dept

2cross join emp

3where dept.deptno=emp.deptno;

DEPTNO DEPTNAMEEMPNO EMPNAMEDEPTNO

---------- ---------- ---------- -------------------- ----------

1 dept11 emp11

1 dept12 emp21

2 dept23 emp32

4、结论

(+)连接是Oracle中经常使用的一种连接方法语法,从简单可读的角度看,似乎要比Join系列要好一些。了解不同类型的Join特征,才能更好的获取到希望的数据,用好Oracle数据库的强大功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值