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

■自然結合

自然結合とは、結合する2つの表に共通して存在する同じ列名かつ同じデータ型の列に基づいて、表を結合する等価結合です。

NATURAL JOIN句の前後に結合する表名を指定する。
SELECT 列名
FROM 表名1 NATURAL JOIN 表名2

自然結合では、データ型の異なる同じ名前の列があるとエラーと成る。
自然結合では、結合列に表接頭辞を使用できない。(表別名を使用できない)

自然結合で共通列が複数ある場合は、複数の共通列で一致するものだけが出力される。
同じ名前の列がない場合は、CLOSS JOIN になる。
NATURAL JOIN とJOIN ~USINGは、どちらか一方しか使えない。どちらも排他的なため、両方を使うとエラーと成る。

自然結合では、ON句は使えない。WHERE句で行絞り込みを行うこと。

■USING句を使用した結合
USING句を使用した結合では、結合列を明示的に指定できる。
USING句に続く()丸括弧内に結合列を指定する。

USING句は、以下のような場合に使用する。
結合列を明示的に指定して、SQL文をわかりやすくしたい場合
結合する2つの表に共通して、存在する列が複数ある場合に、そのいずれかを結合列として使用したい場合
列名が同じでデータ型が異なる列を結合列として、使用する場合
(列名が同じ名前で、なおかつ、互換性のあるデータ型の場合に限り、USING句を使用して、表を結合できる。)
USING句で結合列として、指定された列は、表名、別表名で列名を修飾することはできない。

USING句は、非等価結合には使用できない。
WHERE句を指定して、追加の条件を適用できる。

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

■ON句
ON句は、非等価結合に使用できる。
ON句を使用すると、異なる列名で表を結合できる。
WHERE句を指定して、追加の条件を適用できる。

CONCAT関数
NULLIF関数
TRIM関数
ADD_MANTHS関数

▼LEADINGを指定すると先頭のスペースだけを取り除く
TRIM(LEADING FROM ‘ JAPAN ABC ‘)

▼削除位置を省略すると前後のスペースを取り除く
TRIM(‘ JAPAN ABC ‘)

▼BOTHを指定すると、前後のスペースを取り除く
TRIM(BOTH FROM ‘ JAPAN ABC ‘)

▼TRAILINGを指定すると、末尾のスペースだけを取り除く
TRIM(TRAILING FROM ‘ JAPAN ABC ‘)

SELECT TRIM(BOTH ‘#’ FROM ‘#Oracle Web問題集#’) FROM dual;

SELECT TRUNC((SYSDATE – TO_DATE(‘2012/01/01′,’RRRR/MM/DD’)) / 365 ) AS T1 FROM DUAL;

値書式は数値を文字列に変換する際のフォーマットです。数値書式に使用できる主な要素は次のとおりです。

・TO_CHAR(-123456, ‘999999S’) は 123456- と表示される
数値書式「S」は + または – 記号を表示します。「S」が数値書式の最初に指定された場合は値の前に、「S」が数値書式の最後に指定された場合は値の後に+ または – 記号を表示します。
この選択肢ではTO_CHAR関数の第一引数の値が負の値であり、「S」が数値書式の最後に指定されていますので、123456-と表示されます。

・TO_CHAR(-123456, ‘999999’) は -123456 と表示される
数値書式「9」は指定された桁数の値を表示します。値が負の値の場合は値の前に-記号を表示します。
この選択肢ではTO_CHAR関数の第一引数の値が負の値ですので、-123456と表示されます。

・TO_CHAR(-123456, ‘999999MI’) は 123456- と表示される
数値書式「MI」は値が負の値の場合のみ、値の後ろに-記号を表示します。
この選択肢ではTO_CHAR関数の第一引数の値が負の値ですので、123456-と表示されます。

・TO_CHAR(-123456, ‘999999PR’) は <123456> と表示される
数値書式「PR」は値が負の値の場合のみ、値を<>で囲んで表示します。
この選択肢ではTO_CHAR関数の第一引数の値が負の値ですので、<123456>と表示されます。

■非等価結合
非等価結合とは、結合条件に=(等価演算子)以外の演算子を使用して、条件を満たすデータを取り出す結合である。
ON句に続いて、結合条件を記述する。
結合条件は、
<

<=

BETWEEN
などの演算子を指定する。
例)
SELECT E.EMPNO, E.ENAME, E.SAL, SG.GRADE
FROM EMP E JOIN SALGRADES SG
ON E.SAL BETWEEN SG.LOSAL AND SG.HISAL;

■自己結合
自己結合とは、同一の表に2つの表別名を指定することで、1つの表を2つの表に見立ててデータを取り出す結合である。
自己結合のポイントは、同一の表に2つの表別名を付けるという点である。

■外部結合
外部結合とは、結合条件を持たしたデータだけでなく、結合条件を満たしていないデータも取り出す結合である。
2つの表を結合する際に結合条件を満たすデータのみを取り出す結合を内部結合と呼ぶ。
条件を満たしていないデータも一緒に取り出す結合を外部結合と呼ぶ。

外部結合の種類
LEFT OUTER JOIN 左側外部結合
RIGHT OUTER JOIN 右側外部結合
FULL OUTER JOIN 完全外部結合
OUTERは、省略可能。

■左側外部結合
左側外部結合とは、ON句に指定された結合条件を満たすデータとともに、JOIN句の左側に指定された表のデータをすべて取り出す結合である。
左側に指定された表のデータは、結合条件を満たさないものも全て取り出される。

■クロス結合
クロス結合とは、デカルト積(結合する表に格納されているデータの全ての組合せ。直積ともいう)を戻す結合である。
クロス結合の実行結果には、多くの意味のないデータが含まれるため、通常は余り使用しない。
ただ、大量のサンプルデータを生成する際などに使用することがある。

SELECT 列名 FROM 表名1 CROSS JOIN 表名2;

NATURAL JOINで共通列が存在しない場合は、クロス積(デカルト積)が生成される。

クロス結合の結果のクロス積は、デカルト積である。
2つの表の間ですべての行の結合が生成される。
例)それぞれの表が10行と5行であれば、クロス結合で50行生成される。

■3種類の結合
①クロス結合 CROSS JOIN句を用いる
②内部結合 INNER JOIN INNERは省略可能。
③外部結合 LEFT OUTER JOIN句を用いる。

■結合の指定方法(ON句、自然結合または、USING句)
①ON句 任意の結合条件を指定する。ON句の中で、行の選択条件も指定できる。
②自然結合 2つの表の共通列(同名の列)に同じ値を持つ行を結合する。共通列については、1つの列だけ戻される。
③USING句 2つの表の共通列(同名の列)のうち、USING句で指定された列に同じ値を持つ行を結合する。
USING句で指定した共通列については、1つの列だけ戻される。
USING句で指定しなかった共通列は、2つの列が戻される。

■等価結合と非等価結合
内部結合と外部結合では、結合条件を指定する必要がある。
結合条件に等価演算子(比較演算子=を指す)を使うものを等価結合、
等価演算子以外の演算子(BETWEENなど)を使うものを非等価結合という。

■自己結合
結合では、通常は異なる表を結合するが、1つの表をあたかも別の表であるかのように結合できる。
これを自己結合と呼ぶ。
表別名を指定して、表を区別する。

NATURAL JOIN および JOIN ~ USING
共通列に基づいて結合する。
結合で使われた共通列は1つのれつのみ戻される。
自然結合およびUSING句による結合で、使う共通列を表名で修飾する必要はない。逆に修飾するとエラーと成る。

あわせて読みたい