- 1 1. Introduzione
- 2 2. Basi del conteggio dei dati in MySQL (COUNT)
- 3 3. Recuperare dati senza duplicati (DISTINCT)
- 4 4. Come usare COUNT(DISTINCT column_name)
- 5 5. Usare COUNT(DISTINCT) con più colonne
- 6 6. Ottimizzazione delle prestazioni per COUNT(DISTINCT)
- 7 7. Errori comuni e soluzioni per COUNT(DISTINCT)
- 8 8. Domande Frequenti (FAQ)
- 9 9. Conclusione
1. Introduzione
Quando gestisci un database, potresti trovarti di fronte a situazioni come “Quanti paesi diversi sono stati registrati?” o “Quanti indirizzi email unici ci sono?”
In questi casi, puoi utilizzare COUNT(DISTINCT column_name) di MySQL per ottenere il numero di record eliminando i duplicati.
Questo articolo spiega in dettaglio i seguenti argomenti:
- Le basi di
COUNT()eDISTINCT - L’uso corretto di
COUNT(DISTINCT column_name) - Come contare valori unici su più colonne
- Come migliorare le prestazioni di
COUNT(DISTINCT)
Anche i principianti possono comprendere facilmente questa guida, poiché spieghiamo tutto con esempi pratici e query SQL. Assicurati di leggere fino alla fine.
2. Basi del conteggio dei dati in MySQL (COUNT)
Quando si analizzano i dati in un database, la funzione più fondamentale è COUNT().
Prima di tutto, comprendiamo come funziona COUNT().
2.1 Differenza tra COUNT(*) e COUNT(column_name)
La funzione COUNT() in MySQL può essere usata in due modi:
| COUNT Function | Description |
|---|---|
COUNT(*) | Counts all records in the table (including NULL values) |
COUNT(column_name) | Counts non-NULL values in a specific column |
2.2 Esempi base di COUNT()
Qui utilizzeremo la seguente tabella users come esempio:
| id | name | country | |
|---|---|---|---|
| 1 | Taro | taro@example.com | Japan |
| 2 | Hanako | hanako@example.com | Japan |
| 3 | John | NULL | United States |
| 4 | Tanaka | tanaka@example.com | Japan |
① Recuperare il numero totale di record nella tabella
SELECT COUNT(*) FROM users;
→ Risultato: 4 (Numero totale di record)
② Recuperare il numero di valori non‑NULL in una colonna specifica
SELECT COUNT(email) FROM users;
→ Risultato: 3 (Numero di valori email non‑NULL)
💡 Punti chiave:
COUNT(*)restituisce il numero totale di record inclusi i valori NULL.COUNT(email)esclude i valori NULL durante il conteggio.

