inner join、full out join、left join

 

圖片來源為FB的MSDN小編

由於在網路上討論join的文章雜亂煩多,我是有看沒有懂,

故,我還是自己親自跑實例比較明瞭(自己親自跑一遍就通了)。

 

一、一開始先建立資料

CREATE TABLE [dbo].[table_a]
  (
     [id_a]   [FLOAT] NULL,
     [name_a] [NVARCHAR](50) NULL
  )
ON [PRIMARY]

go 

CREATE TABLE [dbo].[table_b]
  (
     [id_b]   [FLOAT] NULL,
     [name_b] [NVARCHAR](50) NULL
  )
ON [PRIMARY]

go 

--dbo.Table_a
INSERT dbo.Table_a VALUES (1, N'a')

INSERT dbo.Table_a VALUES (2, N'b')

INSERT dbo.Table_a VALUES (3, N'c')

INSERT dbo.Table_a VALUES (4, N'd')

--dbo.Table_b
INSERT dbo.Table_b VALUES (1, N'aa')

INSERT dbo.Table_b VALUES (2, N'bb')

INSERT dbo.Table_b VALUES (5, N'cc')

INSERT dbo.Table_b VALUES (6, N'dd')

 

二、先列出 table_a 與 table_b 的資料

select * from table_a

select * from Table_b

 

三,主要join方式 

個人製作的註記簡圖

 

1、inner join

不管兩 table 的關係是一對一、一對多、多對一、多對多,

只要兩 table 所指定的屬性的 join 條件符合,其組合就會列出來。

select * from Table_a
join Table_b on Table_a.id_a = Table_b.id_b

select * from Table_a
inner join Table_b on Table_a.id_a = Table_b.id_b

的結果是一樣的

還有一個語法跟inner join是蠻相似的,就是NATURAL JOIN,

其兩資料表之間同名的欄位會被自動結合在一起。

不過在SQL SERVER則是不支援這種語法,如想了解請參考

NATURAL JOIN 關鍵字 (SQL NATURAL JOIN Keyword) - 自然連接

 

2、left outer join 等於 left join

除了上述的

不管兩 table 的關係是一對一、一對多、多對一、多對多,

只要兩 table 所指定的屬性的 join 條件符合,其組合就會列出來。

還要加上 Table_a 有的組合,但 Table_b 沒有的地方 (因為所指定的屬性的 join 條件不符合);

select * from Table_a
left join Table_b on Table_a.id_a = Table_b.id_b

 

3、full outer join 等於 full join

除了上述的

不管兩 table 的關係是一對一、一對多、多對一、多對多,

只要兩 table 所指定的屬性的 join 條件符合,其組合就會列出來。

還要加上 Table_a 與 Table_b 所指定的屬性的 join 條件不符合的情況,也就是說,

還要加上 Table_a 有的組合,但 Table_b 沒有的地方 (因為所指定的屬性的 join 條件不符合);

再加上 Table_b 有的組合,但 Table_a 沒有的地方 (因為所指定的屬性的 join 條件不符合)。

select * from Table_a
full join Table_b
on Table_a.id_a = Table_b.id_b

 

4、full outer join but a.Key is null or b.Key is null

select * from Table_a
full outer join Table_b
on Table_a.id_a = Table_b.id_b
where Table_a.id_a is null or Table_b.id_b is null

 

5、left outer join but b.Key is null

select * from Table_a
left outer join Table_b on Table_a.id_a = Table_b.id_b
where Table_b.id_b is null

 

6、right outer join等於right join

select * from Table_a
right join Table_b on Table_a.id_a = Table_b.id_b

 

7、right outer join but a.Key is null

select * from Table_a
right outer join Table_b on Table_a.id_a = Table_b.id_b
where Table_a.id_a is null

 

8、笛卡爾積、交叉合併cross join

將 Table_a 裡的每一個資料去跟 Table_b 裡的每一個資料組合,

例如 Table_a 裡有四筆資料,而 Table_b 裡也有四筆資料,其將會有 4 * 4 = 16 種組合。

select * from Table_a ,Table_b

 

小結:感覺使用圓餅來解說似乎也不是那麼直覺好理解,也有人用較直覺的資料列方圖來表示,

個人覺得使用三度空間的立體圖來表示會不會好一點?╮(╯_╰)╭

 

參考資料:

A Visual Explanation of SQL Joins