📅 公開日: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のデータベース問題で実際に問題を解いて、知識の穴をつぶしていきましょう。

記事を読んだら問題演習で理解を確認しよう!

問題演習を始める