3. Recuperare dati senza duplicati (DISTINCT)
Quando si aggregano dati, spesso si desidera ottenere solo valori unici.
In queste situazioni, DISTINCT è molto utile.
3.1 Basi di DISTINCT
DISTINCT serve a eliminare i dati duplicati dalla colonna specificata e a restituire risultati unici.
Sintassi di base
SELECT DISTINCT column_name FROM table_name;
3.2 Esempio di utilizzo di DISTINCT
Eseguendo la seguente query SQL, è possibile ottenere l’elenco dei nomi dei paesi unici registrati dagli utenti.
SELECT DISTINCT country FROM users;
→ Risultato:
| country |
|---|
| Japan |
| United States |
3.3 Differenza tra DISTINCT e GROUP BY
| Feature | DISTINCT | GROUP BY |
|---|---|---|
| Purpose | Retrieve unique values | Perform aggregation by group |
| Usage | SELECT DISTINCT column_name | SELECT column_name, COUNT(*) GROUP BY column_name |
| Example | Retrieve unique countries | Count users per country |
💡 Punti chiave:
DISTINCTrimuove semplicemente i dati duplicati.GROUP BYraggruppa i dati ed è usato insieme a funzioni aggregate.
4. Come usare COUNT(DISTINCT column_name)
Utilizzando COUNT(DISTINCT column_name), è possibile ottenere il numero di valori unici.
4.1 Basi di COUNT(DISTINCT)
Sintassi di base
SELECT COUNT(DISTINCT column_name) FROM table_name;
4.2 Esempio di COUNT(DISTINCT)
SELECT COUNT(DISTINCT country) FROM users;
→ Risultato: 2 (Due tipologie: “Japan” e “United States”)
4.3 Usare COUNT(DISTINCT) con condizioni
SELECT COUNT(DISTINCT email) FROM users WHERE country = 'Japan';
→ Risultato: 2 (Numero di valori email unici registrati in Giappone)
💡 Punti chiave:
COUNT(DISTINCT column_name)esclude i valori NULL e conta solo i dati unici.- Utilizzando una clausola
WHERE, è possibile contare i record che soddisfano condizioni specifiche.
5. Usare COUNT(DISTINCT) con più colonne
In MySQL, COUNT(DISTINCT column1, column2) non può essere usato direttamente. Invece, una soluzione comune è combinare le colonne con CONCAT() e trattarle come un unico valore.
5.1 Perché COUNT(DISTINCT column1, column2) non può essere usato
In MySQL, non è possibile applicare direttamente COUNT(DISTINCT) a più colonne in questo modo: COUNT(DISTINCT column1, column2).
Ciò è dovuto a una limitazione di MySQL.
5.2 Come contare combinazioni uniche su più colonne
Per contare combinazioni uniche di più colonne, l’approccio tipico è combinare le colonne usando CONCAT() e poi applicare COUNT(DISTINCT) al risultato.
Esempio: Contare combinazioni uniche di Paese e Città
SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;
💡 Punti chiave:
- Usare
CONCAT(colonna1, '-', colonna2)consente di combinare più colonne in un unico valore unico. COUNT(DISTINCT CONCAT(...))permette di recuperare il numero di combinazioni uniche tra più colonne.
6. Ottimizzazione delle prestazioni per COUNT(DISTINCT)
COUNT(DISTINCT) può influire sulle prestazioni, quindi potrebbe essere necessaria un’ottimizzazione.
Quando si lavora con grandi set di dati, è consigliato considerare l’uso di indici o approcci alternativi.
6.1 Perché COUNT(DISTINCT) può essere lento
- MySQL spesso scansiona tutti i record per applicare
DISTINCT. - Se gli indici non sono configurati correttamente, l’esecuzione della query diventa più lenta.
- Un alto volume di dati duplicati aumenta il carico computazionale.
6.2 Ottimizzazione degli indici per velocizzare COUNT(DISTINCT)
Gestendo grandi quantità di dati, è possibile migliorare le prestazioni della query aggiungendo un indice alla colonna target.
Come aggiungere un indice
ALTER TABLE users ADD INDEX (country);
Verifica il piano di esecuzione della query usando un indice
EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
💡 Punti chiave:
- Usare
EXPLAINconsente di verificare come MySQL elabora una query. - Applicare un indice può aiutare a evitare scansioni complete della tabella e migliorare le prestazioni di ricerca.
6.3 Metodo alternativo: GROUP BY + COUNT
A seconda del requisito di aggregazione, usare GROUP BY può fornire prestazioni migliori.
Esempio: Contare dati unici usando GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;
💡 Punti chiave:
GROUP BYpuò offrire prestazioni migliori rispetto aCOUNT(DISTINCT)in alcuni casi.- È particolarmente utile quando è necessario raggruppare e aggregare i dati simultaneamente.
7. Errori comuni e soluzioni per COUNT(DISTINCT)
Quando si usa COUNT(DISTINCT), si possono incontrare diversi errori comuni.
Qui, presentiamo i problemi tipici e le loro soluzioni.
7.1 Errore 1: COUNT(DISTINCT column1, column2) non può essere usato
Causa dell’errore
In MySQL, COUNT(DISTINCT column1, column2) non è supportato quando si mirano più colonne.
Usare direttamente questa sintassi genererà un errore.
Soluzione: Usa CONCAT()
È possibile evitare questo errore combinando più colonne e applicando COUNT(DISTINCT) al risultato.
SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;
💡 Punti chiave:
- Usare
CONCAT(colonna1, '-', colonna2)consente di creare valori unici da più colonne. COUNT(DISTINCT CONCAT(...))permette di recuperare valori unici per ogni combinazione.
7.2 Errore 2: Risultati inattesi quando sono inclusi valori NULL
Causa dell’errore
COUNT(DISTINCT nome_colonna)ignora i valori NULL, il che può causare risultati inattesi se la colonna contiene NULL.
Soluzione: Usa IFNULL()
Puoi sostituire NULL con un altro valore predefinito (ad es., '' o 'unknown') per garantire un conteggio corretto.
SELECT COUNT(DISTINCT IFNULL(email, 'unknown')) FROM users;
💡 Punti chiave:
- Usando
IFNULL(nome_colonna, 'valore_predefinito')è possibile gestire correttamente i valori NULL.
7.3 Errore 3: COUNT(DISTINCT) è lento
Causa dell’errore
COUNT(DISTINCT)scansiona tutti i dati, il che può comportare prestazioni lente con grandi set di dati.
Soluzione: Usa gli indici
ALTER TABLE users ADD INDEX (country);
💡 Punti chiave:
- Aggiungere indici può migliorare le prestazioni della query.
- Usa
EXPLAINper verificare lo stato di ottimizzazione della query.EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
Applicando queste misure, puoi migliorare la praticità di COUNT(DISTINCT) ed evitare problemi di prestazioni.
8. Domande Frequenti (FAQ)
Ecco alcune domande frequenti su COUNT(DISTINCT).
8.1 Qual è la differenza tra COUNT(*) e COUNT(DISTINCT column_name)?
Differenze Chiave
| Function | Description |
|---|---|
COUNT(*) | Counts all records (including NULL values) |
COUNT(DISTINCT column_name) | Counts unique values (excluding NULL values) |
Esempio di Utilizzo
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT email) FROM users;
💡 Punti Chiave:
COUNT(*)conta tutti i record .COUNT(DISTINCT column_name)restituisce il numero di valori unici (escludendo NULL) .
8.2 Qual è la differenza tra DISTINCT e GROUP BY?
| Feature | DISTINCT | GROUP BY |
|---|---|---|
| Purpose | Retrieve unique values | Perform aggregation by group |
| Usage | SELECT DISTINCT column_name | SELECT column_name, COUNT(*) GROUP BY column_name |
| Example | Retrieve unique countries | Count users per country |
Esempio di Utilizzo
-- Using DISTINCT
SELECT DISTINCT country FROM users;
-- Using GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;
💡 Punti Chiave:
DISTINCTrimuove semplicemente i dati duplicati .GROUP BYraggruppa i dati e può essere combinato con funzioni aggregate .
8.3 COUNT(DISTINCT) è lento?
Problema
COUNT(DISTINCT)scansiona tutti i dati, quindi le prestazioni possono degradarsi con dataset di grandi dimensioni.
Soluzione: Usa gli Indici
ALTER TABLE users ADD INDEX (country);
Approccio Alternativo: Usa GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;
💡 Punti Chiave:
- Applicare gli indici può migliorare le prestazioni di ricerca .
- L’uso di
GROUP BYpuò produrre risultati più rapidi rispetto aCOUNT(DISTINCT)in alcuni casi.
8.4 Come posso usare COUNT(DISTINCT column1, column2)?
Problema
- In MySQL,
COUNT(DISTINCT column1, column2)non è supportato .
Soluzione: Usa CONCAT()
SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;
💡 Punti Chiave:
- Usare
CONCAT(column1, '-', column2)consente di creare valori unici su più colonne . COUNT(DISTINCT CONCAT(...))permette di recuperare combinazioni uniche .
Facendo riferimento a queste domande, puoi utilizzare COUNT(DISTINCT) in modo più efficiente.
9. Conclusione
In questo articolo, abbiamo spiegato in dettaglio come utilizzare la funzione COUNT(DISTINCT) di MySQL.
Rivediamo i punti chiave.
9.1 Cosa hai imparato in questo articolo
✅ Come contare i record in MySQL
COUNT(*)restituisce il numero totale di recordCOUNT(column_name)conta i valori escludendo NULLCOUNT(DISTINCT column_name)restituisce il numero di valori unici
✅ La differenza tra DISTINCT e COUNT(DISTINCT)
DISTINCTrecupera i dati con i duplicati rimossiCOUNT(DISTINCT column_name)conta il numero di valori unici
✅ Come usare COUNT(DISTINCT) con più colonne
- Poiché MySQL non supporta direttamente
COUNT(DISTINCT column1, column2), usaCONCAT()al suo posto
✅ Tecniche di ottimizzazione delle prestazioni
- Applica gli indici per migliorare le prestazioni di ricerca
- Usa
GROUP BY + COUNTper query più veloci quando opportuno
9.2 Cosa puoi fare con queste conoscenze
Applicando queste conoscenze, puoi eseguire i seguenti tipi di aggregazione dei dati:
🔹 Contare utenti unici
🔹 Recuperare il conteggio dei record basato su condizioni specifiche
🔹 Contare dati unici su più colonne
🔹 Ottimizzare le query per dataset di grandi dimensioni
Quando esegui aggregazioni di dati e ottimizzazioni in MySQL, assicurati di utilizzare questa guida come riferimento!


