本文在於弄懂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;
附:這是一張圖,能形象的表示各個連接在集合中的關係可視化: