Når du arbejder med databaser, vil du nogle gange gerne finde ud af, hvor mange rækker der returneres af en forespørgsel, uden faktisk at returnere resultaterne af forespørgslen. Eller nogle gange vil du måske bare finde ud af, hvor mange rækker der er i en given tabel.
I SQL Server kan du bruge T-SQLs COUNT()
funktion til at returnere antallet af rækker, der ville blive returneret i en forespørgsel.
Dataene
Her er de data, vi vil bruge i eksemplerne på denne side:
VÆLG *FRA Opgaver;
Resultat:
TaskId Opgavenavn Opgavebeskrivelse Opgavekode------ ------------ -----------------------1 feed katte TBA null 2 Vandhund TBA null 3 Foderhave TBA null 4 Maletæppe TBA null 5 Rent tag TBA null 6 Foderkatte TBA null
Eksempel – Tæl alle rækker i en tabel
Her er et eksempel på brug af COUNT()
funktion til at returnere det samlede antal rækker i en tabel:
VÆLG ANTAL(*)FRA opgaver;
Resultat:
6
Dette returnerer antallet af rækker i tabellen, fordi vi ikke har angivet nogen kriterier til at indsnævre resultaterne.
Eksempel – Tilføjelse af kriterier
Her er et eksempel på at tælle, hvor mange rækker der ville blive returneret baseret på et givet kriterium:
VÆLG ANTAL(*) FRA Opgaver WHERE Opgavenavn SOM '%dog%' ELLER Opgavenavn SOM '%cat%';
Resultat:
3
Eksempel – Angiv en enkelt kolonne
De foregående eksempler bruger alle en stjerne til at anvende tællingen på alle kolonner. Du har også mulighed for at angive en specifik kolonne.
Eksempel:
VÆLG ANTAL(TaskName)FRA Opgaver;
Resultat:
6
Selvom dette eksempel returnerer det samme resultat, som vi fik, da vi brugte stjernen, vil det ikke nødvendigvis altid være tilfældet. For eksempel, her er hvad der sker, hvis vi angiver en anden kolonne:
VÆLG ANTAL(TaskCode)FRA Opgaver;
Resultat:
0
I dette tilfælde får vi nul, fordi den pågældende kolonne indeholder nulværdier i hver række.
Eksempel – Distinkt
Du kan tilføje DISTINCT
argument for kun at returnere antallet af unikke (ikke-null) værdier.
Du har måske bemærket, at hver række i vores TaskDescription
kolonne indeholder den samme værdi ("TBA"). Og TaskName
kolonne har også en dubletværdi ("Foderkatte" vises to gange). Dette kan give problemer, hvis du ikke ønsker, at dubletter skal tælles med.
Sådan ser det ud, hvis vi anvender DISTINCT
argument til TaskName
kolonne:
VÆLG ANTAL(DISTINCT TaskName)FROM Tasks;
Resultat:
5
Og her anvendes det mod TaskDescription
tabel (hvor alle værdier er identiske):
SELECT COUNT(DISTINCT TaskDescription)FROM Tasks;
Resultat:
1
Eksempel – HAVING-klausulen
Du kan også bruge COUNT()
med HAVING
klausul for at begrænse et resultatsæt baseret på antallet af rækker, der ville blive returneret.
Eksempel:
BRUG musik;SELECT ar.ArtistName, COUNT(al.AlbumName) 'Album Count'FROM Artists arINNER JOIN Albums al PÅ ar.ArtistId =al.ArtistIdGROUP BY ar.ArtistNameHAVING COUNT(al.AlbumName)> 1;Resultat:
ArtistName Album Count ---------------------------- ----------Allan Holdsworth 2 Devin Townsend 3 Iron Maiden 5 Michael lærer at rocke 3 Tom Jones 3Dette eksempel bruger en anden database end de foregående eksempler. Det returnerer kun de kunstnere, der har udgivet mere end 1 album. Vi kunne ændre det nummer, uanset hvor mange album vi ønsker:
BRUG musik;SELECT ar.ArtistName, COUNT(al.AlbumName) 'Album Count'FROM Artists arINNER JOIN Albums al PÅ ar.ArtistId =al.ArtistIdGROUP BY ar.ArtistNameHAVING COUNT(al.AlbumName)> 4;Resultat:
ArtistName Album Count------------------------- ----------Iron Maiden 5COUNT_BIG()-funktionen
T-SQL har også en
COUNT_BIG()
funktion, der fungerer præcis somCOUNT()
, bortset fra atCOUNT()
returnerer en int datatype ogCOUNT_BIG()
returnerer en bigt datatype.Denne funktion kan være nyttig til indekserede visninger med grupperede forespørgsler. Det kan du finde ud af, hvis du prøver at oprette et indeks for en visning, der indeholder
COUNT(*)
, at du får en fejl som denne:Kan ikke oprette indeks på visningen "Music.dbo.AlbumsByArtist", fordi den bruger det samlede COUNT. Brug COUNT_BIG i stedet.I sådanne tilfælde skal du ændre visningen til at bruge
COUNT_BIG(*)
burde løse problemet.