はじめに
以前社内のSQL勉強会のネタ探しでJOINの話中にFULL JOINの話をしたところ、
同チームの人がFULL JOIN・・・?
というリアクションだったので調べてみたところ、MySQLにはFULL JOINがないとのこと
今の会社に入る前はMySQLではなかったのでjoinの中にFULL JOINなるものがある(いつ使うかはいまだによくわからんけど)のは知ってたのでほえ~ってなりました
FULL JOINとは
完全外部結合ともいいます。
LEFT JOINだと左側のテーブルを基準として右側のテーブルに一致するものがなくてもNULLとして結合し、表示します。
RIGTHT JOINだとその逆で右側のテーブルを基準とします。
FULL JOINでは両方のデータを正として、左にしかないデータも右にしかないデータも表示してくれるわけです。
いつか使うかもしれないので備忘として
Customersテーブル
CustomerID | CustomerName |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
Ordersテーブル
OrderID | CustomerID | ProductName |
---|---|---|
101 | 1 | ProductA |
102 | 2 | ProductB |
103 | 3 | ProductC |
104 | 4 | ProductD |
SELECT COALESCE(C.CustomerID, O.CustomerID) AS CustomerID,
C.CustomerName,
O.OrderID,
O.ProductName
FROM Customers C
LEFT JOIN Orders O ON C.CustomerID = O.CustomerID
UNION
SELECT COALESCE(C.CustomerID, O.CustomerID) AS CustomerID,
C.CustomerName,
O.OrderID,
O.ProductName
FROM Orders O
LEFT JOIN Customers C ON C.CustomerID = O.CustomerID
WHERE C.CustomerID IS NULL;
実行結果
CustomerID | CustomerName | OrderID | ProductName |
---|---|---|---|
1 | Alice | 101 | ProductA |
2 | Bob | 102 | ProductB |
3 | Charlie | 103 | ProductC |
4 | NULL | 104 | ProductD |
メモと解説のようなもの
MySQLにはそもそもFULL JOINがないと初めに言った通りで、実施するには外部結合結果をUNION結合する、といった力業が必要になります。
UNIONより上のクエリでCustomersを正とした外部結合を行い、UNIONより下でOrdersを正とした結合を行い、UNIONで結合することにより、UNIONが持つ重複削除の恩恵を受けて二つの外部結合結果のいいとこどりができるというわけです。
うーんまじでFULL JOINっていつ使うんや?