🫥
【SQL】応用情報:平成28年秋期(午前:問28)実表と導出表について
実表?導出表?
今回は、表題のテーマに挑戦してみたいと思います。
念のため、「聞きなれない」 という方のために「つまりこれのこと」というのをお伝えしておきます。
- 実表:テーブル
- 導出表:ビュー
今回のサンプル
こちらの過去問を使い、解説をします。
※出典:平成28年度 秋期 応用情報技術者試験 午後 問題冊子
解説に使った画像
ここでは特に解説しませんが、赤でマークした場所を辿れば分かるのではないかと思われます。
正解は『ア』です。
SQLを動かそう!
PostgreSQLで書きますので、よろしければ試してみてください。
※簡単に試す方法はこちらの記事を参考にして下さい。
SQL
まず、テーブル定義とデータ、ビューを作ります。
-- テーブル1:英字1文字
CREATE TABLE tbl1 (
id INTEGER PRIMARY KEY
, single CHAR(1)
);
INSERT INTO tbl1 VALUES
(1,'A')
, (2,'B')
, (3,'C');
-- テーブル2:英字2文字
CREATE TABLE tbl2 (
id INTEGER PRIMARY KEY REFERENCES tbl1(id)
, twin CHAR(2)
);
INSERT INTO tbl2 VALUES
(1,'AA')
, (2,'BB')
, (3,'CC');
-- ビュー1:選択、射影、リテラルあり
CREATE VIEW vw1 AS (
SELECT tbl1.id ,tbl2.twin ,'DUMMY' AS lit FROM tbl1
INNER JOIN tbl2 ON tbl1.id = tbl2.id
WHERE tbl1.single IN ('A','C')
);
-- ビュー2:更新のテスト用
CREATE VIEW vw2 AS (
SELECT twin FROM tbl2
);
では、データ抽出のDMLを作ります。
-- テーブル確認
SELECT * FROM tbl1;
SELECT * FROM tbl2;
SELECT * FROM vw1;
-- 更新が可能な方
UPDATE vw2 SET twin = 'DD';
SELECT * FROM tbl2;
SELECT * FROM vw2;
/*
-- 更新ができない方
UPDATE vw1 SET twin = 'DD';
SELECT * FROM tbl1;
SELECT * FROM vw1;
*/
実行結果
テーブル1:英字1文字『tbl1』
id(主キー) | single |
---|---|
1 | A |
2 | B |
3 | C |
テーブル2:英字2文字『tbl2』
id(主キー) | twin |
---|---|
1 | AA |
2 | BB |
3 | CC |
ビュー1:選択、射影、リテラルあり『vw1』
仕様は下記の通り
- 選択はWHERE
- 射影はSELECT句の後ろで項目を選択すること
- リテラルは固定値で今回のSQLでは'DUMMY'
- 結合しているため、更新処理はできない
id | twin | lit |
---|---|---|
1 | AA | DUMMY |
3 | CC | DUMMY |
ビュー2:更新のテスト用『vw2』
ビュー1との仕様の比較は下記の通り
- 射影のみ
- 結合も集計もしていないため、更新可能
※更新前
twin |
---|
AA |
BB |
CC |
※更新後
twinが全て'DD'に更新されている。
twin |
---|
DD |
DD |
DD |
テーブル2:英字2文字『tbl2』
ビューの項目に対してUPDATE(更新)されたことにより、テーブルから抽出した結果も'DD'となる。
id(主キー) | twin |
---|---|
1 | DD |
2 | DD |
3 | DD |
それでは
ひと通り用意しましたので、色々編集したり試しながら学んでみて下さい。
特に、更新が可能か不可能かはビューの作成方法による点、テーブルから取得する項目以外もビューに含めることが可能(リテラル) であることを押さえておくと良いかと思います。
では、今回は以上です。
ここまでお付き合い頂き、ありがとうございましたm(_ _)m
Discussion