メインコンテンツへスキップ
見出し画像

【基本情報】データベース完全攻略|SQL・正規化・トランザクションを図解

    SQLの集計を結果表まで確かめる:WHERE・GROUP BY・HAVINGを比べる無料例題で、絞る行・まとめる単位・残るグループを紙に書いて確認できます。この下のDB全体の解説と往復して使ってください。

    基本情報技術者試験で頻出の分野のひとつが、データベースです。

    データベースでは、

    「主キーと外部キーの違いが曖昧…」

    「第1・第2・第3正規形が覚えられない…」

    「SQLのJOINやGROUP BYで混乱する…」

    「コミットとロールバックって何だっけ?」

    と、覚えることが多く感じるかもしれません。

    でも、データベースはそれぞれの知識がつながっています。

    この記事では、

    データベースの基本 → キー → SQL → 正規化 → トランザクション → ACID → 排他制御 → 障害回復

    の順番で、基本情報で押さえておきたいポイントをまとめて解説します🔥

    ⸻

    1. そもそもデータベースとは?

    データベースとは、

    関連するデータを整理して、効率よく保存・検索・更新できるようにしたもの

    です。

    たとえばECサイトなら、

    • 顧客情報

    • 商品情報

    • 注文情報

    • 在庫情報

    などをデータベースで管理できます。

    ⸻

    2. DBMSとは?

    データベースを管理するためのソフトウェアを、

    DBMS(Database Management System)

    といいます。

    DBMSには、

    • データの登録

    • 検索

    • 更新

    • 削除

    • アクセス制御

    • 同時実行制御

    • 障害回復

    などの役割があります。

    つまり、

    データベース = データを蓄積する仕組み
    DBMS = そのデータベースを管理する仕組み

    と整理すると分かりやすいです。

    ⸻

    3. リレーショナルデータベース

    基本情報で特に重要なのが、

    リレーショナルデータベース(関係データベース)

    です。

    データを表(テーブル)形式で管理します。

    たとえば、

    画像

    のような形です。

    Excelの表をイメージすると理解しやすいでしょう。

    ⸻

    4. テーブル・行・列

    リレーショナルデータベースでは、まず次の3つを押さえます。

    画像

    たとえば、

    画像

    なら、

    画像

    という関係です。

    ⸻

    5. レコードとフィールド

    試験では、

    レコード

    フィールド


    という言葉も登場します。

    ざっくり整理すると、

    行 → レコード
    列の項目 → フィールド

    と考えておけばOKです。

    ⸻

    6. 主キーとは?

    データベースで非常に重要なのがキーです。

    まずは、

    主キー(Primary Key)

    から。

    主キーとは、

    テーブル内の各行を一意に識別するための列

    です。

    たとえば、

    画像

    なら、

    社員ID

    を主キーとして利用できます。

    ⸻

    7. 主キーのポイント

    主キーでは、

    同じ値が重複してはいけません。

    たとえば、

    社員ID
     1
     2
     3

    なら、それぞれを区別できます。

    一方、

    社員ID
     1
     1
     3

    では、社員ID=1が2件あるため一意に識別できません。

    また、主キーには基本的にNULLを設定できません。

    覚え方は、

    主キー = その行を特定するためのID

    です。

    ⸻

    8. 外部キーとは?

    次に、

    外部キー(Foreign Key)

    です。

    外部キーとは、

    別のテーブルとの関連付けに使う列

    です。

    たとえば、

    社員テーブル

    画像


    部署テーブル

    画像

    社員テーブルの、

    部署ID

    を使って部署テーブルと関連付けられます。

    社員.部署ID
         ↓
        関連
         ↑
    部署.部署ID

    JOINを理解するときにも重要です。

    ⸻

    9. 主キーと外部キーを比較

    画像

    ここは頻出なのでセットで覚えましょう。

    ⸻

    10. 参照整合性

    外部キーと一緒に覚えたいのが、

    参照整合性

    です。

    たとえば部署テーブルに、

    部署ID
     10
     20

    しか存在しないのに、社員テーブルに、

    部署ID = 99

    という値が登録されると、対応する部署が存在しません。

    このような矛盾を防ぐ考え方が参照整合性です。

    ⸻

    11. SQLとは?

    SQLは、

    データベースを操作するための言語

    です。

    SQLを使うことで、

    • データを取得する

    • データを追加する

    • データを更新する

    • データを削除する

    といった操作ができます。

    ⸻

    12. SELECT

    データを取得するときの基本が、

    SELECT

    です。

    SELECT 氏名
    FROM 社員;

    これは、

    社員テーブルから氏名を取得する

    という意味です。

    基本形は、

    SELECT 列
    FROM テーブル;

    です。

    ⸻

    13. WHERE

    条件を指定するときは、

    WHERE

    を使います。

    SELECT 氏名
    FROM 社員
    WHERE 部署ID = 10;

    これは、

    部署IDが10の社員だけ取得する

    という意味です。

    覚え方は、

    WHERE = 行を絞る

    です。

    ⸻

    14. ORDER BY

    結果を並び替える場合は、

    ORDER BY

    を使います。

    SELECT 商品名, 価格
    FROM 商品
    ORDER BY 価格 DESC;

    DESCなので価格の高い順です。

    ASC  → 昇順
    DESC → 降順

    と覚えましょう。

    ⸻

    15. SQLの集約関数

    複数のデータをまとめて計算するときは、集約関数を使います。

    画像

    この5つは優先して覚えましょう。

    ⸻

    16. GROUP BY

    GROUP BYは、

    同じ値を持つデータをグループ化する

    ために使います。

    SELECT 部署ID, COUNT(*)
    FROM 社員
    GROUP BY 部署ID;

    なら、

    部署ごとの社員数

    を求めています。

    ポイントは、

    GROUP BY
    ↓
    「○○ごと」

    です。

    ⸻

    17. WHEREとHAVING

    ここは混同しやすいポイントです。

    画像

    覚え方は、

    WHERE
    ↓
    行に条件
    
    GROUP BY
    ↓
    グループ化
    
    HAVING
    ↓
    グループに条件

    です。

    ⸻

    18. JOIN

    JOINは、

    複数のテーブルを結合する

    ために使います。

    SELECT 社員.氏名, 部署.部署名
    FROM 社員
    INNER JOIN 部署
    ON 社員.部署ID = 部署.部署ID;

    ここでは、

    社員.部署ID
         ↓
        結合
         ↑
    部署.部署ID

    という関係です。

    ⸻

    19. INNER JOINとLEFT JOIN

    INNER JOIN

    両方に対応するデータが存在するものだけ取得

    します。

    LEFT JOIN

    左側のテーブルのデータをすべて残す

    結合です。

    右側に対応するデータがなければ、該当部分はNULLになります。

    INNER JOIN
    → 一致するもの
    
    LEFT JOIN
    → 左側は全部残す

    と覚えると分かりやすいです。

    ⸻

    20. SQLの頻出キーワードまとめ

    画像

    SQLをさらに詳しく勉強したい方は、前回の記事

    「【基本情報】SQL入門|SELECT・JOIN・GROUP BYをゼロから攻略」

    も合わせて使ってみてください。

    ⸻

    21. 正規化とは?

    ここからデータベース分野の大きな山場、

    正規化

    です。

    正規化とは、

    データの重複や更新時の不整合を減らすために、テーブルを適切に分割・整理すること

    です。

    ⸻

    22. なぜ正規化するの?

    たとえば、次のテーブルがあるとします。

    画像

    ここでは、

    田中
    マウス
    3000

    などの情報が繰り返し保存されています。

    同じ情報を何度も保存すると、変更時に問題が発生しやすくなります。

    そこで、テーブルを整理するのが正規化です。

    ⸻

    23. 更新時異常

    正規化されていないデータでは、

    更新時異常

    が起こりやすくなります。

    たとえば、マウスの価格を、

    3000円 → 3500円

    に変更するとします。

    マウスが複数行に存在する場合、すべて変更しなければなりません。

    一部だけ変更すると、

    マウス 3000円
    マウス 3500円

    という矛盾が発生します。

    ⸻

    24. 第1正規形

    まずは、

    第1正規形

    です。

    ポイントは、

    1つのセルに複数の値を入れない

    こと。

    たとえば、

    画像

    のような状態ではなく、

    値を適切に分けて管理できる形にします。

    試験対策では、

    第1正規形 = 繰返し項目をなくし、各項目を単一の値にする

    と押さえましょう。

    ⸻

    25. 関数従属性

    第2・第3正規形を理解するために重要なのが、

    関数従属性

    です。

    たとえば、

    社員ID → 社員名

    という関係があるとします。

    社員IDが決まれば社員名が決まるなら、

    社員名は社員IDに関数従属している

    と考えます。

    社員ID
      ↓
    社員名

    というイメージです。

    ⸻

    26. 第2正規形

    第2正規形では、

    複合主キーの一部だけに依存する項目を分離

    します。

    これを理解するには、次のような表を考えると分かりやすいです。

    画像

    主キーが、

    注文ID + 商品ID

    だったとします。

    しかし商品名は、

    商品ID
    ↓
    商品名

    だけで決まります。

    つまり複合主キー全体ではなく、商品IDだけに依存しています。

    このような部分関数従属をなくすのが第2正規形です。

    ⸻

    27. 第3正規形

    第3正規形では、

    主キー以外の項目を経由した依存関係を分離

    します。

    たとえば、

    画像

    この場合、

    社員ID
    ↓
    部署ID
    ↓
    部署名

    という関係があります。

    部署名は社員IDから直接管理するより、

    部署ID → 部署名

    として部署テーブルに分けた方が自然です。

    このような推移的関数従属をなくしていくのが第3正規形です。

    ⸻

    28. 第1・第2・第3正規形を一気に整理

    ここは試験直前に必ず確認しましょう。

    画像

    ざっくり、

    第1
    ↓
    複数の値を整理
    第2
    ↓
    主キーの一部だけへの依存を整理
    第3
    ↓
    主キー以外を経由する依存を整理

    と段階的に覚えるのがおすすめです。

    ⸻

    29. 正規化問題の解き方

    正規化問題が出たら、いきなりテーブルを分割しないことがポイントです。

    まず、

    STEP1
    主キーは何か?

    STEP2
    何が何によって決まるか?

    STEP3
    主キーの一部だけで決まる列はないか?

    STEP4
    主キー以外の列を経由して決まる列はないか?

    を確認します。

    つまり、

    キー → 関数従属性 → 分割

    の順番です。

    ⸻

    30. トランザクションとは?

    次の重要テーマが、

    トランザクション

    です。

    トランザクションとは、

    一連の処理をひとまとまりとして扱う単位

    です。

    代表例は銀行振込。

    AさんからBさんへ1万円送るなら、

    ① Aさんの残高を1万円減らす
    ② Bさんの残高を1万円増やす

    という2つの処理があります。

    この2つはセットで成功しなければ困ります。

    ⸻

    31. COMMIT

    トランザクションの処理結果を確定するのが、

    COMMIT(コミット)

    です。

    処理開始
    ↓
    データ更新
    ↓
    問題なし
    ↓
    COMMIT
    ↓
    確定

    と考えます。

    ⸻

    32. ROLLBACK

    処理を取り消し、トランザクション開始前などの整合した状態へ戻すのが、

    ROLLBACK(ロールバック)

    です。

    処理開始
    ↓
    データ更新
    ↓
    エラー発生
    ↓
    ROLLBACK
    ↓
    変更を取り消す

    覚え方は、

    COMMIT   → 確定
    ROLLBACK → 取消し

    です。

    ⸻

    33. ACID特性

    トランザクションとセットで頻出なのが、

    ACID特性

    です。

    画像

    ⸻

    34. Atomicity(原子性)

    Atomicityでは、

    全部成功するか、全部失敗するか

    がポイントです。

    銀行振込なら、

    Aから1万円減った
    でも
    Bには1万円増えていない

    という中途半端な状態を避けます。

    覚え方は、

    A = All or Nothing

    です。

    ⸻

    35. Consistency(一貫性)

    Consistencyは、

    トランザクションの前後で、定められた整合性制約を保つ

    という考え方です。

    たとえば、

    • 主キーの重複を許さない

    • 外部キーの参照関係を守る

    など、データベースのルールに反した状態にしないことが重要です。

    ⸻

    36. Isolation(独立性・分離性)

    Isolationは、

    複数のトランザクションを同時に実行するときの干渉を適切に制御する

    ための性質です。

    同じデータを複数の処理が同時に変更すると、意図しない結果になる可能性があります。

    そこで必要になるのが、

    排他制御

    です。

    ⸻

    37. Durability(永続性)

    Durabilityは、

    COMMITした結果は、障害が発生しても失われないようにする

    という性質です。

    覚え方は、

    COMMIT
    ↓
    確定
    ↓
    結果を保持

    です。

    ⸻

    38. ACIDを一気に覚える

    A:Atomicity
    → 全部成功 or 全部取消し
    
    C:Consistency
    → 整合性を保つ
    
    I:Isolation
    → 同時処理の干渉を制御
    
    D:Durability
    → 確定結果を保持

    ACIDは英語と意味を対応させて覚えましょう。

    ⸻

    39. 排他制御とは?

    複数のトランザクションが同じデータを同時に操作すると、データの矛盾が起きる可能性があります。

    そこで使われるのが、

    排他制御

    です。

    代表的な方法が、

    ロック

    です。

    ⸻

    40. 共有ロックと専有ロック

    試験では、

    共有ロック

    専有ロック


    の違いが重要です。

    共有ロック

    主にデータを読むときに使います。

    他のトランザクションによる共有ロックとは共存できます。

    専有ロック

    データを更新するときなどに使います。

    他のトランザクションからの共有ロック・専有ロックを基本的に許しません。

    ⸻

    41. ロックの組合せ

    基本的なイメージは、

    画像

    つまり、

    共有 × 共有
    → OK
    
    共有 × 専有
    → NG
    
    専有 × 共有
    → NG
    
    専有 × 専有
    → NG

    です。

    ⸻

    42. デッドロック

    ロックとセットで覚えたいのが、

    デッドロック

    です。

    たとえば、

    トランザクションA
    → データXをロック
    → データYを待つ
    
    トランザクションB
    → データYをロック
    → データXを待つ

    となった場合、

    A「Yが空くまで待つ」
    B「Xが空くまで待つ」

    となり、お互いに処理が進められません。

    これがデッドロックです。

    ⸻

    43. デッドロックを図で覚える

    A
    ↓ 保有
    X
    ↑ 待ち
    B
    
    B
    ↓ 保有
    Y
    ↑ 待ち
    A

    つまり、

    お互いが相手のロック解除を待っている状態

    です。

    ⸻

    44. 障害回復

    データベースでは、障害が起きてもデータを正しい状態に戻す必要があります。

    そこで重要になるのが、

    ログ

    です。

    データの更新履歴などを記録しておき、障害発生時の回復に利用します。

    ⸻

    45. ロールバックとロールフォワード

    障害回復では、この2つを区別しましょう。

    ロールバック

    更新前の状態などへ戻す処理。

    ロールフォワード

    バックアップなどを基点に、ログを使って更新内容を再適用して進める処理。

    覚え方は、

    ROLLBACK
    → 戻る
    
    ROLLFORWARD
    → 前へ進める

    です。

    ⸻

    46. チェックポイント

    DBMSは、回復処理を効率化するためにチェックポイントを利用することがあります。

    障害回復問題では、

    • バックアップ

    • ログ

    • チェックポイント

    • COMMITの有無

    などを確認しましょう。

    ⸻

    47. インデックスとは?

    検索を高速化するために使われるのが、

    インデックス(索引)

    です。

    本の索引をイメージすると分かりやすいです。

    本を最初から全部読むのではなく、

    索引
    ↓
    探したいキーワード
    ↓
    該当ページへ

    と探します。

    データベースでも同じように、検索を効率化できます。

    ⸻

    48. インデックスの注意点

    インデックスを作れば何でも速くなるわけではありません。

    インデックスには、

    検索を高速化できる

    というメリットがある一方、

    • インデックス用の記憶領域が必要

    • INSERTやUPDATEなどでインデックスの更新が必要

    といったコストもあります。

    試験では、

    検索性能と更新コストのトレードオフ

    として理解しておきましょう。

    ⸻

    49. ビューとは?

    ビュー(View)は、

    一つ以上のテーブルを基に定義された仮想的な表

    です。

    たとえば、

    SELECT 氏名, 部署名
    ...

    のような結果を、利用者から表のように扱えるようにします。

    必要なデータだけを見せる用途などにも利用できます。

    ⸻

    50. データベース分野の頻出キーワード

    画像

    この表は試験直前の復習にも使えます。

    ⸻

    51. データベース問題を解くときの考え方

    問題の種類によって、見る場所を変えるのがポイントです。

    SQLなら

    FROM
    ↓
    どのテーブル?
    
    WHERE
    ↓
    どの行?
    
    GROUP BY
    ↓
    何ごと?
    
    SELECT
    ↓
    何を取得?
    
    ORDER BY
    ↓
    どう並べる?


    JOINなら

    どのテーブル?
    ↓
    結合キーは?
    ↓
    INNER?LEFT?


    正規化なら

    主キーは?
    ↓
    関数従属性は?
    ↓
    部分関数従属は?
    ↓
    推移的関数従属は?


    トランザクションなら

    COMMIT済み?
    ↓
    ロック状態は?
    ↓
    障害が起きたのはいつ?
    ↓
    ROLLBACK?ROLLFORWARD?

    問題の種類ごとに見るポイントを固定すると、解きやすくなります。

    ⸻

    52. よくある間違い① 主キーと外部キー

    主キー
    → 自分のテーブルの行を識別
    
    外部キー
    → 他のテーブルとの関係を表す

    と区別しましょう。

    ⸻

    53. よくある間違い② 第2正規形と第3正規形

    ここは特に混同しやすいです。

    第2正規形
    → 複合主キーの「一部」への依存をなくす
    
    第3正規形
    → 主キー以外を「経由」する依存をなくす

    一部 → 第2

    経由 → 第3

    というイメージで覚えるのもおすすめです。

    ⸻

    54. よくある間違い③ COMMITとROLLBACK

    COMMIT
    → 確定
    
    ROLLBACK
    → 取消し

    逆にしないように注意しましょう。

    ⸻

    55. よくある間違い④ WHEREとHAVING

    WHERE
    → グループ化する前の行
    
    HAVING
    → GROUP BY後のグループ

    です。

    SQL問題ではかなり重要です。

    ⸻

    56. よくある間違い⑤ ロック

    「共有」という名前から、

    「何でも共有できる」

    と考えないように注意。

    基本は、

    共有 × 共有 → ○
    共有 × 専有 → ×
    専有 × 共有 → ×
    専有 × 専有 → ×

    です。

    ⸻

    57. ミニ問題①

    次のうち、テーブル内の各行を一意に識別するために使うものはどれでしょう?

    A. 外部キー
    B. 主キー
    C. インデックス
    D. ビュー

    答え

    B. 主キー


    主キーは各行を一意に識別するために使います。

    ⸻

    58. ミニ問題②

    次のSQLは何を求めているでしょうか?

    SELECT 部署ID, COUNT(*)
    FROM 社員
    GROUP BY 部署ID;

    答え

    部署ごとの社員数


    です。

    GROUP BY 部署ID
    → 部署ごと
    
    COUNT(*)
    → 件数

    と分解します。

    ⸻

    59. ミニ問題③

    複合主キーの一部だけに依存する項目を分離するのは何正規形でしょう?

    答え

    第2正規形


    です。

    第2正規形
    → 部分関数従属をなくす

    と覚えましょう。

    ⸻

    60. ミニ問題④

    トランザクションの処理結果を確定する命令は?

    答え

    COMMIT


    です。

    取消しはROLLBACKです。

    ⸻

    61. ミニ問題⑤

    トランザクションAがXをロックしてYを待ち、トランザクションBがYをロックしてXを待っています。

    この状態は?

    答え

    デッドロック


    です。

    お互いが相手の資源の解放を待っているため、処理が進められません。

    ⸻

    62. 試験直前チェックリスト

    データベース分野は、試験前にここを確認しておきましょう。

    データベース基礎
    ◻︎DBMSの役割が分かる
    ◻︎テーブル・行・列を説明できる
    ◻︎主キーと外部キーを区別できる
    ◻︎参照整合性を理解している

    SQL
    ◻︎SELECT・FROMを理解している
    ◻︎WHEREを理解している
    ◻︎ASC・DESCを区別できる
    ◻︎集約関数を区別できる
    ◻︎GROUP BYを理解している
    ◻︎WHEREとHAVINGを区別できる
    ◻︎INNER JOINとLEFT JOINを区別できる

    正規化
    ◻︎関数従属性を理解している
    ◻︎第1正規形を説明できる
    ◻︎第2正規形を説明できる
    ◻︎第3正規形を説明できる
    ◻︎部分関数従属を理解している
    ◻︎推移的関数従属を理解している

    トランザクション
    ◻︎COMMITとROLLBACKを区別できる
    ◻︎ACID特性を説明できる
    ◻︎共有ロックと専有ロックを区別できる
    ◻︎デッドロックを説明できる
    ◻︎ロールバックとロールフォワードを区別できる

    ⸻

    63. 最後にこれだけ覚える

    時間がない場合は、まずここを優先しましょう🔥

    主キー
    → 行を一意に識別
    
    外部キー
    → テーブルを関連付ける
    
    SELECT
    → データ取得
    
    WHERE
    → 行を絞る
    
    GROUP BY
    → グループ化
    
    HAVING
    → グループに条件
    
    JOIN
    → テーブル結合


    正規化は、

    第1正規形
    → 1項目1値
    
    第2正規形
    → 部分関数従属をなくす
    
    第3正規形
    → 推移的関数従属をなくす


    トランザクションは、

    COMMIT
    → 確定
    
    ROLLBACK
    → 取消し
    
    ACID
    → 原子性・一貫性・独立性・永続性


    ロックは、

    共有 × 共有 → ○
    それ以外     → 基本×

    このあたりはセットで覚えておきましょう。

    ⸻

    まとめ

    データベース分野は覚える用語が多いですが、バラバラに暗記する必要はありません。

    全体を、

    ① データをどう管理する?
    → テーブル・主キー・外部キー

    ② データをどう取り出す?
    → SQL

    ③ データをどう整理する?
    → 正規化

    ④ データを安全に更新する?
    → トランザクション・ACID

    ⑤ 同時アクセスをどう制御する?
    → ロック・デッドロック

    ⑥ 障害からどう戻す?
    → ログ・ロールバック・ロールフォワード

    という流れで理解すると、かなり整理しやすくなります。

    特に基本情報では、

    SQL・正規化・トランザクション

    を優先して対策しておきたいところです。

    SQLでは実際のテーブルを追う。

    正規化では「何が何によって決まる?」を考える。

    トランザクションでは「確定した?取り消す?同時アクセスは?」を見る。

    この3つを意識して問題演習を繰り返していきましょう🔥

    試験前にもう一度見返せるよう、保存してデータベース分野の総復習に使ってみてください!

    あなたへのおすすめ