CodeGym /Corsi /SQL SELF /Ordinamento per più colonne: ordine di ordinamento e prio...

Ordinamento per più colonne: ordine di ordinamento e priorità

SQL SELF
Livello 6 , Lezione 2
Disponibile

Immagina di lavorare con un enorme database di studenti. Ordinarli solo per cognome è già utile, ma pensa che nella tua tabella ci sono studenti con lo stesso cognome. In questo caso, per rendere l’output più leggibile, puoi aggiungere l’ordinamento per nome. Oppure un altro esempio: vuoi ordinare la lista degli ordini prima per data, poi per il totale dell’ordine. Ed è qui che entra in gioco l’ordinamento per più colonne.

L’ordinamento per più colonne ti permette di: 1. Ordinare i dati in un ordine ben definito; 2. Gestire le priorità di ordinamento (prima per una colonna, poi per un’altra); 3. Mostrare i dati in modo più strutturato e leggibile.

Sintassi dell’ordinamento per più colonne

Per ordinare i dati per più colonne, si usa il solito operatore ORDER BY, ma ora elenchiamo più colonne separate da virgola. PostgreSQL ordina prima per la prima colonna, poi (se i valori sono uguali) per la seconda, e così via.

Ecco la sintassi generale:

SELECT colonne
FROM tabella
ORDER BY colonna1 direzione1,  colonna2 direzione2, ... ;

Dove:

  • colonna1, colonna2, ... — sono le colonne per cui vuoi ordinare.
  • direzione1, direzione2, ... — è la direzione dell’ordinamento (ASC — crescente, DESC — decrescente).
  • Questo parametro è opzionale, di default viene usato ASC.

Esempio 1: Ordinare studenti per cognome, poi per nome

Immagina la tabella students con i dati degli studenti:

id first_name last_name age
1 Anna Lin 20
2 Victor Lin 22
3 Maria Kim 21
4 Otto Lin 23
5 Anna Kim 20

Il nostro obiettivo è ordinare gli studenti prima per cognome (last_name), poi per nome (first_name).

SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;

Risultato:

id first_name last_name age
5 Anna Kim 20
3 Maria Kim 21
1 Anna Lin 20
4 Otto Lin 23
2 Victor Lin 22

Come vedi, le righe sono ordinate prima per cognome (Kim, poi Lin), poi per nome (Anna, Maria ecc). È super utile quando devi trovare velocemente qualcuno nella lista o ordinare un registro.

Esempio 2: Ordinare ordini per data e totale

Immagina la tabella orders con i dati degli ordini:

order_id customer_id order_date total
1 101 2025-10-01 500
2 102 2025-10-03 200
3 103 2025-10-02 300
4 104 2025-10-01 100
5 101 2025-10-03 600

Vogliamo ordinare gli ordini prima per data order_date, poi per il totale total in ordine decrescente.

Query SQL:

SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;

Risultato:

order_id customer_id order_date total
1 101 2025-10-01 500
4 104 2025-10-01 100
3 103 2025-10-02 300
5 101 2025-10-03 600
2 102 2025-10-03 200

Come vedi, gli ordini con la stessa data sono ordinati anche per totale.

Lavorare con NULL nell’ordinamento: NULLS FIRST e NULLS LAST

In SQL c’è un valore speciale - NULL, che indica assenza di valore. Parleremo meglio di come gestirlo tra qualche livello. Ma ora è il momento giusto per vedere come puoi gestirlo nell’ordinamento.

Quando ordini colonne che contengono NULL, PostgreSQL deve decidere dove mettere i valori vuoti: all’inizio o alla fine.

Di default:

  • Con ORDER BY ... ASC: NULL vanno alla fine (NULLS LAST)
  • Con ORDER BY ... DESC: NULL vanno all’inizio (NULLS FIRST)

A volte questo comportamento non è comodo — e puoi gestirlo in modo esplicito con NULLS FIRST o NULLS LAST.

Sintassi:

ORDER BY colonna ASC NULLS FIRST
ORDER BY colonna DESC NULLS LAST

Esempio: ordinare per voti, dove NULL — "voto non ancora assegnato"

SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;

Così otteniamo prima gli studenti migliori, poi quelli più deboli, e alla fine — quelli che ancora non hanno il voto (NULL).

Esempio: al contrario — mostrare prima gli studenti senza voto

Supponiamo di avere la tabella grades, dove alcuni studenti non hanno ancora ricevuto il voto (NULL):

student_id grade
101 NULL
102 85
103 NULL
104 92
105 76

Vogliamo mostrare prima gli studenti senza voto, poi gli altri in ordine crescente di voto.

SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;

Risultato:

student_id grade
101 NULL
103 NULL
105 76
102 85
104 92

L’operatore NULLS FIRST insieme a ORDER BY grade ASC garantisce che i record con NULL siano all’inizio, poi i voti in ordine crescente.

Su particolarità ed errori tipici

Chi è alle prime armi spesso si dimentica di specificare la direzione dell’ordinamento per ogni colonna. Se non la specifichi, PostgreSQL usa di default ASC. Inoltre, capita spesso di dimenticare che l’ordine delle colonne in ORDER BY conta: prima i dati vengono ordinati per la prima colonna, poi si applica l’ordinamento per la seconda se i valori della prima sono uguali.

2
Compito
SQL SELF, livello 6, lezione 2
Bloccato
Ordinamento degli studenti per età e nome
Ordinamento degli studenti per età e nome
2
Compito
SQL SELF, livello 6, lezione 2
Bloccato
Ordinamento degli ordini per data e identificativo cliente
Ordinamento degli ordini per data e identificativo cliente
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION