概要:このチュートリアルでは、複数のテーブルからデータを取得できるSQL LEFT JOINと呼ばれる別の種類の結合について説明します。
SQL LEFT JOIN句の概要
前のチュートリアルでは、結合条件に一致する行が両方のテーブルに少なくとも1行存在する場合に行を返すINNER JOINについて学びました。INNER JOIN句は、他のテーブルの行と一致しない行を削除します。
一方、LEFT JOINは、右側のテーブルに一致する行があるかどうかに関わらず、左側のテーブルのすべての行を返します。
テーブルAとテーブルBの2つのテーブルがあるとします。テーブルAには、1、2、3、および4の4つの行があります。テーブルBにも、3、4、5、6の4つの行があります。
テーブルAをテーブルBと結合すると、テーブルBに一致する行があるかどうかにかかわらず、テーブルA(左側のテーブル)のすべての行が結果セットに含まれます。

SQLでは、次の構文を使用してテーブルAをテーブルBと結合します。
SELECT
A.n
FROM
A
LEFT JOIN B ON B.n = A.n;
Code language: SQL (Structured Query Language) (sql)
LEFT JOIN句は、FROM句の後に記述します。ONキーワードに続く条件は、結合条件B.n = A.n
と呼ばれます。
SQL LEFT JOINの例
SQL LEFT JOINの2つのテーブルの例
countries
テーブルとlocations
テーブルを見てみましょう。

各場所は1つの国にのみ属しており、各国は0以上の場所を持つことができます。countriesテーブルとlocationsテーブルの関係は、一対多です。
locationsテーブルのcountry_id列は、countriesテーブルのcountry_id列にリンクする外部キーです。
米国、英国、中国の国名をクエリするには、次のステートメントを使用します。
SELECT
country_id,
country_name
FROM
countries
WHERE
country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)

次のクエリは、米国、英国、中国にある場所を取得します。
SELECT
country_id,
street_address,
city
FROM
locations
WHERE
country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)
次に、LEFT JOIN句を使用して、次のクエリのようにcountriesテーブルをlocationsテーブルと結合します。
SELECT
c.country_name,
c.country_id,
l.country_id,
l.street_address,
l.city
FROM
countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
c.country_id IN ('US', 'UK', 'CN')
Code language: SQL (Structured Query Language) (sql)

WHERE句の条件が適用され、ステートメントが米国、英国、および中国の行からのみデータを取得するようにします。
LEFT JOIN句を使用しているため、countriesテーブルのWHERE句の条件を満たすすべての行が結果セットに含まれます。
countriesテーブルの各行について、LEFT JOIN句はlocationsテーブルで一致する行を検索します。
少なくとも1つの一致する行が見つかった場合、データベースエンジンは両方のテーブルの一致する行の列からのデータを結合します。
一致する行が見つからない場合(たとえば、country_idがCNの場合)、countriesテーブルの行は結果セットに含まれ、locationsテーブルの行はNULL値で埋められます。
右側のテーブルの一致しない行はNULL値で埋められるため、LEFT JOIN句をテーブル間の一致しない行に適用できます。
たとえば、locationsテーブルに場所がない国を見つけるには、次のクエリを使用します。
SELECT
country_name
FROM
countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
l.location_id IS NULL
ORDER BY
country_name;
Code language: SQL (Structured Query Language) (sql)

SQL LEFT JOINの3つのテーブルの例
次のテーブルを参照してください:regions、countries、locations。

1つの地域には0以上の国が存在する可能性があり、各国は1つの地域に存在します。countriesテーブルとregionsテーブルの関係は、一対多です。countriesテーブルのregion_id列は、countriesテーブルとregionsテーブル間のリンクです。
次のステートメントは、regions、countries、およびlocationsの3つのテーブルを結合する方法を示しています。
SELECT
r.region_name,
c.country_name,
l.street_address,
l.city
FROM
regions r
LEFT JOIN countries c ON c.region_id = r.region_id
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
c.country_id IN ('US', 'UK', 'CN');
Code language: SQL (Structured Query Language) (sql)

これで、SQL LEFT JOIN句の仕組みを十分に理解し、LEFT JOIN句を複数のテーブルからのデータのクエリに適用する方法を理解できたはずです。