目次へ
6.3.2. 自然結合

自然結合は次のカテゴリに分類されます。規格ではこれを結合の種類と呼んでいます。OUTER というキーワードはオプションで、影響は一切ありません。

●[NATURAL] [INNER] 結合
NATURAL JOIN の前後で指定されたテーブルの同じ名前のカラムの値を比較し、値が一致する行を出力します。同じ名前のカラムが複数ある場合など、明示的にどのカラムの値を指定する場合は、後に説明するON句を使用します。
-- sample.17-8 --
/* NATURAL INNER 結合 */

  SELECT 受注表.受注番号,顧客表.顧客名
         FROM 受注表 NATURAL JOIN 顧客表 ;

/* 実行結果 */
 受注番号 顧客名
 ─────── ────────────
 10001    KUROKIYA
 10002    ONSIDE
 10003    KUSHINANA
 10004    KUSHINANA
 10005    ONSIDE
 10006    KUROKIYA
 10007    FIRST HOUSE
 10008    KUSHINANA
 10009    FIRST HOUSE
 10010    KUROKIYA
 10011    FIRST HOUSE
 10012    KUSHINANA
●[NATURAL] LEFT [OUTER] 結合
基本的な構文は次の通りです。
  <テーブルA> [NATURAL] LEFT [OUTER] JOIN <テーブル B> ;  

<テーブル A> のすべての行と、<テーブル B> で一致が検出された行が含まれます。<テーブル B> で一致が検出されなかった行には NULL が設定されます。

顧客表が顧客コードの '002' を参照する場合、[NATURAL] LEFT [OUTER] 結合で受注表と顧客表を結合すると、sample.17-9 のようになります。

このサンプルでは 第7章 サブクエリ で解説されているサブクエリが使われています。

サブクエリが発行された際に得られる顧客表
顧客コード
CHAR(4)
顧客名
CHAR(20)
002 ONSIDE
-- sample.17-9 --
/* [NATURAL] LEFT [OUTER] 結合 */

  SELECT 受注表.受注番号,顧客表.顧客名
         FROM 受注表 NATURAL LEFT OUTER JOIN 顧客表
         WHERE 受注表.納品日 ='20010403' ;

/* 実行結果 */
 受注番号 顧客名
 ─────── ────────────
 10001    NULL
 10002    NULL
 10003    NULL
 10004    NULL
 10005    NULL
 10006    NULL
 10007    NULL
 10008    KUSHINANA
 10009    FIRST HOUSE
 10010    KUROKIYA
 10011    NULL
 10012    NULL
●[NATURAL] RIGHT [OUTER] 結合
基本的な構文は次の通りです。
 <テーブルA> [NATURAL] RIGHT [OUTER] JOIN <テーブル B> ;  

LEFT OUTER 結合の反対です。<テーブル B> のすべての行と、<テーブル A> で一致が検出された行が含まれます。<テーブル A> で一致が検出されなかった行には NULL が設定されます。

顧客コード = '005'、顧客名 = 'DAIKISS' の新しい顧客を顧客表に追加します。現時点では受注表に顧客コードが '005' のデータはありませんが、受注表と顧客表を [NATURAL] RIGHT [OUTER] で結合してみます。sample.17-10 にその例を示します。

-- sample.17-10 --
/* [NATURAL] RIGHT [OUTER] 結合 */

  SELECT 受注表.受注番号,顧客表.顧客名
         FROM 受注表 NATURAL RIGHT OUTER JOIN 顧客表 ;

/* 実行結果 */
 受注番号 顧客名
 ─────── ────────────
 10001    KUROKIYA
 10002    ONSIDE
 10003    KUSHINANA
 10004    KUSHINANA
 10005    ONSIDE
 10006    KUROKIYA
 10007    FIRST HOUSE
 10008    KUSHINANA
 10009    FIRST HOUSE
 10010    KUROKIYA
 10011    FIRST HOUSE
 10012    KUSHINANA
 NULL     DAIKISS
●[NATURAL] FULL [OUTER] 結合
LEFT OUTER と RIGHT OUTER の組み合わせです。両方のテーブルからすべての行を追加し、一致する行を含み、一致しないものに NULL を設定します。構文は次の通りです。
  <テーブルA> [NATURAL] FULL [OUTER] JOIN <テーブルB> ;  

[NATURAL] RIGHT [OUTER] 結合と同様に、顧客コード = '005'、顧客名 = 'DAIKISS' の新しい顧客を顧客表に追加し、受注表には、受注番号 = '10013'、商品コード = '104'、受注個数 = '50'、納品日 = '20010405' のデータを入力するとします。この時点では顧客コードは NULL ということにしておきます。この時の受注表と顧客表を [NATURAL] FULL [OUTER] で結合してみます。sample17-11 にその例を示します。

-- sample.17-11 --
/* [NATURAL] FULL [OUTER] 結合 */

  SELECT 受注表.受注番号,顧客表.顧客名
         FROM 受注表 NATURAL FULL OUTER JOIN 顧客表 ;

/* 実行結果 */
 受注番号 顧客名
 ─────── ────────────
 10001    KUROKIYA
 10002    ONSIDE
 10003    KUSHINANA
 10004    KUSHINANA
 10005    ONSIDE
 10006    KUROKIYA
 10007    FIRST HOUSE
 10008    KUSHINANA
 10009    FIRST HOUSE
 10010    KUROKIYA
 10011    FIRST HOUSE
 10012    KUSHINANA
 10013    NULL
 NULL     DAIKISS

実習課題1

まず、販売管理データベースのテーブル employee に次の新入社員のデータを追加する。

表: employee テーブルに追加するデータ
e_num e_name year gender office
108 Fujiwara Norio 2001 1 10


テーブル employee とテーブル accept_order を結合して、従業員名とそれぞれのオプションの価格の合計を表示する SQL 文を記述しなさい。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp