W SQL Server zapytania można wykonywać jako widoki. Widoki są korzystne z wielu powodów, w tym bezpieczeństwa, użyteczności i wygody.
W SQL Server widok to wirtualna tabela, której zawartość jest definiowana przez zapytanie. Jest to w zasadzie wstępnie napisane zapytanie, które jest przechowywane w bazie danych.
Widok składa się z SELECT
instrukcji, a kiedy uruchamiasz zapytanie względem widoku, widzisz jego wyniki tak, jak podczas otwierania tabeli. Widoki są określane jako tabele wirtualne, ponieważ mogą gromadzić dane z wielu tabel, a także agregować dane i przedstawiać je tak, jakby była to pojedyncza tabela.
Zalety widoków
Widok może być przydatny, gdy istnieje wielu użytkowników o różnych poziomach dostępu, z których wszyscy muszą widzieć części danych w bazie danych (ale niekoniecznie wszystkie dane). Widoki mogą wykonywać następujące czynności:
- Ogranicz dostęp do określonych wierszy w tabeli
- Ogranicz dostęp do określonych kolumn w tabeli
- Połącz kolumny z wielu tabel i prezentuj je tak, jakby były częścią jednej tabeli
- Przedstawiaj informacje zbiorcze (takie jak wyniki
COUNT()
funkcja)
Jak utworzyć widok
Widok tworzysz za pomocą CREATE VIEW
instrukcja, po której następuje SELECT
oświadczenie.
CREATE VIEW ViewName AS SELECT ...
Utworzymy teraz widok z naszego poprzedniego zapytania.
-
Zaprojektuj widok
Weź zapytanie z naszego poprzedniego przykładu i poprzedź je przedrostkiem CREATE VIEW RecentAlbums AS .
Usuń także
ORDER BY
klauzula, ponieważ widoki nie obsługują tej klauzuli (chyba żeTOP
,OFFSET
lubFOR XML
jest również określony).Dodaj również średnik na końcu instrukcji, jako terminator instrukcji (więcej na ten temat poniżej).
Przykładowy kod
Poniżej znajduje się kod z naszego przykładu, z
ORDER BY
klauzula usunięta i dodany średnik jako terminator instrukcji.Sformatowałem go również trochę, aby był bardziej czytelny).
CREATE VIEW RecentAlbums AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - 10, GETDATE()));
W tym przykładzie dodałem średnik na końcu widoku. Projektant zapytań tego nie uwzględnił, ale warto to uwzględnić.
Średnik jest częścią standardu ANSI SQL-92. Jest to znak zakończenia instrukcji.
Ponadto firma Microsoft ogłosiła, że instrukcje Transact-SQL zakończone średnikami są przestarzałe w SQL Server 2016 i nie będą obsługiwane w przyszłej wersji (SQL Server historycznie używał
GO
słowo kluczowe jako terminator instrukcji zamiast średnika). -
Wykonaj widok
Teraz wykonaj widok tak, jak wykonujesz każde inne zapytanie.
Kliknij Wykonaj na pasku narzędzi.
Możesz teraz przejść do widoku w Eksploratorze obiektów. Rozwiń go, a zobaczysz kolumny oraz ich typy danych i właściwości — tak, jakby to była tabela.
-
Zapytaj widok
Teraz, gdy widok został utworzony, możesz wysłać zapytanie do widoku, uruchamiając
SELECT
oświadczenie przeciwko niemu.Możesz więc wysłać zapytanie do naszego nowo utworzonego widoku, używając
SELECT * FROM RecentAlbums;
. -
Filtruj widok
Jedną z dobrych rzeczy związanych z widokami jest to, że możesz zastosować wobec nich własne kryteria filtrowania — dalsze filtrowanie wyników.
Na przykład możesz dodać
WHERE Genre = 'Pop'
, dzięki czemu widok zwraca tylko pop albumy z ostatnich 10 lat.
Zmień widok
Możesz zmodyfikować swój widok, używając ALTER VIEW
instrukcja zamiast CREATE VIEW
oświadczenie.
-
Zaprojektuj zmieniony widok
Tutaj zmodyfikujemy nasz pogląd, aby zwracać albumy z ostatnich 20 lat zamiast zaledwie 10.
To dość oldschoolowa kolekcja, więc każdy album wydany w ciągu ostatnich 20 lat jest klasyfikowany jako „najnowszy” :)
Zwrócimy również inną kolumnę:Artists.ActiveFrom
Przykładowy kod
Oto kod, którego używamy w przykładzie:
ALTER VIEW RecentAlbums AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - 20, GETDATE()));
-
Zapytaj widok
Teraz zapytanie o widok zwróci albumy z 20 lat. Wyświetli również datę, od której artysta był aktywny.