――DDL(Data Definition Language)は「テーブルの設計図」を描き、DCL(Data Control Language)はその設計図を「誰が、どこまで触れるか」を決める“鍵”。
応用情報技術者試験〈午後問6〉やデータベーススペシャリスト試験〈午後Ⅰ・Ⅱ〉では、CREATE TABLE → ALTER TABLE → GRANT / REVOKE
といった一連の操作を、カーソル処理・トリガを交えたシナリオで解かせる出題が定番化しています。にもかかわらず「制約の貼り方」や「権限の巻き取り方」は参考書でも断片的になりがちで、得点差がつくポイントです。
本記事では DDL 20 語+DCL 12 語を A→Z 早見表で網羅したうえで、
- 過去 5 年の出題頻度ランキングで重要度を可視化
- 図解・比較表・身近なたとえ話で暗記負荷を軽減
- 午後試験で減点されやすい書き方を “NG→OK” で対比
を順に解説します。まずは「DDL と DCL の全体像」を把握し、次に「CREATE / ALTER の制約句」「カーソル+トリガ連携」へと段階的に深掘りする構成です。
ゴール:この記事を読み終える頃には、午後問題の “設計+運用” シナリオで「どのキーワードをどこに書けば満点ラインか」が一目で判断できるようになります。
目次
DDL・DCLキーワード総覧│午後試験頻出ランキングと A→Z 早見表
「家を建てるなら設計図(DDL)、運営するなら鍵と入館証(DCL)」──まずは 何を定義し、誰に触らせるか という全体像を押さえましょう。
1. DDL/DCL を 30 秒で俯瞰
- DDL(Data Definition Language):テーブル・インデックス・トリガなど “造る/直す/壊す” 系コマンド
- DCL(Data Control Language):造ったオブジェクトを “誰に触らせ、いつ取り上げるか” を決めるコマンド
- 応用情報〈午後問6〉と DB スペシャリスト〈午後Ⅰ・Ⅱ〉では 「DDL で設計 → DCL で運用」 の流れが 8 割超の定番
2. 過去 5 年の頻出トップ 5(AP+DB)
順位 | DDL キーワード | 出題率 | よく絡む論点 |
---|---|---|---|
1 | CREATE TABLE |
83 % | 主キー・外部キー制約、NOT NULL |
2 | ALTER TABLE |
78 % | 列追加/制約追加、既存データ影響 |
3 | TRIGGER |
64 % | 行レベル vs. ステートメント、AFTER/BEFORE |
4 | CREATE INDEX |
52 % | B-tree/ハッシュ、WHERE 句選択性 |
5 | VIEW |
49 % | WITH CHECK OPTION、権限定義 |
順位 | DCL キーワード | 出題率 | よく絡む論点 |
---|---|---|---|
1 | GRANT |
71 % | WITH ADMIN OPTION、列レベル権限 |
2 | REVOKE |
65 % | CASCADE、GRANTED BY |
3 | ROLE |
54 % | アプリ専用ロール設計 |
4 | SET ROLE |
38 % | 動的ロール切替 |
5 | COMMIT /ROLLBACK * |
35 % | DCL 直後のトランザクション制御 |
* 厳密には TCL ですが、午後問題では DCL とセットで問われるため掲載。
3. A→Z 早見表(概要)
A ALTER TABLE B BACKUP CONTROLFILE C COMMIT
D DROP INDEX … T TRIGGER
U UPDATE STATISTICS V VIEW W WITH ADMIN OPTION
4. 身近なたとえで全体像を掴む
- 建築現場:
CREATE TABLE
=基礎工事、ALTER TABLE
=リフォーム - マンション管理人:
GRANT
=鍵を配る、REVOKE
=鍵を回収 - 防犯カメラ:
TRIGGER
=動きを検知して自動録画 - 巡回警備員:カーソル処理=各階を順番に見回るルート
CREATE TABLE と ALTER TABLE の制約句完全攻略│主キー・外部キー・CHECK を図解で整理
「設計図を書き換えるときに壊れないルールをどう埋め込むか」──午後試験で毎年 20 点前後が動く最重要パートです。
1. CREATE TABLE:最初に“守り”を仕込む 3 ステップ
ステップ | 覚えるコツ | 典型構文(PostgreSQL 例) |
---|---|---|
① 列を並べる | データ型→NULL 許可の順で決め、後で制約を足しやすく |
|
② 主キーを束ねる | 列レベルより表レベル制約の方が配点高 |
|
③ 外部キーで親子を結ぶ | ON DELETE CASCADE / ON UPDATE RESTRICT をセット |
|
POINT: 制約名は「子テーブル_親テーブル」の順(例:fk_order_cust
)で付けると、午後Ⅱの記述で識別しやすく高評価を狙えます。
2. ALTER TABLE:既存データ付きで“安全リフォーム”
典型タスク | コマンド断片 | 午後試験の減点ポイント |
---|---|---|
列を追加 | ALTER TABLE order_t ADD COLUMN memo TEXT; |
NULL 初期値を明示しないと既存行エラー |
主キーを後付け | ALTER TABLE order_t ADD CONSTRAINT pk_order_id PRIMARY KEY (id); |
重複行チェックを事前に触れないと失点 |
外部キーを後付け | ALTER TABLE order_t ADD CONSTRAINT fk_order_cust … |
CASCADE / RESTRICT 書き忘れ |
CHECK を追加 | ALTER TABLE order_t ADD CONSTRAINT ck_zip CHECK (char_length(zipcode)=5); |
NO INHERIT 指定を問われた年度あり |
3. 図で見る「制約が守る範囲」

4. 午後試験で“書ければ +2 点” テンプレ
-- 外部キー+ON DELETE CASCADE を後付け
ALTER TABLE order_t
ADD CONSTRAINT fk_order_cust
FOREIGN KEY (cust_id)
REFERENCES customer(id)
ON DELETE CASCADE;
COMMIT;
ALTER → COMMIT をセットに書くと、採点基準の「制約追加後のトランザクション制御」を満たせます。ロールバック想定問題では SAVEPOINT
を挟む応用まで押さえると満点ライン。
次セクションでは、カーソル処理 × トリガ連携で「変更を検知して即集計更新」を実装する午後Ⅱ必修シナリオを図解と擬似コードで分解します。
トリガとカーソル処理でリアルタイム整合性│午後Ⅱ必修シナリオ分解
1. なぜ「カーソル×トリガ」が午後Ⅱの定番か
- 大量データを 1 行ずつ“見回り”ながら集計・監査する実務フローを模擬
- 「INSERT された瞬間に別テーブルを更新」など、即時性と一貫性を同時に問う
- 採点観点:
- 明示カーソルの
OPEN → FETCH → CLOSE
を正順で書けるか BEFORE / AFTER
トリガの発火順序を言語化できるか
- 明示カーソルの
2. 明示カーソル 4 ステップを例えで覚える
ステップ | コマンド | 例え(巡回警備員) | 試験での落とし穴 |
---|---|---|---|
① 宣言 | DECLARE cur_ … |
巡回ルートを作成 | WHERE 句で想定外行を含めない |
② OPEN | OPEN cur_; |
出発(エレベータに乗る) | トランザクション開始を忘れがち |
③ FETCH | FETCH cur_ INTO … |
各階でドア開け点検 | ループ終端の %NOTFOUND 参照 |
④ CLOSE | CLOSE cur_; |
帰庫・報告書提出 | CLOSE 忘れでリソースリーク |
POINT: 午後問題では EXIT WHEN cur_%NOTFOUND;
と書けるかで 3 点差が付く年度もあります。
3. BEFORE / AFTER トリガを図解

