Oracle多表查詢

本節剖析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排序

相關文章
相關標籤/搜索