Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

Differenza tra GROUP BY e ORDER BY in parole semplici

Per chi sta imparando l'SQL, uno dei punti più comuni in cui ci si blocca è l'apprendimento del comando GROUP BY. GROUP BY e ORDER BY sono due importanti parole chiave dell'SQL che si usano per organizzare i dati. La differenza tra GROUP BY e ORDER BY è che ORDER BY è più semplice di GROUP BY e di solito viene introdotto all'inizio di un corso di SQL.

A volte le persone si confondono su questi due concetti (SQL ORDER BY vs. GROUP BY) e la ragione di questa confusione è la mancanza di comprensione di entrambi i concetti. Sebbene entrambi siano utilizzati per organizzare i dati in base ai loro valori, i loro casi d'uso differiscono notevolmente l'uno dall'altro. Se impariamo entrambi i concetti in modo corretto, la confusione sparirà naturalmente.

In questo articolo ho utilizzato un interessante database pubblicato qui. Il set di dati contiene più di 2000 birre artigianali e 500 birrifici utilizzati negli Stati Uniti. I dati sono inclusi in file CSV, che si possono facilmente importare in qualsiasi database utilizzando uno strumento GUI. Uno dei miei colleghi ha mostrato come farlo in un esempio dei dati dell'indagine di LearnSQL.

Questo set di dati contiene due tabelle: beers e breweries. Vediamo il set di dati di esempio della tabella beers per avere un'idea più precisa.

tabella birre

ORDINE PER

Il nostro primo argomento è ORDER BY. Prima di cercare di capire la differenza tra GROUP BY e ORDER BY, vediamo come funziona il comando SELECT.

SELECT il nome, la città e lo stato di ogni record della tabella. breweries tabella.

SELECT name, 
 city, 
 state 
FROM breweries

Quando si esegue il comando precedente, si ottiene qualcosa di simile al seguente:

SELEZIONA il nome, la città e lo stato dalla tabella birrerie

Si può notare che questi risultati non sono ordinati in base al loro nome. L'ordine predefinito per un'istruzione SELECT è non deterministico, il che significa che l'ordine dei risultati può variare ogni volta che si esegue il codice.

Tuttavia, un ordine non deterministico di solito non è quello che vogliamo. Per esempio, supponiamo di voler ordinare i risultati in base all'ordine crescente o decrescente della colonna state; in questo caso, sarebbe necessario il comando ORDER BY. È sufficiente utilizzare la clausola ORDER BY in questo modo:

SELECT name, 
city, 
state 
FROM 	breweries 
ORDER BY state ASC
ORDINE PER

Allo stesso modo, è possibile ottenere i risultati anche in ordine decrescente dello stato.

SELECT name, 
city, 
state 
FROM breweries
ORDER BY state DESC
ordine discendente

Si possono vedere i record organizzati in ordine decrescente di stato. L'ordine predefinito del comando ORDER BY è ascendente. Quindi, se non si usa ASC o DESC, i risultati saranno in ordine crescente.

È possibile utilizzare ORDER BY in due o più colonne. Controllare la seguente query:

SELECT name, 
 city, 
 state 
FROM breweries
ORDER BY state,
         city DESC

Questa query ordina i risultati prima in ordine crescente di stato, poi in ordine decrescente di città.

ORDINE PER

Ora, la cosa interessante è che chi non sa usare molto GROUP BY può usare ORDER BY per analizzare i dati. Per esempio, supponiamo di voler scoprire quante birrerie ci sono in un determinato state. Si possono ottenere i risultati ordinati per stato. In questo modo si otterrà un bel risultato raggruppato dal quale si potrà contare manualmente il numero di birrerie di un determinato state.

Pertanto, chi non ha una forte conoscenza di GROUP BY potrebbe pensare che ORDER BY sia un modo eccellente per raggruppare gli stessi dati. Questa idea non è sbagliata. Se si vogliono visualizzare i dati in un bel modo raggruppato, ORDER BY è una buona scelta.

GROUP BY non è un modo per visualizzare i dati in gruppi, ma è più un modo per analizzare i dati in gruppi. Per comprendere meglio l'SQL ORDER BY rispetto a GROUP BY, diamo un'occhiata a GROUP BY in modo più dettagliato.

GRUPPO PER

Nella maggior parte dei testi, GROUP BY è definito come un modo per aggregare i record in base alle colonne specificate che consentono di eseguire funzioni di aggregazione su colonne non raggruppate (come SUM, COUNT, AVG, ecc.). In altre parole, lo scopo della clausola GROUP BY è quello di riassumere combinazioni uniche di valori di colonne.

