Navicatブログ

MySQLで外部結合をエミュレートする 2022年10月24日 Robert Gravelle

先週の記事では、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からフェッチされるデータを示しています:

left_join_diagram (31K)

RIGHT JOIN

RIGHT JOINは、右側のテーブルから全ての行を返し、左側のテーブルから一致する行を返します。左側のテーブルに一致する行が見つからない場合は、NULLが返されます。構文は次のとおりです:

SELECT 
    select_list
FROM 
    T1
RIGHT JOIN T2 ON join_predicate;

次のVENダイアグラムは、RIGHT JOIN句を使用して2つのテーブルT1とT2からフェッチされるデータを示しています:

right_join_diagram (18K)

結合を組み合わせて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結合を使用することにより、この効果を実現します:

pm_Left_join_query (37K)

2番目のテーブルで一致しないレコードを検索する

2 番目のクエリは、右側のテーブルでのみ見つかった行を返します。これを行うためには、左側のテーブルの共通(結合)列がnullであることを指定するWHERE句と共にRIGHT結合を使用します:

pm_Right_join_query (40K)

両方のテーブルで一致するレコードを見つける

両方のテーブルに表示されるレコードを見つけるためには、次のような標準(INNER)JOIN を使用できます:

pm_Inner_join_query (45K)

UNION ALLを使用して組み合わせると、3つの個別のクエリはOUTER JOINと同じ結果になります:

pm_query (140K)

結論

この記事では、LEFT JOINとRIGHT JOINについて詳しく説明し、INNER JOINと組み合わせてOUTER JOINを作成する方法について説明しました。先週と同様に、注意事項があります。この手法は、ORDER BYクエリやLIMITクエリと一緒に使用すると、これらがファイルソートを利用するため、大きなテーブルでは非常に非効率になる可能性があります。そのような場合は、別のアプローチを採用することをお勧めします。

ブログのアーカイブ
シェア