MySQL 速習チュートリアル

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(顧客)」テーブルの抜粋データです。

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

次に、「Orders(注文)」テーブルの抜粋データです。

OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
10309331996-09-191
103107781996-09-202

これら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;