平成25年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
テクノロジ/データベース三つの表“取引先”,“商品”,“注文”を基底表とするビュー“注文123”を操作するSQL文のうち,実行できるものはどれか。ここで,各表の列のうち下線のあるものを主キーとする。 取引先 取引先ID,名称,住所 111,中央貿易,東京都中央区 222,上野商会,東京都台東区 333,目白商店,東京都豊島区 商品 商品番号,商品名,価格 111,スパナ,1,000 123,レンチ,1,300 313,ドライバ,800 注文 注文番号,注文日,取引先ID,商品番号,数量 1,2013-04-17,111,111,3 2,2013-04-18,222,123,4 3,2013-04-19,111,313,3 4,2013-04-20,333,123,2 (注:本サイトでは原問題の表を文字表記に変換しています) 〔ビュー“注文123”の定義〕 CREATE VIEW 注文123 AS SELECT 注文番号,取引先.名称 AS 取引先名,数量 FROM 注文,取引先,商品 WHERE 注文.商品番号 = '123' AND 注文.取引先ID = 取引先.取引先ID AND 注文.商品番号 = 商品.商品番号
出典:平成25年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
- アDELETE FROM 注文123 WHERE 取引先ID = '111'
- イINSERT INTO 注文123 VALUES (8, '目白商店', 'レンチ', 3)
- ウSELECT 取引先.名称 FROM 注文123
- エUPDATE 注文123 SET 数量 = 3 WHERE 取引先名 = '目白商店'
正解:エ
解説
ビュー“注文123”は,“注文”“取引先”“商品”の三つの表を商品番号='123'という条件で結合したビューであり,その列は“注文番号”“取引先名(取引先.名称の別名)”“数量(注文.数量)”の三つだけである。したがって,このビューに対する操作は,このビューが実際に公開している列名だけを使って行う必要があり,かつビューの列と1対1に対応する基底表の列(この場合は“数量”が“注文”表の列に,そのまま単純な形で対応する)を更新する操作でなければ実行できない。設問の四つの選択肢のうち,ビューが公開していない列名(取引先ID)を参照するもの,ビューの列数と一致しない値を挿入しようとするもの,ビューに存在しない表名を直接参照しようとするものは,いずれも列参照の誤りによって実行できない。一方,エのUPDATE文は,ビューが公開している列“数量”(“注文”表の列にそのまま対応する)を,同じくビューが公開している列“取引先名”を条件として更新するものであり,実行可能である。
選択肢ごとの解説
- ア誤り。ビュー“注文123”は,“注文番号”“取引先名”“数量”の三つの列だけを公開しており,“取引先ID”という列は公開されていない。存在しない列を参照するWHERE句となるため,このDELETE文は実行できない。
- イ誤り。ビュー“注文123”の列数は3列(注文番号,取引先名,数量)であるにもかかわらず,VALUES句には4個の値が指定されており,列数が一致しないため,このINSERT文は実行できない。
- ウ誤り。ビュー“注文123”に対する問合せでは,ビューが公開する列名(注文番号,取引先名,数量)だけを参照でき,ビューの定義に使われた基底表“取引先”を“取引先.名称”のように直接参照することはできない。このSELECT文は実行できない。
- エ正しい。“数量”はビューの定義上,“注文”表の列がそのまま対応する単純な列であり,“取引先名”もビューが公開している列である。このUPDATE文は,ビューが公開する列だけを使って“数量”を更新するものであり,実行できる。