PLSQL 外連接

1.爲什麼表之間要進行連接?

學習的過程中,我們要學會多問幾個問什麼,多思考,多嘗試,才能夠更好的成長。尤其是,在初學的時候,沉浸在單表查詢中的喜悅中,無法自拔、不能自已。我們需要用唯物辯證法的聯繫觀點去看待這個問題。當表與表之間存在一定的聯繫的時候,我們可能需要連接表來獲所得需要的信息,連接的橋樑就是條件。

2. Employee,Department

(1)先簡單地創建兩張表

【department】

create table department
( dep_id   VARCHAR2(5) PRIMARY KEY,
  dep_no   VARCHAR2(5) UNIQUE,
  dep_name VARCHAR2(20)
)

【employee】

create table employee
( emp_id   VARCHAR2(5) PRIMARY KEY,
  emp_no   VARCHAR2(5) UNIQUE,
  emp_name VARCHAR2(20),
  emp_sex  VARCHAR2(5),
  dep_id   VARCHAR(5) REFERENCES department(dep_id)
)

(2)插入一些數據

這裏寫圖片描述

這裏寫圖片描述

3.交叉連接

它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。簡單地說不管三七二十一就把兩張表連接在一起。

SELECT * FROM employee,department

【結果】

這裏寫圖片描述

employee表中有5條數據,department表中有4條數據。因爲無腦連接(假裝沒聯繫,呵呵),employee表中的每一條記錄都會連接department表中的所有記錄,所以我們看到結果有20條。

4.內連接

(1)聯繫

把這兩張表分別當做漢子和妹子。兩個人怎麼樣才能夠走到一起呢,這是個問題。當然兩個人有共同的興趣愛好是在一起的充分條件,部門ID就是他們的共同點

(2)連接(我們想獲取員工及其所屬部門等信息)

SELECT  emp_id,
        emp_no,
        emp_name,
        emp_sex,
        dep.dep_id,
        dep_no,
        dep_name 
        FROM employee emp,department dep
             WHERE emp.dep_id=dep.dep_id

【結果】

這裏寫圖片描述

5.外連接

(1)爲什麼要用外連接?

我們想要的是所有員工的信息,很顯然內連接是無法滿足要求的,一些暫時還沒有所屬部門的員工的信息(比如新來的員工,還沒有維護好基礎數據)將獲取不了。需求是要獲取所有員工的信息,如果員工沒有所屬部門的,就空在那裏。

(2)左連接

(+)的另一側爲連接的方向,下面的是左連接,(+)左側的全部顯示,即顯示所有的員工,然後department表進行匹配,不存在部門的,那麼相關字段就爲nul值l

SELECT emp_id,
       emp_no,
       emp_name,
       emp_sex,
       emp.dep_id
       dep_no,
       dep_name
       FROM employee emp,department dep
       WHERE 1=1
             AND emp.dep_id=dep.dep_id(+)
             ORDER BY emp_no

【結果】

這裏寫圖片描述

(3)右連接

現在我們來改一下需求,我們要獲取的是所有部門的員工信息

那麼部門就要全部顯示,和employee表進行匹配,有員工的就顯示,沒員工的,那麼相關的字段都爲null值

SELECT dep.dep_id
       dep_no,
       dep_name
       emp_id,
       emp_no,
       emp_name,
       emp_sex
       FROM employee emp,department dep
       WHERE 1=1
             AND emp.dep_id(+)=dep.dep_id
             ORDER BY dep_no  

【結果】

這裏寫圖片描述

6.如何外部連接到多表?

(1)新建一個部門宿舍表,假設公司會爲每個部門分配好宿舍

create table ROOM
(
  room_id VARCHAR2(3) primary key,
  room_no VARCHAR2(3) unique,
  dep_id  VARCHAR2(5) REFERENCES department(dep_id)

)

(2)插入幾條數據

這裏寫圖片描述

(3)需求

我們需要獲取公司所有宿舍員工的信息情況

SELECT r.room_id,
       r.room_no,
       emp_id,
       emp_no,
       emp_name,
       emp_sex,
       dep.dep_no,
       dep.dep_name
       FROM employee emp,department dep,room r
       WHERE 1=1
             AND emp.dep_id=dep.dep_id(+)
             AND r.dep_id=dep.dep_id(+)
             ORDER BY room_no

【結果】

這裏寫圖片描述

(4)解決方法

department這張表要分別連接employee表和room表,但是又不能外連接兩張表。可以先讓deparment表和room表進行外連接,再用得到的結果和employee進行連接。

SELECT r_dep.room_id,
       r_dep.room_no, 
       emp_id, 
       emp_no, 
       emp_name, 
       emp_sex, 
       r_dep.dep_no,
       r_dep.dep_id,
       r_dep.dep_name
  FROM employee emp,
       department dep,
       (SELECT room_id, room_no, r.dep_id,dep.dep_no,dep.dep_name 
               FROM department dep, room r 
               WHERE r.dep_id = dep.dep_id(+)) r_dep
 WHERE 1 = 1
   AND emp.dep_id = dep.dep_id(+)
   AND emp.dep_id(+) = r_dep.dep_id

【結果】

這裏寫圖片描述

因爲製造部暫時還沒有員工,所以相關字段爲null.在這裏room表只和department表有聯繫。另外的兩個員工(劉琴,新來的)因爲沒有所屬部門,所以在這裏也不會出現。

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