- 6.1. 基本的な結合
- 6.2. 自己結合
- 6.3. 特殊な結合演算子
- 1. CROSS JOIN
- 2. 自然結合
- 3. 指定結合
- 4. UNION JOIN
6.3.2. 自然結合
自然結合は次のカテゴリに分類されます。規格ではこれを結合の種類と呼んでいます。OUTER というキーワードはオプションで、影響は一切ありません。
- ●[NATURAL] [INNER] 結合
- NATURAL JOIN の前後で指定されたテーブルの同じ名前のカラムの値を比較し、値が一致する行を出力します。同じ名前のカラムが複数ある場合など、明示的にどのカラムの値を指定する場合は、後に説明するON句を使用します。
/* 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 |
/* [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
e_num | e_name | year | gender | office |
---|---|---|---|---|
108 | Fujiwara Norio | 2001 | 1 | 10 |
テーブル employee とテーブル accept_order を結合して、従業員名とそれぞれのオプションの価格の合計を表示する
SQL 文を記述しなさい。