Lekcja 16 – Widoki (Views) w bazach danych

Widoki (ang. views) to potężne narzędzie w SQL, które umożliwia tworzenie logicznych, wirtualnych tabel na podstawie wyników zapytań. Chociaż widoki nie przechowują fizycznych danych, mogą odgrywać kluczową rolę w zwiększeniu czytelności zapytań, zabezpieczeniu danych oraz uproszczeniu dostępu do złożonych informacji. W tej lekcji dokładnie omówimy, czym są widoki, jak je tworzyć i zarządzać nimi w SQL, a także jakie korzyści i ograniczenia wiążą się z ich stosowaniem.

Widoki są szczególnie użyteczne w dużych systemach bazodanowych, gdzie struktura danych jest skomplikowana, a regularnie wykonywane zapytania mogą stać się trudne do zarządzania. Widoki pozwalają na abstrakcję i ukrywanie złożoności baz danych, co ułatwia korzystanie z danych przez użytkowników końcowych i programistów.

Czym jest widok?

Widok to wirtualna tabela stworzona na podstawie wyników zapytania SQL. Widok działa jak tabela, ale nie przechowuje danych fizycznie. Zamiast tego jest dynamicznie generowany za każdym razem, gdy jest wywoływany. Widok może obejmować dane z jednej lub wielu tabel, filtrować, grupować lub łączyć te dane w bardziej przystępną formę. Widoki są przydatne do dostarczania użytkownikom końcowym uproszczonego dostępu do danych lub do zabezpieczenia wrażliwych informacji, które nie powinny być bezpośrednio dostępne.

Widoki można wykorzystywać podobnie jak tabele w zapytaniach SELECT, a także w niektórych przypadkach do aktualizacji, dodawania i usuwania danych.

Korzyści z używania widoków

  1. Uproszczenie złożonych zapytań: Widoki mogą zawierać skomplikowane zapytania, które łączą dane z wielu tabel, agregują wyniki lub stosują skomplikowane filtry. Użytkownicy mogą później korzystać z widoku tak, jakby był to prosty zestaw danych, co znacznie ułatwia pracę z bazą danych.
  2. Zwiększenie bezpieczeństwa: Widoki pozwalają na ukrycie pewnych kolumn lub danych przed użytkownikami. Możemy utworzyć widok, który udostępnia tylko część danych z tabeli, ograniczając dostęp do wrażliwych informacji.
  3. Reużywalność: Skoro widok przechowuje zapytanie, można go wielokrotnie wykorzystywać w różnych miejscach bazy danych, bez konieczności powtarzania tego samego złożonego zapytania. Poprawia to efektywność pracy i eliminuje potrzebę wielokrotnego pisania tych samych operacji.
  4. Separacja danych i logiki: Widoki pomagają w oddzieleniu warstwy danych od aplikacji. Zamiast bezpośrednio odwoływać się do tabel, aplikacje mogą pracować z widokami, które ukrywają szczegóły dotyczące struktury bazy danych.
  5. Łatwość aktualizacji danych: W niektórych przypadkach widoki umożliwiają aktualizowanie danych w bazie. Daje to użytkownikom prostszy sposób na zarządzanie danymi, szczególnie w skomplikowanych systemach z wieloma powiązanymi tabelami.

Tworzenie widoków

Aby utworzyć widok, używamy polecenia CREATE VIEW. Definiujemy widok na podstawie zapytania SELECT, które wskazuje, jakie dane mają być zwracane. Składnia wygląda następująco:

CREATE VIEW nazwa_widoku AS
SELECT kolumna1, kolumna2, ...
FROM tabela
WHERE warunek;

Przykład: Utworzenie widoku dla danych o zamówieniach, który zawiera tylko zamówienia o wartości powyżej 1000 zł.

CREATE VIEW Widok_Zamowienia_Wartosciowe AS
SELECT Zamowienie_ID, Klient_ID, Kwota
FROM Zamowienia
WHERE Kwota > 1000;

Po utworzeniu widoku, można go traktować jak zwykłą tabelę:

SELECT * FROM Widok_Zamowienia_Wartosciowe;

Widok zwróci dane zamówień, które spełniają warunek wartości powyżej 1000 zł.

Widoki złożone

