SQL 速習チュートリアル

SQL LEFT JOIN

LEFT JOIN キーワードは、左側のテーブル(table1)の全レコードと、右側のテーブル(table2)のマッチしたレコードを返します。

右側のテーブルにマッチするレコードがない場合、結果セットの右側テーブルのカラムには NULL が入ります。

なお、LEFT JOINLEFT OUTER JOIN キーワードは同一であり、OUTER キーワードは省略可能です。

1. LEFT JOIN の構文

SELECT カラム名
FROM テーブル1
LEFT JOIN テーブル2
ON テーブル1.カラム名 = テーブル2.カラム名;

       注意: このシンタックスは、関連カラム(Related column)に基づいて2つのテーブルを結合します。マッチングの条件を指定するには ON キーワードを使用します。

2. デモ用データベース

以下は「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
103093731996-09-191
103107781996-09-202

ここで、上記2つのテーブル間の関連カラムは「CustomerID」カラムであることがわかります。

3. SQL LEFT JOIN の実装例

以下の SQL は、すべての顧客と、それに対応する注文内容を返します。注文を一度も行っていない顧客も結果に含まれます。

3.1 基本的な LEFT JOIN の例

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

3.2 未注文のレコードを特定する手法

ヒント: まだ一度も注文を出していない顧客のみを抽出したい場合は、右側のテーブルの値を WHERE 句でフィルタリングし、NULL 値を探します。

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.CustomerID IS NULL;