🎯 Cele lekcji

🪟

1. Czym jest widok (VIEW)?

Widok (VIEW) to zapisane zapytanie SELECT, które działa jak wirtualna tabela. Nie przechowuje danych — przy każdym odpytaniu wykonuje swoje zapytanie bazowe. Można go używać jak zwykłej tabeli w zapytaniach SELECT.

Zalety widoków:

ZaletaOpis
UproszczenieUkrywa złożone JOINy — użytkownik odpytuje prosty widok
BezpieczeństwoUkrywa wrażliwe kolumny (np. hasła, PESEL) — użytkownik widzi tylko wybrane pola
HermetyzacjaIzoluje zmiany struktury — jeśli zmieni się tabela, można zaktualizować widok bez zmiany aplikacji
SpójnośćWiele aplikacji używa tych samych danych przez widok — zmiany logiki w jednym miejscu
-- Prosty widok: aktywni klienci
CREATE VIEW v_aktywni_klienci AS
SELECT id_klienta, imie, nazwisko, email
FROM klienci
WHERE aktywny = TRUE;

-- Używamy widoku jak tabeli
SELECT * FROM v_aktywni_klienci WHERE nazwisko LIKE 'K%';

-- Widok złożony: statystyki zamówień per klient
CREATE OR REPLACE VIEW v_stats_zamowien AS
SELECT k.imie, k.nazwisko,
       COUNT(z.id_zamowienia) AS liczba_zam,
       COALESCE(SUM(z.kwota), 0) AS suma
FROM klienci k
LEFT JOIN zamowienia z USING(id_klienta)
GROUP BY k.id_klienta, k.imie, k.nazwisko;
⚙️

2. Zarządzanie widokami

-- Tworzenie widoku
CREATE VIEW nazwa_widoku AS SELECT ...;

-- Tworzenie lub zastąpienie istniejącego
CREATE OR REPLACE VIEW nazwa_widoku AS SELECT ...;

-- Zmiana widoku (ALTER VIEW)
ALTER VIEW v_aktywni_klienci AS
SELECT id_klienta, imie, nazwisko, email, telefon
FROM klienci
WHERE aktywny = TRUE;

-- Usunięcie widoku
DROP VIEW v_aktywni_klienci;
DROP VIEW IF EXISTS v_aktywni_klienci;

-- Wyświetlenie definicji widoku
SHOW CREATE VIEW v_aktywni_klienci;

-- WITH CHECK OPTION — zapobiega wstawieniu rekordu poza filtr widoku
CREATE VIEW v_drogie_produkty AS
SELECT * FROM produkty WHERE cena > 1000
WITH CHECK OPTION;
-- INSERT przez ten widok odrzuci produkty z ceną <= 1000
Modyfikowalność widoków: Widok jest modyfikowalny (można przez niego INSERT/UPDATE/DELETE) gdy: bazuje na jednej tabeli, nie ma GROUP BY, DISTINCT, UNION, funkcji agregujących, podzapytań w SELECT.
✏️

Zadania interaktywne

Zadanie 1Quiz: widok vs tabela

Czym różni się widok (VIEW) od zwykłej tabeli?

  • Widok przechowuje dane trwale na dysku, jak tabela, ale tylko dla wybranych kolumn
  • Widok to wirtualna tabela — nie przechowuje danych, wykonuje zapytanie bazowe przy każdym odwołaniu
  • Widok można tworzyć tylko na podstawie jednej tabeli (bez JOIN)
  • Widok zawsze umożliwia operacje INSERT, UPDATE, DELETE
Zadanie 2Napisz CREATE VIEW: niski stan magazynowy

Tabela produkty(id_produktu, nazwa, cena, kategoria, ilosc). Napisz widok v_niski_stan pokazujący produkty z ilością mniejszą niż 5 sztuk:

Zadanie 3Wskaż błąd w CREATE VIEW

Poniższy CREATE VIEW zawiera błąd składniowy. Wskaż go:

CREATE v_aktywni VIEW AS
SELECT id_klienta, imie FROM klienci WHERE aktywny = 1;
  • Brakuje słowa kluczowego REPLACE
  • Błędna kolejność słów: powinno być CREATE VIEW v_aktywni AS (nie CREATE v_aktywni VIEW AS)
  • Nie można używać WHERE w CREATE VIEW
  • Brakuje średnika po nazwie widoku

📌 Zapamiętaj