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:NULLvanno alla fine (NULLS LAST) - Con
ORDER BY ... DESC:NULLvanno 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.
GO TO FULL VERSION