Widoki mogą również łączyć dane z wielu tabel za pomocą operacji JOIN, GROUP BY oraz funkcji agregujących. W ten sposób możemy tworzyć bardziej skomplikowane reprezentacje danych.

Przykład: Utworzenie widoku łączącego dane o klientach i ich zamówieniach, wyświetlającego całkowitą wartość zamówień dla każdego klienta.

CREATE VIEW Widok_Wartosci_Zamowien AS
SELECT Klienci.Klient_ID, Klienci.Imie, Klienci.Nazwisko, SUM(Zamowienia.Kwota) AS CaloscZamowien
FROM Klienci
JOIN Zamowienia ON Klienci.Klient_ID = Zamowienia.Klient_ID
GROUP BY Klienci.Klient_ID, Klienci.Imie, Klienci.Nazwisko;

Teraz widok Widok_Wartosci_Zamowien zwróci listę klientów wraz z całkowitą sumą ich zamówień, co jest szczególnie przydatne do analizowania danych o sprzedaży.

Widoki z aktualizacją danych

W niektórych przypadkach możemy używać widoków do aktualizacji danych, ale nie wszystkie widoki są aktualizowalne. Widok jest aktualizowalny, jeśli jest bezpośrednio związany z jedną tabelą i nie zawiera skomplikowanych operacji, takich jak GROUP BY czy agregacje. Jeśli widok spełnia te warunki, możemy używać go do wstawiania, aktualizowania i usuwania danych.

Przykład: Aktualizacja danych poprzez widok.

CREATE VIEW Widok_Klienci AS
SELECT Klient_ID, Imie, Nazwisko
FROM Klienci;

-- Aktualizacja danych przez widok
UPDATE Widok_Klienci
SET Imie = 'Janusz'
WHERE Klient_ID = 1;

W tym przykładzie widok Widok_Klienci działa jak tabela i pozwala na aktualizowanie danych w tabeli Klienci.

Widoki materializowane

Widoki materializowane (ang. materialized views) to specjalny rodzaj widoków, które przechowują fizycznie dane wynikające z zapytania w widoku. Widok materializowany jest regularnie odświeżany, aby zachować aktualne dane, ale różni się od zwykłego widoku tym, że wynik zapytania jest zapisany na stałe i nie musi być generowany za każdym razem, gdy jest wywoływany. Widoki materializowane są przydatne, gdy często wykonujemy skomplikowane zapytania i chcemy uniknąć wielokrotnego ich przeliczania.

Przykład tworzenia widoku materializowanego w niektórych systemach bazodanowych, takich jak Oracle:

CREATE MATERIALIZED VIEW WidokMaterializowany_Zamowienia AS
SELECT Klient_ID, SUM(Kwota) AS CaloscZamowien
FROM Zamowienia
GROUP BY Klient_ID;

Dzięki widokowi materializowanemu wyniki tego zapytania są fizycznie zapisane, co umożliwia szybkie pobieranie danych bez konieczności ponownego obliczania za każdym razem. Wadą widoków materializowanych jest to, że mogą być czasowo niespójne z aktualnymi danymi, jeśli nie są odświeżane w czasie rzeczywistym.

Zabezpieczenie danych przy użyciu widoków

Widoki mogą służyć jako narzędzie do zabezpieczenia wrażliwych danych w bazie danych. Możemy utworzyć widoki, które udostępniają tylko wybrane kolumny lub wiersze danych, a następnie przyznać uprawnienia użytkownikom tylko do tych widoków, zamiast do pełnych tabel.

Przykład: Ukrywanie kolumny PESEL w tabeli Pracownicy za pomocą widoku.

CREATE VIEW Widok_Pracownicy_Bez_PESEL AS
SELECT Imie, Nazwisko, Stanowisko
FROM Pracownicy;

Użytkownicy, którym przydzielimy dostęp tylko do widoku Widok_Pracownicy_Bez_PESEL, nie będą mieli dostępu do wrażliwych danych z kolumny PESEL.

Ograniczenia widoków

