MySQL LEFT JOIN
1. MySQL LEFT JOIN の概要
LEFT JOIN 句は、左側のテーブル(table1)のすべての行を返し、右側のテーブル(table2)からは一致する行のみを返します。
もし右側のテーブルに一致するレコードがない場合、結果セット内の右側テーブル由来のカラムにはすべて NULL が格納されます。
2. LEFT JOIN の構文
SELECT table1.column1, table1.column2, ..., table2.column1, ...
FROM table1
LEFT JOIN table2
ON table1.condition_column = table2.condition_column; 注意: この構文は、リレーションのあるカラムに基づいて2つのテーブルを結合します。ON キーワードを使用して、マッチングの条件を指定します。
3. デモ用データベース
以下は、「Customers(顧客)」テーブルの抜粋データです。
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
次に、「Orders(注文)」テーブルの抜粋データです。
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10308 | 2 | 7 | 1996-09-18 | 3 |
| 10309 | 3 | 3 | 1996-09-19 | 1 |
| 10310 | 77 | 8 | 1996-09-20 | 2 |
これら2つのテーブルの関連カラムは CustomerID カラムとなります。
4. MySQL LEFT JOIN の具体例
次の SQL は、すべての顧客(Customers)と、それに対応する注文情報(Orders)をすべて選択します。
-- すべての顧客と、紐づく注文情報を取得します
-- 注文がない顧客も結果に含まれます
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName; ポイント:LEFT JOIN は、右側のテーブル(Orders)に一致するデータがなくても、左側のテーブル(Customers)のすべてのレコードを返します。
5. 応用:注文履歴がないレコードを特定する
実務で非常に役立つテクニックとして、右側テーブルの NULL 値を WHERE 句でフィルタリングすることで、「一度も注文をしていない顧客」のみを抽出できます。
-- 注文履歴が一度もない顧客のみを抽出します
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.CustomerID IS NULL;