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

Come ordinare i record con la clausola ORDER BY

I database relazionali non memorizzano i record in ordine alfabetico, numerico, ascendente o in un ordine particolare. L'unico modo per ordinare i record nell'insieme dei risultati è utilizzare la clausola ORDER BY. Questa clausola può essere utilizzata per ordinare le righe in base a una colonna, a un elenco di colonne o a un'espressione. È anche possibile ordinare le righe utilizzando l'espressione CASE.

In questo post esamineremo la clausola ORDER BY: come scriverla, come funziona e cosa fa.

Sintassi ORDER BY

La clausola ORDER BY viene utilizzata per ordinare le righe in una tabella di risultati. Ecco la sua sintassi:

SELECT list_column
FROM table
ORDER BY column ;

Uso di ORDER BY con una colonna

L'esempio seguente mostra i record della tabella furniture_data che sono stati ordinati in ordine crescente in base alla colonna furniture. L'ordine ascendente è quello predefinito in una clausola ORDER BY.

SELECT id, furniture, points
FROM furniture_data
ORDER BY furniture ;

Come si può notare, la clausola ORDER BY è posta dopo l'istruzione FROM. Dopo la parola chiave ORDER BY, si trova la colonna o le colonne in base alle quali verranno ordinate le righe. In altre parole, si sta dicendo al database "Prendete le colonne id, furniture e points dalla tabella e mettetele in ordine in base al numero di righe. furniture_data e di metterle in ordine in base alla colonna mobili".

È possibile specificare l'ordinamento dei risultati, in ordine crescente (A-Z) o decrescente (Z-A). Per l'ordine ascendente, è possibile utilizzare la parola chiave ASC, ma non è necessario. Per l'ordine discendente, è necessario utilizzare la parola chiave DESC.

Quindi, dopo il nome della colonna, si può inserire la parola chiave ASC o DESC. L'esempio seguente ordina i dati in ordine crescente in base alla colonna "furniture":

SELECT id, furniture, points
FROM furniture _data
ORDER BY furniture ASC ;

Ricordate che non è necessaria la parola chiave ASC per specificare un ordinamento ascendente; SQL lo fa per default.

Successivamente, si osservino i dati della tabella furniture_data che utilizzeremo negli altri esempi di questo articolo:

id furniture points price
1 chair 5 120
2 sofa 8 950
3 table 2 1350
4 bookcase 5 200
5 bed 3 2000

Ecco come appare dopo un ordinamento ascendente per la colonna furniture:

id furniture points
5 bed 3
4 bookcase 5
1 chair 5
2 sofa 8
3 table 2

E se facessimo un ordinamento discendente sulla stessa colonna?

SELECT id, furniture, points
FROM furniture _data
ORDER BY furniture DESC ;

Ecco il risultato dell'ordinamento discendente:

id furniture points
3 table 2
2 sofa 8
1 chair 5
4 bookcase 5
5 bed 3

Utilizzo di ORDER BY con più colonne

Gli ultimi esempi hanno ordinato i dati utilizzando una sola colonna. Tuttavia, se alcuni record di questa colonna hanno valori identici, ciò potrebbe influenzare la visualizzazione dei risultati. In questo caso, è necessario ordinare le righe utilizzando un'altra colonna. L'esempio successivo mostra come utilizzare più di una colonna per ordinare i dati:

SELECT id, furniture, points
FROM furniture _data
ORDER BY point DESC , furniture;

Questo esempio ordina le righe in ordine decrescente in base alla colonna points. Se due o più record hanno lo stesso valore, il database utilizza la colonna furniture per ordinare i record in ordine crescente.

Ecco i risultati:

id furniture points
2 sofa 8
4 bookcase 5
1 chair 5
5 bed 3
3 table 2

Le righe della libreria e della sedia hanno lo stesso numero di punti (5), quindi anche queste righe vengono ordinate in base ai valori della colonna furniture. L'ordinamento è alfabetico, quindi la riga viola viene mostrata prima di quella libreria viene visualizzata prima della riga sedia riga .

Espressioni nella clausola ORDER BY

