CodeGym /Kurse /SQL SELF /Views (`VIEW`) in PostgreSQL

Views (`VIEW`) in PostgreSQL

SQL SELF
Level 13 , Lektion 4
Verfügbar

Manchmal werden SQL-Queries einfach zu groß, zu kompliziert und wiederholen sich ständig. Zum Beispiel baust du einen Report über Studierende mit deren Durchschnittsnoten und der Anzahl der Kurse – und schreibst denselben Subquery an fünf Stellen. Damit du nicht immer wieder das Gleiche kopierst, nutze Views – oder VIEW.

VIEW ist wie ein „gespeicherter Query“, dem du einen Namen gibst und den du wie eine Tabelle ansprechen kannst. Er speichert keine Daten, sondern nur die Struktur des Queries.

Das ist besonders praktisch, wenn du:

  • den SQL-Code lesbarer machen willst,
  • eine komplexe Abfrage wiederverwenden möchtest,
  • technische Details vor Usern verstecken willst,
  • Zugriffsrechte steuern willst (nur die nötigen Daten zeigen).

Wie funktioniert ein VIEW?

Ein View erstellen heißt, eine Pseudo-Tabelle auf Basis eines SELECT-Queries zu bauen. Zum Beispiel:

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;

Jetzt kannst du student_avg_grades wie eine normale Tabelle abfragen:

SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;

Uni-Beispiel

Du analysierst oft Studierende, ihre Kurse und Noten. Stell dir vor, du willst einen zusammengefassten Report für jede:n Studierende:n bauen:

  • Name,
  • Anzahl der Kursanmeldungen,
  • Durchschnittsnote.

Wenn du das alles in einem Query machst – wird das SQL lang und schwer lesbar. Viel besser ist es, die Aufgabe zu splitten: Erst zwei Views (VIEW) bauen, dann zusammenführen.

Tabelle students

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

Tabelle 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. View: Anzahl der Kurse

Dieses View zählt, wie viele Kurse jede:r Studierende hat:

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

Ergebnis:

name
Alex Lin
Anna Song
Maria Chi
  1. View: Durchschnittsnote Das hier ist die Durchschnittsnote pro Studierende:n (wenn keine Note – NULL, zählt nicht mit):
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. So nutzt du diese 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;

Jetzt hast du einen sauberen und verständlichen Query. Und das Beste: Er ist easy zu pflegen.

Aktualisierbarkeit von VIEW

Views enthalten normalerweise keine Daten – sie sind einfach ein „Wrapper“ um einen Query. Trotzdem kannst du sie manchmal sogar zum Updaten von Daten nutzen, wenn das VIEW ein paar Bedingungen erfüllt (z.B. ohne JOIN, GROUP BY, Aggregatfunktionen und Subqueries).

Beispiel für ein aktualisierbares View:

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

Jetzt kannst du machen:

UPDATE active_students SET name = 'Ivan Petrov' WHERE student_id = 2;

Aber wenn das VIEW kompliziert ist (z.B. mit JOIN oder GROUP BY), ist es nur lesbar. Für Updates kannst du INSTEAD OF Trigger nutzen, aber das ist schon Advanced-Topic.

Wie löscht oder änderst du ein VIEW

Löschen:

DROP VIEW student_avg_grade;

Ändern:

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

Beispiele: Wann ist ein VIEW besonders praktisch?

  1. Reports bauen

Ein VIEW – eine Logik. Du kannst z.B. report_enrollments_by_month, report_payments_by_year usw. machen.

  1. Zugriffsrechte steuern

Erstelle ein VIEW, das nur eingeschränkte Daten zeigt (z.B. ohne persönliche Daten) und gib nur darauf Zugriff.

  1. Wiederverwenden

Statt einen Subquery zu kopieren – gib ihm einen Namen als VIEW.

Tipps

  • Gib sinnvolle Namen: view_avg_scores_by_group, active_users_view – so liest sich das viel besser.
  • Mach keine Ketten von VIEW in VIEW in VIEW – das macht alles nur komplizierter und schwerer zu debuggen.
  • Achte auf die Performance: PostgreSQL berechnet das VIEW bei jedem Query neu, außer es ist ein MATERIALIZED VIEW.

VIEW ist eines der einfachsten und praktischsten Tools in PostgreSQL. Du brauchst kein neues Wissen, nur ein Umdenken: „Vielleicht speichere ich diesen Query und nutze ihn wie eine Tabelle?“ Wenn dein Query zu fett wird – dann ist es fast immer Zeit für ein VIEW.

1
Umfrage/Quiz
Verschachtelte SELECTs, Level 13, Lektion 4
Nicht verfügbar
Verschachtelte SELECTs
Verschachtelte SELECTs
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION