0Pricing
SQL Interview Prep · Lezione

DISTINCT e GROUP BY per l'unicità

Capire quando DISTINCT è la risposta corretta e quando invece al colloquio ci si aspetta GROUP BY

DISTINCT e GROUP BY per l'unicità è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa fa DISTINCT

DISTINCT rimuove le righe duplicate. Il punto fondamentale che viene verificato nei colloqui è questo: agisce sull'intera riga selezionata, non su una sola colonna; quindi SELECT DISTINCT a, b elimina i duplicati della coppia (a, b).

SELECT DISTINCT department
FROM employees;

DISTINCT considera tutte le colonne selezionate

Con più colonne, DISTINCT conserva ogni combinazione univoca: una riga per ogni coppia distinta (department, job_title). Non esiste un modo standard per eliminare i duplicati di una sola colonna.

SELECT DISTINCT department, job_title
FROM employees;

Cosa fa GROUP BY

GROUP BY riunisce in un unico gruppo le righe che condividono la stessa chiave. Da solo, il raggruppamento per una colonna produce lo stesso risultato di DISTINCT applicato a quella colonna.

SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;

La vera differenza: l'aggregazione

Quando, quindi, sono diversi? Quando serve un'aggregazione. GROUP BY può calcolare COUNT, SUM o AVG per ogni gruppo; DISTINCT no. Servono righe univoche? DISTINCT. Serve una metrica per gruppo? GROUP BY.

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

DISTINCT non può contare per gruppo

Non è possibile aggiungere un conteggio a DISTINCT. Per sapere «quanti dipendenti ci sono per reparto», lo strumento corretto è sempre GROUP BY con COUNT(*), non SELECT DISTINCT.

-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;

-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

COUNT(DISTINCT) combina entrambe le idee

Una combinazione molto utile: COUNT(DISTINCT col) conta i valori univoci all'interno di ogni gruppo. Qui DISTINCT si trova dentro l'aggregazione e risponde alla domanda «quanti titoli distinti ci sono per reparto?».

SELECT department,
       COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;

Conteggio dei valori distinti complessivi

Senza GROUP BY, COUNT(DISTINCT col) conta i valori univoci nell'intera tabella: è una risposta chiara alla domanda «di quanti reparti diversi disponiamo?».

SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;

-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;

Spesso le prestazioni sono equivalenti

DISTINCT o GROUP BY: quale dei due è più veloce? Per la semplice eliminazione dei duplicati, di solito sono equivalenti: gli ottimizzatori elaborano piani simili. Scelga in base all'intento: DISTINCT per le righe univoche, GROUP BY quando si eseguono aggregazioni.

DISTINCT e NULL

Come tratta NULL DISTINCT? Considera tutti i NULL uguali, quindi molte righe con NULL vengono riunite in una sola. GROUP BY si comporta allo stesso modo: i NULL formano un unico gruppo.

-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;

DISTINCT ON di Postgres (extra)

Come extra, Postgres dispone di DISTINCT ON (expr), non standard, che conserva la prima riga per chiave in base a un ORDER BY. Il codice portabile utilizza invece ROW_NUMBER().

-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;

DISTINCT si applica all'intera SELECT, non a una sola colonna

Un'altra insidia: DISTINCT agisce sull'intera riga, quindi SELECT DISTINCT customer_id, order_date non restituisce una riga per cliente. In quel caso, utilizzi GROUP BY con MAX oppure una funzione finestra.

-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;

-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

Verifica rapida

Scelga lo strumento corretto.

Riepilogo

Riepilogo: DISTINCT elimina i duplicati delle righe intere; GROUP BY raggruppa in base alla chiave e abilita le aggregazioni. COUNT(DISTINCT col) conta i valori univoci, entrambi trattano i NULL come un unico valore e le prestazioni sono generalmente equivalenti.

Domande Frequenti

La lezione «DISTINCT e GROUP BY per l'unicità» è gratuita?

Sì — il testo completo di «DISTINCT e GROUP BY per l'unicità» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «DISTINCT e GROUP BY per l'unicità»?

Capire quando DISTINCT è la risposta corretta e quando invece al colloquio ci si aspetta GROUP BY Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «DISTINCT e GROUP BY per l'unicità»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?

Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Proiezione delle colonne e insidie degli alias
  2. Colonne calcolate e precedenza delle espressioni
  3. DISTINCT e GROUP BY per l'unicità
  4. Espressioni CASE in SELECT
← Torna a SQL Interview Prep