本节剖析Oracle多表查询中的相关内容。
本文所用到的表为oracle中scott用户下的emp表,dept表,数据以下:oracle


1、笛卡尔集:
概念:假设A,B是2个集合,A X B所造成的集合叫笛卡尔集。
实例1:A={a,b} B={c,d,e},那么A X B={(a,c),(a,d),(a,e),(b,c),(b,d),(b,e)}
图形实例以下:
A:
B:
spa
那么A X B:
3d
由此可看出笛卡尔集的结果为列数相加行数相乘,其中有不少重复项。
那么在多表查询中若是查询出来的结果有重复项,一般会对咱们须要的结果形成干扰,为了不这种笛卡尔集的出现,能够添加有效的链接条件,若是有n张表,那么链接条件最少为n-1个。
2、交叉链接:
在oracle中笛卡尔集也有对应的求解,称为交叉链接cross join,示例以下:
Example:
select d.dname,e.ename,d.deptno,e.deptno from dept d cross join emp e;



emp表14条数据,dept表4条数据,14x4=56恰好等于笛卡尔集的结果。code
3、天然链接:
概念:natural join是一种特殊的等值链接,将表中具备相同名称的列进行自动匹配,不须要再加等值条件。
Example:
select ename,deptno,dname from emp natural join dept;

能够看到dname是dept表中的列,条件中并无加入emp.deptno=dept.deptno,可是结果仍然正确,这就是天然链接的做用,特别注意的是须要列名相同才能够。
4、内链接:
概念:inner join只返回知足条件的相匹配的查询结果,inner可省略。
(1)第一种用using子句创建链接
Example:
select ename,deptno,dname from emp join dept using(deptno);

(2)第二种:用on子句创建链接:
Example:
select ename,e.deptno,dname from emp e join dept d on e.deptno=d.deptno;

这2种均可以查询到咱们想要的结果,那么这2种语句的意义在哪里呢,刚才有讲过天然链接会将列名相同做为条件,
若是此时2张表中有多个列值对应相等,那么oracle会自动将这些列都做为条件,而咱们有可能只须要其中的一部分
做为条件,那么此时就用到了这2种语句,也是它们存在的价值。
5、外链接
概念:分为左外链接,右外链接,彻底(外)链接,它们都返回知足结果的链接,不一样的是左外链接还返回不知足左表的部分数据,
一样的右外链接还返回不知足右表的部分数据,彻底链接则还返回不知足条件的部分数据,也就是说,左外链接返回左表的所有数据
右表的知足条件数据,右外链接返回右表的所有数据左表知足条件的数据,彻底链接返回左右表的所有数据。
Example:
select ename,d.deptno,dname from dept d left join emp e on d.deptno=e.deptno;
select ename,d.deptno,dname from emp e right join dept d on e.deptno=d.deptno;

右外链接能够看作是将左外链接的表换了个位置,查询结果相同,因此此处只讲左外链接,dept表中有deptno=40的部门,可是
在emp表中并无deptno=40的员工,若是此处没有用左外链接,那么就不会显示最后一行,以下图:
select ename,d.deptno,dname from dept d join emp e on d.deptno=e.deptno;

能够看到并无deptno=40的那一行。
Example2:
select e.ename,d.dname from emp e full join dept d on e.deptno=d.deptno;

彻底外链接能够看作是将左外链接和右外链接进行了一个“合体”,不知足的结果也会显示出来,能够看出来左外链接用到的状况最多。
另外,左外链接和右外链接还有另外一种表达的方式,使用(+)操做符,
Expression:左外链接:select table1.column,table2.column from table t1,table2 t2 where t1.column = t2.column(+)
右外链接:select table1.column,table2.column from table1 t1,table2 t2 where t1.column(+) = t2.column
Example:
select e.ename,d.dname from dept d,emp e where e.deptno(+) = d.deptno;
select e.ename,d.dname from emp e ,dept d where e.deptno(+)=d.deptno;

所查结果同样,这里我故意将条件的位置写反,说明并非(+)的位置固定,而是要根据条件中的表的名字的位置判断,这也是外链接查询的一种写法,注意此处是where子句再也不是on子句。
6、自链接:
概念:自链接很容易理解,就是同一张表,将它看作是2张如出一辙的表,其中一张表的列能够做为另外一个表的查询条件。
Example:在emp表中查询员工本身的上司。
select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;

分析:emp e表中的mgr是他的上司的empno,而他的上司的empno也在emp这张表中,这就将同一张表当作了2张表。
7、set运算符:
概念:专门用来合并多条select语句的结果,分为四种。
左图表示2个查询select1和select2,其中B是2个查询的重复数据。
一、union操做符:用于取得2个查询的并集,而且会将其中的重复数据去掉,最后按第一列的结果进行升序排序。
用图来表示就是 select1 union select2 = A+B+C
二、union all操做符:一样用于取得2个查询的并集,但不会将重复的数据去掉,也不会进行排序。
用图来表示就是 select1 union all select2 = A+B+B+C
三、intersect操做符:同于取得2个查询的交集 ,而且会以第一列的结果升序排序
用图表示就是:select1 intersect select2 =B
四、minus操做符:用于取得在第一个中的结果,但不在第二个中的结果,而且会以第一列的结果升序排序
用图表示就是 select1 minus select2 = A
Example:
先根据emp表和dept表作2张新表,emp01取部门号为10和20的,emp02取部门号为20和30的:
create table emp01
as
select * from emp where deptno in(10,20);
create table emp02
as
select * from emp where deptno in(20,30);
数据以下:


union操做符的运用:
select deptno,empno,ename from emp01
union
select deptno,empno,ename from emp02;

emp表中只有10,20,30部门的数据,因此union之后应该恰好是emp表的数据。
union all操做符的运用:
select deptno,empno,ename from emp01
union all
select deptno,empno,ename from emp02;

union all之后会将重复的也显示出来,因此部门号为20的员工会显示2次
intersect操做符的运用:
select deptno,empno,ename from emp01
intersect
select deptno,empno,ename from emp02;

intersect之后会将重复数据显示,因此只显示部门号为20 的数据。
minus操做符的运用:
select deptno,empno,ename from emp01
minus
select deptno,empno,ename from emp02;

minus只显示第一个查询的结果,把其中和第二部分查询重复的删除,因此只显示10号部门不会显示20号部门的信息。
到此为止,多表查询所有总结完毕,有任何建议能够在下方评论。blog
2018-08-10 16:57:07排序