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などを含む複雑な構造 |
| 注意点 | ビューは実体がなく、元のテーブル構造変更の影響を受けやすい |
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント