関係データベースの演算

このページでは、和・共通・差・直積の集合演算と、選択・射影・結合・商の関係演算、それぞれの結果の行数と列数の考え方がわかります。

  • 一言で言うと:
    • 表から新しい表を作る計算(演算)の話
    • 数学の集合と同じ集合演算(和・共通・差・直積)と、関係データベースならではの関係演算(選択・射影・結合・商)の2つに分かれる

集合として計算(和、共通、差、直積)→ 表ならではの計算(選択、射影、結合、商)→ 結合の種類(外結合へ)

覚え方の軸

  • 集合演算は「同じ形の表どうし」の3つと、「形が違ってもよい」直積
    • 和(∪、UNION)・共通(∩、INTERSECT)・差(−、EXCEPT)は、同じ型(和両立)の表どうしでしかできない
    • 直積は、形が違ってもできる。列数は足し算、行数は掛け算
  • 選択は「行」、射影は「列」
    • 選択は、条件に合う行を取り出す(横に切る)
    • 射影は、指定した列を取り出す(縦に切る)
  • 結合は「直積して、選択して、重複列を消す」
    • 等結合は、直積の中から結合列の値が等しいものだけを選ぶ
    • 比較演算子を何でも使えるのがθ(シータ)結合
  • 商は「全部そろっている人を探す」
    • R÷S は、Sの行を全部持っているRの行を取り出し、Sの列を除く

集合演算:同じ形の表を足す・重ねる・引く(★)

  • 関係データベースの集合演算:
    • 同じ型の表の間で行う、和、共通(積)、差の3つ
    • 同じ型の表でなくてもできる、直積
  • 同じ型の表:
    • 属性の数(次数)とドメイン(取りうる値の集合)が等しい表
    • このような表を、和両立であるという
  • SQLでの実現:
    • 各集合演算をSQL文で実現する方法は、後の「SQL」で扱う

① 和、共通、差

例:表Aと表B

表 行
表A (1101、青木花子、S1)、(1201、石井健、S2)
表B (1101、青木花子、S1)、(2201、上田翔、H1)

関係データベースの和、共通、差(★)

演算 SQL 中身 表A・表Bの結果
和:∪ UNION(あるいはUNION ALL) 2つの表を合わせて新しい表を作る 青木、石井、上田の3行
共通(積):∩ INTERSECT どちらにも属する行で新しい表を作る 青木の1行
差:− EXCEPT 差A−Bは、Aに属してBに属さない行で新しい表を作る 石井の1行
  • UNIONとUNION ALL:
    • UNIONは、重複行を削除する(青木は1行だけになる)
    • UNION ALLは、重複行を削除しない(青木が2行になり、全部で4行)
  • 集合演算の例え:
    • A組とB組の「部活の名簿」を比べる。和は「どちらかの名簿に載っている人全員」、共通は「両方に載っている人」、差は「A組の名簿にだけ載っている人」

② 直積

  • 直積演算:
    • 2つの表のすべての行を組み合わせて新しい表を作る演算
  • 直積表:
    • 直積演算の結果できた新しい表
    • 列数は、両方の列数を足した数
    • 行数は、両方の行数を掛けた数
  • 例:
    • 社員表(社員コード、社員名)2行 × 部門表(部門コード、部門名)2行
    • 結果は、2 × 2 = 4行、2 + 2 = 4列
  • 直積が行われるとき:
    • SELECT文のFROM句で複数の表を指定したとき
  • CROSS JOIN:
    • 直積演算の結果は、CROSS JOIN(交差結合)と一致する
  • 直積の例え:
    • Tシャツ3色とズボン2色の「すべての組合せ」を並べると、3 × 2 = 6通り

例題(直積)

  • 問題:
    • 3列・5行の表Aと、2列・4行の表Bの直積表は、何列・何行になるか
  • 答え:
    • 列数は 3 + 2 = 5列
    • 行数は 5 × 4 = 20行
  • 検算:
    • 表Aの1行ごとに、表Bの4行が全部くっつくので、4行 × 5 = 20行