Mimo że widoki są bardzo przydatnym narzędziem, mają pewne ograniczenia:

  1. Brak fizycznych danych: Widoki nie przechowują danych fizycznie (chyba że są to widoki materializowane), co oznacza, że za każdym razem, gdy widok jest wywoływany, baza danych musi przetworzyć oryginalne zapytanie. Może to być problematyczne w przypadku bardzo złożonych widoków, które łączą wiele tabel.
  2. Nie wszystkie widoki są aktualizowalne: Widoki, które zawierają operacje takie jak JOIN, GROUP BY lub DISTINCT, nie mogą być używane do aktualizowania danych. Tylko widoki oparte na jednej tabeli i bez złożonych operacji mogą być aktualizowane.
  3. Spowolniona wydajność: Jeśli widok jest bardzo skomplikowany, a dane muszą być generowane dynamicznie, każde wywołanie widoku może być czasochłonne. Dlatego w takich przypadkach lepszym rozwiązaniem mogą być widoki materializowane.
  4. Ograniczona elastyczność: Widoki są statycznymi definicjami zapytań. Jeśli struktura tabeli zostanie zmieniona (np. dodanie lub usunięcie kolumny), widok może przestać działać, co wymaga jego aktualizacji.

Zarządzanie widokami

W SQL możemy modyfikować, usuwać i zarządzać widokami podobnie jak tabelami. Aby usunąć widok, używamy polecenia DROP VIEW:

DROP VIEW nazwa_widoku;

Jeśli chcemy zmienić definicję widoku, możemy użyć polecenia CREATE OR REPLACE VIEW, które aktualizuje istniejący widok bez konieczności jego usuwania:

CREATE OR REPLACE VIEW Widok_Zamowienia_Wartosciowe AS
SELECT Zamowienie_ID, Klient_ID, Kwota
FROM Zamowienia
WHERE Kwota > 500;

To polecenie zastąpi istniejący widok nową wersją, która zmienia próg wartości zamówień z 1000 zł na 500 zł.

Podsumowanie

Widoki są potężnym narzędziem w SQL, które umożliwia tworzenie logicznych reprezentacji danych w bazie, ukrywając złożoność struktury tabel oraz zwiększając bezpieczeństwo i czytelność zapytań. Umożliwiają one uproszczenie dostępu do danych, a także tworzenie skomplikowanych operacji na danych w sposób bardziej zrozumiały i elastyczny dla użytkowników. Widoki materializowane dodatkowo oferują możliwość przechowywania wyników zapytań, co zwiększa wydajność w przypadku skomplikowanych operacji.

W kolejnej lekcji omówimy procedury składowane (Stored Procedures) i funkcje, które pozwalają na automatyzowanie operacji w bazie danych oraz tworzenie złożonych logik bezpośrednio w systemie zarządzania bazą danych.

Gratulacje! Ukończyłeś lekcję 16.
Przejdź teraz do lekcji 17 >> Procedury składowane (Stored Procedures) i funkcje w SQL


Spis Treści - darmowy kurs SQL


Wprowadzenie: Czym jest baza danych?
Lekcja 1: Instalacja dedykowanego środowiska dla SQL
Lekcja 2: Tworzenie bazy danych
Lekcja 3: Tworzenie tabel w SQL
Lekcja 4: Wstawianie danych do bazy danych SQL
Lekcja 5: Pobieranie danych z bazy danych SQL
Lekcja 6: Aktualizacja i usuwanie danych SQL
Lekcja 7: Operacje na danych (JOIN)
Lekcja 8: Funkcje agregujące i grupowanie danych (GROUP BY)
Lekcja 9: Podzapytania (Subqueries)
Lekcja 10: Indeksy w bazach danych
Lekcja 11: Optymalizacja zapytań SQL
Lekcja 12: Transakcje w bazach danych
Lekcja 13: Zarządzanie blokadami (Locks) i dostępem do danych
Lekcja 14: Replikacja danych w bazach danych
Lekcja 15: Partycjonowanie danych SQL
Lekcja 16: Widoki (Views) w bazach danych
Lekcja 17: Procedury składowane (Stored Procedures) i funkcje w SQL
Lekcja 18: Wyzwalacze (Triggers) w bazach danych
Lekcja 19: Zaawansowane indeksowanie w bazach danych
Lekcja 20: Narzędzia do zarządzania dużymi danymi (Big Data) w SQL
Lekcja 21: Bezpieczeństwo baz danych


Dodatki: 
- Spis najważniejszych funkcji SQL