OracleBronze 7章

結合

複数のテーブルを関連付けてデータを抽出する機能です。
1章で2つのテーブルから情報を取り出していた図があったのを覚えてますか?鈴木さんが研究開発の部署にいるアレです。
それこそが結合なのです。

一番簡単な結合

FROM句を ,(カンマ)で区切ってつなぐと結合します。
ですが、このやり方は全ての組み合わせが出ちゃうのであまり意味ないかもしれません。

SELECT empno, ename, dname FROM EMPLOYEES, DEPATMENTS ;

全ての組み合わせ?
って感じであれば、上記を実行して確認してみましょう。

EMPLOYEESテーブルにも、DEPATMENTSテーブルにも、DEPTNOがありますよね。上記の様なSELECT文にdeptnoを指定するとどちらかわからないためエラーになります。
その時は、列名の表接頭辞を付けることで明示的に「どの表のどの列」を指定します。

表名.列名
SELECT empno, ename, dname, EMPLOYEES.deptno FROM EMPLOYEES, DEPATMENTS ;

deptnoのようにどちらかわからないもの以外にも付けることは可能です。

表別名

列別名があれば、表別名があっても不思議はないでしょう。
表別名を付けた時点でSQL内では元の表名は無効になるので、注意です。

FROM 表名 表別名
SELECT empno, ename, e.deptno FROM EMPLOYEES e, DEPATMENTS ;

EMPLOYEES に e という表別名を付けて表接頭辞にそれを使っています。
この形はよく見ることになりますので、ふわっとしてないでおきましょうね。

等価結合

特定の列値が等しいデータだけを取り出す結合で、内部結合・単純結合とも言う。

自然結合

同じ列名かつ同じデータ型の列、でテーブルを結合する。

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

自然結合では、結合列を自動で判別するため、結合条件は明示しなくて良い。
共通して存在する列が複数ある場合は、すべての列が結合条件となる。
データ型の異なる同名の列があるとエラーとなる。
結合列に表接頭辞を使用するとエラーになる。
結合条件でなければWHERE句も指定できる。

いつもの例だと、deptnoが結合されるのは予想できますね?
OKです。結合条件であるdeptnoは明示の必要はありません。

SELECT empno, ename, dname
FROM EMPLOYEES e NATURAL JOIN DEPATMENTS
WHERE e.sal > 300000 ;

共通列が複数ある場合は、どちらも等しいデータのみが表示されます。

USING

結合列を指定する。
※NATURAL JOINは明示の必要がないのを確認してください

SELECT 列名
FROM 表名1 JOIN 表名2 USING( 列名 );

勝手に結合するわけじゃないので、結合列を指定できる。
列名が同じでデータ型が異なる列を使用する場合に使用する。

ON

自然結合やUSINGは「2つの表にある同じ名前の列」を使用しますが、ONは異なる名前の列を使用しても結合が可能です。

SELECT 列名
FROM 表名1 JOIN 表名2 
ON [表名1.]列名 = [表名2.]列名
[WHERE 結合条件以外の条件] ;

ONは前の二つと違い、等価結合以外にも「非等価結合」「自己結合」でも使うので、しっかり理解しておきましょう。

SELECT empno, ename, dname
FROM EMPLOYEES e JOIN DEPATMENTS d
ON e.deptno = d.deptno;

そういえば、気づきましたか?
同名の列名を指定する場合、ONは表接頭辞を使用します。

3つ以上のテーブル結合もできます。上記を知っていればわかるはずなので、自分で調べてみましょう。

ONは等価結合だけじゃないよ、なんて直前で書いてますが、要は=を使うから等価結合になるだけで、「>」「<」「<=」「>=」「BETWEEN」なども使えます。その時は、非等価結合というわけです。

…と、いうわけで、その他の結合いきましょう。

その他の結合

自己結合

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

SELECT 列名
FROM 表名1 表別名1 JOIN 表名1 表別名2
ON [表別名1.]列名 JOIN [表別名2.]列名 ;

 

外部結合

条件を満たしていないデータも取り出す結合のこと。
結合条件を満たすデータのみを取り出す結合を内部結合条件を満たしていないデータも一緒に取り出す結合を外部結合といいます。

SELECT 列名
FROM 表名1 LEFT JOIN 表名2
ON 結合条件 ;

LEFT JOINとは、左側外部結合のことなのですが、これ以外に、、、
RIGHT JOIN、FULL JOINがあります。

左側外部結合

JOIN句の左側に指定された表のデータ全て取り出す結合です。
わかりやすく説明するために、以下のデータを追加します。

EMPNO=1015, ENAME=山口, DEPTNO=NULL
以下を追加して試してみましょう。
INSERT INTO EMPLOYEES VALUES (1015,”山口”,”yamaguchi”,null,null,null,null,null,null);

SELECT e.empno, e.ename, e.dname
FROM EMPLOYEES e LEFT JOIN DEPATMENTS d
ON e.deptno = d.deptno;

JOIN句の左側(EMPLOYEESテーブル)にあるデータは、結合条件(e.deptno = d.deptno)を満たしていなくても抽出される、ということです。
まぁ、試して確認してみましょうね。

さて、そうなると、RIGHT JOINはわかりますよね。
FULL JOINも想像できますよね。左右に指定された表の全てを抽出します。
ピンとこないって人は調べて試してみましょう。

クロス結合

あまり使わないので、気になる人は調べてみてね。

以下をやっておきましょう。

・未着手