Sådan opretter du en forespørgsel i en SQL Server 2017-database.
En af de mest grundlæggende forespørgsler, du kan gøre, går sådan her:
SELECT * FROM TableName;
Denne forespørgsel returnerer alle data fra en given tabel. TableName
er navnet på den tabel, du vil forespørge på. Alt du skal gøre er at erstatte det med navnet på en tabel i din database, køre forespørgslen, og indholdet af den tabel vil blive vist.
Vores database består af tre tabeller. Hver indeholder data. Lad os se, hvad der er i hver tabel.
Artists
tabel:
SELECT * FROM Artists;Resultat
ArtistId ArtistName ActiveFrom -------- ---------------------- ------------------------ 1 Iron Maiden 1975-12-25T00:00:00.000Z 2 AC/DC 1973-01-11T00:00:00.000Z 3 Allan Holdsworth 1969-01-01T00:00:00.000Z 4 Buddy Rich 1919-01-01T00:00:00.000Z 5 Devin Townsend 1993-01-01T00:00:00.000Z 6 Jim Reeves 1948-01-01T00:00:00.000Z 7 Tom Jones 1963-01-01T00:00:00.000Z 8 Maroon 5 1994-01-01T00:00:00.000Z 9 The Script 2001-01-01T00:00:00.000Z 10 Lit 1988-06-26T00:00:00.000Z 11 Black Sabbath 1968-01-01T00:00:00.000Z 12 Michael Learns to Rock 1988-03-15T00:00:00.000Z 13 Carabao 1981-01-01T00:00:00.000Z 14 Karnivool 1997-01-01T00:00:00.000Z 15 Birds of Tokyo 2004-01-01T00:00:00.000Z 16 Bodyjar 1990-01-01T00:00:00.000Z 16 row(s) returned Executed in 1 ms
Albums
tabel:
SELECT * FROM Albums;Resultat
AlbumId AlbumName ReleaseDate ArtistId GenreId ------- ------------------------ ------------------------ -------- ------- 1 Powerslave 1984-09-03T00:00:00.000Z 1 1 2 Powerage 1978-05-05T00:00:00.000Z 2 1 3 Singing Down the Lane 1956-01-01T00:00:00.000Z 6 3 4 Ziltoid the Omniscient 2007-05-21T00:00:00.000Z 5 1 5 Casualties of Cool 2014-05-14T00:00:00.000Z 5 1 6 Epicloud 2012-09-18T00:00:00.000Z 5 1 31 Somewhere in Time 1986-09-29T00:00:00.000Z 1 1 32 Piece of Mind 1983-05-16T00:00:00.000Z 1 1 33 Killers 1981-02-02T00:00:00.000Z 1 1 34 No Prayer for the Dying 1990-10-01T00:00:00.000Z 1 1 35 No Sound Without Silence 2014-09-12T00:00:00.000Z 9 4 36 Big Swing Face 1967-06-01T00:00:00.000Z 4 2 37 Blue Night 2000-11-01T00:00:00.000Z 12 4 38 Eternity 2008-10-27T00:00:00.000Z 12 4 39 Scandinavia 2012-06-11T00:00:00.000Z 12 4 40 Long Lost Suitcase 2015-10-09T00:00:00.000Z 7 4 41 Praise and Blame 2010-06-26T00:00:00.000Z 7 4 42 Along Came Jones 1965-05-21T00:00:00.000Z 7 4 43 All Night Wrong 2002-05-05T00:00:00.000Z 3 2 44 The Sixteen Men of Tain 2000-03-20T00:00:00.000Z 3 2 20 row(s) returned Executed in 1 ms
Genres
tabel:
SELECT * FROM Genres;Resultat
GenreId Genre ------- ------- 1 Rock 2 Jazz 3 Country 4 Pop 5 Blues 6 Hip Hop 7 Rap 8 Punk 8 row(s) returned Executed in 1 ms
I alle tre tilfælde var vores forespørgsel den samme. Det eneste, der ændrede sig, var tabelnavnet.
Dette er en af de mest grundlæggende forespørgsler, vi kan gøre. Det returnerer simpelthen alle rækker og alle kolonner fra en enkelt tabel.
Vi kunne ændre denne forespørgsel på en række måder for kun at returnere de data, vi ønsker at se. Nedenfor er nogle almindelige måder, hvorpå vi kan ændre en forespørgsel for at returnere præcis de resultater, vi har brug for.
Angiv kolonnerne
I stedet for at bruge stjernen (*
) for at returnere alle kolonner, kan du udtrykkeligt kun angive de kolonner, du ønsker skal returneres.
SELECT AlbumId, AlbumName, ArtistId FROM Albums;Resultat
AlbumId AlbumName ArtistId ------- ------------------------ -------- 1 Powerslave 1 2 Powerage 2 3 Singing Down the Lane 6 4 Ziltoid the Omniscient 5 5 Casualties of Cool 5 6 Epicloud 5 31 Somewhere in Time 1 32 Piece of Mind 1 33 Killers 1 34 No Prayer for the Dying 1 35 No Sound Without Silence 9 36 Big Swing Face 4 37 Blue Night 12 38 Eternity 12 39 Scandinavia 12 40 Long Lost Suitcase 7 41 Praise and Blame 7 42 Along Came Jones 7 43 All Night Wrong 3 44 The Sixteen Men of Tain 3 20 row(s) returned Executed in 1 ms
Begræns kriterierne
Du kan tilføje en WHERE
klausul for kun at returnere de rækker, der matcher et kriterium angivet af dig.
SELECT AlbumId, AlbumName, ArtistId FROM Albums WHERE ArtistId = 1;Resultat
AlbumId AlbumName ArtistId ------- ----------------------- -------- 1 Powerslave 1 31 Somewhere in Time 1 32 Piece of Mind 1 33 Killers 1 34 No Prayer for the Dying 1 5 row(s) returned Executed in 1 ms
Tilslut dig et andet bord
Du kan bruge en joinforbindelse til at returnere resultater fra flere tabeller, der deler data. Det er, hvad relationer handler om. Især bruges en join typisk, hvor fremmednøglen i en tabel matcher den primære nøgle i en anden.
SELECT AlbumId, AlbumName, ArtistName FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId WHERE ReleaseDate < '1980-01-01';Resultat
AlbumId AlbumName ArtistName ------- --------------------- ---------- 2 Powerage AC/DC 3 Singing Down the Lane Jim Reeves 36 Big Swing Face Buddy Rich 42 Along Came Jones Tom Jones 4 row(s) returned Executed in 1 ms
Du vil se, at WHERE
klausul fungerer stadig på kolonner, der faktisk ikke er inkluderet i outputtet. I dette tilfælde blev det anvendt på ReleaseDate
kolonne, selvom vi ikke inkluderer den kolonne i resultaterne.
Du vil også se, at vi kvalificerer de to ArtistId
kolonner med navnet på tabellen (dvs. Albums.ArtistId
og Artists.ArtistId
). Vi skal gøre dette, for at SQL Server kan vide, hvilken tabel vi henviser til, når vi refererer til den kolonne. Nogle databaseudviklere anser det for god praksis at kvalificere alle kolonnenavne i alle SQL-forespørgsler, men dette er mere et tilfælde af personlig præference eller projektspecifik kodningskonvention.
Tilføj et alias
Du kan også tilføje tabelaliasser til dine forespørgsler for at gøre koden mere kortfattet. For eksempel kunne du give Artists
et alias for ar
og Albums
et alias for al
(eller enhver anden streng, du kan lide).
Du kan bruge disse aliaser til at kvalificere kolonnenavnene. Her er den samme forespørgsel som ovenfor, men med alle kolonnenavne kvalificeret med tabelaliasser:
SELECT al.AlbumId, al.AlbumName, ar.ArtistName FROM Albums al INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE al.ReleaseDate < '1980-01-01';Resultat
AlbumId AlbumName ArtistName ------- --------------------- ---------- 2 Powerage AC/DC 3 Singing Down the Lane Jim Reeves 36 Big Swing Face Buddy Rich 42 Along Came Jones Tom Jones 4 row(s) returned Executed in 1 ms
Du kan også tildele aliaser til kolonner (ikke kun tabeller). Det gør vi i det næste eksempel.
Formatér datoen
Der er mange forskellige måder, hvorpå datoer og tidspunkter kan behandles i databaser. I SQL Server er der forskellige datatyper til lagring af datoer (såsom date
, time
, datetime
, smalldatetime
osv.), og der er mange forskellige funktioner til håndtering af datoer (f.eks. SYSDATETIME()
, GETDATE( )
, CURRENT_TIMESTAMP
osv.).
I dette eksempel bruger vi YEAR()
funktion for kun at returnere årsdelen af datoen.
SELECT AlbumName, YEAR(ReleaseDate) AS Year FROM Albums;Resultat
AlbumName Year ------------------------ ---- Powerslave 1984 Powerage 1978 Singing Down the Lane 1956 Ziltoid the Omniscient 2007 Casualties of Cool 2014 Epicloud 2012 Somewhere in Time 1986 Piece of Mind 1983 Killers 1981 No Prayer for the Dying 1990 No Sound Without Silence 2014 Big Swing Face 1967 Blue Night 2000 Eternity 2008 Scandinavia 2012 Long Lost Suitcase 2015 Praise and Blame 2010 Along Came Jones 1965 All Night Wrong 2002 The Sixteen Men of Tain 2000 20 row(s) returned Executed in 1 ms
I dette eksempel tildeler vi også et alias til en kolonne. Mere specifikt tildeler vi et alias til resultatet af YEAR()
funktion, hvoraf vi sender ReleaseDate
kolonne som argument.
Et andet punkt ved dette eksempel er, at vi brugte AS
nøgleord, når du tildeler aliaset. Dette er valgfrit, og vi kunne også have brugt AS
nøgleord, når du tildeler et alias til en tabel i det foregående eksempel.
Om SQL og Transact-SQL
Ovenstående forespørgsler (og de andre forespørgsler i denne øvelse) er skrevet i Structured Query Language (SQL). Mere specifikt bruger SQL Server Transact-SQL (nogle gange forkortet til T-SQL ), som er Microsofts og Sybases proprietære udvidelse til SQL.
SQL er standardforespørgselssproget, der bruges på de fleste relationelle databasestyringssystemer. Det er en standard fra American National Standards Institute (ANSI) og fra International Organization for Standardization (ISO).
Mens de fleste basale forespørgsler fungerer på tværs af de fleste relationelle databaser, skal nogle forespørgsler muligvis ændres en smule, når de overføres mellem et databasesystem og et andet. For eksempel kan du have et script, der kører i SQL Server. Du kan også bruge det script i MySQL, men du vil måske opdage, at du skal ændre et par ting, før det kører med succes.
SQL-scripts i denne øvelse viser blot et lille udsnit af ting, du kan gøre med SQL. For mere information, tjek mit SQL-tutorial eller gå til Microsoft Transact-SQL-referencen.