Home実験室 − No.0067


        No.0067(SQL)
        表の結合の種類と概要、その基本パターン演習

■環境
  □OS: Windows XP Professional SP3
  □Oracle: Oracle Database 11g R2 (Standard)
  □OSログインユーザ: ORA_DBAグループ
  □Oracleユーザ: dicdic(実験用ユーザー) → 実験環境構築スクリプト





   2つ以上の表(ビュー)を結合する問合せ。






            






     
   SELECT [@表示したい列を列挙]   FROM [A左表(FROM表)]    [C結合方式]    JOIN [B右表(JOIN表)]    ON [D結合条件];

  @表示したい列 ・・・ 列名は、[テーブル名.列名]で記述する。
     ただし、Cの結合条件でUSINGを使用する場合、結合する列はテーブル名修飾しない。


  A右表とB左表 ・・・・・ 結合したい2表を、左表と右表に割り当てる。どちらをどちらに割り当ててもよいが、
     それによってCの結合方式の書き方が変わるので注意する。


  C結合方式 ・・・・・・・ inner、left outer、right outer、crossなどが入る。結合の肝。
      

  D結合条件 ・・・・・・・ 結合する列を指定する。基本的には以下、2通りの記述方法がある。
     (ON句を使う) ON 左表名.結合列名=右表名.結合列名
     (USINGを使う) USING(結合列名)
     ただし、USINGの場合、左表と右表で列名と型がバッチリ一致している必要がある。






結合方式イメージAccessのGUI表現SQLServerのGUI表現
内部結合
左外部結合
右外部結合
完全外部結合






     
次の手順を実行すると、下に掲げる結合の例題をすべて再現できます。
(このページのスクリプトで、基本的な実行環境ができていることが前提です)
※一般のdicdicユーザーの環境ではできません。下記手順を行ってください。

(手順)
 @下記ファイルをダウンロードします。
          これ
 ASQL*Plusを起動します。
 Bダウンロードしたファイルをテキストエディタで開き、1〜40行目を選択します。
 CSQL*Plusの画面でペースト(貼り付け)します。
 Dこのページで使用しているSQL文は     こちら

  0. 実験ユーザー「dicdic」でコネクトする。

SQL> conn dicdic/Oracle11g 接続されました。 SQL>



  1.【内部結合の例@】

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 INNER JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 8行が選択されました。 SQL>



  2.【内部結合の例A】
  「INNER」を略しても内部結合として解釈される。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 8行が選択されました。 SQL>



  3.【内部結合の例B】
  ON句の代わりにUSINGを使用してもよい。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 JOIN JOINTEST_GENDER 7 USING(GEND_CODE); NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 8行が選択されました。 SQL>



  4.【左外部結合の例@】

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 LEFT OUTER JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 9行が選択されました。 SQL>



  5.【左外部結合の例A】
  「OUTER」を略しても外部結合として解釈される。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 LEFT JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 9行が選択されました。 SQL>



  6.【左外部結合の例B】
  ON句の代わりにUSINGを使用してもよい。
  @、Aと若干違うことに注意する。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 LEFT JOIN JOINTEST_GENDER 7 USING(GEND_CODE); NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 9 9行が選択されました。 SQL>



  7.【右外部結合の例@】

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 RIGHT OUTER JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 3 犬 9行が選択されました。 SQL>



  8.【右外部結合の例A】
  「OUTER」を略しても外部結合として解釈される。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 RIGHT JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 3 犬 9行が選択されました。 SQL>



  9.【右外部結合の例B】
  ON句の代わりにUSINGを使用してもよい。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 RIGHT JOIN JOINTEST_GENDER 7 USING(GEND_CODE); NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 3 犬 9行が選択されました。 SQL>



  10.【完全外部結合の例@】

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 FULL OUTER JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 3 犬 10行が選択されました。 SQL>



  11.【完全外部結合の例A】
  「OUTER」を略しても外部結合として解釈される。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 FULL JOIN JOINTEST_GENDER 7 ON JOINTEST_NAME.GEND_CODE=JOINTEST_GENDER.GEND_CODE; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 3 犬 10行が選択されました。 SQL>



  12.【完全外部結合の例B】
  ON句の代わりにUSINGを使用してもよい。
  @、Aと若干違うことに注意する。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 FULL JOIN JOINTEST_GENDER 7 USING(GEND_CODE); NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 9 3 犬 10行が選択されました。 SQL>



  13.【自然結合の例@】
  「NATURAL JOIN」を利用すると、もっとも適切と思われる結合列を勝手に拾ってくれる。
  「NATURAL JOIN」の場合、結合条件を書いてはならない
  下は、内部結合で自然結合を利用している例。

