Oracle 多表查询

Posted echola_mendes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 多表查询相关的知识,希望对你有一定的参考价值。

一、多表查询

1、内连接
一般使用INNER JOIN关键字指定内连接,INNER可以省略,默认表示内连接。查询结果中只包含两表的公共字段值相等的行,列可以是两表中的任意列

2、外连接
包括左外连接、右外连接、全外连接

(1)左外连接 LEFT JOIN
结果集中包括两表连接后满足ON后面指定的连接条件的行,还显示JOIN关键字左侧表中所有满足检索条件的行,如何左表的某行在右表中没有匹配行,则在结果中,右表的所有选择列均为NULL。
(2)右外连接 RIGHT JOIN
是左外连接的反向连接。
(3)完全外连接 FULL JOIN
完全外连接查询的结果集包括两表内连接的结果集和左表与右表中不满足条件的行。

3、交叉连接

  

 下面使用emp和dept表进行多表查询:

1 select ename,dname
2 from emp
3 where ename=\'SMITH\'

执行结果:

改成:

1 select ename,(select dname from dept where deptno=20) as 部门   
2 from emp
3 where ename=\'SMITH\'

若不知道SMITH在20号部门,则要改成:

1 select ename,(select dname from dept where deptno=select deptno from emp where ename=\'SMITH\')) as 部门   

执行结果:

 

1、内连接
一般使用INNER JOIN关键字指定内连接,INNER可以省略,默认表示内连接。查询结果中只包含两表的公共字段值相等的行,列可以是两表中的任意列

1 select ename,dname
2 from emp,dept
3 where emp.deptno=dept.deptno and emp.ename=\'SMITH\'

 等同于:

1  select ename,dname     
2  from emp a inner join dept b  --a,b分别是emp,dept的别名
3  on a.deptno=b.deptno and a.ename="SMITH\'

2、外连接

左外连接

1  select ename,dname
2  from emp a left join dept b  --a,b分别是emp,dept的别名        --或者      from emp,dept
3  on a.deptno=b.deptno where a.ename="SMITH"                 --          a.deptno=b.deptno(+)  也表示左外连接

执行结果都是:

  


 

内连接和外连接的区别,可以从以下看出:

A表:                                                B表:                                              C表:

Aid Aname
A1 A
A2 AA
A3 AAA
A4 AAAA
A5 AAAAA
   
   
   
   
   
   
Bid Bname
B1 B
B2 BB
B3 BBB
B4 BBBB
B5 BBBBB
   
   
   
   
   
   
Cid Aid Bid Cname
C1 A1 B1 C
C2 A2 B2 CC
C3 A3 B3 CCC
C4 null B4 CCCC
C5 null null CCCC

 

 

 

 

 

 

------------内连接------------

1 select c.cid,b.bid,a,aid
2 from c,b
3 where c.bid=b.bid and c.aid=a.aid

执行结果:(必须都有,并且全都不为空)

Cid Bid Aid
C1 B1 A1
C2 B2 A2
C3 B3 A3

 

 

 

                                                                                                                                                                                                 

------------左外连接 LEFT JOIN ------------

1 select c.cid,b.bid
2 from c,b
3 where c.bid=b.bid(+)

执行结果:(以C表为中心,允许输出NULL)

Cid Bid
C1 B1
C2 B2
C3 B3
C4 B4
C5 null

 

 

 

 

 

                                                                                                                                                      

------------右外连接 RIGHT JOIN ------------

1 select c.cid,b.bid
2 from c right join b 
3 on c.bid=b.bid

执行结果:(以B表为中心,允许输出NULL)

Cid Bid
C1 B1
C2 B2
C3 B3
C4 B4
null B5

 

 

 

 

 

                                                                                                                                                                                                             

------------全外连接 FULL JOIN ------------

1 select c.cid,b.bid
2 from c full join b
3 on c.bid=b.bid

执行结果:

Cid Bid
C1 B1
C2 B2
C3 B3
C4 B4
null B5
C5 null

 

 

 

 

 

 

                                                                                                                                                                                  

3、交叉连接

交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合,交叉连接也称为笛卡尔积。

1  select c.cid,b.bid
2  from c cross join b
3  on c.bid=b.bid

 

二、查询预算符

Exists:子查询至少返回一行时条件为true。当括号内的查询语句为true,才能继续查询。

1 select * from emp where exists(select * from emp where deptno!=50)

Not Exists:子查询不返回任何一行时条件为true。

In:与子查询返回结果集中某个值相等。

Not In:与子查询返回结果集中任何一个值不相等。

>ANY:比子查询返回结果中的某个值大。

查询任意一个比20号部门工资高的员工(大于20号部门最少的工资):

1 select ename, sla
2 from emp
3 where deptno!=10 
4 and sal>any(select sal from emp where deptno=20)

=ANY:与子查询返回结果中的某个值相等。

<ANY:比子查询返回结果中的某个值小。

>ALL:比子查询返回结果中的所有值都大。

查询比20号部门高于所有员工的工资(大于20号部门最多的工资):

1 select ename, sla
2 from emp
3 where deptno!=10 
4 and sal>all(select sal from emp where deptno=20)

 三、集合运算

集合运算就是将两个或者多个结果集组合成为一个结果集。

种类:

并集 union all 返回各个查询的所有记录,包括重复记录。

并集 union 返回各个查询的所有记录,不包括重复记录

交集 intersect 返回两个查询共有的记录。

补集 minus 返回第一个查询的记录减去第二个查询记录之后剩余的记录。

查询不隶属于30号部门的CLERK:

1 select * from emp where job="CLERK"
2 minus  --补集 排除下面的条件
3 select * from emp where deptno=30

 操作自增序列:

nextval 每次默认使用 自动加1 不管成功与否

1 select emp_dept.nextval from dual
2 insert into emp(ename) values(null)

currval 自带序列维护 不成功+1

1 select emp_dept.currval from dual

排名: 112  113 123

1 select ename,sal 
2 rank() over(order by sal desc) as 排名113,
3 dense_rank() over(order by sal desc) as 排名112,
4 row_number() over(order by sal desc) as 排名123
5 from emp

 

以上是关于Oracle 多表查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 查询技巧与优化 多表查询

Oracle笔记 多表查询

Oracle基础:多表查询

Oracle曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

Oracle --- 多表查询和子查询

Oracle查询多表连接