関係演算:表ならではの取り出し方(★)

  • 関係演算:
    • 関係データベース特有の演算
    • 射影、選択、結合、商の4つ
  • 関係代数:
    • 関係演算と集合演算を合わせたもの
    • これらの演算で得られる表を、導出表という

① 選択と射影

  • 選択演算:
    • 表から「指定した行」を取り出す演算
  • 射影演算:
    • 表から「指定した列」を取り出す演算
  • 例:
    • 社員表から「社員コード=1101」で選択すると、(1101、青木花子、S1)の1行
    • 社員表から「社員名」を射影すると、青木花子、石井健の1列
  • 選択と射影の例え:
    • 選択は、名簿から「東京に住む人」の行に蛍光ペンを引く(横に切る)
    • 射影は、名簿の「名前」の列だけをコピーする(縦に切る)
  • 射影の個数:
    • n列ある表で、1つの列が射影で取り出されるか否かで2通りある
    • だから、列がn列あれば、2 × 2 × … × 2 = 2ⁿ個の異なる射影がある

例題(射影の個数)

  • 問題:
    • 4列の表には、何個の異なる射影があるか
  • 答え:
    • 2⁴ = 16個
  • 確かめ:
    • 4列から「0列選ぶ」1通り +「1列」4通り +「2列」6通り +「3列」4通り +「4列」1通り = 16通り(何も選ばない場合も数に入る)

② 結合

  • 結合演算:
    • 2つの表が共通に持つ項目(結合列)で結合し、新しい表を作る関係演算
  • SQLでの書き方:
    • 一般に、SELECT文のFROM句で結合する表名をカンマで区切って指定し、WHERE句で結合条件を指定する
  • 結合条件:
    • 結合列の値を、>、≧、=、≠、≦、<のいずれかの比較演算子で比べて結び付ける条件
  • θ(シータ)結合:
    • 結合列の値を、>、≧、=、≠、≦、<のいずれかの比較演算子で比べて結び付ける演算
  • 等結合:
    • 比較演算子が「=(等号)」である結合

等結合

  • 等結合のやり方:
    • 2つの表から作る直積表の中から、結合列の値が等しいものだけを取り出す
    • できた表には結合列が重複して含まれるので、SELECT句でどちらか一方の結合列を指定して、見かけ上の重複を取り除く
  • 等結合の例:
SELECT 社員.社員コード, 社員.社員名, 部門.部門コード, 部門.部門名
  FROM 社員, 部門
  WHERE 社員.部門コード = 部門.部門コード
  • 等結合の流れ:
    • 社員表と部門表の直積(4行)を作る
    • 部門コードの値が等しいものだけを取り出す(選択)→ 2行
    • 重複する部門コードの1つを取り除く
    • 結果は、(1101、青木花子、S1、販売1課)、(1201、石井健、S2、販売2課)
  • 等結合は直積と選択の組合せ:
    • FROM句に社員表と部門表を指定すると、この2つの表の直積ができる
    • WHERE句の結合条件で、部門コードが等しいものが選択される
    • だから、等結合は、直積と選択の組合せで表せる演算
  • 列名の指定:
    • 結合表には、同じ列名が存在する可能性がある(例では部門コード)
    • そこで、どの表の列かをはっきりさせるため、「表名.列名」で指定する
    • 列名が結合表の中で一意なら、「列名」だけでもかまわない
    • 試験ではすべての列名を「表名.列名」で書いている
  • 結合の例え:
    • 社員名簿と部署一覧を、「部署コード」が同じもの同士でホチキス留めする

③ 商

  • 商演算:
    • 2つの表 R(X, Y1, Y2)と S(Y3, Y4)について、Sのすべての行がR(Y1, Y2)に含まれる場合に、対応するR(X)を求める演算
    • つまり、商(R÷S)は、表Rの中から表Sのすべての行を含む行を取り出し、そこから表Sの項目を取り除く
    • このとき、重複行も取り除かれる

