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
小結:感覺使用圓餅來解說似乎也不是那麼直覺好理解,也有人用較直覺的資料列方圖來表示,
個人覺得使用三度空間的立體圖來表示會不會好一點?╮(╯_╰)╭
參考資料: