http:www.sip-ac.jp/sip/konan_text/dbm05-02.html,        © 2001 Ayumi Yoshikawa
主観情報処理研究所

データベースマネジメント:SQL(最終更新:2015/12/06 16:33:44 JST)

SQL(表の結合)

WHERE句による表の結合(教科書83ページ)

リレーショナルデータベースではデータが複数のテーブルに分割して保存されている.したがって必要なデータを主キーと外部キーを用いて結合して利用することが常である.ここでは表を結合するためのSQL文について解説する.

2つの表の結合(教科書83ページ)

基本的な2つのテーブルを結合するためのSQL文は,既出の「WHERE句」を利用して次のように指定する.ただし,ここでテーブル1がテーブル2により参照されているものとする(つまり,テーブル1の主キーがテーブル2の外部キーとなっているとする).

/* テーブルの結合の書式 */

SELECT 結合後に取り出すフィールド
FROM テーブル1, テーブル2
WHERE テーブル1.主キー = テーブル2.外部キー 

例えば,教科書83ページの[注文]と[商品]テーブルの場合,[注文]テーブルの<商品コード>が「外部キー」,[商品]テーブルの<商品コード>は主キーとなっている.したがって2つのテーブルを結合するSQL文は次のようになる.

複数のテーブルに同じ名称のフィールドが存在する場合は,それらを区別するために,「テーブル名.フィールド名」と表記する.

/* 教科書84ページ例 */

SELECT 日付, 商品.商品コード, 商品名, 数量
FROM 注文, 商品
WHERE 注文.商品コード = 商品.商品コード

なお,教科書83ページの[注文]テーブルは主キーが不足している.本来なら<注文コード>が必要である.

フィールド同様,テーブルも別名をつけることができる.前出の[注文]と[商品]テーブルにそれぞれ[C]と[S]という別名を設定する場合は「AS句」または空白の後ろに設定する別名を記述する(教科書85ページ参照).

/* 表の別名の設定の例 */

SELECT 日付, S.商品コード, 商品名, 数量
FROM 注文 AS C, 商品 AS S  -- ←教科書のように「注文 C, 商品 S」でも可
WHERE C.商品コード = S.商品コード

/* ※SELECT句やWHERE句で別名で利用可能 */

