【SQL – Oracle】等価結合、自然結合について

【SQL – Oracle】等価結合、自然結合について

等価結合とは

 等価結合とは、結合する2つの表の、「特定の列の値が等しいデータだけを取り出す結合」です。「内部結合」や「単純結合」と呼ばれることもあります。

※「内部結合」(単純結合)とは、「結合条件に合うデータだけを取り出す結合」です。「等価結合」も「特定の列の値が等しいデータだけを取り出す結合」なので「内部結合」ですが、「内部結合」には、後述する非等価結合なども含まれるため、厳密には「等価結合」=「内部結合」ではありません。

等価結合は、以下の3つの方法で実行できます。 
 ・自然結合
 ・USING句を使用した結合
 ・ON句を使用した結合

※ここでは、自然結合のみを記載しております。

自然結合

 

 自然結合とは、結合する2つの表に共通して存在する同じ列名かつ同じデータ型の列に基づいて表を結合する等価結合です。「NATURAL JOIN句」の前後に結合する表名を指定します。
 ※「同じデータ型」には、文字値、数値、日付値など互換性のあるデータ型も含まれます。

 ▼自然結合の構文
  SELECT [表名.]列名 [, [表名.]列名・・・]  FROM 表名1 NATURAL JOIN 表2
        [WHERE 結合条件以外の条件];

自然結合には次の特徴があります。
・自然結合では結合列(結合条件として使用される列)が自動的に判断されるため、明示的に結合条件を指定する必要はない
・共通して存在する列が複数ある場合は、すべての列が結合条件として使用される
・自然結合では、データ型の異なる同名の列があるとエラーになる

 以下の例では、EMPLOYEES表とDEPARTMENTS表を自然結合しています。結合列はこれらの表に共通して存在する「DEPTNO列」です(名前、データ型ともに同じです)。なお、自然結合では結合列が自動的に判断されるため、結合条件としてDEPTNO列を指定する必要はありません。

▼ 自然結合

SQL> SELECT empno, ename, dname
 2  FROM employees NATURAL JOIN departments;

EMPNO  ENAME      DNAME
-----  ---------  ---------
1001   佐藤        管理
1002   鈴木        研究開発
1003   高橋        営業
1004   田中        営業
1005   渡辺        研究開発
1006   伊藤        営業

6行が選択されました。

■ 共通して存在する列が複数ある場合の自然結合
 結合する2つの表に共通して存在する列が複数ある場合は、それらのすべての値が等しいデータのみが取り出されます(すべての列が結合列になります)。自然結合では、いずれかの列だけを結合列に指定することはできません。
 例えば、次の図ではそれぞれの表にMGR列とDEPTNO列が存在しているため、これらの表を自然結合するとDEPTNO列とMGR列の両方の列の値が等しいデータのみが取り出されます。

 

 結合する2つの表に今日打つして存在する列が複数ある場合に、結合列を明示的に指定したいときは、後述の「USING句を指定した結合」または「ON句を使用した結合」を実行します。

 ▼自然結合の構文
 SQL:1999結合構文でも、多くの場合で表接頭辞を使用して列名を修飾できますが、自然結合の結合列には表接頭辞を使用できません。結合列に表接頭辞を使用するとエラーになります。
 以下の例では、結合列にあるDEPTNO列に表接頭辞「d.」を指定しているためエラーになっています。

▼ 自然結合における表接頭辞を使用した列名の修飾(1)

SQL> SELECT e.empno, e.ename, d.deptno, d.dname
 2  FROM employees e NATURAL JOIN departments d;

行1でエラーが発生しまいた。:
ORA-25155: NATURAL結合で使用される列は修飾子を持てません。

 結合列以外には表接頭辞を指定できるので、ここでは次の例のようにDEPTNO列の表接頭辞を削除すると正常に実行できます。

▼ 自然結合における表接頭辞を使用した列名の修飾(2)

SQL> SELECT e.empno, e.ename, deptno, d.dname ← 結合列以外には、表接頭辞を指定できる
 2  FROM employees e NATURAL JOIN departments d;

行1でエラーが発生しまいた。:
ORA-25155: NATURAL結合で使用される列は修飾子を持てません。

 WHERE句に結合列を指定する場合も同様です。WHERE句に指定した結合列に表接頭辞を指定するとエラーにります。

▼ 自然結合における表接頭辞を使用した列名の修飾(3)

SQL> SELECT e.empno, e.ename, d.dname
 2  FROM employees e NATURAL JOIN departments d;
 3  WHERE e.deptno IN (10, 20); 
                *
行3でエラーが発生しまいた。:
ORA-25155: NATURAL結合で使用される列は修飾子を持てません。

SQL> SELECT e.empno, e.ename, d.dname  
 2 FROM employees e NATURAL JOIN departments d;  
 3 WHERE deptno IN (10, 20);

EMPNO   ENAME         DNAME
-----   ----------   --------
1001 佐藤 管理 1002 鈴木 研究開発 1005 渡辺 研究開発 1008 中村 管理 1009 小林 研究開発 1011 加藤 研究開発 1013 山田 研究開発 1014 佐々木 管理

まとめ

▼ 自然結合とは、結合する2つの表に共通して存在するすべての列に基づいて表を結合する等価結合である
▼ 自然結合では、明示的に結合条件を指定する必要はない
▼ 自然結合では、データ型の異なる同名の列があるとエラーになる
▼ 自然結合の結合列には、表接頭辞を指定できない

コメントを残す