関係型データベースの基本操作|選択・射影・統合を実例で解説
関係型データベース(RDB)を効果的に活用するには、データを操作する基本的な演算を理解することが不可欠です。本記事では、関係代数の中核となる選択(Selection)、射影(Projection)、**統合(Union)**の3つの基本操作について、実例を交えながら分かりやすく解説します。
データベース初心者の方から、SQLを実務で使用している方まで、データ操作の本質を理解するための完全ガイドとしてご活用ください。
テックジム東京本校では、情報科目の受験対策指導もご用意しております。
目次
関係型データベースと関係代数とは
関係型データベースの基本概念
関係型データベースは、データを**テーブル(表)**の形式で管理するデータベースシステムです。各テーブルは行(レコード)と列(カラム)で構成され、行同士の関係性を定義することでデータを効率的に管理できます。
関係代数の役割
関係代数は、関係型データベースでデータを操作するための数学的な演算体系です。SQLの理論的基盤となっており、以下のような基本操作が含まれます:
- 選択(Selection) – 条件に合う行を抽出
- 射影(Projection) – 必要な列のみを抽出
- 統合(Union) – 複数のテーブルを結合
- 積(Product) – テーブルの直積
- 差(Difference) – テーブルの差集合
- 結合(Join) – 共通の値を持つ行を結合
本記事では、特に重要な選択、射影、統合に焦点を当てて解説します。
選択(Selection):条件に合うデータを抽出
選択とは
選択は、テーブルから**特定の条件を満たす行(レコード)**を抽出する操作です。関係代数では「σ(シグマ)」という記号で表されます。
選択の基本構文
σ条件(テーブル名)
SQLでの実装
SQLではWHERE句を使用して選択を実現します。
SELECT * FROM 社員
WHERE 年齢 >= 30;
具体例
元のテーブル「社員」
| 社員ID | 名前 | 年齢 | 部署 | 給与 |
|---|---|---|---|---|
| 001 | 田中 | 28 | 営業 | 350000 |
| 002 | 佐藤 | 35 | 開発 | 450000 |
| 003 | 鈴木 | 42 | 人事 | 500000 |
| 004 | 高橋 | 26 | 開発 | 320000 |
| 005 | 伊藤 | 31 | 営業 | 380000 |
選択操作:年齢が30歳以上の社員を抽出
SELECT * FROM 社員
WHERE 年齢 >= 30;
結果
| 社員ID | 名前 | 年齢 | 部署 | 給与 |
|---|---|---|---|---|
| 002 | 佐藤 | 35 | 開発 | 450000 |
| 003 | 鈴木 | 42 | 人事 | 500000 |
| 005 | 伊藤 | 31 | 営業 | 380000 |
複数条件での選択
SELECT * FROM 社員
WHERE 年齢 >= 30 AND 部署 = '開発';
この場合、年齢が30歳以上かつ部署が「開発」の社員のみが抽出されます。
選択のメリット
- 大量のデータから必要な情報だけを素早く取得できる
- データの分析や集計の前処理として活用できる
- インデックスと組み合わせることで高速な検索が可能
射影(Projection):必要な列だけを抽出
射影とは
射影は、テーブルから**特定の列(カラム)**のみを抽出する操作です。関係代数では「π(パイ)」という記号で表されます。
射影の基本構文
π列名1,列名2,...(テーブル名)
SQLでの実装
SQLではSELECT文で列名を指定して射影を実現します。
SELECT 名前, 部署 FROM 社員;
具体例
元のテーブル「社員」(上記と同じテーブルを使用)
射影操作:名前と部署のみを抽出
SELECT 名前, 部署 FROM 社員;
結果
| 名前 | 部署 |
|---|---|
| 田中 | 営業 |
| 佐藤 | 開発 |
| 鈴木 | 人事 |
| 高橋 | 開発 |
| 伊藤 | 営業 |
重複の除去
射影では、同じ値を持つ行が自動的に除去されます(重複排除)。SQLではDISTINCTキーワードを使用します。
SELECT DISTINCT 部署 FROM 社員;
結果
| 部署 |
|---|
| 営業 |
| 開発 |
| 人事 |
選択と射影の組み合わせ
実務では、選択と射影を組み合わせて使用することが一般的です。
SELECT 名前, 給与 FROM 社員
WHERE 部署 = '開発';
この例では、まず「部署が開発」という条件で選択し、その後「名前」と「給与」の列のみを射影しています。
射影のメリット
- 必要な情報のみを表示することでデータの可読性が向上
- ネットワーク転送量の削減
- セキュリティ向上(機密情報を含む列を除外できる)
- パフォーマンスの最適化
統合(Union):複数のテーブルを結合
統合とは
統合は、同じ構造を持つ複数のテーブルを縦に結合して1つのテーブルにする操作です。関係代数では「∪(ユニオン)」という記号で表されます。
統合の条件
統合を行うには、以下の条件を満たす必要があります:
- 列の数が同じであること
- 対応する列のデータ型が互換性があること
- 列の順序が一致していること
SQLでの実装
SQLではUNION演算子を使用します。
SELECT 列名 FROM テーブル1
UNION
SELECT 列名 FROM テーブル2;
具体例
テーブル「東京支社」
| 社員ID | 名前 | 部署 |
|---|---|---|
| 101 | 山田 | 営業 |
| 102 | 中村 | 開発 |
| 103 | 小林 | 人事 |
テーブル「大阪支社」
| 社員ID | 名前 | 部署 |
|---|---|---|
| 201 | 加藤 | 営業 |
| 202 | 吉田 | 開発 |
| 203 | 山本 | 経理 |
統合操作:全支社の社員リストを作成
SELECT 社員ID, 名前, 部署 FROM 東京支社
UNION
SELECT 社員ID, 名前, 部署 FROM 大阪支社;
結果
| 社員ID | 名前 | 部署 |
|---|---|---|
| 101 | 山田 | 営業 |
| 102 | 中村 | 開発 |
| 103 | 小林 | 人事 |
| 201 | 加藤 | 営業 |
| 202 | 吉田 | 開発 |
| 203 | 山本 | 経理 |
UNIONとUNION ALLの違い
- UNION: 重複する行を自動的に削除
- UNION ALL: 重複する行も含めてすべて結合
-- 重複を削除
SELECT 部署 FROM 東京支社
UNION
SELECT 部署 FROM 大阪支社;
-- 重複を保持
SELECT 部署 FROM 東京支社
UNION ALL
SELECT 部署 FROM 大阪支社;
統合のメリット
- 分散しているデータを統一的に管理できる
- 複数のデータソースからの集計が容易
- レポート作成時に複数の条件結果を1つにまとめられる
その他の重要な関係代数演算
差集合(Difference)
テーブルAにあってテーブルBにない要素を抽出します。
SELECT 列名 FROM テーブルA
EXCEPT -- または MINUS(DBMSによる)
SELECT 列名 FROM テーブルB;
積集合(Intersection)
両方のテーブルに共通する要素を抽出します。
SELECT 列名 FROM テーブルA
INTERSECT
SELECT 列名 FROM テーブルB;
直積(Cartesian Product)
2つのテーブルのすべての組み合わせを生成します。
SELECT * FROM テーブルA, テーブルB;
-- または
SELECT * FROM テーブルA CROSS JOIN テーブルB;
結合(Join)
共通のキーを基に2つのテーブルを結合します。
SELECT * FROM 社員
INNER JOIN 部署 ON 社員.部署ID = 部署.部署ID;
実務での活用例
例1:顧客データ分析
-- 選択:今月の購入顧客を抽出
SELECT * FROM 購入履歴
WHERE 購入日 >= '2024-12-01';
-- 射影:顧客名と購入金額のみ表示
SELECT 顧客名, 購入金額 FROM 購入履歴
WHERE 購入日 >= '2024-12-01';
-- 統合:複数店舗の売上を統合
SELECT 店舗名, 売上金額 FROM 東京店
UNION ALL
SELECT 店舗名, 売上金額 FROM 大阪店;
例2:在庫管理システム
-- 選択:在庫が少ない商品を抽出
SELECT * FROM 在庫
WHERE 在庫数 < 10;
-- 射影:商品名と在庫数のみ表示
SELECT 商品名, 在庫数 FROM 在庫
WHERE 在庫数 < 10;
-- 統合:複数倉庫の在庫を統合
SELECT 商品ID, SUM(在庫数) AS 総在庫数
FROM (
SELECT 商品ID, 在庫数 FROM 倉庫A
UNION ALL
SELECT 商品ID, 在庫数 FROM 倉庫B
) AS 全倉庫
GROUP BY 商品ID;
例3:人事データ管理
-- 複合条件での選択と射影
SELECT 社員名, 給与, 勤続年数
FROM 社員マスタ
WHERE 給与 >= 400000
AND 勤続年数 >= 5
AND 部署 IN ('開発', '営業');
パフォーマンス最適化のポイント
インデックスの活用
選択操作で頻繁に使用される列にはインデックスを作成しましょう。
CREATE INDEX idx_age ON 社員(年齢);
CREATE INDEX idx_dept ON 社員(部署);
必要な列のみを射影
SELECT *は避け、必要な列のみを指定することでパフォーマンスが向上します。
-- 非推奨
SELECT * FROM 社員;
-- 推奨
SELECT 社員ID, 名前, 部署 FROM 社員;
UNION vs UNION ALL
重複削除が不要な場合はUNION ALLを使用することで、パフォーマンスが大幅に向上します。
まとめ
関係型データベースの3つの基本操作について解説しました:
- 選択(Selection) –
WHERE句を使って条件に合う行を抽出 - 射影(Projection) –
SELECT句で必要な列のみを抽出 - 統合(Union) –
UNION演算子で複数テーブルを結合
これらの操作を理解することで:
- SQLクエリの本質的な動作が理解できる
- より効率的なクエリを書けるようになる
- データベース設計の質が向上する
- パフォーマンスチューニングの基礎が身につく
実務では、これらの基本操作を組み合わせることで、複雑なデータ操作も実現できます。まずは基本をしっかりと理解し、実際のプロジェクトで活用してみてください。
関連記事
- データベース正規化の基礎
- SQLパフォーマンスチューニング入門
- JOINの種類と使い分け
- インデックス設計のベストプラクティス
キーワード: 関係型データベース, 選択, 射影, 統合, SQL, 関係代数, データベース操作, RDB, WHERE句, SELECT文, UNION
■らくらくPython塾 – 読むだけでマスター
【現役エンジニア歓迎】プログラミング学習お悩み相談会
【情報I】受験対策・お悩み相談会(オンライン・無料)
【オンライン無料】ゼロから始めるPython爆速講座
■テックジム東京本校
格安のプログラミングスクールといえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
対面型でより早くスキル獲得、月額2万円のプログラミングスクールです。
情報科目の受験対策指導もご用意しております。
