iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0

此篇文章同步發表於個人部落格

今天來介紹JOIN,有以下幾個模式!

  1. JOIN
  2. LEFT JOIN
  3. RIGHT JOIN
  4. FULL OUTER JOIN
  5. CROSS JOIN
SELECT aga.area_pkid, a.name, aga.subid, aga.place, aga.kind 
FROM adoption_gov_animals AS aga LEFT JOIN areas AS a 
ON aga.area_pkid = a.id;

解釋SQL

複習一下 aga.area_pkid 以這個欄位的撰寫方式,aga 是 adoption_gov_animals 的縮寫,在第二行中 adoption_gov_animals AS aga AS 關鍵字可以設定一個名稱來代表adoption_gov_animals 這張資料表

以上方查詢的程式碼來看的話是使用 LEFT JOIN 關鍵字,左右兩邊都有一張表!為了好辨識我們改成這樣。

FROM left_table LEFT JOIN right_table

所以我們現在就有 left_table 左邊資料表以及右邊資料表 right_table,等等就會以這個名詞來做講解。

第三行 ON 關鍵字告訴資料庫! 兩張表對應方式的邏輯。

https://ithelp.ithome.com.tw/upload/images/20190930/201058654Jkug4OywE.png

JOIN

JOIN 關鍵字 左邊(left_table) 以及 右邊 (right_table)有對應到數值才顯示!就是一個數學集合的概念。

https://ithelp.ithome.com.tw/upload/images/20190930/201058650rfPCRM6cn.png

LEFT JOIN

以左邊為主,左邊(left_table)資料全部列出來,去對應右邊的資料表(right_table) 有對到顯示,沒有對應的值顯示 null 表示空值

https://ithelp.ithome.com.tw/upload/images/20190930/20105865llduKMhId1.png

RIGHT JOIN

就是與LEFT JOIN 相反,以右邊的資料表(right_table) 全部列出來,不管左邊的資料表(left_table)有沒有對應值

https://ithelp.ithome.com.tw/upload/images/20190930/20105865NvQ4xbO7gd.png

FULL OUTER JOIN

還是左邊先,左邊資料表全部查詢出來有對應到顯示對應值,沒有對到的顯示空值,如果右邊的資料表,有沒有對應到的內容,全部也一起顯示出來,左邊的表顯示空值。

https://ithelp.ithome.com.tw/upload/images/20190930/201058657WdVZrnAUB.png

CROSS JOIN

把左邊的資料表與右邊資料表的每一個值做匹配,呈現出所有可能的排列組合。因為不考慮是否有無匹配,所以不需要 ON關鍵字。

https://ithelp.ithome.com.tw/upload/images/20190930/20105865N9sqjsDpQB.png

加入篩選

因為對應不到的值會填入 null 空值,這個值比較特別,代表這個欄位內容是空的,不是 "" 空字串,也不是數字0的意思。

我們可以用 WHERE left_table.cloumn IS NULL 來塞選出左邊來為顯示出來是null的結果。如果要找不為null的資料 使用 IS NOT NULL 即可。 不只可以運用在這邊。一般的資料表也可以這麼做篩選。

LEFT JOIN 查詢結果為例

https://ithelp.ithome.com.tw/upload/images/20190930/20105865llduKMhId1.png

可以下 WHERE right_table.名稱 IS NULL

就會出現根 JOIN 一樣的結果

https://ithelp.ithome.com.tw/upload/images/20190930/201058650rfPCRM6cn.png

結合更多資料表

上面都是以左右兩個資料表為範例,不過JOIN 是可以接很多個的喔!


上一篇
JOIN 資料表的結合
下一篇
資料表設計規則-命名規則
系列文
後端前進PostgreSQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言