データベーススペシャリスト 2016年 午前2 問10
問題文
更新可能なビューの定義はどれか。ここで、ビュー定義の中で参照する基底表は全て更新可能とする。
選択肢
ア:
CREATE VIEW ビュー1(取引先番号、 製品番号)
AS SELECT DISTINCT 納入.取引先番号、 納入.製品番号
FROM 納入
イ:
CREATE VIEW ビュー2(取引先番号、 製品番号)
AS SELECT 納入.取引先番号、 納入.製品番号
FROM 納入
GROUP BY 納入.取引先番号、 納入.製品番号
ウ:
CREATE VIEW ビュー3(取引先番号、 ランク、 住所)
AS SELECT 取引先.取引先番号、 取引先.ランク、 取引先.住所
FROM 取引先
WHERE 取引先.ランク > 15
(正解)エ:
CREATE VIEW ビュー4(取引先住所、 ランク、 製品倉庫)
AS SELECT 取引先.住所、 取引先.ランク、 製品.倉庫
FROM 取引先、 製品
HAVING 取引先.ランク > 15
更新可能なビューの定義はどれか【午前2 解説】
要点まとめ
- 結論:更新可能なビューは単一の基底表からの単純なSELECT文で定義されているものです。
- 根拠:DISTINCTやGROUP BY、複数表の結合やHAVING句を含むビューは更新不可となるためです。
- 差がつくポイント:ビューの定義に集約関数やDISTINCT、結合が含まれているかを見極めることが重要です。
正解の理由
選択肢ウは「取引先」表から単純に条件付きで行を抽出しているだけのビュー定義です。
このようなビューは基底表の1つの表に対して単純なSELECT文であり、更新可能なビューの条件を満たします。
一方、他の選択肢はDISTINCTやGROUP BY、複数表の結合、HAVING句を使っており、これらはビューの更新を妨げる要因となります。
このようなビューは基底表の1つの表に対して単純なSELECT文であり、更新可能なビューの条件を満たします。
一方、他の選択肢はDISTINCTやGROUP BY、複数表の結合、HAVING句を使っており、これらはビューの更新を妨げる要因となります。
よくある誤解
DISTINCTやGROUP BYを使ったビューも更新できると思い込むことがありますが、これらは行の一意性を変えるため更新不可です。
複数表をFROM句で結合したビューも更新可能と誤解されがちですが、基本的に更新不可です。
複数表をFROM句で結合したビューも更新可能と誤解されがちですが、基本的に更新不可です。
解法ステップ
- ビュー定義のSELECT文を確認し、基底表が単一か複数かを判断する。
- DISTINCTやGROUP BY、HAVING句の有無をチェックする。
- 単純なSELECT文であれば更新可能と判断し、複雑な集約や結合があれば更新不可と判断する。
- 条件付き抽出(WHERE句)は更新可能ビューの条件を満たすため問題ない。
- 以上の観点から正解を選択する。
選択肢別の誤答解説
- ア: DISTINCTを使っているため、行の重複を排除し更新時にどの行を更新するか不明確になり更新不可。
- イ: GROUP BYを使って集約しているため、基底表の行と1対1対応しなくなり更新不可。
- ウ: 単一表からWHERE句で条件抽出しているだけで、更新可能なビューの条件を満たす。
- エ: 複数表の結合(FROM句で複数表指定)とHAVING句を使っているため、更新不可。
補足コラム
更新可能なビューの条件はSQL標準や各DBMSで若干異なりますが、一般的には以下の条件が挙げられます。
- 基底表が単一であること
- SELECT句に集約関数やDISTINCTを含まないこと
- GROUP BYやHAVING句を使わないこと
- 結合を含まないこと
- ビューの列が基底表の列に1対1対応していること
これらを満たすビューはINSERT、UPDATE、DELETEが可能です。
FAQ
Q: なぜDISTINCTを使うとビューは更新不可になるのですか?
A: DISTINCTは重複行を排除するため、ビューの行と基底表の行が1対1対応しなくなり、どの行を更新すべきか不明確になるからです。
A: DISTINCTは重複行を排除するため、ビューの行と基底表の行が1対1対応しなくなり、どの行を更新すべきか不明確になるからです。
Q: WHERE句を使ったビューはなぜ更新可能なのですか?
A: WHERE句は単に行を絞り込むだけで、基底表の行とビューの行の対応関係を壊さないため更新可能です。
A: WHERE句は単に行を絞り込むだけで、基底表の行とビューの行の対応関係を壊さないため更新可能です。
関連キーワード: 更新可能ビュー、ビュー定義、SQLビュー、DISTINCT, GROUP BY, HAVING, 単一表ビュー、ビュー更新条件

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