商演算の仕組み:表R

X Y1 Y2
T1 c 1
T2 a 1
T2 b 2
T3 a 1
T3 b 2
  • 表S:

    • (a、1)、(b、2)の2行
  • R÷Sの結果:

    • T2、T3
    • T2とT3は、(a、1)と(b、2)の両方を持っている。T1は(c、1)しかないので外れる
  • 商演算の使い道:

    • 社員表(社員コード、社員名、住所、部門コード)から、「大阪に住み、販売2課(S2)に勤務する社員」を探すときに使う
    • 社員表 ÷(住所=大阪、部門コード=S2)=(1201、石井健)、(1301、岡本恵)
  • 商の例え:

    • 「スタンプラリーのスタンプを全部集めた人」を探す。表Sがスタンプの一覧、表Rが「誰がどのスタンプを押したか」の記録。全部そろった人の名前だけが残る

例題(商)

  • 問題:
    • 表R(生徒、科目)が(佐藤、国語)(佐藤、数学)(佐藤、英語)(鈴木、国語)(鈴木、数学)(田中、数学)(田中、英語)、表S(科目)が(国語)(数学)のとき、R÷Sの結果は何か
  • 答え:
    • 国語と数学の両方を持っている生徒は、佐藤と鈴木
    • 田中は国語がないので外れる
  • 確かめ:
    • 佐藤は英語も持っているが、Sのすべての行(国語・数学)を含んでいればよいので、残る。結果は(佐藤)(鈴木)の2行

結合演算の種類

  • 従来の等結合の弱点:
    • 「SELECT…FROM…WHERE」を使った結合(等結合)は、従来からの基本的な方法
    • でも、この方法では、結合列が一致しない行を結果に反映できない
    • 例えば、上の等結合の例で、社員コード1101の社員の部門コードが空値(NULL)だったら、この社員を抽出できない
  • 外結合(OUTER JOIN):
    • そこで、今のSQL標準には、このような場合に使う結合演算として、外結合が用意されている
    • このほかの結合演算は、後の「SQL」の表の結合で扱う

混同しやすいペア

  • 集合演算 / 関係演算
    • 集合演算は、和・共通・差・直積(数学の集合と同じ)
    • 関係演算は、選択・射影・結合・商(関係データベース特有)
  • 和(UNION) / 和(UNION ALL)
    • UNIONは、重複行を削除する
    • UNION ALLは、重複行を削除しない
  • 共通(INTERSECT) / 差(EXCEPT)
    • 共通は、どちらにも属する行
    • 差A−Bは、Aに属してBに属さない行
  • 和両立 / 直積
    • 和両立は、属性の数とドメインが等しい表。和・共通・差はこれが条件
    • 直積は、同じ型でなくてもできる(列数は足し算、行数は掛け算)
  • 直積 / 結合
    • 直積は、すべての行を組み合わせる(CROSS JOIN)
    • 結合は、結合列の条件に合う組合せだけを残す(直積+選択)
  • 選択 / 射影
    • 選択は、指定した行を取り出す
    • 射影は、指定した列を取り出す(n列なら2ⁿ通り)
  • θ結合 / 等結合
    • θ結合は、>、≧、=、≠、≦、<のいずれかで比べて結び付ける
    • 等結合は、θ結合のうち「=」で結び付けるもの
  • 関係代数 / 導出表
    • 関係代数は、関係演算と集合演算を合わせたもの
    • 導出表は、これらの演算で得られる表
  • 商 / 差
    • 商R÷Sは、Sのすべての行を含むRの行を取り出し、Sの項目を除く
    • 差A−Bは、Aにあり、Bにない行を取り出す
  • 等結合(内結合) / 外結合(OUTER JOIN)
    • 等結合は、結合列が一致しない行(NULLを含む)は結果に出ない
    • 外結合は、一致しない行も結果に残せる

← 06 データベースの目次に戻る

タイトルとURLをコピーしました