naritai.app

データベース管理システム(DBMS、SQL、トランザクション管理、排他制御)

この章で覚えておきたいこと

DBMS、SQL、結合、ACID、排他制御、障害回復の重要論点を一枚で整理する図解

基本知識

DBMSが果たす役割

DBMSがデータ定義、操作、同時実行制御、障害回復、セキュリティを担う様子を具体物で示す図解

DBMSは、データベースを安全かつ効率的に使うための土台です。単に表を保存するだけでなく、利用者からの要求を整理し、正しい形で読み書きさせる役割を持ちます。

試験では、インデックス、トリガ、ストアドプロシージャ、レプリケーションなどを、どの機能に属するかで判断させる問題が出ます。名称だけではなく、何を実現する仕組みなのかで覚えることが大切です。

SQLを読む基本順序

SQLをFROM、JOIN、WHERE、GROUP BY、SELECT、ORDER BYの順で読む流れを店舗と表で示す図解

SQLは記述順のまま読むより、処理の流れに沿って読むほうが理解しやすいです。特に空欄補充や実行結果選択では、この読み順がそのまま解答手順になります。

1. FROM で対象となる表を確認します。 2. JOIN でどの表同士を、どの列で結びつけるかを確認します。 3. WHERE で抽出条件を当てはめ、残る行を絞ります。 4. GROUP BY で集計単位を決めます。 5. SELECT で表示する列や集計結果を確定します。 6. ORDER BY で並び順を確認します。

結果表の1行が何を意味するかを最初に見ると、GROUP BY と集計関数の候補を絞りやすくなります。店舗ごとの集計なのか、商品ごとの集計なのかを先に見抜くことが重要です。

集計問題では、WHERE、HAVING、DISTINCT の位置づけも頻出です。

| 句・指定 | 役割 | 読む位置 | 典型的なひっかけ | |---|---|---|---| | WHERE | 行を絞り込む | 集計前 | 集計後の条件を書く場所ではない | | GROUP BY | 集計単位を決める | 絞り込み後 | 結果表の1行の粒度と合っているかを見る | | HAVING | 集計結果を条件で絞る | 集計後 | COUNT や SUM の結果に対する条件はここ | | DISTINCT | 重複行を除く | 表示列の確定時 | 集計単位を作る命令ではない |

たとえば「店舗ごとの売上合計が10万円以上の店舗だけ」を出すなら、先に店舗で GROUP BY し、合計額に対して HAVING を使います。一方、「東京都の店舗だけ」を対象にするなら、集計前の行条件なので WHERE で絞ります。

JOINと外部結合の考え方

利用者表と商品登録表を結合し、INNER JOINとLEFT OUTER JOINの違いを見比べる図解

JOIN は複数の表を結びつける処理です。結合の種類は、対応するデータがない行を残すかどうかで判断します。

たとえば、利用者一覧を基準にして、商品登録がない利用者も含めて集計したいなら、利用者表を左側に置いた LEFT OUTER JOIN が必要です。ここで INNER JOIN を使うと、商品登録がない利用者が結果から消えてしまいます。

RIGHT OUTER JOIN も考え方は同じで、右側の表を残す結合です。ただし、試験では「どちらの表を残したいか」を明確にするため、LEFT OUTER JOIN の形で考えるほうが整理しやすいです。

集計SQLとCOUNTの読み分け

COUNT(*) と COUNT(列名) の違いをNULLを含む集計表で比較する図解

集計SQLでは、まず結果表の粒度を読み、その粒度に合わせて GROUP BY を決めます。そのうえで、何を数えるか、何を合計するかを関数で表します。

外部結合と組み合わせるときは、COUNT(*) と COUNT(列名) の違いが特に重要です。対応データがない行を0件として扱いたいなら、NULLになる右表の列を COUNT(列名) で数える必要があります。COUNT(*) を使うと、左側の行自体は残っているため1件と数えられてしまいます。

