このページでは、和・共通・差・直積の集合演算と、選択・射影・結合・商の関係演算、それぞれの結果の行数と列数の考え方がわかります。
- 一言で言うと:
- 表から新しい表を作る計算(演算)の話
- 数学の集合と同じ集合演算(和・共通・差・直積)と、関係データベースならではの関係演算(選択・射影・結合・商)の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を含む)は結果に出ない
- 外結合は、一致しない行も結果に残せる