- 内部結合とは何ですか?
- 外部結合とは何ですか?
- (+)記号を使用した外部結合の実行
事実上すべてのリレーショナルデータベースと同様に、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