A volte è necessario ordinare i record in base al risultato di un calcolo piuttosto che ai valori delle colonne. Immaginiamo di voler ordinare i dati recuperati dalla tabella furniture_data tabella in base all'importo di uno sconto sul prezzo. Lo sconto verrebbe calcolato moltiplicando il valore della colonna points per 120 e dividendolo poi per 100.

Ecco come apparirebbe nel codice SQL:

SELECT id, furniture, points, price
FROM furniture _data
ORDER BY price-120*points/100;

Ecco il risultato:

id furniture points price
1 chair 5 120
4 bookcase 5 200
2 sofa 8 950
3 table 2 1350
5 bed 3 2000

Utilizzo di ORDER BY con CASE

Ordinare in base all'espressione CASE

Oltre a ordinare le righe utilizzando una o più colonne, è possibile utilizzare ORDER BY con espressioni CASE semplici e ricercate.(Per saperne di più su CASE, leggete questo articolo). Perché usare CASE in una clausola ORDER BY? È possibile che si voglia ottenere un ordinamento ancora più specifico delle righe, oppure che si vogliano recuperare solo alcune delle righe (ad esempio quelle che soddisfano determinate condizioni).

L'esempio seguente mostra come utilizzare CASE per ordinare i dati in modo specifico. Immaginiamo di voler recuperare i dati dalla tabella furniture_data ma di voler visualizzare in cima ai risultati le righe con un numero pari di punti. Non è possibile farlo usando le colonne come criterio di ordinamento; è necessario CASE.

Di seguito è riportato un esempio del codice in questione:

SELECT id, furniture, points
FROM furniture _data
ORDER BY CASE 
              WHEN points%2=0  THEN 1
              ELSE 2
         END ;

Ecco come appaiono i risultati:

id furniture points
2 sofa 8
3 table 2
1 chair 5
4 bookcase 5
5 bed 3

Come fa l'espressione CASE a farlo? Verifica se il numero della colonna points può essere diviso per 2 senza resto. In caso affermativo, viene restituito un 1 e riga viene mostrata nella parte superiore dei risultati. In caso contrario, viene restituito un 2 e la riga viene mostrata nella parte inferiore dei risultati.

Se si desidera che i record dei mobili con un numero dispari di punti siano elencati per primi, è sufficiente modificare l'ordine di ordinamento in decrescente:

SELECT id, furniture, points
FROM furniture _data
ORDER BY CASE 
              WHEN points%2=0  THEN 1
              ELSE 2
         END   DESC ;

Il risultato:

id furniture points
1 chair 5
4 bookcase 5
5 bed 3
2 sofa 8
3 table 2

Ordinamento con CASE e una colonna

È possibile utilizzare altri elementi insieme all'istruzione CASE, come ad esempio una colonna o un'altra espressione CASE. Guardate il seguente esempio, che utilizza un'espressione CASE e una colonna per ordinare i dati.

SELECT id, furniture, points
FROM furniture _data
ORDER BY CASE 
              WHEN points%2=0  THEN 1
              ELSE 2
         END , furniture  DESC ;

Innanzitutto, i record vengono ordinati in base all'espressione CASE, che controlla se i valori points sono pari o dispari. Come prima, i numeri pari sono elencati per primi. Ma vogliamo ordinare ancora di più i gruppi. Utilizziamo quindi la colonna furniture per ordinare i risultati all'interno dell'espressione CASE. Poiché abbiamo usato la parola chiave DESC, le righe sono elencate in ordine alfabetico inverso. Ecco i risultati:

id furniture points
3 table 2
2 sofa 8
1 chair 5
4 bookcase 5
5 bed 3

Confrontate questi risultati con quelli sottostanti, che utilizzano solo l'espressione CASE:

id furniture points
2 sofa 8
3 table 2
1 chair 5
4 bookcase 5
5 bed 3

Volete saperne di più?

Questo articolo vi ha solo permesso di iniziare a conoscere la clausola ORDER BY. Il modo migliore per saperne di più è provarla di persona, utilizzando il corso Query SQL di Vertabelo Academy.