“取引先”表, “商品”表, “注文”表の3表を基底表とするビュー“注文 123”を操作する SQL文のうち, 実行できるものはどれか。ここで, 各表の列のうち下線のあるものを主キーとする。
ア:DELETE FROM 注文 123 WHERE 取引先 ID = '111'
イ:INSERT INTO 注文 123 VALUES (8, '目白商店', 'レンチ', 3)
ウ:SELECT 取引先.名称 FROM 注文123
エ:UPDATE 注文123 SET 数量 = 3 WHERE 取引先名='目白商店'
(正解)
解説
ビュー“注文123”を操作するSQL文の実行可否【午前2 解説】
要点まとめ
- 結論:ビュー“注文123”は更新可能であり、UPDATE文は実行できるが、DELETEやINSERTは不可です。
- 根拠:ビュー定義に基づき、主キーを含む単一の基底表の列のみ更新可能で、複数表結合や集約を含むビューは更新制限があるためです。
- 差がつくポイント:ビューの更新可否の判断は、基底表の関係性や主キーの有無、ビューの定義内容を正確に理解することが重要です。
正解の理由
ビュー“注文123”は「注文」「取引先」「商品」の3表を結合し、商品番号が'123'の注文情報を抽出しています。
このビューは複数表の結合ビューですが、SELECT句に含まれる列は「注文番号」「取引先名(取引先.名称の別名)」「数量」です。
主キーは「注文番号」であり、ビューの更新は基底表「注文」の「数量」列に対して可能です。
したがって、UPDATE文で「数量」を変更するエのSQL文は実行可能です。
一方、DELETEやINSERTは複数表結合ビューのため制限され、特にINSERTはビューの列構成が基底表と一致しないため不可です。
SELECT文は文法的に誤りがあり、実行できません。
よくある誤解
ビューは単なる仮想テーブルなので、すべてのDML操作が可能と誤解しがちです。
しかし、結合や集約を含むビューは更新制限があり、特にINSERTやDELETEは制限されることが多いです。
解法ステップ
- ビュー定義を確認し、基底表と結合条件を把握する。
- ビューのSELECT句に含まれる列と主キーの有無を確認する。
- ビューの更新可能性のルール(単一表の主キー列を含むか)を適用する。
- 各SQL文の文法とビューの更新制限を照らし合わせて実行可否を判断する。
選択肢別の誤答解説
- ア: DELETE文は複数表結合ビューに対しては制限され、実行不可です。
- イ: INSERT文はビューの列構成が基底表と一致せず、また複数表結合ビューへの挿入は原則不可です。
- ウ: SELECT文の「取引先.名称」はビュー“注文123”の列名ではなく、正しくは「取引先名」です。文法エラーで実行不可です。
- エ: UPDATE文はビューの「数量」列を基底表「注文」表の列に対応しており、条件も正しいため実行可能です。
補足コラム
ビューの更新可否はSQL標準で定められており、単一表の主キー列を含むビューは更新可能です。
複数表結合ビューは更新制限が厳しく、特にINSERTやDELETEは制限されることが多いです。
ビューの列名は定義時の別名に注意し、SQL文で正確に指定する必要があります。
FAQ
Q: なぜ複数表結合のビューはINSERTできないのですか?
A: 複数表結合ビューはどの基底表にデータを挿入すべきか曖昧になるため、SQL標準で原則禁止されています。
Q: ビューの列名は元の表の列名と異なってもよいですか?
A: はい、ビュー定義でAS句を使い別名を付けることができ、SQL文ではその別名を使う必要があります。
Q: UPDATE文で複数表の列を同時に更新できますか?
A: 通常はできません。ビューの更新は単一基底表の列に限定されます。
関連キーワード: ビュー更新, SQL制約, 複数表結合ビュー, 主キー, DML操作