sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man returnerar antalet rader i ett frågeresultat i SQL Server

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 3

Det 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 5

funktionen COUNT_BIG()

T-SQL har också en COUNT_BIG() funktion som fungerar precis som COUNT() , förutom att COUNT() returnerar en int datatyp och COUNT_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.


  1. Säkra MySQL - Använda dataåtkomsträttigheter för en säker installation

  2. Vad är skillnaden mellan Float och Numeric/Decimal i SQL Server - SQL Server / T-SQL Tutorial Del 33

  3. Genererar tidsserier mellan två datum i PostgreSQL

  4. Hur man använder stoppord och stopplista för att förbättra SQL Server Full-Text Search (FTS)