Oracleのビュー(VIEW)とは?仕組み・用途・作成方法を図解で完全解説!

Oracle Master Bronze

Oracle Databaseにおける「ビュー(VIEW)」は、実体を持たずにSELECT文の結果を仮想的な表として扱う機能で、業務の効率化やセキュリティ向上に大きく貢献します。

本記事では、ビューの概要から作成方法、更新可能かどうかの条件、さらには注意点や実行例まで、初心者にも理解できるよう丁寧に解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


ビューとは何か?

ビュー(VIEW)とは、1つまたは複数のテーブルを基に定義された「仮想的なテーブル」です。データ自体は基となるテーブルにあり、ビューには実際のデータは格納されません。

図:ビューのイメージ

┌────────────┐
│ employees(実表)│
└────────────┘
↓ SELECT文
┌────────────┐
│ view_sales部門のみ │(仮想表)
└────────────┘

ビューはあくまで「SELECT文の定義」であり、そこからデータにアクセスする仕組みです。


ビューを使うメリット

利点説明
SQLの簡素化複雑なJOINや集計ロジックを隠蔽し、クエリが簡潔になる
セキュリティの向上テーブル全体ではなく必要な列・行だけを公開できる
再利用性の向上SELECT文の再利用や変更管理がしやすくなる
アプリとの分離が可能テーブル構造の変更をビューで吸収でき、アプリ側の影響を抑えられる

ビューの作成方法と実行例

構文

CREATE VIEW ビュー名 AS
SELECT文;

実例:特定部門の社員だけを表示するビュー

CREATE VIEW v_sales AS
SELECT emp_id, emp_name
FROM employees
WHERE dept_id = 20;

このビューを使えば、sales部門(dept_id=20)の社員だけを簡単に表示できます。

SELECT * FROM v_sales;

検証用:テーブル作成とビューの定義

-- 実表作成
CREATE TABLE employees (
emp_id NUMBER,
emp_name VARCHAR2(50),
dept_id NUMBER
);

-- データ登録
INSERT INTO employees VALUES (1, '田中太郎', 10);
INSERT INTO employees VALUES (2, '佐藤花子', 20);
INSERT INTO employees VALUES (3, '鈴木次郎', 30);
COMMIT;

-- ビュー作成
CREATE VIEW v_sales AS
SELECT emp_id, emp_name
FROM employees
WHERE dept_id = 20;

ビューの確認・削除

-- 作成済ビューの一覧
SELECT view_name FROM user_views;

-- ビュー定義の確認
SELECT text FROM user_views WHERE view_name = 'V_SALES';

-- ビューの削除
DROP VIEW v_sales;

更新可能なビューと更新できないビューの違い

ビューには、更新可能なビューと、更新できないビュー(非更新可能ビュー)があります。

✅ 更新可能なビュー(updatable view)

単純なSELECT文を基にしたビューは、DML操作(INSERT/UPDATE/DELETE)が可能です。

-- 更新可能なビュー
CREATE VIEW v_updatable AS
SELECT emp_id, emp_name
FROM employees
WHERE dept_id = 20;

-- 更新してみる
UPDATE v_updatable SET emp_name = '山田花子' WHERE emp_id = 2;

このように、ビューから直接UPDATEが可能です。


❌ 更新できないビューの例とその理由

更新不可な例

CREATE VIEW v_group AS
SELECT dept_id, COUNT(*) AS emp_count
FROM employees
GROUP BY dept_id;

このビューに対して次のようなUPDATEを試みると…

UPDATE v_group SET emp_count = 100 WHERE dept_id = 20;

次のようなエラーが発生します:

ORA-01732: このビューではデータ操作が無効です

なぜ更新できないのか?

このようなビューが更新できない理由は、基となるテーブルとの対応関係が不明確になるためです。

図:更新不可なビューのイメージ

┌────────────┐
│ v_groupビュー │
│ dept_id | emp_count │ ← 集計された結果(COUNT)で構成
└────────────┘

UPDATE対象がどのレコードに対応しているのかOracleは判断できない

COUNT関数などの集計関数を含んでいる場合、「どのレコードを更新すべきか」という判断ができないため、Oracleはビューを更新不可と判断します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


一般的に更新できない構成の例

使用されている要素更新可否理由(Oracleが行の特定をできない)
集計関数(COUNT, SUM)×集約された値には元の行との対応がない
DISTINCT×重複排除後の行は特定の元レコードと対応しない
GROUP BY×グループ単位で集計されているため個別の行操作が困難
JOIN一部条件付きで更新可能だが複雑なJOINは基本的に非更新可能
UNION/UNION ALL×複数のSELECTの結合結果で構成されるため更新不可
WITH READ ONLY×明示的に更新を禁止する構文(CREATE VIEW ... WITH READ ONLY

まとめ

項目内容
ビューとはSELECT文に名前をつけて仮想的なテーブルとして利用できる機能
主な用途SQLの簡略化・アクセス制限・再利用性向上など
更新可能条件単一テーブル・集計やDISTINCTなし・明確な行の特定が可能な構造
非更新可能の例集計関数、GROUP BY、DISTINCT、JOINなどを含む複雑な構造
注意点ビューは実体がなく、元のテーブル構造変更の影響を受けやすい



[参考]
SQL言語リファレンス – CREATE VIEW

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました