När du arbetar med databaser vill du ibland ta reda på hur många rader som kommer att returneras av en fråga, utan att faktiskt returnera resultatet av frågan. Eller ibland kanske du bara vill ta reda på hur många rader som finns i en given tabell.
I SQL Server kan du använda T-SQL:s COUNT()
funktion för att returnera antalet rader som skulle returneras i en fråga.
Datan
Här är informationen vi kommer att använda i exemplen på den här sidan:
VÄLJ *FRÅN Uppgifter;
Resultat:
TaskId TaskName TaskDescription TaskCode------ ------------ -----------------------1 flöde katter TBA null 2 Vattenhund TBA null 3 Foderträdgård TBA null 4 Måla matta TBA null 5 Rent tak TBA null 6 Foderkatter TBA null
Exempel – Räkna alla rader i en tabell
Här är ett exempel på hur du använder COUNT()
funktion för att returnera det totala antalet rader i en tabell:
VÄLJ ANTAL(*)FRÅN uppgifter;
Resultat:
6
Detta returnerar antalet rader i tabellen eftersom vi inte angav några kriterier för att begränsa resultaten.
Exempel – Lägga till kriterier
Här är ett exempel på hur många rader som skulle returneras baserat på ett givet kriterium:
VÄLJ ANTAL(*)FRÅN TasksWHERE TaskName LIKE '%dog%' ELLER TaskName LIKE '%cat%';
Resultat:
3
Exempel – Ange en enskild kolumn
De föregående exemplen använder alla en asterisk för att tillämpa räkningen på alla kolumner. Du har också möjlighet att ange en specifik kolumn.
Exempel:
VÄLJ ANTAL(TaskName)FROM Tasks;
Resultat:
6
Även om det här exemplet returnerar samma resultat som vi fick när vi använde asterisken, kommer det inte nödvändigtvis alltid att vara fallet. Här är till exempel vad som händer om vi anger en annan kolumn:
VÄLJ ANTAL(TaskCode)FROM Tasks;
Resultat:
0
I det här fallet får vi noll, eftersom just den kolumnen innehåller nollvärden i varje rad.
Exempel – Distinkt
Du kan lägga till DISTINCT
argument för att endast returnera antalet unika (icke-null) värden.
Du kanske har märkt att varje rad i vår TaskDescription
kolumnen innehåller samma värde ("TBA"). Och TaskName
kolumnen har också ett dubblettvärde (”Feed cats” visas två gånger). Detta kan orsaka problem om du inte vill att dubbletter ska räknas.
Så här ser det ut om vi använder DISTINCT
argument till TaskName
kolumn:
VÄLJ ANTAL(DISTINCT TaskName)FROM Tasks;
Resultat:
5
Och här tillämpas den mot TaskDescription
tabell (där alla värden är identiska):
VÄLJ ANTAL(DISTINCT TaskDescription)FROM Tasks;
Resultat:
1
Exempel – HAVING-klausulen
Du kan också använda COUNT()
med HAVING
sats för att begränsa en resultatuppsättning baserat på antalet rader som skulle returneras.
Exempel:
ANVÄND musik;VÄLJ ar.ArtistName, COUNT(al.AlbumName) 'Album Count'FRÅN artister 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 Learns to Rock 3 Tom Jones 3Det här exemplet använder en annan databas än de tidigare exemplen. Den returnerar endast de artister som har släppt mer än 1 album. Vi kan ändra det antalet hur många album vi vill:
ANVÄND musik;VÄLJ 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 5funktionen COUNT_BIG()
T-SQL har också en
COUNT_BIG()
funktion som fungerar precis somCOUNT()
, förutom attCOUNT()
returnerar en int datatyp ochCOUNT_BIG()
returnerar en bigint datatyp.Den här funktionen kan vara användbar för indexerade vyer med grupperade frågor. Du kanske hittar om du försöker skapa ett index för en vy som innehåller
COUNT(*)
, att du får ett felmeddelande som detta:Kan inte skapa index på vyn "Music.dbo.AlbumsByArtist" eftersom den använder det sammanlagda COUNT. Använd COUNT_BIG istället.I sådana fall, ändra vyn för att använda
COUNT_BIG(*)
borde lösa problemet.