SQL JOIN
什麼是JOIN
JOIN是一種從多個表源取資料的操作,常用于合并表。常見的JOIN操作包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN、自關聯等
- JOIN和INNER JOIN一緻,是擷取兩張表交集部分資料的方法。也就是兩張表間互相比對的那部分記錄會被列舉。
-
OUTER JOIN包含LEFT JOIN、RIGHT JOIN、FULL JOIN三種。具體地:
1. LEFT JOIN:即使右表中沒有比對,也從左表傳回所有的行
2. RIGHT JOIN:即使左表中沒有比對,也從右表傳回所有的行
3. FULL JOIN:隻要其中一個表中存在比對,就傳回行
- 自關聯是指一張表與同一張表按照某種篩選條件進行合并,生成新表。
常用的JOIN政策
-
需要展示的字段内容分别存儲在不同的表裡,此時需要用JOIN來合并表
舉個例子:
資料庫中包含Persons和Orders表,如果我們希望列出所有人的定購數,可以使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons JOIN Orders
ON Persons.Id_P = Orders.Id_P
這裡的JOIN可以了解為Persons表和Orders表的各自任取一行組合成行記錄,得到臨時表t,然後針對臨時表t 進行ON條件篩選,即選擇Persons表部分Id_P與Orders表部分Id_P一緻的行記錄,最終得到結果表。
-
需要展示的字段内容在同一個表中,但僅通過一個表不能直接得到最終結果,此時需要用JOIN來合并表
舉個例子:
資料庫中包含employees表,其中包含員工id及姓名、經理id。如果我們希望列出所有員工及其經理姓名,可以使用下面的 SELECT 語句:
SELECT worker.last_name, manager.last_name
FROM employees worker JOIN employees manager
ON (workers.manager_id = manager.employee_id)
3. 需要展示的字段内容在同一張表裡,但是對不同行記錄的起始截止有條件限定
在SQL實作深圳地鐵換乘小項目中,同一條線路不同站點上下車或者站點間換乘的場景,對線路資訊表的起始截止站點【不同行記錄】均有條件限制,是以采用自關聯的方式,
例1: 同一條線路不同站點上下車
SELECT a.num, a.stopid,b.stopid
FROM szsubway a JOIN szsubway b ON (a.num=b.num)
WHERE a.stopid=1 AND b.stopid= 22
例2: 站點間換乘
SELECT a.stopid,a.num, b.stopid, c.num, d.stopid
FROM szsubway a
JOIN szsubway b ON (a.num=b.num)
JOIN szsubway c ON (b.stopid=c.stopid AND b.num != c.num)
JOIN szsubway d ON (c.num=d.num)
WHERE a.stopid=70 AND d.stopid= 108