選択は行、射影は列、結合は条件に合う行の組を取り出す操作です。関係代数は関係を入力し、結果も関係として得る考え方です。SQLと対応させるときは、重複行やNULLの扱いの違いにも注意します。
行と列を小さな表で確認
| 社員ID | 氏名 | 部署ID |
|---|---|---|
| E1 | 青木 | D1 |
| E2 | 井上 | D1 |
| E3 | 上田 | D2 |
学習用の社員表employeesとします。この文脈のタプルは表の1行、属性は列です。プログラミング言語の「変更できないタプル型」と同じ意味で定義するものではありません。
選択:条件に合う行を残す
SELECT * FROM employees WHERE department_id = 'D1';
部署D1のE1・E2という2行が残ります。関係代数の選択に対応するのはSQLのWHEREによる行の絞り込みです。SQL文の名前SELECTと、関係代数の選択を混同しないようにします。
射影:必要な列を取り出す
SELECT DISTINCT department_id FROM employees;
関係代数の射影では、重複した組を持たない集合としてD1・D2が得られます。一方、SQLのSELECT department_idだけならD1・D1・D2と重複が残ります。関係代数の射影に合わせて重複を除きたい場合はDISTINCTを使います。表示順はORDER BYなしでは保証されません。
結合:条件に合う行の組を作る
| 部署ID | 部署名 |
|---|---|
| D1 | 開発 |
| D2 | 営業 |
SELECT e.employee_id, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;
E1・E2に開発、E3に営業が対応します。等結合は値が等しい条件の結合で、一般の結合条件が等号に限られるわけではありません。主キー・外部キー制約がなくてもJOINは書けます。自然結合は共通名の列を使い、その共通列を1組にまとめます。
結合は直積から条件に合う組を選ぶと論理的に理解できますが、DBMSが必ず全組合せを実体化してから処理するわけではありません。外部結合は、指定した側の一致相手がない行も残し、相手側の列をNULLで補います。
和・差・積は結果の行を組み合わせる
同じ型のIDだけを持つ集合A={1, 2}、B={2, 3}で比較します。
| 演算 | この例の結果 | SQLの代表的な書き方 |
|---|---|---|
| 和 | {1, 2, 3} | UNION |
| 差 A−B | {1} | EXCEPT |
| 積(共通部分) | {2} | INTERSECT |
UNION・EXCEPT・INTERSECTでは、左右の問い合わせの列数をそろえ、同じ位置の列の型を互換にします。列名が同じというだけでは条件を満たしません。UNIONは重複を除き、UNION ALLは重複を残します。演算名や対応範囲はDBMSにより異なるため確認しましょう。
直積:すべての組合せ
| AのID | BのID |
|---|---|
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
直積は2行×2行で4行です。積の「共通する2」だけを残す処理とは異なります。直積では入力の表が同じ構造である必要はなく、列数は両表の合計になります。SQLではCROSS JOINで表します。列名が衝突する場合は別名などで区別します。
商:「すべて」を満たす組を探す
| 受講者 | 修了講座 |
|---|---|
| S1 | DB |
| S1 | NW |
| S2 | DB |
必要講座がDBとNWの2つなら、両方を修了したS1が商の結果になります。1つでも修了した人を探す条件とは違います。必要講座にない講座を追加で修了していても、必要な2つを満たせば対象です。割る側が空の場合などは問題の定義を確認します。
SQLでは、未修了の必要講座が存在しないことをNOT EXISTSなどで表現できます。SQLの四則演算の割り算記号をそのまま使うものではありません。
確認問題
A={1, 2}、B={2, 3}について、積と直積の結果の行数は同じでしょうか?
解答・解説を見る
違います。積は共通する2の1行です。直積は(1,2)(1,3)(2,2)(2,3)の4行になります。
関係演算からSQLのnoteへ進む
行と列、結合の考え方を押さえたら、無料noteでSELECT・DISTINCT・JOIN・GROUP BY・サブクエリへ進みましょう。今回の理論をSQLとして読む練習につながります。
参考資料
PostgreSQL:UNION・INTERSECT・EXCEPT / WHERE・JOIN・CROSS JOIN
資格・目的別のnote教材ナビから、ほかの教材も選べます。

コメント