В SQL Server можете да правите заявки като изгледи. Изгледите са полезни по много причини, включително сигурност, използваемост и удобство.
В SQL Server, изглед е виртуална таблица, чието съдържание се дефинира от заявка. По същество това е предварително написана заявка, която се съхранява в базата данни.
Изгледът се състои от SELECT
оператор и когато стартирате заявка към изгледа, виждате резултатите от него, както бихте направили, когато отваряте таблица. Изгледите се наричат виртуални таблици, защото могат да събират заедно данни от множество таблици, както и обобщени данни и да ги представят, сякаш са една таблица.
Предимства на изгледите
Изгледът може да бъде полезен, когато има множество потребители с различни нива на достъп, които всички трябва да видят части от данните в базата данни (но не непременно всички данни). Изгледите могат да правят следното:
- Ограничете достъпа до конкретни редове в таблица
- Ограничете достъпа до конкретни колони в таблица
- Обединете колони от множество таблици и ги представете така, сякаш са част от една таблица
- Представете обобщена информация (като резултатите от
COUNT()
функция)
Как да създадете изглед
Създавате изглед, като използвате CREATE VIEW
оператор, последван от SELECT
изявление.
CREATE VIEW ViewName AS SELECT ...
Сега ще създадем изглед от предишната ни заявка.
-
Проектирайте изгледа
Вземете заявката от предишния ни пример и й добавете префикс с CREATE VIEW RecentAlbums AS .
Също така премахнете
ORDER BY
клауза, тъй като изгледите не поддържат тази клауза (освен акоTOP
,OFFSET
илиFOR XML
също е посочено).Също така добавете точка и запетая в края на израза като терминатор на израза (повече за това по-долу).
Примерен код
По-долу е кодът от нашия пример с
ORDER BY
клаузата е премахната и е добавена точка и запетая като терминатор на израза.Също така го преформатирах малко, за да го направя по-четливо).
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()));
В този пример добавих точка и запетая в края на изгледа. Дизайнерът на заявки не е включил това, но е добра практика да го включите.
Точката и запетаята е част от стандарта ANSI SQL-92. Това е терминатор на израза.
Също така, Microsoft обяви, че Transact-SQL изразите, завършващи без точка и запетая, са отхвърлени в SQL Server 2016 и няма да се поддържат в бъдеща версия (SQL Server исторически използва
GO
ключова дума като терминатор на израза вместо точка и запетая). -
Изпълнете изгледа
Сега изпълнете изгледа точно както бихте изпълнили всяка друга заявка.
Щракнете върху Изпълни на лентата с инструменти.
Вече можете да навигирате до изгледа в Object Explorer. Разгънете го и ще видите колоните и техните типове данни и свойства — сякаш е таблица.
-
Запитване на изгледа
След като изгледът е създаден, можете да направите заявка за него, като изпълните
SELECT
изявление срещу него.Така че можете да направите заявка за новосъздадения ни изглед, като използвате
SELECT * FROM RecentAlbums;
. -
Филтрирайте изгледа
Едно от добрите неща за изгледите е, че можете да приложите свои собствени критерии за филтриране спрямо тях – допълнително филтриране на резултатите.
Например, можете да добавите
WHERE Genre = 'Pop'
, така че изгледът връща само pop албуми от последните 10 години.
Промяна на изглед
Можете да промените изгледа си, като използвате ALTER VIEW
оператор вместо CREATE VIEW
изявление.
-
Проектирайте променения изглед
Тук ще променим изгледа си, за да върнем албуми през последните 20 години вместо само 10.
Това е доста стара колекция, така че всеки албум, издаден през последните 20 години, се класифицира като "скорошен" :)
Ще върнем и друга колона:Artists.ActiveFrom
Примерен код
Ето кода, който използваме за примера:
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()));
-
Запитване за изгледа
Сега запитването на изгледа ще върне албуми на стойност 20 години. Той също така ще покаже датата, от която изпълнителят е бил активен.