Widok (VIEW) to zapamiętane zapytanie SELECT, które zachowuje się jak tabela.
Można o tym myśleć tak:
Widok = tabela wirtualna, której zawartość nie jest zapisana na stałe w bazie,
tylko wyświetla dane na podstawie zapisanego zapytania.
Widok nie przechowuje danych — dane są pobierane z prawdziwych tabel za każdym razem, gdy widok jest używany.
Widoki są bardzo przydatne, bo pozwalają:
– uprościć skomplikowane zapytania
Jeśli jakieś SELECT jest długie albo często używane — zapisujemy je jako widok.
– ukryć trudną logikę przed użytkownikami
Np. w firmie użytkownicy mogą mieć dostęp tylko do widoku, a nie do prawdziwych tabel.
– tworzyć raporty
Widoki często zawierają już policzone sumy, średnie, złączenia tabel itp.
– zmniejszyć ilość powtarzanego kodu
Zamiast pisać długiego SELECT za każdym razem → używamy widoku jak tabeli.
Bez widoku:
SELECT p.nazwa, t.ilosc, t.data_sprzedazy
FROM transakcje t
JOIN produkty p ON t.produkt_id = p.id;
Tworzymy widok:
CREATE VIEW sprzedaz_szczegoly AS
SELECT
p.nazwa AS produkt,
t.ilosc,
t.data_sprzedazy,
t.sprzedawca
FROM transakcje t
JOIN produkty p ON t.produkt_id = p.id;
Teraz możemy używać widoku jak tabeli:
SELECT * FROM sprzedaz_szczegoly;
– Widok może pozwalać na INSERT/UPDATE/DELETE, ale:
– tylko jeśli widok jest prosty (bez GROUP BY, bez agregacji, bez DISTINCT),
– musi mieć jasne powiązanie z jedną tabelą.
W naszej nauce na tym etapie:
– Najważniejsze: widoku używa się głównie do odczytu.
DROP VIEW sprzedaz_szczegoly;
CREATE OR REPLACE VIEW sprzedaz_szczegoly AS
SELECT …
Typowe błędy i problemy:
– Widok nie może mieć parametrów
– Nie używamy widoków jak funkcji — zawsze zwracają jeden „ustalony” zestaw danych.
– Widoku nie można stworzyć bez SELECT
– Widoki opierają się tylko na SELECT.
– Widok może wyświetlać dane, których użytkownik nie powinien widzieć
Dlatego w firmach często daje się użytkownikowi dostęp tylko do widoków, a nie do tabel.
Zadanie przykładowe:
– produkty(id, nazwa, kategoria, cena)
– transakcje(id, produkt_id, ilosc, sprzedawca, data_sprzedazy)
– uzupełnij tabele przykładowymi danymi
Stwórz widok, który wyświetla transakcje z nazwą produktu zamiast produkt_id.
Przykład:
CREATE VIEW transakcje_z_nazwa AS
SELECT
t.id,
p.nazwa AS produkt,
t.ilosc,
t.sprzedawca,
t.data_sprzedazy
FROM transakcje t
JOIN produkty p ON t.produkt_id = p.id;
Używamy widoku:
SELECT * FROM transakcje_z_nazwa;