Quando si lavora con i database, a volte si desidera scoprire quante righe verranno restituite da una query, senza restituire effettivamente i risultati della query. O a volte potresti semplicemente voler scoprire quante righe ci sono in una determinata tabella.
In SQL Server puoi utilizzare COUNT()
di T-SQL funzione per restituire il numero di righe che verrebbero restituite in una query.
I dati
Ecco i dati che utilizzeremo negli esempi in questa pagina:
SELECT * FROM Tasks;
Risultato:
TaskId TaskName TaskDescription TaskCode ------ ------------ --------------- -------- 1 Feed cats TBA null 2 Water dog TBA null 3 Feed garden TBA null 4 Paint carpet TBA null 5 Clean roof TBA null 6 Feed cats TBA null
Esempio:conta tutte le righe in una tabella
Ecco un esempio di utilizzo di COUNT()
funzione per restituire il numero totale di righe in una tabella:
SELECT COUNT(*) FROM Tasks;
Risultato:
6
Questo restituisce il numero di righe nella tabella perché non abbiamo fornito alcun criterio per restringere i risultati.
Esempio:aggiunta di criteri
Ecco un esempio di conteggio di quante righe verrebbero restituite in base a un determinato criterio:
SELECT COUNT(*) FROM Tasks WHERE TaskName LIKE '%dog%' OR TaskName LIKE '%cat%';
Risultato:
3
Esempio:specifica una singola colonna
Gli esempi precedenti utilizzano tutti un asterisco per applicare il conteggio a tutte le colonne. Hai anche la possibilità di specificare una colonna specifica.
Esempio:
SELECT COUNT(TaskName) FROM Tasks;
Risultato:
6
Sebbene questo esempio restituisca lo stesso risultato che abbiamo ottenuto quando abbiamo utilizzato l'asterisco, non sarà necessariamente così. Ad esempio, ecco cosa succede se specifichiamo una colonna diversa:
SELECT COUNT(TaskCode) FROM Tasks;
Risultato:
0
In questo caso otteniamo zero, perché quella particolare colonna contiene valori nulli in ogni riga.
Esempio – Distinto
Puoi aggiungere il DISTINCT
argomento per restituire solo il numero di valori univoci (non nulli).
Potresti aver notato che ogni riga nella nostra TaskDescription
la colonna contiene lo stesso valore ("TBA"). E il TaskName
la colonna ha anche un valore duplicato ("Feed cats" appare due volte). Ciò potrebbe causare problemi se non desideri che i duplicati vengano conteggiati.
Ecco come appare se applichiamo il DISTINCT
argomento al TaskName
colonna:
SELECT COUNT(DISTINCT TaskName) FROM Tasks;
Risultato:
5
E qui viene applicato contro TaskDescription
tabella (dove tutti i valori sono identici):
SELECT COUNT(DISTINCT TaskDescription) FROM Tasks;
Risultato:
1
Esempio:la clausola HAVING
Puoi anche usare COUNT()
con il HAVING
clausola per limitare un set di risultati in base al numero di righe che verrebbero restituite.
Esempio:
USE Music; SELECT ar.ArtistName, COUNT(al.AlbumName) 'Album Count' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ar.ArtistName HAVING COUNT(al.AlbumName) > 1;
Risultato:
ArtistName Album Count ------------------------- ----------- Allan Holdsworth 2 Devin Townsend 3 Iron Maiden 5 Michael Learns to Rock 3 Tom Jones 3
Questo esempio utilizza un database diverso rispetto agli esempi precedenti. Restituisce solo quegli artisti che hanno pubblicato più di 1 album. Potremmo cambiare quel numero quanti album desideriamo:
USE Music; SELECT ar.ArtistName, COUNT(al.AlbumName) 'Album Count' FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ar.ArtistName HAVING COUNT(al.AlbumName) > 4;
Risultato:
ArtistName Album Count ------------------------- ----------- Iron Maiden 5
La funzione COUNT_BIG()
T-SQL ha anche un COUNT_BIG()
funzione che funziona esattamente come COUNT()
, tranne che COUNT()
restituisce un int tipo di dati e COUNT_BIG()
restituisce un bigint tipo di dati.
Questa funzione può essere utile per viste indicizzate con query raggruppate. Potresti trovare se provi a creare un indice per una vista che contiene COUNT(*)
, che ricevi un errore come questo:
Cannot create index on view "Music.dbo.AlbumsByArtist" because it uses the aggregate COUNT. Use COUNT_BIG instead.
In questi casi, alterare la visualizzazione per utilizzare COUNT_BIG(*)
dovrebbe risolvere il problema.