Widok

Wirtualna tabela oparta na wyniku zapisanego zapytania SQL. Upraszcza dostęp do złożonych danych, nie przechowując ich fizycznie.

Widok (ang. view) to wirtualna tabela, której zawartość pochodzi z zapisanego zapytania SELECT. Sam widok nie trzyma żadnych danych na dysku — przechowuje wyłącznie definicję zapytania. Kiedy się do niego odwołujesz, baza wykonuje zapisany SELECT w locie i podaje wynik tak, jakby to była zwykła tabela. Dla aplikacji czy analityka różnica jest niewidoczna: pytasz SELECT * FROM nazwa_widoku i dostajesz wiersze.

Do czego to służy

Widok ma dwa główne zadania. Pierwsze to upraszczanie: jeśli regularnie sklejasz cztery tabele kilkoma JOIN-ami z filtrami i agregacją, możesz raz zamknąć to w widoku i potem pisać krótkie, czytelne zapytania zamiast kopiować potwora po całym kodzie. Drugie to bezpieczeństwo i abstrakcja: możesz dać użytkownikowi dostęp tylko do widoku, który pokazuje wybrane kolumny (np. bez numeru PESEL czy hasła), nie udostępniając tabeli źródłowej. Bonus: jeśli zmienisz strukturę tabel pod spodem, wystarczy poprawić definicję widoku — aplikacja może nawet nie zauważyć.

Przykład z praktyki

W PostgreSQL czy MySQL tworzysz widok tak:

CREATE VIEW aktywni_klienci AS SELECT id, imie, email FROM klienci WHERE status = 'active';

Od tej chwili SELECT * FROM aktywni_klienci zawsze zwróci świeżą listę aktywnych klientów — bez przepisywania warunku za każdym razem. Gdy widok robi się wąskim gardłem (ciężkie agregacje liczone przy każdym odpytaniu), w PostgreSQL sięgasz po MATERIALIZED VIEW, który fizycznie zapisuje wynik i odświeżasz go komendą REFRESH MATERIALIZED VIEW.

Na co uważać

Najczęstszy mit: „widok przyspiesza zapytania”. Zwykły widok nie jest cache’em — to tylko skrót składniowy. Pod spodem i tak wykonuje się oryginalny SELECT, więc jeśli zapytanie jest wolne, widok będzie równie wolny. Drugą pułapką jest zagnieżdżanie widoków na widokach na widokach — łatwo zbudować łańcuszek, który planer zapytań rozwija w gigantyczny JOIN i nikt już nie wie, dlaczego jest tak ślamazarnie. Pamiętaj też, że nie każdy widok jest aktualizowalny: INSERT czy UPDATE przez widok zadziała tylko przy prostych, jednotabelowych definicjach.

Pojęcia powiązane

Materialized view, tabela, zapytanie SELECT, JOIN, CTE (Common Table Expression), indeks, uprawnienia (GRANT), schemat bazy danych.