CodeGym /Kursy /SQL SELF /Widoki ( VIEW) w PostgreSQL

Widoki ( VIEW) w PostgreSQL

SQL SELF
Poziom 13 , Lekcja 4
Dostępny

Czasem zapytania SQL robią się za długie, skomplikowane i powtarzalne. Na przykład, budujesz raport o studentach z ich średnimi ocenami i liczbą kursów — i piszesz ten sam subquery w pięciu miejscach. Żeby nie kopiować tego w kółko, użyj widoków — czyli VIEW.

VIEW to taki “zapisany query”, któremu możesz nadać nazwę i traktować jak tabelę. On nie przechowuje danych, tylko strukturę zapytania.

To szczególnie przydatne, gdy chcesz:

  • uprościć czytelność kodu SQL;
  • wielokrotnie używać złożonej selekcji;
  • ukryć techniczne szczegóły przed userami;
  • ograniczyć poziomy dostępu (pokazywać tylko potrzebne dane).

Jak działa VIEW?

Stworzenie widoku to jak stworzenie pseudotabeli na bazie zapytania SELECT. Przykład:

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;

Teraz możesz używać student_avg_grades jak zwykłej tabeli:

SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;

Przykład z uniwersytetu

Często analizujesz studentów, ich kursy i oceny. Załóżmy, że trzeba zrobić zbiorczy raport dla każdego studenta:

  • imię,
  • liczba zapisów na kursy,
  • średnia ocena.

Jeśli spróbujesz zrobić to jednym zapytaniem — wyjdzie długi i nieczytelny SQL. O wiele wygodniej rozbić zadanie: najpierw tworzymy dwa widoki (VIEW), a potem je łączymy.

Tabela students

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

Tabela 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. Widok: liczba kursów

Ten widok liczy, ile kursów ma każdy student:

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

Wynik:

name
Alex Lin
Anna Song
Maria Chi
  1. Widok: średnia ocena A to — średnia ocena studenta (jeśli nie ma oceny — NULL, i ona nie wpływa):
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. Użycie tych 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;

Teraz masz czyste i czytelne zapytanie. A co najważniejsze — łatwo je utrzymać.

Aktualizowalność VIEW

Widoki zazwyczaj nie przechowują danych — to po prostu "owijka" na zapytaniu. Ale możesz ich używać nawet do aktualizacji danych, jeśli VIEW spełnia kilka warunków (np. bez JOIN, GROUP BY, agregatów i subquery).

Przykład aktualizowalnego widoku:

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

Teraz możesz wykonać:

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

Ale jeśli VIEW jest skomplikowany (np. zawiera JOIN albo GROUP BY), staje się tylko do odczytu. Do aktualizacji możesz użyć INSTEAD OF triggerów, ale to już wyższy poziom.

Jak usunąć lub zmienić VIEW

Usuwanie:

DROP VIEW student_avg_grade;

Aktualizacja:

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

Przykłady: kiedy VIEW jest szczególnie przydatny

  1. Budowanie raportów

Jeden VIEW — jedna logika. Możesz zrobić report_enrollments_by_month, report_payments_by_year itd.

  1. Ograniczanie dostępu

Stwórz VIEW, który pokazuje tylko ograniczone dane (np. bez danych osobowych) i daj dostęp tylko do niego.

  1. Wielokrotne użycie

Zamiast kopiować subquery — nadaj mu nazwę jako VIEW.

Tipy

  • Dawaj sensowne nazwy: view_avg_scores_by_group, active_users_view — tak łatwiej czytać.
  • Nie rób łańcuchów VIEW w VIEW w VIEW — to utrudnia zrozumienie i debugowanie.
  • Patrz na wydajność: PostgreSQL będzie przeliczał VIEW przy każdym zapytaniu, jeśli to nie jest MATERIALIZED VIEW.

VIEW to jeden z najprostszych i najwygodniejszych narzędzi w PostgreSQL. Nie wymagają nowych umiejętności, tylko innego podejścia: „Może zapisać to zapytanie i używać jak tabeli?” Jeśli twoje zapytanie robi się za duże — prawie na pewno zasługuje, żeby zostać VIEW.

1
Ankieta/quiz
Zagnieżdżone SELECT, poziom 13, lekcja 4
Niedostępny
Zagnieżdżone SELECT
Zagnieżdżone SELECT
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION