先週の記事では、SELECTクエリの外部結合に光を当てました。関連するテーブルから一致した行と一致しない行の両方を返すJOINのタイプです。残念ながら、これはMySQLを含む全てのデータベース(DB)ベンダーでサポートされているわけではありません。しかし、大丈夫です。なぜなら、外部結合は、他の3つのJOINのタイプ、つまり、LEFT JOIN(左結合)、INNER JOIN(内部結合)、およびRIGHT JOIN(右結合)を組み合わせることでエミュレートできるためです。この記事では、JEFT JOINとRIGHT JOINについて詳しく説明し、INNER JOINと組み合わせてOUTER JOINを作成する方法について説明します。
LEFT JOIN
LEFT JOINは、左側のテーブルから全ての行を返し、右側のテーブルから一致する行を返します。右側のテーブルに一致する行が見つからない場合は、NULLが返されます。構文は次のとおりです:
SELECT select_list FROM T1 LEFT JOIN T2 ON join_predicate;
次のVENダイアグラムは、LEFT JOIN句を使用して2つのテーブルT1とT2からフェッチされるデータを示しています:
RIGHT JOIN
RIGHT JOINは、右側のテーブルから全ての行を返し、左側のテーブルから一致する行を返します。左側のテーブルに一致する行が見つからない場合は、NULLが返されます。構文は次のとおりです:
SELECT select_list FROM T1 RIGHT JOIN T2 ON join_predicate;
次のVENダイアグラムは、RIGHT JOIN句を使用して2つのテーブルT1とT2からフェッチされるデータを示しています:
結合を組み合わせてOUTER JOINをエミュレートする
MySQLがFULL OUTER JOINをサポートしていないことは、データベースコミュニティ全体でよく知られています。この欠点に対する一般的な回避策の1つは、UNION ALLを使用して、2つのテーブルのLEFT JOIN、INNER JOIN、およびRIGHT JOINからの3つの結果セットを結合することです。この場合、join_column IS NULL条件がLEFTおよびRIGHT結合に追加されます。
上記のようなOUTER JOINをエミュレートする方法を示すために、先週の「SQL外部結合について」の記事と同じProject Managementデータベースに対してクエリを作成しますが、今回はMySQLを使用します。
左側のテーブルで一致しないレコードを見つける
この最初のクエリは、左側のテーブルでのみ見つかった行を返します。次のクエリは、右側のテーブルの共通(結合)列がnullであることを指定するWHERE句と共にLEFT結合を使用することにより、この効果を実現します:
2番目のテーブルで一致しないレコードを検索する
2 番目のクエリは、右側のテーブルでのみ見つかった行を返します。これを行うためには、左側のテーブルの共通(結合)列がnullであることを指定するWHERE句と共にRIGHT結合を使用します:
両方のテーブルで一致するレコードを見つける
両方のテーブルに表示されるレコードを見つけるためには、次のような標準(INNER)JOIN を使用できます:
UNION ALLを使用して組み合わせると、3つの個別のクエリはOUTER JOINと同じ結果になります:
結論
この記事では、LEFT JOINとRIGHT JOINについて詳しく説明し、INNER JOINと組み合わせてOUTER JOINを作成する方法について説明しました。先週と同様に、注意事項があります。この手法は、ORDER BYクエリやLIMITクエリと一緒に使用すると、これらがファイルソートを利用するため、大きなテーブルでは非常に非効率になる可能性があります。そのような場合は、別のアプローチを採用することをお勧めします。