Home [SQL筆記] 多表查詢一
Post
Cancel

[SQL筆記] 多表查詢一

R

  • 簡單多表查詢from A, B:只要不符合主外鍵關係的數據,都不會顯示。
  • 內連接 inner join:只要不符合主外鍵關係的數據,都不會顯示。
  • 外連接-左外連left join:以左表為主,只要不符合主外鍵關係的數據,null顯示。
  • 外連接-右外連right join:以右表為主,只要不符合主外鍵關係的數據,null顯示。
  • 全外連 full join:兩張的數據,無論是否符合外鍵關係的數據,都會全部顯示。

簡單多表查詢(from A,B)和內連接(inner join)共同的特點:
不符合主外鍵關係的數據,不會被顯示出來。

笛卡爾乘積

查詢結果將Department所有記錄和Employee表所有記錄依次排列組合型成新的結果

1
2
3
--笛卡爾乘積
select * from Employee, Department
--查詢結果將Department所有記錄和Employee表所有記錄依次排列組合型成新的結果

簡單多表查詢

from A表, B表
只要不符合主外鍵關係的數據,都不會顯示。

1
2
3
4
5
6
7
8
9
10
11
12
13
--簡單多表查詢
--查詢員工資料,顯示部門名稱
select * from Employee, Department 
where Employee.DepartmentId = Department.DepartmentId

--查詢員工資料顯示職級名稱
select * from Employee, [Rank]
where Employee.RankId = [Rank].RankId

--查詢員工資料顯示部門名稱,職級名稱
select * from Employee, Department, [Rank]
where Employee.DepartmentId = Department.DepartmentId
and Employee.RankId = [Rank].RankId

內連接查詢 Inner Join

只要不符合主外鍵關係的數據,都不會被顯示。

第一張表 inner join(內連接) 第二張表 on 兩張表的關係

很多張表的話,就繼續 inner join 下去:
select * from 第一張表
inner join(內連接) 第二張表 on 第一張表和兩張表的關係
inner join(內連接) 第三張表 on 第一張表和三張表的關係

1
2
3
4
5
6
7
8
9
10
11
12
--查詢員工資料,顯示部門名稱(inner join)
select * from Employee 
inner join Department on Employee.DepartmentId = Department.DepartmentId

--查詢員工資料,顯示職級名稱
select * from Employee
inner join [Rank] on Employee.RankId = [Rank].RankId

--查詢員工資料,顯示部門名稱,職級名稱
select * from Employee
inner join Department on Employee.DepartmentId = Department.DepartmentId
inner join [Rank] on Employee.RankId = [Rank].RankId

簡單多表查詢(from A,B)和內連接(inner join)共同的特點:
不符合主外鍵關係的數據,不會被顯示出來

外連接(左、右、全)

左外連 Left Join

left join誰在左邊,誰為主。
以左表為主表進行數據顯示,主外鍵關係找不到的數據null取代。

例如:

1
2
3
4
5
select * from Department
left join Employee on Employee.DepartmentId = Department.DepartmentId
--結果
--1 摸魚部	test...	28	8	1	王五	男	1999-09-09 00:00:00	50000.00	098899900 2023-05-08 00:11:00
--2	人事部	...	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL

以部門Department為主表,但部門底下沒有員工的話,數據就會以NULL取代

範例

1
2
3
4
5
6
7
8
9
10
--查詢員工資料,顯示部門名稱
select * from Employee
left join Department on Employee.DepartmentId = Department.DepartmentId
--查詢員工資料,顯示職級名稱
select * from Employee
left join [Rank] on Employee.RankId = [Rank].RankId
--查詢員工資料,顯示部門名稱,職級名稱
select * from Employee
left join Department on Employee.DepartmentId = Department.DepartmentId
left join [Rank] on Employee.RankId = [Rank].RankId

右外連 Right Join

A left join B = B right join A

1
2
3
4
5
6
7
--右外連:A left join B = B right join A
--下面兩個查詢含義相同
select * from Employee
left join Department on Employee.DepartmentId = Department.DepartmentId

select * from Department
left join Employee on Employee.DepartmentId = Department.DepartmentId

全外連 Full Join

兩張表的數據,無論是否符合關係,都要顯示

1
2
3
--全外連:兩張表的數據,無論是否符合關係,都要顯示
select * from Employee
full join Department on Employee.DepartmentId = Department.DepartmentId

https://www.bilibili.com/video/BV1XV411C7TP?p=13

This post is licensed under CC BY 4.0 by the author.