7. 複数の表からのデータの取り出し

7.1 複数の表の結合

結合

複数の表を関連付けてデータを取り出す機能。

 

基本的な表の結合方法

FROM句に結合する表の名前を「,」で区切って指定する。

SELECT 列名1,2,3,4... FROM 表名,表名

・結合する表の両方に存在する列をSELECT句に指定するとエラーになる。

(どちらの表の列から取り出せばいいかわからないため)

→表接頭辞をつけて「明示的に」どの表のどの列なのかを指定することで解決。

表接頭辞

表名.列名

 ・列名が重複していなくても表接頭辞はつけられる。表接頭辞を使用することで,OracleサーバーがSQL文の構文を解析する際に列名の重複有無をチェックする必要がなくなるので,SQL文のパフォーマンスがわずかに向上する。

 

表別名の使用

FROM句では「表別名」を使用できる。

表別名の指定

FROM 表名 表別名

・表別名は30バイト以下

・一般的に表別名にはわかりやすく,短い名前をつける

・表接頭辞に短い表別名を使用するとSQL文が短くなるため,メモリ使用量を削減できる

・表別名は表別名を指定したSQL文内でのみ有効

・表別名を指定するとSQL文全体で元の表名は無効になる

 

結合構文の種類

Oralceサーバーでは2種類の結合構文に含まれる方法で表を結合できる

SQLSQL:1999結合構文)⬅︎こっちの方が出題される

Oracle独自結合構文 

 

SQL:1999結合構文

SELECT [表名.]列名 [ , 表名. [列名...]

 FROM 表名1

{

NATURAL JOIN 表名2 |

JOIN 表名2 USING(列名) |

JOIN 表名2 ON 結合条件 |

{ LEFT | RIGHT | FULL } [ OUTER ] JOIN 表名2 ON 結合条件 |

CROSS JOIN 表名2

}

[WHERE 結合条件以外の条件];

 

7.2 等価結合

 結合する2つの表の「特定の列の値が等しいデータだけを取り出す」結合。

内部結合,単純結合とも。

内部結合(単純結合)…「結合条件にあうデータだけを取り出す結合。厳密には内部結合=等価結合ではない。

 

自然結合

結合する2つの表に共通して存在する同じ列名かつ同じデータ型の列に基づいて表を結合する等価結合。「NATURAL JOIN句」の前後に結合する表名を指定する。

SELECT [表名.]列名  [,表名[.列名 ...]

 FROM 表1 NATURAL JOIN 表2

[WHERE 結合条件以外の条件];

・自然結合では結合列(結合条件として使用される列)が自動的に判断されるため,明示的に結合条件を指定する必要がない。

・共通して存在する列が複数ある場合は,すべての列が結合条件として使用される。

・自然結合では,データ型の異なる同名の列があるとエラーになる。

・共通して存在する列が複数ある場合は,それらの全ての値が等しいデータのみを取り出す。

・自然結合の結合列には表接頭辞を使用できない。使用するとエラーになる。

(結合列以外の列には表接頭辞を使用できる。)

・WHERE句に結合列を指定する場合でも表接頭辞を使用するとエラーになる。

 

 USING句

自然結合とちがって,結合列を明示的に指定できる。

SELECT [表名.]列名 [表名.]列名...]

FROM 表名1 JOIN 表名2 USING(列名[,列名...])

WHERE [結合条件以外の条件];

・結合列を明示的に指定してSQL文をわかりやすくしたい場合に使用する

 ・結合する2つの表に共通して存在する列が複数ある場合に,そのいずれかを結合列として使いたい場合に使用する

・列名が同じでデータ型が異なる列を結合列として使用する場合に使用する

・結合列に表接頭辞を使用するとエラーになる

・NATURAL JOIN句とUSING句は同時に使用できない

 

ON句

異なる名前の列を使用して表を結合することができる。

ON句のあとに結合条件,その他の条件をWHERE句に指定する。

SELECT [表名.]列名 [,[表名.]列名...]

FROM 表名1 JOIN 表名2

ON [表名1.]列名 = [表名2.]列名

WHERE [結合条件以外の条件]; 

 ・2つの表にある同じ名前の列をSELECT句やWHERE句で使用する場合は表接頭辞を使用して列名を修飾する(表接頭辞を使用しないとエラーになる)

 

Oralce独自結合構文による等価結合

SELECT [表名.]列名, [,[表名.]列名...]

FROM 表名1, 表名2

WHERE 結合条件

[AND 結合条件以外の条件];

・結合条件はWHERE句に指定する

・2つの表に存在する列は表接頭辞を使用して修飾する必要がある。

・SQL1999結合構文とOracle独自結合構文にパフォーマンス上の差はない。

 

3つ以上の表の結合

SELECT [表名.]列名 [,[表名.]列名...]

FROM 表名1

JOIN 表名2 ON [表名.]列名 = [表名.]列名

JOIN 表名3 ON [表名.]列名 = [表名.]列名

[JOIN 表名4 ON [表名.]列名 = [表名.]列名…]

WHERE [結合条件以外の条件]; 

 

7.3 その他の結合構文

 非等価結合

結合条件に「=」以外の結合条件を指定して条件を満たすデータを取り出す。

SELECT [表名.]列名 [,[表名.]列名...]

FROM 表名1 JOIN 表名2

ON   結合条件;

・結合条件には,>,<,<=,>=,BETWEENなどが使える

 

自己結合

同一の表に2つの表別名を指定することで1つの表を2つの表に見立ててデータを取り出す結合。

SELECT [表別名.]列名 [, [表別名.]列名...]

FROM 表名1.表別名1 JOIN 表名1.表別名2

ON [表別名1.]列名 = [表別名2.]列名...

 

外部結合

結合条件を満たしていないデータも取り出す結合。内部結合の反対的な。

SELECT [表名.]列名 [,[表名.]列名...]

FROM 表名1

{LEFT | RIGHT | FULL} [OUTER] JOIN 表名2

ON 結合条件;

 

LEFT 左側外部結合

JOIN句の左側に指定された表のデータをすべて取り出す。

 

RIGHT 右側外部結合

JOIN句の右側に指定された表のデータを全て取り出す。

 

FULL 完全外部結合

JOIN句の左右に指定された表のデータを全て取り出す。

 

クロス結合

デカルト積(結合する表に格納されている全てのデータの全ての組み合わせ,直積)を戻す結合。

SELECT [表別名.]列名 [, [表別名.]列名...]

FROM 表名1 CROSS JOIN 表名2;