たまに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 |
- ビュー:コース数
このビューは各学生のコース数を数える:
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 |
- ビュー:平均点 これは学生ごとの平均点(成績が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;
- この
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つのVIEWに1つのロジック。例えばreport_enrollments_by_monthやreport_payments_by_yearみたいに。
- アクセス制限
個人情報なしの限定データだけ見せるVIEWを作って、それだけアクセス権を与えるとか。
- 再利用
サブクエリをコピペする代わりに、VIEWとして名前を付けて使い回そう。
おすすめポイント
- わかりやすい名前を付けよう:
view_avg_scores_by_groupやactive_users_viewみたいにすると読みやすい。 VIEWの中でさらにVIEWを重ねるのはやめよう ― わかりにくくなるしデバッグも大変。- パフォーマンスに注意: PostgreSQLは
VIEWを毎回クエリごとに再計算する(MATERIALIZED VIEWじゃない限り)。
VIEWはPostgreSQLで一番シンプルで便利なツールのひとつ。新しい知識は要らなくて、「このクエリ、保存してテーブルみたいに使えないかな?」って発想だけでOK。クエリがゴチャゴチャしてきたら、たぶんVIEWにする価値アリ!
GO TO FULL VERSION