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

Guida dettagliata a SQL ORDER BY

Spesso è necessario visualizzare l'output di una query SQL in un ordine specifico piuttosto che in modo arbitrario. In questo articolo spiegherò i vari modi in cui è possibile farlo con la clausola ORDER BY di SQL.

Per ordinare i record in SQL è necessario utilizzare la clausola ORDER BY. In questo articolo spiegherò in dettaglio come utilizzare ORDER BY per ordinare l'output in base a una o più colonne, in ordine crescente (A-Z) o decrescente (Z-A), utilizzando colonne esistenti o calcolate da una funzione aggregata. Non preoccupatevi, non è così complicato come sembra!

Come ordinare le righe in SQL

Se non si ordina l'output della query SQL, l'ordine delle righe sarà arbitrario. Se si desidera che le righe della tabella risultante appaiano in un ordine specifico, è necessario utilizzare la clausola ORDER BY.

La sintassi di base di ORDER BY è la seguente:

SELECT ...columns...
FROM table
ORDER BY sorting_column ASC/DESC;
  • Dopo la parola chiave ORDER BY, si elencano semplicemente le colonne in base alle quali si desidera ordinare i record.
  • Queste colonne non devono essere visualizzate nell'output, ovvero elencate nell'istruzione SELECT.
  • L'ordine di ordinamento (crescente o decrescente) si imposta con le parole chiave DESC e ASC. La parola chiave ASC è opzionale; se non viene specificata alcuna parola chiave dopo il nome della colonna, le righe saranno ordinate in ordine crescente per impostazione predefinita.
  • ORDER BY è posizionato alla fine della query.

In questo articolo si può vedere un'animazione del funzionamento di ORDER BY. Vediamo ora alcuni casi pratici di utilizzo di ORDER BY.

ORDINARE PER UNA COLONNA

Immaginiamo di gestire un negozio che vende costumi di Halloween. Abbiamo in magazzino diversi tipi di costumi, maschere, cappelli e accessori. Ecco la tabella con i nostri products:

products
idnamecategoryquantityprice
11Wonder Womancostumes219.95
12Vampiremasks43.95
13Magic Wandaccessories62.50
14Wizard of Ozhats33.95
15Supermancostumes314.95
16Hulkcostumes212.50
17Witchhats44.95
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
20Freddy Kruegermasks33.95
21Alienmasks0NULL
22Cowboyhats34.95
23Ghostbusteraccessories213.95
24Swordaccessories73.50
25Zombiemasks82.95

Ordinamento semplice con una sola colonna: Ordinamento in base a una colonna

Cominciamo con un esempio molto semplice: ordinare gli elementi in ordine alfabetico per nome. Per ordinare gli elementi in ordine alfabetico, è sufficiente ordinare il set di risultati in base alla colonna nome in ordine crescente. Come sappiamo, l'ordine crescente è quello predefinito in SQL, quindi la parola chiave ASC può essere omessa. Ecco la nostra query:

SELECT *
FROM products
ORDER BY name;

Ed ecco il risultato, con tutti i record ordinati alfabeticamente in base al nome del prodotto:

idnamecategoryquantityprice
21Alienmasks0NULL
22Cowboyhats34.95
20Freddy Kruegermasks33.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
13Magic Wandaccessories62.50
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
15Supermancostumes314.95
24Swordaccessories73.50
12Vampiremasks43.95
17Witchhats44.95
14Wizard of Ozhats33.95
11Wonder Womancostumes219.95
25Zombiemasks82.95

Piuttosto semplice, no? Ora ordiniamo i costumi di Halloween in base al prezzo, partendo dal più costoso. Per andare dal prezzo più alto a quello più basso è necessario ordinare in ordine decrescente. Pertanto, la clausola ORDER BY deve includere la parola chiave DESC:

SELECT *
FROM products
ORDER BY price DESC;
idnamecategoryquantityprice
19Snow Whitecostumes123.95
11Wonder Womancostumes219.95
15Supermancostumes314.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
17Witchhats44.95
22Cowboyhats34.95
14Wizard of Ozhats33.95
12Vampiremasks43.95
20Freddy Kruegermasks33.95
24Swordaccessories73.50
25Zombiemasks82.95
13Magic Wandaccessories62.50
21Alienmasks0NULL
18Rapunzelcostumes0NULL

