- 内部結合とは何ですか?
- 外部結合とは何ですか?
- (+)記号を使用した外部結合の実行
事実上すべてのリレーショナルデータベースと同様に、Oracleでは、結合またはJOIN
を含むクエリを生成できます。 最終結果セットを作成するための2つ以上のテーブルからの行。多数のタイプがありますが 実行できる結合のうち、最も一般的なのはINNER JOIN
です。 およびOUTER JOIN
。
このチュートリアルでは、INNER
の違いについて簡単に説明します。 およびOUTER JOIN
次に、OracleがOUTER JOINS
を実行するために提供する簡略化された方法を調べます。 特に+
を使用する 演算子記号。
内部結合とは何ですか?
INNER JOIN
リレーショナルデータベースでは、2つ以上のテーブルを単純に結合し、その結果にはすべての結合条件を満たすデータのみが含まれます。 。
たとえば、ここに基本的なlibrary
があります 2つのテーブルを持つスキーマ:books
およびlanguages
。 languages
表は、可能な言語名と一意の言語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 name
、books
テーブルは常にデータを返す必要があるため、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