1. 程式人生 > >17、多表連線查詢

17、多表連線查詢

學習目標:

1、掌握自然連線、左外連線、右外連線和全連線的概念

2、掌握Oracle對自然連線、左外連線、右外連線和全連線的語法的支援

3、熟練掌握多表連線查詢

學習過程:

有時候我們需要從多張表中獲取資料,select語句支援一次性查詢多張表,這些表在記憶體中會做一個“乘法”操作。兩個表如何相乘呢?我們看看那下面這個例子。

比如現在有兩張表,員工表和部門表

attcontent/1674edc9-44c9-4cf7-b885-966bd2c5b554.png

如果這兩張表做一個乘法運算,那麼結果如下:

attcontent/fd18cb69-d2f6-403a-b33a-e7b71d575a34.png

一、內連結查詢

現在我們要查詢,查詢所有部門的員工資訊,要求顯示部門名稱,員工名稱,工資等資訊,因為部門名稱儲存在部門表中,其他資訊儲存在員工表中,所以我們需要一次性的查詢兩個表,程式碼如下:

1

2

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

      from employee e,department d

這樣得到的結果就是部門表和員工表的一個乘法結果,其中部門的id和員工的所屬部門的外交id是對不上的,所以我們新增一個條件判斷,就是主鍵=外來鍵,這樣就可以得到正確的資料了。修改上面的查詢語句。

1

2

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

      from employee e,department d where e.dep_id=d.dep_id

得到結果如下:

attcontent/c765cae4-181c-4207-a695-ecf49e01cd35.png

多表查詢可以是多張表的,比如下面這個例子,需要查詢四張表,才可以得到員工每門課程的對應的成績。

1

2

3

4

--查詢員工的姓名,部門名稱,科目名稱,科目的成績

select employee_name,dep_name,EMP_SOURCE_NAME, POINT 

            from employee e,department d,emp_source es,emp_result er

        where e.dep_id=d.dep_id  and e.employee_id=er.employee_id and er.emp_source_id=es.emp_source_id

結果如下:

attcontent/137a4cb7-e8be-4bd5-a250-e8b07689f1e8.png

二、外鏈查詢

主要有左外連線,右外連線和全連線。

左外連線:指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。     

右外連線:其實和左外連線差不多。右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

全連線:完整外部聯接返回左表和右表中的所有行。

oracle有自己的一套實現外連結的語法格式,這些語法格式有別於標準的sql語句,相對來說比較容易一點。下面兩個我們都介紹一下:

首先我們現在員工表插入一條部門外來鍵為空的資料。

attcontent/dc4d37e3-259f-4fb6-a421-9949cc887feb.png

然後在部門表,新增一條沒有任何員工是該部門的資料。

attcontent/cd3493ac-fe12-4159-845d-d2bfc2e6cac2.png

1、左外連線示例如下:

1

2

3

4

5

6

7

 --oracle的實現方式

--+號寫在右邊,左外連結,左邊邊全部出現,

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

      from employee e,department d where e.dep_id=d.dep_id(+) 

--標準sql寫法

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

   from employee e left outer join department d on e.dep_id=d.dep_id

結果如下:

attcontent/67ff151a-4a34-4ba3-a238-af7f6bf8358e.png

右外連線示例如下:

1

2

3

4

5

6

 --右外連結

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

      from employee e,department d where e.dep_id(+)=d.dep_id

--標準sql寫法

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

   from employee e right outer join department d on e.dep_id=d.dep_id

結果如下:

attcontent/419697b3-d451-41f3-bec1-a7276395da6a.png

全連線示例如下:

1

2

3

4

5

6

7

8

9

10

--oracle可以把左外和右外連線做個並集

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

      from employee e,department d where e.dep_id=d.dep_id(+)  

  union    

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

      from employee e,department d where e.dep_id(+)=d.dep_id    

             

--標準sql寫法

select d.dep_name  部門名稱,e.employee_name 員工名稱 ,e.salary  工資 

   from employee e full outer join department d on e.dep_id=d.dep_id

 

attcontent/c2fd4041-999f-49e6-a1db-d5c2a9e82e98.png