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表有聯繫。另外的兩個員工(劉琴,新來的)因爲沒有所屬部門,所以在這裏也不會出現。