初学者向けDBスペ試験対策ノート
1. ロック(SロックとXロック)
内容の解説
-
Sロック(共有ロック):他人も読みOK、書きNG。
-
Xロック(排他ロック):他人は読みも書きもNG。
-
粒度(テーブル/行)によって競合範囲が変わる。
- 行aにSロック中→別行bへのXロックは可能。
- 行aにSロック中→テーブル全体のXロックは不可。
例
- 商品テーブルで行1にSロックがあるとき、別行2に対するXロックは取得できる。
- ただし行1にSロックがある状態でテーブル全体にXロックを取ろうとするとブロックされる。
課題
- 粒度の違いでロック競合がどう変わるか、表で整理する。
- S/S, S/X, X/X の競合パターンを暗記する。
試験対策
- 「粒度が広いロックは下位粒度をブロックする」が基本。
- ロックエスカレーション、意図ロック(IS/IX)の存在も押さえる。
2. NULLと3値論理
内容の解説
- SQLは true / false / unknown の3値論理。
- NULLを含む比較は原則unknown(IS NULL/IS NOT NULLは例外)。
- false OR unknown → unknown。
例
SELECT CASE WHEN (1 = NULL) THEN 'true'
WHEN (1 <> NULL) THEN 'false'
ELSE 'unknown' END;
この結果は常に 'unknown' になる。
課題
- AND/ORとunknownの真理値表を自作する。
- NULL判定のSQLを書いて動作確認する。
試験対策
- 「= NULL」での比較は常にunknown。
- IS NULLで判定する習慣を身につける。
3. リファクタリング
内容の解説
- 外部仕様を変えずに内部構造を改善する作業。
- 可読性、保守性、拡張性、再利用性を向上させる。
例
- 冗長なJOINをサブクエリ化して見やすくする。
- 意味のわからないカラム名を業務的な意味が分かる名前に変更。
課題
- 自分の書いたSQLやコードをリファクタリングしてみる。
- 命名改善、重複排除、条件簡略化を実践。
試験対策
- 「外部振る舞い不変+内部改善」がキーワード。
- 他の用語(リバースエンジニアリング、回帰テスト)との区別を覚える。
4. COUNTで条件付き集計
内容の解説
- COUNT(expr) は NULL以外の件数を数える。
- 条件一致時のみ1、不一致はNULLを返すと条件件数が取れる。
例
SELECT COUNT(CASE WHEN 役職 = '主任' THEN 1 ELSE NULL END) AS 主任数
FROM 社員;
課題
- COUNTとSUMで条件付き集計をそれぞれ試す。
- ELSE 0とELSE NULLの違いを確認する。
試験対策
- 件数 → COUNT + ELSE NULL
- 合計 → SUM + ELSE 0
5. 弱実体
内容の解説
- 親がいないと存在できない実体。
- 識別は「親キー+自分の部分キー」で行う。
例
- 注文に属する注文明細(注文削除で明細も削除)。
課題
- ER図で弱実体を二重枠で描く練習。
- 存在従属の例を3つ書く。
試験対策
- 「親削除で子も削除」=弱実体と即判断できるように。
6. 2相ロック(2PL)
内容の解説
- 成長段階:ロック取得のみ。
- 縮退段階:ロック解放のみ。
- このルールで競合直列可能性が保証される。
例
- 銀行振込トランザクションで、残高確認→更新(ロック取得)→振込完了→ロック解放。
課題
- 2PLの状態遷移図を描く。
- 厳密2PLとの違いを調べる。
試験対策
- 2PLでもデッドロックは起こる → 別対策が必要。
- 「取って放す」順序を守るかが肝。
7. ファントムリード
内容の解説
- 同じ検索条件で行集合が増減する現象。
- 範囲ロックやSERIALIZABLEで防ぐ。
例
- 「平均点が80点以上の学生」を集計中に、新規学生がINSERTされて平均が変動する。
課題
- READ COMMITTEDとSERIALIZABLEの挙動を比較。
- ファントムリードが起こるSQL例を作る。
試験対策
- 「条件範囲に行が増減」=ファントムリードと即答できるように。
8. ACID特性
内容の解説
- A:全か無か(原子性)
- C:制約保持(一貫性)
- I:直列化と同等の見え方(分離性)
- D:コミット後は失わない(耐久性)
例
- 銀行振込で送金だけ成功して入金が失敗→原子性違反。
課題
- 各特性が欠けた場合の事例を調べる。
試験対策
- 選択肢にACID以外の説明が混ざっていることが多いので見抜く。
9. 3層スキーマ
内容の解説
- 外部スキーマ:ユーザごとの見え方。
- 概念スキーマ:全体の論理構造。
- 内部スキーマ:物理的な格納方法。
例
- 外部:社員給与ビュー、概念:社員テーブル構造、内部:インデックス設定。
課題
- 自社システムを3層に分けてみる。
試験対策
- 「外部=ビュー、概念=論理構造、内部=物理構造」と覚える。
10. 候補キーの導き方
内容の解説
- 右辺に出ない属性を必須にする。
- それに属性を足して閉包計算。
- 全属性に到達&極小なら候補キー。
例
- R(A,B,C), A→B, B→C → 候補キーはA。
課題
- 関数従属性集合から候補キーを3パターン導出する練習。
試験対策
- 「右辺に出ない属性→必須」が時短のカギ。
11. 2相コミット(2PC)
内容の解説
- 分散DBで全参加者がYESならコミット。
- フェーズ1:準備→投票。
- フェーズ2:コミット/アボート決定。
例
- A支店とB支店の口座振替を同時コミット。
課題
- 2PCのシーケンス図を描く。
試験対策
- ブロッキング問題とYES/NOの条件を覚える。
12. 正規化
内容の解説
- 2NF:複合キーの一部だけで決まる属性を排除。
- 3NF:非キー→非キーの従属を排除。
例
- 注文明細(注文ID, 商品ID, 商品名)で商品名は商品IDに依存→3NF違反。
課題
- 複合キーと部分関数従属の例を作る。
- 推移的従属の例を作る。
試験対策
- 単一キー→2NF自動クリア、複合キー→部分従属要注意。