In SQL Server è possibile eseguire query come viste. Le visualizzazioni sono vantaggiose per molti motivi, tra cui sicurezza, usabilità e praticità.
In SQL Server, una vista è una tabella virtuale il cui contenuto è definito da una query. È fondamentalmente una query pre-scritta che viene archiviata nel database.
Una vista consiste in un SELECT
istruzione e quando esegui una query sulla vista, ne vedi i risultati come faresti quando apri una tabella. Le viste sono denominate tabelle virtuali perché possono riunire i dati di più tabelle, nonché aggregare i dati e presentarli come se fosse un'unica tabella.
Vantaggi delle viste
Una vista può essere utile quando sono presenti più utenti con diversi livelli di accesso, che devono tutti visualizzare parti dei dati nel database (ma non necessariamente tutti i dati). Le visualizzazioni possono eseguire le seguenti operazioni:
- Limita l'accesso a righe specifiche in una tabella
- Limita l'accesso a colonne specifiche in una tabella
- Unisci colonne di più tabelle e presentale come se facessero parte di un'unica tabella
- Presenta informazioni aggregate (come i risultati di
COUNT()
funzione)
Come creare una vista
Puoi creare una vista utilizzando CREATE VIEW
istruzione, seguita da SELECT
dichiarazione.
CREATE VIEW ViewName AS SELECT ...
Ora creeremo una vista dalla nostra query precedente.
-
Progetta la vista
Prendi la query dal nostro esempio precedente e anteponila con CREATE VIEW RecentAlbums AS .
Rimuovi anche il
ORDER BY
clausola, perché le viste non supportano questa clausola (a meno cheTOP
,OFFSET
oFOR XML
è anche specificato).Aggiungi anche un punto e virgola alla fine dell'istruzione, come terminatore di istruzione (ne parleremo più avanti).
Codice campione
Di seguito è riportato il codice del nostro esempio, con
ORDER BY
clausola rimossa e punto e virgola aggiunto come terminatore di istruzione.L'ho anche riformattato un po' per renderlo più leggibile).
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()));
In questo esempio ho aggiunto un punto e virgola alla fine della vista. Query Designer non lo ha incluso, ma è buona norma includerlo.
Il punto e virgola fa parte dello standard ANSI SQL-92. È un carattere terminatore di istruzione.
Inoltre, Microsoft ha annunciato che le istruzioni Transact-SQL senza punto e virgola sono deprecate in SQL Server 2016 e non saranno supportate in una versione futura (SQL Server ha storicamente utilizzato
GO
parola chiave come terminatore di un'istruzione invece del punto e virgola). -
Esegui la vista
Ora esegui la vista come eseguiresti qualsiasi altra query.
Fai clic su Esegui sulla barra degli strumenti.
È ora possibile passare alla vista in Esplora oggetti. Espandilo e vedrai le colonne e i relativi tipi di dati e proprietà, come se fosse una tabella.
-
Interroga la vista
Ora che la vista è stata creata, puoi interrogare la vista eseguendo un
SELECT
dichiarazione contro di essa.Quindi puoi interrogare la nostra vista appena creata usando
SELECT * FROM RecentAlbums;
. -
Filtra la vista
Uno degli aspetti positivi delle visualizzazioni è che puoi applicare i tuoi criteri di filtraggio su di esse, filtrando ulteriormente i risultati.
Ad esempio, puoi aggiungere
WHERE Genre = 'Pop'
, in modo che la vista restituisca solo pop album degli ultimi 10 anni.
Modificare una vista
Puoi modificare la tua visualizzazione utilizzando ALTER VIEW
istruzione invece di CREATE VIEW
dichiarazione.
-
Progetta la vista modificata
Qui modificheremo la nostra visualizzazione per restituire gli album degli ultimi 20 anni anziché solo 10.
È una raccolta piuttosto vecchia, quindi qualsiasi album pubblicato negli ultimi 20 anni è classificato come "recente" :)
Restituiremo anche un'altra colonna:Artists.ActiveFrom
Codice campione
Ecco il codice che utilizziamo per l'esempio:
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()));
-
Interroga la vista
Ora, interrogare la vista restituirà 20 anni di album. Mostrerà anche la data da cui l'artista era attivo.