PostgreSQL Joins

Summary: このチュートリアルでは、インナージョイン、レフトジョイン、ライトジョイン、フルアウタージョインなど、さまざまな種類のPostgreSQLジョインについて学びます。

PostgreSQLジョインは、関連するテーブル間の共通カラムの値に基づいて、1つ(セルフジョイン)または複数のテーブルからカラムを結合するために使用されます。

PostgreSQLでは、インナージョイン、レフトジョイン、ライトジョイン、フルアウタージョイン、クロスジョイン、ナチュラルジョイン、そしてセルフジョインと呼ばれる特殊なジョインをサポートしています。

サンプルテーブルの設定

例えば、果物を保存するbasket_abasket_bという2つのテーブルがあるとします。

これらのテーブルには、appleorangeのような共通の果物があります。

次のステートメントは、basket_aテーブルからデータを返します。

そして、以下のステートメントでは、basket_bテーブルからデータを返します。

PostgreSQLの内部結合

以下のステートメントは、最初のテーブル(basket_abasket_bfruit_afruit_bのカラムの値をマッチさせることで結合します。

内側の結合では、最初のテーブル(basket_afruit_abasket_bfruit_b列の値を比較します。 これらの値が等しい場合、内側joinは両方のテーブルの列を含む新しい行を作成し、この新しい行を結果セットに追加します。

次のベン図は、内側joinを示しています。

PostgreSQLの左join

次のステートメントは左join句を使用しています。 文は左結合句を使用して、basket_abasket_bテーブルを結合します。

左の結合では、左のテーブルからデータの選択を開始します。 これは、fruit_a列の値とbasket_bテーブルのfruit_b列の値を比較します。

これらの値が等しい場合、左結合は両方のテーブルの列を含む新しい行を作成し、この新しい行を結果セットに追加します。

値が等しくない場合、左結合は両方のテーブルのカラムを含む新しい行を作成し、それを結果セットに追加します。 しかし、右のテーブル(basket_b)のカラムにはnullが入ります。 (結果セットの行#3と#4を参照)。

次のベン図は、左の結合を示しています。

左のテーブルから、右のテーブルに一致する行がない行を選択するには、WHERE 句を使った左結合を使用します。 例:

出力は次のようになります。

なお、LEFT JOINLEFT OUTER JOINと同じなので、入れ替えて使うことができます。

次のベン図は、左のテーブルからの行を返し、右のテーブルからは一致する行がない左の結合を示しています:

PostgreSQLの右の結合

右の結合は、左の結合を逆にしたものです。 右結合は、右のテーブルからデータを選択し始めます。

これらの値が等しければ、右結合は両方のテーブルの列を含む新しい行を作成します。

これらの値が等しくない場合、右結合は両方のテーブルの列を含む新しい行を作成します。 しかし、左テーブルのカラムにはNULLが入ります。

次のステートメントでは、右結合を使用してbasket_abasket_bテーブルを結合しています。

次のベン図は、正しい結合を示しています。

同様に、以下のようにWHERE句を追加することで、左テーブルから一致する行を持たない右テーブルの行を取得することができます。

RIGHT JOINRIGHT OUTER JOINは同じものなので、入れ替えて使用することができます。

次のベン図は、右のテーブルから、左のテーブルに一致する行がない行を返す右結合を示しています。

PostgreSQLのフルアウタージョイン

フルアウタージョインまたはフルジョインは、左右のテーブルのすべての行を含む結果セットを返し、マッチする行がある場合は双方から返します。 一致する行がない場合、テーブルの列はNULLで埋められます。

Output:

次のベン図は完全な外部結合を示しています。

一方のテーブルに一致する行がない行を返すには、次のようなWHERE句を使った完全結合を使用します:

以下はその結果です。

次のベン図は、対応する行が他のテーブルにないテーブルの行を返す完全な外部結合を示しています。

次の図は、これまでに説明したすべてのPostgreSQLの結合を、詳細な構文とともに示したものです。

このチュートリアルでは、関連する複数のテーブルのデータを結合するために、様々な種類のPostgreSQLの結合を使用する方法を学びました。

  • このチュートリアルは役に立ちましたか?
  • YesNo

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です