Agent Grow Tech Notes
🫥

【SQL】応用情報:平成28年秋期(午前:問28)実表と導出表について

2025/03/10に公開

実表?導出表?

今回は、表題のテーマに挑戦してみたいと思います。
念のため、「聞きなれない」 という方のために「つまりこれのこと」というのをお伝えしておきます。

  • 実表:テーブル
  • 導出表:ビュー

今回のサンプル

こちらの過去問を使い、解説をします。
※出典:平成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

Agent Grow Tech Notes
Agent Grow Tech Notes

Discussion