CodeGym /コース /SQL SELF /PostgreSQLのビュー(`VIEW`)について

PostgreSQLのビュー(`VIEW`)について

SQL SELF
レベル 13, レッスン 4
使用可能

たまにSQLクエリがめっちゃ長くて複雑で、しかも何度も同じサブクエリを書いてることない?例えば、学生ごとの平均点や履修コース数のレポートを作るとき、同じサブクエリを5ヶ所で使ってたり。そんなとき、毎回コピペするのは面倒だし、ビュー(VIEW)を使うと超便利!

VIEWは「保存されたクエリ」みたいなもので、名前を付けてテーブルみたいに扱えるよ。 データ自体は保存しないで、クエリの構造だけ持ってる感じ。

こんなときに特に役立つ:

  • SQLコードの読みやすさをアップしたいとき
  • 複雑なクエリを再利用したいとき
  • ユーザーから技術的な詳細を隠したいとき
  • アクセス権を分けたいとき(必要なデータだけ見せる)

VIEWってどう動くの?

ビューを作るってことは、SELECTクエリから疑似テーブルを作るってこと。例えば:

CREATE VIEW student_avg_grades AS
SELECT 
    s.student_id,
    s.name,
    AVG(g.grade) AS avg_grade
FROM 
    students s
JOIN 
    grades g ON s.student_id = g.student_id
GROUP BY 
    s.student_id, s.name;

これでstudent_avg_gradesを普通のテーブルみたいに使える:

SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;

大学の例

学生・コース・成績をよく分析するよね。例えば、各学生ごとのまとめレポートを作りたいとする:

  • 名前
  • 履修コース数
  • 平均点

これを一発でやろうとすると、SQLが長くて読みにくくなる。だから、まず2つのビュー(VIEW)を作ってから、それを組み合わせると超ラク!

studentsテーブル

id name
1 Alex Lin
2 Anna Song
3 Maria Chi
4 Dan Seth

enrollmentsテーブル

student_id course_id grade
1 1 90
1 2 85
2 2 88
2 3 91
3 1 75
3 3 NULL
  1. ビュー:コース数

このビューは各学生のコース数を数える:

CREATE VIEW student_course_count AS
SELECT 
    student_id,
    COUNT(*) AS course_count
FROM 
    enrollments
GROUP BY student_id;

結果:

name
Alex Lin
Anna Song
Maria Chi
  1. ビュー:平均点 これは学生ごとの平均点(成績がNULLなら無視される):
CREATE VIEW student_avg_grade AS
SELECT
student_id,
AVG(grade) AS avg_grade
FROM
enrollments
WHERE grade IS NOT NULL
GROUP BY student_id;
  1. このVIEWたちを使う
SELECT
    s.name,
    c.course_count,
    a.avg_grade
FROM 
    students s
LEFT JOIN student_course_count c ON s.student_id = c.student_id
LEFT JOIN student_avg_grade a ON s.student_id = a.student_id;

これでクエリがスッキリして超わかりやすい!しかもメンテも簡単。

VIEWの更新可否

ビューは普通データを持たない ― ただのクエリの「ラッパー」だよ。でも、更新もできる場合がある(例えばJOINやGROUP BY、集約やサブクエリがない場合など)。

更新できるビューの例:

CREATE VIEW active_students AS
SELECT * FROM students WHERE active = true;

これで:

UPDATE active_students SET name = 'イワン・ペトロフ' WHERE student_id = 2;

みたいにできる。

でもVIEWが複雑(例えばJOINやGROUP BYがある)だと読み取り専用になる。更新したい場合はINSTEAD OFトリガーを使うけど、これは上級テク。

VIEWの削除や変更

削除:

DROP VIEW student_avg_grade;

更新:

CREATE OR REPLACE VIEW student_avg_grade AS
SELECT student_id, ROUND(AVG(grade), 2) AS avg_grade
FROM grades
GROUP BY student_id;

例:VIEWが特に便利なとき

  1. レポート作成

1つのVIEWに1つのロジック。例えばreport_enrollments_by_monthやreport_payments_by_yearみたいに。

  1. アクセス制限

個人情報なしの限定データだけ見せるVIEWを作って、それだけアクセス権を与えるとか。

  1. 再利用

サブクエリをコピペする代わりに、VIEWとして名前を付けて使い回そう。

おすすめポイント

  • わかりやすい名前を付けよう: view_avg_scores_by_groupやactive_users_viewみたいにすると読みやすい。
  • VIEWの中でさらにVIEWを重ねるのはやめよう ― わかりにくくなるしデバッグも大変。
  • パフォーマンスに注意: PostgreSQLはVIEWを毎回クエリごとに再計算する(MATERIALIZED VIEWじゃない限り)。

VIEWはPostgreSQLで一番シンプルで便利なツールのひとつ。新しい知識は要らなくて、「このクエリ、保存してテーブルみたいに使えないかな?」って発想だけでOK。クエリがゴチャゴチャしてきたら、たぶんVIEWにする価値アリ!

2
タスク
SQL SELF, レベル 13, レッスン 4
ロック未解除
シンプルなビューの作成
シンプルなビューの作成
2
タスク
SQL SELF, レベル 13, レッスン 4
ロック未解除
複数のテーブルからデータを結合したビューの作成
複数のテーブルからデータを結合したビューの作成
1
アンケート/クイズ
ネストされたSELECT、レベル 13、レッスン 4
使用不可
ネストされたSELECT
ネストされたSELECT
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION