摘要:T-SQL 中的 JOIN 語法解析 (for SQL Server)
T-SQL 中的 JOIN 這個語法的來源是關係代數 (由 E.F. Codd 於1970年時所提出),
乃利用各種不同的聯結方式來從兩個集合中取出不同的資料~~~
而在 T-SQL 裡面用到的聯結方式包括:
1. 交叉聯結或稱笛卡兒乘積 (CROSS JOIN,即A × B,稱AB的積集)
2. 自然聯結 (INNER JOIN,即A ∩ B,稱AB的交集)
3. 左外聯結 (LEFT OUTER JOIN,即A)
4. 右外聯結 (RIGHT OUTER JOIN,即B)
5. 完全外聯結 (FULL OUTER JOIN,即A ∪ B,稱AB的聯集)
以下分別就上列這 5 種聯結方式個別作介紹,但首先做個事前準備工作,
使用以下的 SQL 語法來建立兩個資料表變數,然後看看資料對不對:
declare @employee table (deptName nvarchar(50), name nvarchar(50))
declare @dept table (county nvarchar(50), name nvarchar(50))
insert into @employee (name) values ('Chang')
insert into @employee (deptName, name) values ('PG', 'Lin')
insert into @employee (deptName) values ('EC')
insert into @employee (deptName, name) values ('PG', 'Wang')
insert into @dept (county, name) values ('KH', 'PG')
insert into @dept (county) values ('TN')
insert into @dept (name) values ('PG')
insert into @dept (county, name) values ('TP', 'EC')
select * from @dept
select * from @employee
執行完會出現像這樣的結果:
這樣我們就可以接著來做後續介紹及範例語法~~~
1. 交叉聯結或稱笛卡兒乘積 (CROSS JOIN):
將兩個資料表所有想取出欄位的兩兩配對可能結果都選取出來,不需要加 on 關鍵字
以下是範例程式及結果
SELECT
*
FROM
@employee AS emp
CROSS JOIN @dept AS dep
ORDER BY
emp.deptName,
emp.name,
dep.county,
dep.name
2. 自然聯結 (INNER JOIN):
依照某個具有相同值的欄位取出想取得的欄位兩兩配對的可能結果,
也就是在「兩個資料表都有 on 關鍵字所指定的欄位的值」這個條件下才取出想取的欄位
以下是範例程式及結果
SELECT
*
FROM
@employee AS emp
INNER JOIN @dept AS dep
ON emp.deptName = dep.name
ORDER BY
emp.deptName,
emp.name,
dep.county,
dep.name
3. 左外聯結 (LEFT OUTER JOIN):
「以 JOIN 左側的資料表為基準,每一個想取的欄位的每一筆資料都一定會取出」,
在此條件下,再依照 on 關鍵字所指定的欄位之相同值去取右側資料表對應的資料出來
以下是範例程式及結果
SELECT
*
FROM
@employee AS emp
LEFT OUTER JOIN @dept AS dep
ON emp.deptName = dep.name
ORDER BY
emp.deptName,
emp.name,
dep.county,
dep.name
4. 右外聯結 (RIGHT OUTER JOIN)):
與 LEFT OUTER JOIN 相反,是以 JOIN 右側的資料表為基準來取左側的......
以下是範例程式及結果
SELECT
*
FROM
@employee AS emp
RIGHT OUTER JOIN @dept AS dep
ON emp.deptName = dep.name
ORDER BY
emp.deptName,
emp.name,
dep.county,
dep.name
5. 完全外聯結 (FULL OUTER JOIN):
是 LEFT OUTER JOIN 跟 RIGHT OUTER JOIN 的聯集,
也就是在「取出左右兩個資料表的每一筆資料」的條件下,依照 on 關鍵字所指定的欄位的值來取得資料
也就是說,不管 on 所指定的欄位的值是不是兩個資料表都有,所有資料還是照取,但不做兩兩配對
以下是範例程式及結果
SELECT
*
FROM
@employee AS emp
FULL OUTER JOIN @dept AS dep
ON emp.deptName = dep.name
ORDER BY
emp.deptName,
emp.name,
dep.county,
dep.name
以上不同的 JOIN 語法可以應付各種不同狀況所需,如果用熟了可以省掉很多不必要的邏輯,
效能上面也可以有稍稍的改善~~~