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.