スポンサーリンク

【応用情報技術者試験】データベースを学ぼう!     ~第4章~関係演算と集合演算

SQLと関係演算:抽出・結合・集計を整理 データベース

選択は行、射影は列、結合は条件に合う行の組を取り出す操作です。関係代数は関係を入力し、結果も関係として得る考え方です。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のIDBのID
12
13
22
23

直積は2行×2行で4行です。積の「共通する2」だけを残す処理とは異なります。直積では入力の表が同じ構造である必要はなく、列数は両表の合計になります。SQLではCROSS JOINで表します。列名が衝突する場合は別名などで区別します。

商:「すべて」を満たす組を探す

受講者修了講座
S1DB
S1NW
S2DB

必要講座が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として読む練習につながります。

無料note:SQL頻出ポイントを学ぶ

参考資料

PostgreSQL:UNION・INTERSECT・EXCEPT / WHERE・JOIN・CROSS JOIN

資格・目的別のnote教材ナビから、ほかの教材も選べます。

コメント