- 内部結合とは何ですか?
- 外部結合とは何ですか?
- (+)記号を使用した外部結合の実行
ほぼすべてのリレーショナル-データベースと同様に、oracleでは、複数の表からorJOIN
行を組み合わせて, 実行できる結合にはさまざまな種類がありますが、最も一般的なものはINNER JOIN
とOUTER JOIN
です。
このチュートリアルでは、INNER
とOUTER JOIN
の違いを簡単に調べ、特に+
演算子シンボルを使用してOUTER JOINS
を実行するためにOracleが提供する省略形メソッドを調べます。
内部結合とは何ですか?,
リレーショナルデータベース内のINNER JOIN
は、単に複数のテーブルを結合することで、結果にはすべての結合条件を満たすデータのみが含まれます。
たとえば、ここでは、基本的なlibrary
二つのテーブルを持つスキーマがあります:books
とlanguages
。,一方、私たちのbooks
テーブルにはlanguage_id
行があり、ほとんどの場合、すべてではありませんが、書籍には単にlanguage_id
本の元の公開言語に関連付けられています。
SELECT * FROM booksORDER BY idFETCH FIRST 10 ROWS ONLY;id title author year_published language_id1 In Search of Lost Time Marcel Proust 1913 22 Ulysses James Joyce 1922 13 Don Quixote Miguel de Cervantes 1605 54 Moby Dick Herman Melville 1851 15 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 87 The Odyssey Homer -700 98 The Great Gatsby F. Scott Fitzgerald 1925 19 The Divine Comedy Dante Alighieri 1472 1010 Madame Bovary Gustave Flaubert 1857 2
多くの場合、INNER JOIN
のbooks
およびlanguages
テーブルを実行したい場合がありますので、各書籍の無意味なlanguage_id
値を見るのではなく、実際にlanguage name
代わりに。,
ここで重要なのは、上記の二つのクエリで結果セットがわずかに異なっていたことです。 最初に、最初の10
書籍をリストしましたが、INNER JOIN
クエリでは、両方のテーブルのすべての条件を満たす結果のみを返します。 このため、Hamlet
(language_id
値がnull
または空)のレコードは無視され、INNER JOIN
の結果に返されません。,
外部結合とは何ですか?
INNER JOIN
のすべての結合条件を満たす結果を排他的に返すのではなく、OUTER JOIN
はすべての条件を満たす結果だけでなく、条件を満たさなかったテーブルの行も返します。 条件付き要件のこの”バイパス”に対して選択されるテーブルは、通常、LEFT
またはRIGHT
外部結合と呼ばれる結合の方向性または”サイド”によって決定されます。,
OUTER JOIN
側を定義するとき、結合の反対側の反対側の反対側のテーブルが欠落している場合でも、null
結合条件の一部として,
したがって、上記と同じ基本的なJOIN
を実行してbooks
とlanguage names
を取得すると、books
テーブルは常にデータを返す必要があるため、JOIN
“私たちのbooks
テーブル、それによってlanguages
テーブルをOUTER
テーブルに添付しています。,
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bLEFT OUTER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English5 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French
期待どおり、LEFT OUTER JOIN
前のINNER JOIN
の代わりに、両方の長所を得ています。books
レコードをスキップしていません。などHamlet
)単純にlanguage_id
値はnull
そのレコードのために、まだlanguage_id
が存在するすべてのレコードのために、我々はうまくフォーマットされたlanguage name
私たちから得られたテーブル。,
(+)記号を使用した外部結合の実行
公式文書に示されているように、oracleはouter join operator
(+
シンボル)を提供し、OUTER JOINS
を実行するための省略形です。
実際には、+
シンボルは、条件文内およびオプションのテーブル(空またはnull
条件内の値を含むことが許されるもの)の側に直接配,
したがって、上記のLEFT OUTER JOIN
ステートメントを+
演算子を使用して次のように書き換えることができます。
結果は、上記の標準のLEFT OUTER JOIN
例と同じですので、ここには含めません。 ただし、+
OUTER JOINS
の演算子を使用する構文について注意すべき重要な側面があります。
+
演算子は、条件の左側(equals=
記号の左側)にある必要があります。, したがって、この場合、languages
テーブルがnull
値を返すことができるオプションのテーブルであることを確認したいので、この比較中に、この条件でテーブルの順序を入れ替えたので、languages
は左側(およびオプションです)にあり、books
は左側(およびオプションです)にあります。そうだな
最後に、+
演算子を使用する場合、条件付きでテーブルの側面を並べ替えるため、上記は単にRIGHT OUTER JOIN
の短縮形であることを認識することが重要です。, これは、クエリのこのスニペットを意味します:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…これと実質的に同じです:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
コメントを残す