SQL> Select NAME_NO, 2 NAME, 3 GEND_CODE, 4 GENDER 5 from JOINTEST_NAME 6 NATURAL JOIN JOINTEST_GENDER; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 8行が選択されました。 SQL>



  14.【自然結合の例A】
  「NATURAL JOIN」を利用すると、もっとも適切と思われる結合列を勝手に拾ってくれる。
  「NATURAL JOIN」の場合、結合条件を書いてはならない
  下は、左外部結合で自然結合を利用している例。

SQL> Select NAME_NO, 2 NAME, 3 GEND_CODE, 4 GENDER 5 from JOINTEST_NAME 6 NATURAL LEFT JOIN JOINTEST_GENDER; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 9 9行が選択されました。 SQL>



  15.【自然結合の例B】
  「NATURAL JOIN」を利用すると、もっとも適切と思われる結合列を勝手に拾ってくれる。
  「NATURAL JOIN」の場合、結合条件を書いてはならない
  下は、右外部結合で自然結合を利用している例。

SQL> Select NAME_NO, 2 NAME, 3 GEND_CODE, 4 GENDER 5 from JOINTEST_NAME 6 NATURAL RIGHT JOIN JOINTEST_GENDER; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 3 犬 9行が選択されました。 SQL>



  16.【単純結合(クロス結合)の例@】
  右表のすべての行が、左表のすべての行と結合するので、結合条件がない。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME 6 CROSS JOIN JOINTEST_GENDER; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 1 女 2 B郎 1 女 3 C郎 1 女 4 D郎 1 女 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 1 女 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 2 男 6 B子 2 男 7 C子 2 男 8 D子 2 男 9 A釜 2 男 1 A郎 3 犬 2 B郎 3 犬 3 C郎 3 犬 4 D郎 3 犬 5 A子 3 犬 6 B子 3 犬 7 C子 3 犬 8 D子 3 犬 9 A釜 3 犬 27行が選択されました。 SQL>



  17.【単純結合(クロス結合)の例A】
  「CROSS JOIN」を明記せず、結合条件もなければ直積になる。

SQL> Select JOINTEST_NAME.NAME_NO, 2 JOINTEST_NAME.NAME, 3 JOINTEST_GENDER.GEND_CODE, 4 JOINTEST_GENDER.GENDER 5 from JOINTEST_NAME, 6 JOINTEST_GENDER; NAME_NO NAME GEND_CODE GE ---------- ---- ---------- -- 1 A郎 1 女 2 B郎 1 女 3 C郎 1 女 4 D郎 1 女 5 A子 1 女 6 B子 1 女 7 C子 1 女 8 D子 1 女 9 A釜 1 女 1 A郎 2 男 2 B郎 2 男 3 C郎 2 男 4 D郎 2 男 5 A子 2 男 6 B子 2 男 7 C子 2 男 8 D子 2 男 9 A釜 2 男 1 A郎 3 犬 2 B郎 3 犬 3 C郎 3 犬 4 D郎 3 犬 5 A子 3 犬 6 B子 3 犬 7 C子 3 犬 8 D子 3 犬 9 A釜 3 犬 27行が選択されました。 SQL>





    【PR】    Oracle実験室監修  『Oracleアーキテクチャ鳥瞰図』 PDF  (Oracleのアーキテクチャを一目で俯瞰できるイラスト)  


Home実験室 − No.0067

© 2011-2011   Amateur Laboratory of ORACLE
inserted by FC2 system