CASE式とGROUP BYによる条件付き集計

CASE式で販売店ごとに分類し、SUMとGROUP BYで数量を集計する流れを示す図解

条件付き集計では、CASE で条件ごとに値を振り分け、その結果を SUM や COUNT で集計します。試験では、分類条件に使う列と、合計対象の列を取り違えないことが重要です。

たとえば、販売店ごとの販売数量を商品単位で横持ち表示したい場合は、次のように考えます。

件数を数えたいなら THEN 1 の形が使えますが、数量や金額を合計したいなら THEN 販売数量 や THEN 金額 のように、実際に合計したい列を返す必要があります。この違いは空欄補充でよく狙われます。

トランザクションとACID

振込処理を例にトランザクションとACIDの4性質を整理する図解

トランザクションは、複数の処理を一体として扱い、途中だけ成功する状態を防ぐ仕組みです。代表例は振込処理で、出金だけ成功して入金が失敗する状態は許されません。

ACIDは、トランザクションが満たすべき代表的な性質です。

試験では、原子性と耐久性、独立性と一貫性を入れ替えさせる選択肢がよく出ます。用語だけで覚えず、具体例と結びつけて理解することが必要です。

排他制御とロック

行ロックと表ロックの違いと、同時実行性と管理負荷のトレードオフを示す図解

排他制御は、複数の利用者が同じデータを同時に扱っても不整合が起きないようにする仕組みです。代表的な方法がロックです。

ここで重要なのは、ロック粒度の大小と性能の関係です。

試験では、排他制御の目的そのものに加えて、このトレードオフを問う選択肢が出ます。単純に「細かいほうが優れている」とは言えない点を押さえてください。

障害回復と分散トランザクション

ロールバック、ロールフォワード、2相コミットの役割をサーバとログで示す図解

障害回復では、バックアップと更新ログを組み合わせて整合性を戻します。似た用語が多いため、処理の向きを意識して整理することが大切です。

ロールバックは「戻す」、ロールフォワードは「進める」と覚えると区別しやすくなります。

分散環境では、複数のデータベースや資源にまたがる更新を同時に確定させる必要があります。このとき使われる代表的な仕組みが2相コミットです。2相コミットは、全参加者が確定可能かを確認してから、全体を一斉にコミットまたは中止させます。これにより、一部だけ確定してしまう不整合を防ぎます。

DBMSの周辺機能

インデックス、ストアドプロシージャ、トリガ、レプリケーションの役割差を具体物で示す図解

DBMSには、日常的な運用を支える周辺機能も多くあります。用語問題では、次の役割を区別できるようにしておく必要があります。

これらは名称が似ていなくても、出題では「何を実現する機能か」で選ばせることが多いです。索引は高速化、自動実行はトリガ、処理の部品化はストアドプロシージャというように、役割で結びつけて覚えてください。

この章のまとめ

DBMS、SQL、結合、集計、ACID、排他制御、障害回復、周辺機能の総まとめを一覧化する図解

一次試験過去問での出方

2025年第12問では、利用者をすべて残す集計SQLが出題され、LEFT OUTER JOIN と COUNT(列名) の組み合わせを正しく読めるかが問われました。

2024年第8問では、CASE と SUM と GROUP BY を組み合わせた条件付き集計が出題され、分類に使う列と合計対象の列を切り分ける力が求められました。

2023年度第2回第4問では、表の結合後に店舗単位で集計し、並び順まで含めてSQLの実行結果を読む問題が出ました。

2020年第7問では、ACIDの各性質が問われ、原子性、一貫性、独立性、耐久性を具体例で説明できるかが重要でした。

2017年第9問では、ロック粒度、ロールバック、ロールフォワード、2相コミットがまとめて問われ、排他制御と障害回復の基本理解が試されました。

2023年度第1回第5問では、インデックス、ストアドプロシージャ、トリガ、レプリケーションなどのDBMS機能が出題され、名称より役割で判断することが求められました。