Oracle中的連接查詢

本文在於弄懂join、inner join;left join、left outer join; right join、right outer join;full join、full outer join;scoss join在oracle中的區別。

1.選擇oracle中自帶的表,部門表:dept,員工表:emp

dept表的查詢如下:

select * from dept;

emp表的查詢如下:

select * from emp;

2.內連接: join 等價於inner join。在兩張表進行查詢時,只保留兩張表中條件完全匹配的結果集。即滿足on條件的記錄纔會返回。

--dept與emp的內連接,join 等價與 inner join, 下面兩條語句查詢結果相同  相當於交集
select * from dept inner join emp on dept.deptno=emp.deptno;
select * from dept  join emp on dept.deptno=emp.deptno;

3. 左連接:left join 等價於left outer join,。外部連接兩個表中的記錄,幷包含左表中的全部記錄。如果左表的某記錄在右表中沒有匹配記錄,則在相關聯的結果集中右表的所有選擇列表列均爲空值。即使左表不符合ON條件,左表中的記錄也全部顯示出來,且結果集中該類記錄的右表字段爲null,即以左表爲參考點。

--dept與emp的左連接
select * from dept left join emp on dept.deptno = emp.deptno;
select * from dept left outer join emp on dept.deptno = emp.deptno;
select * from dept , emp where dept.deptno = emp.deptno(+);

4. 右連接:right join 等價於right outer jooin。外部連接兩個表中的記錄,幷包含右表中的全部記錄。如果右表的某記錄在左表中沒有匹配記錄,則在相關聯的結果集中左表的所有選擇列表列均爲空值。即使右表不符合ON條件,右表中的記錄也全部顯示出來,且結果集中該類記錄的左表字段爲null,即以右表爲參考點。由此看出,左連接與右連接是反過來的。

--dept與emp的右連接
select * from dept right join emp on dept.deptno = emp.deptno;
select * from dept right outer join emp on dept.deptno = emp.deptno;
select * from dept, emp where dept.deptno(+) = emp.deptno;

5.全連接: full join 等價於 full outer join。完整外部聯接返回左表和右表中的所有行。就是LEFT JOIN和RIGHT JOIN和合並,左右兩表的數據都全部顯示。

-- 全連接  並集
select* from dept full join emp on dept.deptno = emp.deptno;
select * from dept full outer join emp on dept.deptno = emp.deptno;

6.笛卡爾積 :cross join  例如:A={a,b},B={0,1,2},則:AxB = { (a,0), (a,1), (a,2), (b,0), (b,1), (b,2) }

select * from dept cross join emp ;

因此,如dept表(4行)與emp(14行)表進行笛卡爾積,最終的結果爲4x14=56行。

7. union 與 union all的區別:

如果我們需要將兩個select語句的結果作爲一個整體顯示出來,我們就需要用到union或者union all關鍵字。union(或稱爲聯合)的作用是將多個結果合併在一起顯示出來。 

union可以對字段名不同但數據類型相同的結果集進行合併;

union和union all,區別在於union從結果集中刪除重複的行。如果使用union all 將包含所有行並且將不刪除重複的行。

union,對兩個結果集進行並集操作,不包括重複行,同時進行默認規則的排序;

union all,對兩個結果集進行並集操作,包括重複行不進行排序

另外:

intersect,對兩個結果集進行交集操作,不包括重複行,同時進行默認規則的排序;

minus,對兩個結果集進行差操作,不包括重複行,同時進行默認規則的排序。

語句爲:

select * from dept union select * from dept_p1;
select * from dept union all select * from dept_p1;
select * from dept intersect select * from dept_p1;
select * from dept minus select * from dept_p1;

附:這是一張圖,能形象的表示各個連接在集合中的關係可視化:

https://img3.sycdn.imooc.com/5ceb542c0001621606000472.jpg

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章