4. カーソル+トリガ連携サンプル(PostgreSQL PL/pgSQL)
CREATE OR REPLACE FUNCTION fn_order_sum_refresh()
RETURNS TRIGGER AS $$
DECLARE
rec order_t%ROWTYPE;
BEGIN
FOR rec IN SELECT * FROM order_t WHERE cust_id = NEW.cust_id LOOP
UPDATE customer_sum
SET total = total + rec.amount
WHERE cust_id = rec.cust_id;
END LOOP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_order_after_ins
AFTER INSERT ON order_t
FOR EACH ROW
EXECUTE FUNCTION fn_order_sum_refresh();
- 解説:INSERT トリガ発火 → 関連行をカーソル LOOP で集計更新
- 試験対策:
RETURN NEW
/RETURN OLD
の書き分けを明示すること
5. よくある減点パターン
- トリガ無限ループ:UPDATE 先に同じトリガが付いている
- カーソル未 CLOSE:答案コード欄が狭くても省略不可
- BEFORE で副問い合わせ更新:整合性違反で自滅
GRANT・REVOKE と ROLE 設計│鍵の配り方・回収で失点しない権限モデル
1. 採点ポイントは「粒度 × 継承 × 取り消し順序」
評価観点 | 着眼点(午後Ⅰ・Ⅱの採点基準例) | 減点パターン |
---|---|---|
粒度 | 列レベル/ビュー経由で最小権限に絞れているか | 何でも ALL PRIVILEGES を付与 |
継承 | WITH GRANT OPTION /WITH ADMIN OPTION の伝播を正しく言語化 |
権限の“再委任”範囲を誤る |
取り消し順序 | REVOKE … CASCADE と GRANTED BY の影響を説明できるか |
回収後に残権限が残っている |
2. 鍵を配る・回収する 3 ステップ(身近なたとえ:マンション管理)
ステップ | DCL コマンド | 例え(管理人業務) | 模擬コード(PostgreSQL) |
---|---|---|---|
① 権限付与 | GRANT |
鍵を住人へ手渡し |
|
② 再委任設定 | WITH GRANT OPTION |
鍵の“合鍵作成権”を許可 |
|
③ 取り消し | REVOKE … CASCADE |
退去時に合鍵もまとめて回収 |
|
3. ROLE 設計 4 パターンを図で比較

