La funzione COUNT() è una delle funzioni aggregate più popolari e utili in SQL. Il suo compito principale è contare il numero di righe nei risultati di una query. Se la funzione COUNT() fosse un supereroe nel mondo SQL, il suo superpotere sarebbe trovare velocemente risposte a domande come:
- Quanti dipendenti lavorano in azienda?
- Quanti studenti ci sono in ogni facoltà?
- Quanti prodotti sono stati venduti nell'ultimo mese?
La sintassi di COUNT() è piuttosto semplice:
COUNT(colonna)
dove colonna è il nome della colonna di cui vuoi contare le righe. Ma ci sono anche altri modi di usarla, che vedremo più avanti nella lezione.
Dai, partiamo dall'uso più basilare di COUNT().
Variante 1: Conteggio di tutte le righe con COUNT(*)
Quando vuoi contare ogni riga della tabella, indipendentemente dal fatto che ci siano dati o meno, usi COUNT(*). L'asterisco significa "tutte le colonne".
Esempio: Abbiamo una tabella students con questo contenuto:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Eseguiamo questa query:
SELECT COUNT(*)
FROM students;
Risultato:
| count |
|---|
| 4 |
La funzione COUNT(*) non fa caso ai valori NULL nelle singole colonne, perché semplicemente conta il numero di righe nella tabella.
Variante 2: Conteggio delle righe con valori esistenti in una colonna COUNT(column)
Ma se vuoi contare solo le righe dove c'è un valore non-NULL in una colonna specifica? In questo caso usi COUNT(column).
Esempio: contiamo quanti studenti hanno il nome indicato.
SELECT COUNT(name)
FROM students;
Risultato:
| count |
|---|
| 3 |
Hai notato la differenza? Nella tabella ci sono 4 righe, ma in una di queste la colonna name ha valore NULL. La funzione COUNT(column) ignora le righe dove il valore della colonna è NULL.
Confronto tra COUNT(*) e COUNT(column)
Quindi, qual è la differenza tra i due modi di usare la funzione: COUNT(*) e COUNT(column)?
COUNT(*)conta tutte le righe nella tabella, incluse quelle conNULLin qualsiasi colonna.COUNT(column)conta solo le righe dove nella colonna indicata il valore non è NULL.
Tabella di esempio:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Query:
-- Conta tutte le righe.
SELECT COUNT(*) FROM students; -- 4 -- TOTALE (tutte le righe)
-- Conta solo le righe dove il nome non è NULL.
SELECT COUNT(name) FROM students; -- 3 -- Contiamo le righe con nome indicato
-- Conta solo le righe dove l'età non è NULL.
SELECT COUNT(age) FROM students; -- 3 -- Contiamo le righe con età indicata
Variante 3: Conteggio dei valori unici con COUNT(DISTINCT column)
A volte vuoi contare solo i valori unici in una colonna. Per esempio, vogliamo sapere quanti valori di età diversi ci sono tra gli studenti. Qui ci aiuta COUNT(DISTINCT column).
Esempio:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
Risultato:
| count |
|---|
| 3 |
Nota che in questo caso DISTINCT ignora non solo i duplicati, ma anche i valori NULL.
Se provi a usare DISTINCT insieme a COUNT(*), otterrai un errore: DISTINCT si può usare solo su colonne specifiche.
Esempi di utilizzo di COUNT() in casi reali
Esempio 1. Conteggio del numero di studenti
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
Risultato:
| total_students |
|---|
| 4 |
Esempio 2. Conteggio degli studenti con età nota
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
Risultato:
| students_with_age |
|---|
| 3 |
Esempio 3. Conteggio delle età uniche
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
Risultato:
| unique_ages |
|---|
| 2 |
Errori tipici quando usi COUNT()
Aspettarsi che COUNT(column) conti tutte le righe, anche se ci sono NULL.
Non è vero: COUNT(column) ignora le righe con NULL nella colonna indicata.
Usare COUNT(*) per contare i valori unici.
Invece usa COUNT(DISTINCT column).
Dimenticarsi di filtrare i dati specifici prima di contare.
Per esempio:
SELECT COUNT(*) FROM students WHERE age > 20;
Qui otterrai solo gli studenti con età maggiore di 20, perché WHERE filtra già le righe prima del conteggio.
Queste sfumature spesso portano a errori logici nelle query. Fai attenzione!
GO TO FULL VERSION