[*]下へ▼ ▲[#]上へ

3つ(以上)の表の結合(教科書87ページ)

3つ以上のテーブルを結合する場合は,前出のWHERE句による条件を複数用意し,それらをAND演算でつなげばよい.教科書87ページの例の場合,[売上明細]は{伝票コード,商品コード}が複合主キー,[売上]は<伝票コード>が主キー,[商品]は<商品コード>が主キーになっている.また[売上明細]の<伝票コード>と<商品コード>はそれぞれ[売上],[商品]を参照している(主キーなので外部キーとは呼ばないが).以上の条件で3つのテーブルを結合するSQL文は次のようになる.

/* 3つのテーブルの結合の例 */

SELECT U.伝票コード, U.日付, U.得意先名, M.個数, S.商品コード, S.商品名
FROM 売上 AS U, 売上明細 AS M, 商品 AS S
WHERE (U.伝票コード = M.伝票コード) AND (M.商品コード = S.商品コード)

[*]下へ▼ ▲[#]上へ

いろいろな結合(教科書88ページ)

結合にはいろいろな種類がある.主要な結合について説明する.

内部結合(教科書88ページ)

WHERE句に書かれた条件が成立する場合にレコードを取り出す操作を内部結合(inner join)と呼ぶ.通常の結合は特に指定がなければ内部結合である.特に指定したフィールド間で値が等しい場合に結合するものを等結合(equijoin),等号以外で結合する場合を非等価結合(nonequijoin)と呼ぶ.両者の一例は次のとおり(教科書88,89ページ参照).

前章の関係演算の結合演算に相当する.

/* 等結合の例 */

SELECT *
FROM 注文, 商品
WHERE 注文.商品コード = 商品.商品コード

/* ※一方にしか商品コードが存在しない場合は出力されない */
/* 非等価結合の例 */

SELECT *
FROM 注文, 商品
WHERE 注文.商品コード < 商品.商品コード

なお内部結合はINNER JOIN句を利用して次のように書くことも可能である(教科書90ページ参照).

SELECT *
FROM 注文 INNER JOIN 商品
ON 注文.商品コード = 商品.商品コード

/* ※INNERは省略可能 */

[*]下へ▼ ▲[#]上へ

自然結合(教科書89ページ)

自然結合(natural join)では重複するフィールドは1つにまとめられる.自然結合を指定するためには「NATURAL JOIN句」を利用する.書式は次のようになる.教科書90ページの例では重複する<商品コード>が1つになる.

前章の関係演算の自然結合演算に相当する.

/* 自然結合の例 */

SELECT *
FROM テーブル1 NATURAL JOIN テーブル2

/* ※NATURAL JOINでも一方にしか存在しないレコードは捨てられる. */

[*]下へ▼ ▲[#]上へ

外部結合(教科書90ページ)

外部結合(outer join)は一方のテーブルにしかレコードが存在しない場合も含めて,すべてのレコードを結合して取り出す処理である.結合に仕方により,左外部結合(left outer join),右外部結合(right outer join),完全外部結合(full outer join)の3種がある.

左外部結合(教科書90ページ)

左外部結合は2つのテーブルを左右に並べて結合するとき,左のテーブルの全レコードとそれに一致する右側のテーブルのレコードを出力する.なお,左側のレコードに一致する右側のレコードが存在しない場合はヌルとなる(教科書91ページ参照).左外部結合には「LEFT OUTER JOIN句」を用い,結合条件を「ON句」として指定する.教科書91ページの例の場合は次のようになる.

/* 左外部結合の例 */

SELECT *
FROM 注文 LEFT OUTER JOIN 商品
ON 注文.商品コード = 商品.商品コード

右外部結合(教科書91ページ)

右外部結合は2つのテーブルを左右に並べて結合するとき,右のテーブルの全レコードとそれに一致する左側のテーブルのレコードを出力する.なお,右側のレコードに一致する左側のレコードが存在しない場合はヌルとなる(教科書92ページ参照).右外部結合には「RIGHT OUTER JOIN句」を用い,結合条件を「ON句」として指定する.教科書92ページの例の場合は次のようになる.

/* 右外部結合の例 */

SELECT *
FROM 注文 RIGHT OUTER JOIN 商品
ON 注文.商品コード = 商品.商品コード

完全外部結合(教科書92ページ)

完全外部結合は2つのテーブルを左右に並べて結合するとき,両者のすべてのレコードを一致するものを結びつけて出力する.なお,相手のテーブルに一致するレコードが存在しない場合はヌルとなる(教科書93ページ参照).完全外部結合には「FULL OUTER JOIN句」を用い,結合条件を「ON句」として指定する.教科書93ページの例の場合は次のようになる.

/* 完全外部結合の例 */

SELCET *
FROM 注文 FULL OUTER JOIN 商品
ON 注文.商品コード = 商品.商品コード

[*]下へ▼ ▲[#]上へ

和結合(教科書93ページ)

和結合(union join)は2つのテーブルのフィールドを足し合わせる(というより,横に並べる)結合である.相手方のレコードの部分はヌルになる.和結合には「UNION JOIN句」を用いる.結合条件は指定しない.教科書94ページの例の場合は次のようになる.

/* 和結合の例 */

SELECT *
FROM 注文 UNION JOIN 商品

[*]下へ▼ ▲[#]上へ

交差結合(教科書94ページ)

交差結合(cross join)は2つのテーブルのすべてのレコードを組み合わせて出力する結合である.交差結合の結果は直積になる.よってフィールド数は2つのテーブルのフィールド数の和,レコード数は2つのテーブルのレコード数の積である.SELECT文で条件をつけなければ交差結合となる.あるいは明示的に「CROSS JOIN句」を用いても同じ結果が得られる.教科書95ページの例の場合は次のようになる.

交差結合は集合演算の直積に相当する.

/* 交差結合(直積)の例 */

SELECT *
FROM 注文, 商品

あるいは

SELECT *
FROM 注文 CROSS JOIN 商品

[*]下へ▼ ▲[#]上へ

自己結合(教科書95ページ)

自己結合(self join)は前出の交差結合を同じテーブル間で実行したものである.同じテーブルを利用するため,テーブルに異なる別名をつけて,交差結合を実行すればよい.当然ながら,同じテーブルでの直積となる.教科書96ページの例の場合は次のようになる.

/* 自己結合の例 */

SELECT *
FROM 商品 AS S1, 商品 AS S2

自己結合の利用方法として教科書97ページに紹介されているように,例えば商品コードと商品名の矛盾のチェックがある.次のようなSQL分を作成することで商品コードと商品名の矛盾があれば,そのレコードが出力される.

/* 自己結合の利用例 */

SELECT *
FROM 商品 AS S1, 商品 AS S2
WHERE (S1.商品コード = S2.商品コード) AND (S1.商品名 <> S2.商品名)

[*]下へ▼ ▲[#]上へ

SQLによる関係演算・集合演算(教科書103ページ)

前章で触れたデータベースに関する関係演算および集合演算はSQLにより実行できる.既に関係演算の結合演算(自然結合演算)と集合演算の直積については前項で説明した.その他の演算について説明する.なお一部は既に紹介しているものもある.

SQLによる関係演算(教科書103ページ)

結合については既に詳述しているため割愛する.射影,選択は基本的にSELECT文で実現可能である.ただし商はSQLでは単独の句としては提供されていない.ここでは射影と選択のみ紹介する.

射影(教科書103ページ)

射影はテーブルからフィールド(列)を取り出す演算である.したがってSQLではSELECT句に取り出す列名を明記してやればよい.

/* 射影の書式 */

SELECT 取り出すフィールド名
FROM テーブル名

選択(教科書104ページ)

他方,選択はテーブルからレコード(行)を取り出す演算である.したがってSQLではSELECT文中にでWHERE句に選択条件を明記してやればよい.

/* 選択の書式 */

SELECT *
FROM テーブル名
WHERE 選択条件

[*]下へ▼ ▲[#]上へ

SQLによる集合演算(教科書104ページ)

直積については既に説明済みであるため割愛する.残る和,差,積はそれぞれ句が用意されている.なお前章でも集合演算実行の条件として型適合を挙げたが,当然ながらフィールド名と並び,データの型が一致していなければいけない.

和(教科書105ページ)

和は2つのテーブルの少なくとも一方に含まれるレコードをすべて取り出す演算である.SQLでは「UNION句」を使用する.

/* 和演算の書式 */
/* 重複するレコードをまとめる場合:UNION */

SELECT * FROM テーブル1
UNION
SELECT * FROM テーブル2
/* 重複するレコードもそのまま出力する場合:UNION ALL */

SELECT * FROM テーブル1
UNION ALL
SELECT * FROM テーブル2

差(教科書105ページ)

差は一方のテーブルのみに存在するレコードを取り出す演算である.SQLでは「EXCEPT句」を使用する.前章でも触れたが,差演算は方向性があるので注意すること.

/* 差演算の書式:テーブル1-テーブル2(テーブル1のみに存在) */

SELECT * FROM テーブル1
EXCEPT
SELECT * FROM テーブル2

積(教科書105ページ)

積は両方のテーブルに共通して存在するレコードを取り出す演算である.SQLでは「INTERSECT句」を使用する.

/* 積演算の書式 */

SELECT * FROM テーブル1
INTERSECT
SELECT * FROM テーブル2

[*]下へ▼ ▲[#]上へ

このサイトに関するお問い合わせは,連絡先のページをご覧ください.

このページのボトムへ講義資料このページのトップへ

前のページに戻る  1  2  3  4  次のページへ進む   データベースマネジメントの目次に戻る ,        © 2001 Ayumi Yoshikawa