Alcuni esempi chiariranno ulteriormente la questione:

Raggruppiamo la beers tabella in base alla colonna style.

SELECT style 
FROM beers 
GROUP BY style

La query SQL di cui sopra genererà il seguente output

ORDINE PER

Vediamo quindi cosa è successo. Questa query ha restituito un risultato per ogni valore di style. Ciò significa che SQL crea prima dei gruppi a partire dagli stessi valori style e restituisce una riga che rappresenta il gruppo.

Qual è l'uso esatto di GROUP BY? Naturalmente, è possibile utilizzare GROUP BY per trovare valori distinti. Ma SQL ha una parola chiave DISTINCT specifica per questo. La vera importanza di GROUP BY si vede quando la si usa con funzioni aggregate come SUM(), COUNT(). Per capire meglio, eseguite la seguente query SQL:

SELECT style, 
 COUNT(Name) 
FROM beers 
GROUP BY style

Il risultato sarà il seguente:

ORDINE PER

In questo caso, l'SQL raggruppa innanzitutto i risultati in base alla colonna style. Poi controlla quanti nomi ci sono in ogni gruppo e restituisce i valori style e il conteggio dei nomi per ogni stile.

Se si osserva attentamente, si può notare che i risultati sono già ordinati in ordine crescente. Questa situazione può far credere che GROUP BY ordina i risultati. In realtà, non è garantito che GROUP BY visualizzi i risultati in ordine crescente. Se si ha bisogno di risultati in un ordine specifico, bisogna farlo da soli, come in questo caso:

SELECT style, 
COUNT(Name) 
FROM beers 
GROUP BY style 
ORDER BY style

Pertanto, GROUP BY funziona bene insieme a ORDER BY.

Ora sapete come usare GROUP BY per contare un insieme di valori appartenenti a un certo gruppo. Vi fornirò altri due esempi reali per capire l'uso di GROUP BY.

  1. Pensate a una tabella di dipendenti in cui sono memorizzate informazioni sui dipendenti, come il nome, il ruolo e lo stipendio. Ogni dipendente appartiene a un reparto diverso, come quello finanziario, informatico o dei trasporti. Si supponga ora di voler ottenere la somma degli stipendi pagati dai dipendenti in base al loro reparto. È necessario eseguire un comando SQL come quello riportato di seguito:

    SELECT department,
     SUM(salary) 
    FROM employee 
    GROUP BY department
    
  2. Supponiamo di avere un sito di commercio elettronico che vende diversi tipi di prodotti. Nel vostro database, avete una tabella per memorizzare le informazioni sulle scorte. Se si desidera trovare il conteggio di ciascun tipo di prodotto, è possibile utilizzare la funzione aggregata GROUP BY with COUNT:

    SELECT product_type, 
     COUNT(product_id) 
    FROM stock
    GROUP BY product_type
    

Proseguiamo questa lezione per approfondire la conoscenza di GROUP BY. È anche possibile raggruppare i risultati utilizzando due colonne. Ad esempio, raggruppiamo la tabella beers in base alle colonne style e brewery_id.

SELECT style,
 brewery_id,
 COUNT(Name) 
FROM beers 
GROUP BY style,
   brewery_id

Questa query SQL dividerà ulteriormente i gruppi style utilizzando brewery_id. Quando la si esegue, si ottiene il seguente risultato:

ORDINE PER

Conclusione

In questo articolo ho spiegato la differenza tra ORDER BY e GROUP BY. ORDER BY ordina i dati in base ai dati di una colonna. Naturalmente, come risultato dell'ordinamento, i dati con gli stessi valori saranno riuniti in un gruppo, il che faciliterà l'analisi manuale successiva. Ma GROUP BY è il metodo SQL per analizzare dati simili.

Non c'è un vero uso di GROUP BY senza funzioni di aggregazione. A volte, GROUP BY può restituire i risultati in ordine ordinato, ma non bisogna farci affidamento. L'ordine in cui vengono restituiti i risultati non è deterministico e dipende da come il motore del db esegue la query.

Dopo aver letto questo articolo, si dovrebbe essere in grado di utilizzare GROUP BY e ORDER BY con maggiore sicurezza. Se volete approfondire le vostre conoscenze su SQL ORDER BY vs. GROUP BY, consultate questo set di esercitazioni: contiene una sezione speciale dedicata a questo argomento.