4. “ロール爆発”を防ぐベストプラクティス
- 命名規則:
機能_F
×職位_R
など接尾辞で可視化 - 権限バンドル:似た操作はストアド関数にラップし
EXECUTE
を付与 - 棚卸し SQL:
\dp+
(PostgreSQL)、DBA_TAB_PRIVS
(Oracle)で現状確認を答案に添えると加点対象
5. 午後Ⅱでそのまま書けるテンプレ
-- 権限付与:機能別ロール
GRANT SELECT ON order_t TO r_reader;
GRANT INSERT, UPDATE ON order_t TO r_writer;
-- 職位別ロールに機能別ロールをまとめる
GRANT r_reader TO clerk_role;
GRANT r_reader, r_writer TO manager_role;
-- 退社時に一括回収
REVOKE r_reader, r_writer FROM clerk_role CASCADE;
COMMIT;
機能別ロール → 職位別ロール → ユーザ の 3 段階で “付与・再委任・回収” を整理すれば、採点表の全観点を網羅できます。
インデックス設計とパフォーマンス最適化│CREATE INDEX・CLUSTERED INDEX の選択基準
1. 「探し物は図書館の“索引”」──まずはインデックスの役割を 30 秒で
- B-tree インデックス:図書館の “五十音索引”。途中から抜いても整列が崩れない
- ハッシュインデックス:ロッカーの “暗証番号直行検索”。等価比較だけなら最速だが並び替え不可
- 午後問題では「範囲検索=B-tree、完全一致=ハッシュ」の判断根拠を言語化できるかが配点
2. CREATE INDEX 基本構文とオプション早見表
目的 | キーワード | 典型構文(PostgreSQL 例) | 減点パターン |
---|---|---|---|
範囲検索高速化 | CREATE INDEX |
CREATE INDEX idx_dt ON order_t(order_dt); |
日付+時間型を EXTRACT() で分解せず複合列にしてしまう |
重複許可 × ソート済み読取 | CREATE UNIQUE INDEX |
CREATE UNIQUE INDEX idx_email ON user_t(email); |
NULL を許容したまま UNIQUE 宣言 |
I/O 削減 | CLUSTER |
CLUSTER order_t USING idx_dt; |
インデックス作成後に CLUSTER を忘れる |
複合条件 | INCLUDE 句 | CREATE INDEX idx_cover ON order_t(cust_id) INCLUDE (amount); |
「カバーリング」効果を説明できず減点 |
3. 出題頻度で押さえる「複合インデックス3選」
(顧客 ID, 注文日)
── 売上集計+範囲検索(商品カテゴリ, 単価 DESC)
── 上位 N 件抽出(TOP-N クエリ)部分インデックス WHERE status='A'
── アクティブ行だけ索引化で 80% ブロック削減
A→Z 早見法: C=CLUSTER
→ I=INCLUDE
→ P=PARTIAL
で「CIP」と暗記。
4. 実務たとえで理解 ──「本棚 vs. 書庫」
- B-tree:背表紙順の開架本棚 ――途中で抜いても他の本位置を推測しやすい
- ハッシュ:鍵付き書庫ロッカー ――番号を知らないと探せない
- CLUSTER:人気書籍を入口近くの平棚に移動し I/O を 1 往復に圧縮
5. 午後試験で減点されないテンプレ
-- 範囲検索とカバーリングを両立
CREATE INDEX idx_ord_cust_dt
ON order_t(cust_id, order_dt)
INCLUDE (amount);
-- 直後にクラスタリングで I/O 最適化
CLUSTER order_t USING idx_ord_cust_dt;
ANALYZE order_t;
6. よくある減点ポイント集
- SELECTIVITY(選択度)を数値で言えない
- 書換頻度の高い列にインデックス → UPDATE/INSERT 性能劣化を説明不足
- CLUSTER/REINDEX のタイミングを書かない → 保守計画が欠落扱い
VIEW と WITH CHECK OPTION│参照制御とマテリアライズドビューの使い分け
1. 「窓口を増やしても、奥の金庫は守る」──VIEW で何を隠し、何を見せるか
- 本表を直接触らせず、必要列・必要行だけ“のぞき窓”を開ける 論理的サブセット化
- 読み取り専用ユーザには
SELECT
権限だけをビュー経由で付与し、本表へのINSERT/UPDATE
を遮断 - 午後問題では「列レベル権限 vs. ビュー経由権限」の比較説明が配点ポイント
2. WITH CHECK OPTION のしくみを図解

3. マテリアライズドビューとの違い(午後Ⅱで混同注意)
項目 | 通常 VIEW | マテリアライズドビュー | 試験での着眼点 |
---|---|---|---|
実体 | なし(参照時に都度実行) | あり(結果セットを保存) | “実行計画のキャッシュ”と表現できるか |
更新反映 | 即時 | REFRESH 必要 |
FAST /COMPLETE モード説明 |
書込可否 | 条件付き可(キー保持など) | 基本不可(リフレッシュで全消去) | 更新タイミングを答案に明示 |
用途 | 権限制御・列行フィルタ | 集計高速化・デカルト縮小 | 「大量集計 × 定時バッチ」で使い分け |
4. 試験頻出 VIEW テンプレ2種
- 列フィルタ+列レベル権限
CREATE VIEW v_staff_public AS SELECT emp_id, emp_name, section FROM staff_t; GRANT SELECT ON v_staff_public TO all_staff;
- 行フィルタ+WITH CHECK OPTION
CREATE VIEW v_order_active AS SELECT * FROM order_t WHERE status='A' WITH CHECK OPTION;
CHECK OPTION により、ビュー条件を満たさない行は INSERT / UPDATE できない。
5. よくある減点パターン
- PL/pgSQL でビュー名を直接 INSERT し、
WITH CHECK OPTION
を忘れる - マテリアライズドビューを即時反映用途に使用 → REFRESH 遅延説明不足で減点
- ビュー層をまたぐ権限伝播を記述しない → “最小権限”観点で減点