I SQL Server kan du göra frågor som vyer. Visningar är fördelaktiga av många skäl, inklusive säkerhet, användbarhet och bekvämlighet.
I SQL Server, en vy är en virtuell tabell vars innehåll definieras av en fråga. Det är i princip en förskriven fråga som lagras i databasen.
En vy består av en SELECT
uttalande, och när du kör en fråga mot vyn ser du resultatet av den som när du öppnar en tabell. Vyer kallas virtuella tabeller eftersom de kan dra ihop data från flera tabeller, såväl som aggregerad data, och presentera det som om det vore en enda tabell.
Fördelar med vyer
En vy kan vara användbar när det finns flera användare med olika åtkomstnivåer, som alla behöver se delar av data i databasen (men inte nödvändigtvis all data). Vyer kan göra följande:
- Begränsa åtkomsten till specifika rader i en tabell
- Begränsa åtkomsten till specifika kolumner i en tabell
- Sammanfoga kolumner från flera tabeller och presentera dem som om de är en del av en enda tabell
- Presentera samlad information (som resultaten av
COUNT()
funktion)
Hur man skapar en vy
Du skapar en vy genom att använda CREATE VIEW
sats, följt av SELECT
uttalande.
CREATE VIEW ViewName AS SELECT ...
Vi kommer nu att skapa en vy från vår tidigare fråga.
-
Designa vyn
Ta frågan från vårt tidigare exempel och prefix den med CREATE VIEW RecentAlbums AS .
Ta också bort
ORDER BY
sats, eftersom vyer inte stöder denna sats (såvida inteTOP
,OFFSET
ellerFOR XML
anges också).Lägg också till ett semikolon i slutet av satsen, som en terminator (mer om det nedan).
Exempelkod
Nedan är koden från vårt exempel, med
ORDER BY
sats borttagen, och ett semikolon läggs till som en satsterminator.Jag har också formaterat om den lite för att göra den mer läsbar).
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()));
I det här exemplet lade jag till ett semikolon i slutet av vyn. Frågedesignern inkluderade inte detta, men det är bra att inkludera det.
Semikolonet är en del av ANSI SQL-92-standarden. Det är ett tecken för uttalandeavslutning.
Microsoft har också meddelat att Transact-SQL-satser som inte slutar med semikolon är utfasade i SQL Server 2016, och de kommer inte att stödjas i en framtida version (SQL Server har historiskt använt
GO
nyckelord som en satsterminator istället för semikolon). -
Kör vyn
Kör nu vyn precis som du skulle köra vilken annan fråga som helst.
Klicka på Kör i verktygsfältet.
Du kan nu navigera till vyn i Objektutforskaren. Expandera den så ser du kolumnerna och deras datatyper och egenskaper – som om det vore en tabell.
-
Fråga vyn
Nu när vyn har skapats kan du fråga vyn genom att köra en
SELECT
uttalande mot det.Så du kan fråga vår nyskapade vy genom att använda
SELECT * FROM RecentAlbums;
. -
Filtrera vyn
En av de bra sakerna med vyer är att du kan tillämpa dina egna filtreringskriterier mot dem – filtrera resultaten ytterligare.
Till exempel kan du lägga till
WHERE Genre = 'Pop'
, så att vyn bara returnerar pop album från de senaste 10 åren.
Ändra en vy
Du kan ändra din vy genom att använda ALTER VIEW
sats istället för CREATE VIEW
uttalande.
-
Designa den ändrade vyn
Här kommer vi att ändra vår syn på att returnera album under de senaste 20 åren istället för bara 10.
Det är en ganska gammal samling, så alla album som släppts under de senaste 20 åren klassificeras som "senaste" :)
Vi kommer också att returnera en annan kolumn:Artists.ActiveFrom
Exempelkod
Här är koden vi använder för exemplet:
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()));
-
Fråga vyn
Om du nu frågar efter vyn kommer du att returnera 20 års album. Det kommer också att visa det datum artisten var aktiv från.