sql >> データベース >  >> RDS >> Oracle

Oracleのプラス(+)サインインを使用した左結合と右結合

    • 内部結合とは何ですか?
    • 外部結合とは何ですか?
      • (+)記号を使用した外部結合の実行

    事実上すべてのリレーショナルデータベースと同様に、Oracleでは、結合またはJOINを含むクエリを生成できます。 最終結果セットを作成するための2つ以上のテーブルからの行。多数のタイプがありますが 実行できる結合のうち、最も一般的なのはINNER JOINです。 およびOUTER JOIN

    このチュートリアルでは、INNERの違いについて簡単に説明します。 およびOUTER JOIN 次に、OracleがOUTER JOINSを実行するために提供する簡略化された方法を調べます。 特に+を使用する 演算子記号。

    内部結合とは何ですか?

    INNER JOIN リレーショナルデータベースでは、2つ以上のテーブルを単純に結合し、その結果にはすべての結合条件を満たすデータのみが含まれます。 。

    たとえば、ここに基本的なlibraryがあります 2つのテーブルを持つスキーマ:books およびlanguageslanguages 表は、可能な言語名と一意の言語idの単なるリストです。 :

    SELECT * FROM library.languages;
    
    id   name
    1   English
    2   French
    3   German
    4   Mandarin
    5   Spanish
    6   Arabic
    7   Japanese
    8   Russian
    9   Greek
    10   Italian
    

    その間、私たちのbooks テーブルにはlanguage_idがあります すべてではありませんが、ほとんどの本にlanguage_idが含まれている行 本の元の公開言語に関連付けられている:

    SELECT * FROM
      books
    ORDER BY
      id
    FETCH FIRST 10 ROWS ONLY;
    
    id title    author    year_published    language_id
    1   In Search of Lost Time  Marcel Proust   1913    2
    2   Ulysses James Joyce 1922    1
    3   Don Quixote Miguel de Cervantes 1605    5
    4   Moby Dick   Herman Melville 1851    1
    5   Hamlet  William Shakespeare 1601 (null)
    6   War and Peace   Leo Tolstoy 1869    8
    7   The Odyssey Homer   -700    9
    8   The Great Gatsby    F. Scott Fitzgerald 1925    1
    9   The Divine Comedy   Dante Alighieri     1472    10
    10  Madame Bovary   Gustave Flaubert    1857    2
    

    多くの場合、INNER JOINを実行することをお勧めします。 booksの およびlanguages 意味のないlanguage_idを表示するのではなく、テーブル 各本の価値、実際にlanguage nameを見ることができます 代わりに。

    SELECT
      b.id,
      b.title,
      b.author,
      b.year_published,
      l.name language
    FROM
      books b
    INNER JOIN
      library.languages l
    ON
      b.language_id = l.id
    ORDER BY
      b.id
    FETCH FIRST 10 ROWS ONLY;
    
    id title    author    year_published    language
    1   In Search of Lost Time  Marcel Proust   1913    French
    2   Ulysses James Joyce 1922    English
    3   Don Quixote Miguel de Cervantes 1605    Spanish
    4   Moby Dick   Herman Melville 1851    English
    6   War and Peace   Leo Tolstoy 1869    Russian
    7   The Odyssey Homer   -700    Greek
    8   The Great Gatsby    F. Scott Fitzgerald 1925    English
    9   The Divine Comedy   Dante Alighieri     1472    Italian
    10  Madame Bovary   Gustave Flaubert    1857    French
    11  The Brothers Karamazov  Fyodor Dostoyevsky  1880    Russian
    

    ここで重要なのは、上記の2つのクエリでは結果セットがわずかに異なることです。最初に、最初の10をリストしました。 本ですが、INNER JOIN クエリでは、両方のテーブルのすべての条件を満たす結果のみが返されます。このため、Hamletの記録 (language_idがあります nullの値 または空)は無視され、INNER JOINの結果には返されません。 。

    外部結合とは何ですか?

    INNER JOINのすべての結合条件を満たす結果を排他的に返す代わりに 、OUTER JOIN すべての条件を満たす結果だけでなく、を返します 条件を満たさなかった1つのテーブルから行を返します。条件付き要件のこの「バイパス」のために選択されるテーブルは、結合の方向性または「サイド」によって決定されます。これは通常、LEFTと呼ばれます。 またはRIGHT 外側の結合。

    OUTER JOINの側面を定義する場合 、反対の場合でも、どのテーブルが常にその行を返すかを指定しています。 結合の反対側のテーブルに欠落またはnullがあります 結合条件の一部としての値。

    したがって、同じ基本的なJOINを実行すると 上記のようにbooksを取得します およびlanguage namebooks テーブルは常にデータを返す必要があるため、JOIN 側は私たちのbooksを「指す」必要があります テーブル、それによってlanguagesを作成します OUTERのテーブル 添付するテーブル。

    これを実現するには、次のように変更するだけです。

    books b INNER JOIN library.languages l
    

    …これに:

    books b LEFT OUTER JOIN library.languages l
    

    したがって、クエリと結果セット全体は、INNER JOINとほぼ同じに見えます。 マイナーな変更を除いて:

    SELECT
      b.id,
      b.title,
      b.author,
      b.year_published,
      l.name language
    FROM
      books b
    LEFT OUTER JOIN
      library.languages l
    ON
      b.language_id = l.id
    ORDER BY
      b.id
    FETCH FIRST 10 ROWS ONLY;
    
    id title    author    year_published    language
    1   In Search of Lost Time  Marcel Proust   1913    French
    2   Ulysses James Joyce 1922    English
    3   Don Quixote Miguel de Cervantes 1605    Spanish
    4   Moby Dick   Herman Melville 1851    English
    5   Hamlet  William Shakespeare 1601  (null)
    6   War and Peace   Leo Tolstoy 1869    Russian
    7   The Odyssey Homer   -700    Greek
    8   The Great Gatsby    F. Scott Fitzgerald 1925    English
    9   The Divine Comedy   Dante Alighieri     1472    Italian
    10  Madame Bovary   Gustave Flaubert    1857    French
    

    予想どおり、LEFT OUTER JOINを使用します 以前のINNER JOINの代わりに 、両方の長所を活用しています。booksをスキップすることはありません。 レコード(Hamletなど )language_idという理由だけで 値はnullです そのレコードに対して、ただしlanguage_idが存在するすべてのレコードに対して 存在する場合、適切にフォーマットされたlanguage nameを取得します languagesから取得 テーブル。

    (+)記号を使用した外部結合の実行

    公式ドキュメントに示されているように、Oracleは特別なouter join operatorを提供しています。 (+ シンボル)OUTER JOINSを実行するための省略形 。

    実際には、+ シンボルは条件付きに直接配置されます ステートメントとオプションのテーブル(空またはnullを含めることができるテーブル) 条件内の値)。

    したがって、上記のLEFT OUTER JOINをもう一度書き直すことができます。 +を使用したステートメント そのような演算子:

    SELECT
      b.id,
      b.title,
      b.author,
      b.year_published,
      l.name language
    FROM
      books b,
      library.languages l
    WHERE
      l.id (+)= b.language_id
    ORDER BY
      b.id
    FETCH FIRST 10 ROWS ONLY;
    

    結果は、標準のLEFT OUTER JOINと同じです。 上記の例なので、ここでは含めません。ただし、+を使用した構文について注意すべき重要な側面が1つあります。 OUTER JOINSの演算子 。

    + 演算子必須 条件の左側にあります(等しい=の左側 サイン)。したがって、この場合、languagesを確認する必要があるためです。 tableは、nullを返すことができるオプションのテーブルです。 この比較中の値では、この条件付きのテーブルの順序を入れ替えたため、languages booksが左側にある(オプション) 右側にあります。

    最後に、+を使用する場合、条件付きのテーブルサイドがこのように並べ替えられるためです。 オペレーターの場合、上記は単にRIGHT OUTER JOINの省略形であることを理解することが重要です。 。これは、クエリのこのスニペットが次のことを意味します:

    FROM
      books b,
      library.languages l
    WHERE
      l.id (+)= b.language_id
    

    …これと実質的に同じです:

    FROM
      library.languages l
    RIGHT OUTER JOIN
      books b
    ON
      b.language_id = l.id
    

    1. PHPを使用してSQLサーバーに接続する方法

    2. MySQLの区切り文字

    3. SQLServerで一括アクセス許可を有効にする方法

    4. エラーは何ですかすべての派生テーブルはMySQLで独自のエイリアスを持っている必要がありますか?