LEFT (OUTER) JOIN (左外部結合)を使ってデータを取得する
LEFT (OUTER) JOIN (左外部結合)を使ってデータを取得する
前回は 「 INNER JOIN (内部結合)を使ってデータを取得する 」 で、INNER JOIN を使って、二つのテーブルを結合してデータを取得しました。
OUTER JOIN (外部結合) には LEFT, RIGHT, FULL の 3 種類があります。
今回は LEFT (OUTER) JOIN (左外部結合) を使って、二つのテーブルを結合して値を取得してみましょう。 OUTER は省略できるので、省略します。
まだ生成していなければ、こちら のスクリプトを実行して、Student・Test・TestResult テーブルを生成しておいてください。
LEFT JOIN (左外部結合)
LEFT JOIN を使って、 [左テーブル] LEFT JOIN [右テーブル] ON ... のように結合すると、左側の [左テーブル] の全レコードと、ON で指定した条件がマッチする [右テーブル] のレコードが取得されます。
例えば、次のような TestResult テーブルと Student テーブルがあります。
[ TestResult テーブル ]
[ Student テーブル ]
StudentID がマッチするという条件で LEFT JOIN することによって、TestResult テーブルの TestID = 2 の全レコードと、StudentID がマッチする Student の名前が取得できます。
SELECT TR.*, S.FirstName, S.LastName FROM TestResult AS TR LEFT JOIN Student AS S ON TR.StudentID = S.StudentID WHERE TestID = 2;
[ 実行結果 ]
下のように、TestResult テーブルの TestID = 2 の全レコードと、 StudentID がマッチする StudentID が 1, 3, 4 の名前のみが Student テーブルから取得されましたね。
LEFT JOIN を使う時の注意点
LEFT JOIN を使う時に、WHERE 句で右テーブルのカラムを使って条件を指定してしまうと、左テーブルのマッチしない行は結果セットに含まれません。
SELECT TR.*, S.FirstName, S.LastName, S.Birthday FROM TestResult AS TR LEFT JOIN Student AS S ON TR.StudentID = S.StudentID WHERE S.Birthday < '2000-01-01';
[ 実行結果 ]
わかっていて使うのであれば問題ありませんが、もし左テーブルのマッチしない行は含めて、右テーブルの選択されるレコードに条件を追加したい時は、ON に追加すると期待の結果が得られます。
SELECT TR.*, S.FirstName, S.LastName, S.Birthday FROM TestResult AS TR LEFT JOIN Student AS S ON TR.StudentID = S.StudentID AND S.Birthday < '2000-01-01';
[ 実行結果 ]
次は、RIGHT (OUTER) JOIN (右外部結合)を使ってデータを取得してみましょう。