📅 公開日:2026年3月20日
【応用情報技術者試験】データベース完全解説|正規化・トランザクション・SQLを体系的に理解する
応用情報技術者試験において、データベース分野は午前・午後ともに頻出の重要テーマです。正規化の手順、トランザクション管理、SQLの構文まで幅広く問われます。本記事では試験に必要なデータベースの知識を体系的に解説します。
1. リレーショナルデータベースの基礎
基本用語
リレーショナルデータベース(RDB)は、データを表(テーブル)の形式で管理します。
| 用語 | 意味 |
|---|---|
| テーブル(表) | データを格納する表。「エンティティ」とも呼ばれる |
| 行(レコード・タプル) | テーブルの1件分のデータ |
| 列(カラム・属性) | データの項目(名前、年齢など) |
| 主キー(PRIMARY KEY) | 行を一意に識別する列。NULLや重複は不可 |
| 外部キー(FOREIGN KEY) | 別テーブルの主キーを参照する列 |
主キーと外部キーの関係
図書館の本管理に例えると、本テーブルの「ISBN」が主キー、貸出テーブルの「ISBN」が外部キーです。外部キーは「必ず本テーブルに存在するISBN」しか入れられないため、存在しない本の貸出記録は作れません。これを参照整合性と呼びます。
2. 正規化
正規化とは
正規化とは、データの冗長性(重複)を排除し、更新異常を防ぐためにテーブルを分割・整理する手順です。
更新異常とは、データの重複が原因で発生する問題です。例えば「社員テーブル」に部署名を直接持つと、部署名が変わったとき全行を更新する必要があり、一部更新漏れが発生する可能性があります(更新異常)。
第1正規形(1NF)
繰り返しグループを排除し、各セルに1つの値だけを持たせる状態です。
正規化前(NG):
| 注文ID | 顧客名 | 商品(複数) |
|---|---|---|
| 001 | 田中 | りんご, みかん, ぶどう |
正規化後(OK):
| 注文ID | 顧客名 | 商品 |
|---|---|---|
| 001 | 田中 | りんご |
| 001 | 田中 | みかん |
| 001 | 田中 | ぶどう |
第2正規形(2NF)
第1正規形を満たした上で、部分関数従属を排除する状態です。
「主キーの一部だけに依存する列」を別テーブルに分離します。複合主キー(注文ID + 商品ID)を持つテーブルで、「顧客名」が注文IDだけに依存している場合は部分従属です。顧客情報を別テーブルに切り出します。
第3正規形(3NF)
第2正規形を満たした上で、推移的関数従属を排除する状態です。
「主キー以外の列に依存する列」を別テーブルに分離します。社員テーブルに「部署ID」と「部署名」が両方ある場合、「部署名」は「部署ID」に依存しており推移的従属です。部署テーブルを別に作り分離します。
| 正規形 | 排除する問題 |
|---|---|
| 第1正規形 | 繰り返しグループ |
| 第2正規形 | 部分関数従属 |
| 第3正規形 | 推移的関数従属 |
3. SQL
データ操作の基本(DML)
SELECT文(データ取得)
SELECT 列名1, 列名2
FROM テーブル名
WHERE 条件
ORDER BY 列名 ASC|DESC;
実例:
-- 応用情報の問題を難易度順に取得
SELECT question_id, question_text, difficulty
FROM questions
WHERE exam = '応用情報技術者'
ORDER BY difficulty DESC;
JOIN(テーブルの結合)
-- INNER JOIN:両テーブルに存在するデータのみ取得
SELECT u.username, p.is_correct
FROM users u
INNER JOIN user_progress p ON u.id = p.user_id;
-- LEFT JOIN:左テーブルの全データ+右テーブルの一致データ
SELECT u.username, p.is_correct
FROM users u
LEFT JOIN user_progress p ON u.id = p.user_id;
INNER JOINは「社員と部署の両方に一致するレコードだけ」、LEFT JOINは「社員は全員表示、部署未所属の社員はNULL」のイメージです。
GROUP BY と集計関数
-- 試験別の問題数と平均正解率を取得
SELECT exam,
COUNT(*) AS 問題数,
AVG(difficulty) AS 平均難易度
FROM questions
GROUP BY exam
HAVING COUNT(*) >= 10;
WHERE は集計前の行フィルタ、HAVING は集計後のグループフィルタです。この違いは試験でよく問われます。
データ定義(DDL)
-- テーブル作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at DATE
);
-- 列の追加
ALTER TABLE users ADD COLUMN streak INT DEFAULT 0;
-- テーブル削除
DROP TABLE users;
データ制御(DCL)
-- 権限付与
GRANT SELECT, INSERT ON questions TO 'appuser'@'localhost';
-- 権限剥奪
REVOKE INSERT ON questions FROM 'appuser'@'localhost';
4. トランザクション
トランザクションとは
トランザクションとは、複数のSQL操作をひとまとまりとして扱う仕組みです。
銀行の振込に例えると、「A口座から1万円を引く」「B口座に1万円を加える」の2操作は必ず両方成功するか、両方失敗するかでなければなりません。途中で障害が起きて片方だけ実行されると大問題です。この「全部やるか全部やらないか」を保証するのがトランザクションです。
ACID特性
トランザクションが満たすべき4つの性質です。試験で必ず問われます。
| 特性 | 意味 | 例 |
|---|---|---|
| 原子性(Atomicity) | 全部成功か全部失敗か | 振込の2操作は必ず両方成功か両方失敗 |
| 一貫性(Consistency) | 整合性が保たれる | 振込後も残高の合計は変わらない |
| 独立性(Isolation) | 他のトランザクションから隔離される | 振込中の中間状態は他から見えない |
| 耐久性(Durability) | コミット後は障害があっても失われない | 障害後も振込結果は保持される |
コミットとロールバック
BEGIN; -- トランザクション開始
UPDATE accounts SET balance = balance - 10000 WHERE id = 1;
UPDATE accounts SET balance = balance + 10000 WHERE id = 2;
COMMIT; -- 確定(成功時)
-- ROLLBACK; -- 取り消し(失敗時)
排他制御(ロック)
複数のトランザクションが同時に同じデータを更新しようとすると矛盾が生じます。これを防ぐのがロックです。
- 共有ロック(読み取りロック):他の読み取りは許可するが、書き込みは禁止
- 排他ロック(書き込みロック):他の読み取りも書き込みも禁止
デッドロック
2つのトランザクションが互いに相手のロック解除を待ち続け、永久に進めなくなる状態です。
トランザクションA:テーブル1をロック → テーブル2のロック待ち
トランザクションB:テーブル2をロック → テーブル1のロック待ち
→ 永遠に待ち続ける(デッドロック)
対策:ロックの取得順序を統一する、タイムアウトを設定して強制ロールバックする。
5. データベースの障害回復
ログとチェックポイント
DBMSはトランザクションログ(ジャーナル)にすべての更新操作を記録します。障害発生時はログを使って復旧します。
- ロールフォワード:バックアップからログを再適用して最新状態に復旧(媒体障害時)
- ロールバック:未完了のトランザクションを取り消して整合性を回復(ソフト障害時)
チェックポイントとは、メモリ上の更新内容をディスクに書き出すタイミングです。チェックポイント以降のログだけを適用すればよいため、復旧時間を短縮できます。
6. 試験頻出の用語まとめ
| 用語 | 意味 |
|---|---|
| ビュー | SELECT文の結果に名前をつけた仮想テーブル |
| インデックス | 検索を高速化するための索引。更新は遅くなる |
| ストアドプロシージャ | DBサーバ上に保存したSQL手続き |
| カーソル | クエリ結果を1行ずつ処理する仕組み |
| 関数従属 | ある列の値が決まると別の列の値も一意に決まる関係 |
| スキーマ | データベースの構造定義(テーブル・列・制約など) |
7. まとめ
データベース分野は「なぜその設計が必要か」という理由から理解すると、暗記だけに頼らずに済みます。
- 正規化は第1〜第3正規形の手順と「何を排除するか」を確実に覚える
- SQLはSELECT・JOIN・GROUP BY / HAVINGの使い分けを練習する
- ACID特性は4つの頭文字と意味をセットで覚える
- トランザクションはコミット・ロールバック・デッドロックを実際の例で理解する
HiDeckerのデータベース問題で実際に問題を解いて、知識の穴をつぶしていきましょう。