Ci sono diverse cose interessanti da notare sugli ordinamenti SQL:

  • Ordine delle righe con lo stesso valore. Alcuni articoli della nostra tabella hanno lo stesso prezzo: in particolare, i cappelli da strega e da cowboy costano 4,95 dollari, mentre il cappello del Mago di Oz e le maschere da vampiro e Freddy Krueger costano 3,95 dollari. Come fa SQL a ordinare queste righe? In realtà non esistono regole specifiche per questi casi; il risultato non è deterministico. In altre parole, l'ordine delle righe contenenti lo stesso valore della colonna di ordinamento può variare ogni volta che la query viene eseguita. Se si desidera che l'ordine delle righe sia coerente, utilizzare una colonna univoca per ordinare le righe. Se ciò non è possibile, verificare se è possibile ordinare l'insieme dei risultati utilizzando una combinazione di colonne che determinano un ordine determinato. L'ordinamento per colonne multiple sarà trattato più avanti in questo articolo.
  • Comportamento dell'ordinamento per i valori NULL. Nella tabella dei risultati sopra riportata, le righe con valori NULL nella colonna di ordinamento vengono messe alla fine della tabella. Tuttavia, questo comportamento non è coerente tra i diversi database relazionali. Ho usato MySQL per eseguire questa query e questo database considera i valori NULL come il valore più basso possibile. Pertanto, li ordina per ultimi quando viene richiesto l'ordine decrescente. Il risultato sarebbe lo stesso nei database SQL Server e SQLite. Tuttavia, i database PostgreSQL e Oracle trattano i NULL come i valori più grandi possibili e li mettono al primo posto nell'ordinamento discendente. Nella maggior parte dei casi, è possibile modificare il comportamento predefinito di ORDER BY rispetto ai valori NULL. Scoprite come in questa guida dettagliata.

Ottimo! Passiamo a esempi più complicati.

Ordinamento in base a una colonna calcolata da una funzione aggregata

In SQL è possibile ordinare i risultati in base a una o più colonne calcolate. Questa colonna può essere calcolata utilizzando una delle funzioni aggregate (come AVG(), SUM(), COUNT(), MAX(), MIN()) o un altro metodo. Vediamo come funziona in pratica.

Nel prossimo esempio, vogliamo vedere quali categorie di prodotti includono articoli più costosi. In particolare, vogliamo ordinare le categorie in base al prezzo medio dei prodotti, partendo da quelli più costosi.

Calcoleremo il prezzo medio per ogni categoria, quindi ordineremo le righe in ordine decrescente in base a questa colonna calcolata:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY avg_price DESC;

Si noti che la clausola ORDER BY è posizionata per ultima, dopo la clausola GROUP BY. Ecco il risultato:

categoryavg_price
costumes17.84
accessories6.65
hats4.62
masks3.62

È bene notare che ORDER BY accetta la notazione numerica quando si riferisce alla colonna di ordinamento. Ad esempio, per ordinare l'insieme dei risultati in base alla prima colonna, è sufficiente scrivere ORDER BY 1.

Di conseguenza, la seguente query darebbe lo stesso risultato della tabella precedente:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY 2 DESC;

Poiché la colonna avg_price è la seconda nella nostra istruzione SELECT, possiamo fare riferimento ad essa nella clausola ORDER BY usando '2'.

Questo approccio ci fa risparmiare tempo nella digitazione, ma ha un importante svantaggio. Se si modifica la query aggiungendo altri campi all'istruzione SELECT, bisogna ricordarsi di controllare se il numero nella clausola ORDER BY è ancora rilevante o deve essere modificato. Sfortunatamente, questo passaggio viene spesso trascurato, causando un ordine errato nell'insieme dei risultati.

ORDINE PER COLONNE MULTIPLE

ORDER BY consente di ordinare il set di risultati in base a due o più colonne. Tuttavia, per utilizzare questo strumento in modo appropriato è necessario comprenderne il funzionamento:

  • L'ordinamento inizia ordinando i dati in base alla prima colonna menzionata nella clausola ORDER BY Se questa colonna contiene gli stessi valori, le righe corrispondenti vengono ordinate in base alla seconda colonna elencata nella clausola ORDER BY e così via. Pertanto, l'ordine delle colonne è importante.
  • È possibile scegliere l'ordine (cioè ascendente o discendente) per ciascuna delle colonne elencate in ORDER BY. Per specificare l'ordine, è sufficiente inserire la parola chiave DESC o ASC dopo ciascuna delle colonne elencate. Se si omette la parola chiave DESC / ASC, l'ordinamento sarà per default in ordine crescente.

Vediamo alcuni esempi.

Ordinamento per colonne multiple in SQL

Si ricorderà che quando abbiamo ordinato i prodotti in base al prezzo, il risultato dell'ordinamento non era deterministico. In particolare, c'erano diversi articoli con lo stesso prezzo che avrebbero dovuto apparire nella stessa posizione, ma in realtà erano ordinati in modo casuale. Se si vuole avere un maggiore controllo sull'ordinamento in questi casi, è necessario aggiungere un'altra colonna alla clausola ORDER BY.

Ad esempio, si può iniziare ordinando gli articoli in base al loro prezzo (dal più costoso al più economico). Poi si può scegliere di ordinare in ordine alfabetico gli articoli con lo stesso prezzo. Ciò implica un ordinamento per prezzo in ordine decrescente e poi un ordinamento per nome in ordine crescente. Ecco la query:

SELECT id, name, price
FROM products
ORDER BY price DESC, name;
idnameprice
19Snow White23.95
11Wonder Woman19.95
15Superman14.95
23Ghostbuster13.95
16Hulk12.50
22Cowboy4.95
17Witch4.95
20Freddy Krueger3.95
12Vampire3.95
14Wizard of Oz3.95
24Sword3.50
25Zombie2.95
13Magic Wand2.50
21AlienNULL
18RapunzelNULL

Abbiamo selezionato solo tre colonne per concentrarci meglio sui risultati dell'ordinamento. Come si può vedere:

  • I cappelli da cowboy e da strega hanno lo stesso prezzo e sono ora ordinati in ordine alfabetico.
  • Allo stesso modo, un altro gruppo di articoli al prezzo di 3,95 dollari è ordinato in ordine alfabetico per nome.
  • Infine, SQL considera i valori NULL della colonna prezzo come lo stesso valore, quindi le righe sono ordinate alfabeticamente in base al nome dell'articolo.

È possibile utilizzare la notazione numerica quando si elencano più colonne nella clausola ORDER BY; funziona allo stesso modo. La seguente query darà gli stessi risultati di quella precedente:

SELECT id, name, price
FROM items
ORDER BY 3 DESC, 2;

Tuttavia, occorre prestare molta attenzione alla notazione numerica, poiché la modifica della query può cambiare l'ordine delle colonne e quindi l'ordinamento.

Ordinamento in base a più colonne calcolate

Aggiungiamo un'ulteriore complessità al nostro esempio di ordinamento finale. In questo caso, vogliamo ordinare le categorie di prodotti in base al numero totale di articoli in magazzino, partendo dalla categoria con il minor numero di articoli. Se una delle categorie ha lo stesso numero di articoli in magazzino, vogliamo che la categoria con il prezzo più alto sia elencata per prima.

In altre parole, vogliamo ordinare l'output in base a due colonne, entrambe calcolate con funzioni aggregate. Inoltre:

  • La somma del numero di articoli in ogni categoria deve essere ordinata in ordine crescente.
  • Il prezzo massimo del prodotto in ogni categoria deve essere ordinato in ordine decrescente.

Ecco la query e il risultato:

SELECT 
  category, 
  SUM(quantity) AS total_quantity, 
  MAX(price) AS max_price
FROM items
GROUP BY category
ORDER BY total_quantity, max_price DESC;
categorytotal_quantitymax_price
costumes823.95
hats104.95
accessories1513.95
masks153.95

In questa query, calcoliamo il numero totale di articoli (SUM(quantity)) e il prezzo massimo del prodotto (MAX(price)) per ogni categoria (categoriaGROUP BY ). Assegniamo anche gli alias (total_quantity e max_price, rispettivamente). Infine, ordiniamo l'output per total_quantity in ordine crescente (omettendo la parola chiave ASC ) e per max_price in ordine decrescente (usando la parola chiave DESC ).

Come previsto, la tabella è ordinata in base al numero totale di articoli di ogni categoria, a partire dai costumi (che hanno il minor numero di articoli in magazzino). Ma si noti che le categorie accessori e maschere hanno entrambe 15 articoli in magazzino. In questo caso, entra in gioco l'ordinamento in base alla seconda colonna e queste due righe vengono ordinate in base al prodotto più costoso della categoria corrispondente. In particolare, la categoria degli accessori viene prima (in quanto include Ghostbusters, che ha un prezzo di 13,95 dollari), mentre la categoria delle maschere viene per ultima (in quanto le maschere più costose costano solo 3,95 dollari).

Per imparare usi più avanzati di ORDER BY, come l'inserimento di espressioni nella condizione ORDER BY, consultate questa guida completa.

È ora di fare pratica con l'SQL ORDER BY!

ORDER BY sembra abbastanza facile da capire. Tuttavia, l'ordinamento dei record in SQL presenta molte sfumature che è meglio imparare con la pratica. Consiglio di iniziare con il corso SQL Basics che, tra le altre cose, copre tutto ciò che è necessario sapere sull'ordinamento delle righe in SQL. Il corso è interattivo e comprende 149 sfide di codifica, dalle più semplici alle più avanzate.

Se siete desiderosi di costruire una solida base di SQL, prendete in considerazione la possibilità di completare il corso di LearnSQL.it. SQL Fundamentals . Include SQL Basics e due corsi aggiuntivi che coprono le funzioni SQL standard, la creazione e l'aggiornamento di tabelle in SQL e molto altro ancora.

Grazie per aver letto e buon apprendimento!