Sommario: in questo tutorial, imparerete come ordinare un set di risultati usando la clausola MySQL ORDER BY
.
Introduzione alla clausola MySQL ORDER BY
Quando si usa l’istruzione SELECT
per interrogare i dati di una tabella, il set di risultati non è ordinato. Ciò significa che le righe nel set di risultati possono essere in qualsiasi ordine.
Per ordinare il set di risultati, si aggiunge la clausola ORDER BY
all’istruzione SELECT
. La seguente illustra la sintassi della clausola ORDER BY
:
In questa sintassi, si specificano una o più colonne che si desidera ordinare dopo la clausola ORDER BY
.
Il ASC
sta per ascendente e il DESC
sta per discendente. Si usa ASC
per ordinare il set di risultati in ordine crescente e DESC
per ordinare il set di risultati in ordine decrescente.
Questa clausola ORDER BY
ordina l’insieme dei risultati in ordine crescente:
Code language: SQL (Structured Query Language) (sql)ORDER BY column1 ASC;
E questa clausola ORDER BY
ordina l’insieme dei risultati in ordine decrescente:
Code language: SQL (Structured Query Language) (sql)ORDER BY column1 DESC;
Per default, la clausola ORDER BY
usa ASC
se non si specifica esplicitamente alcuna opzione.
Quindi, le seguenti clausole sono equivalenti:
Code language: SQL (Structured Query Language) (sql)ORDER BY column1 ASC;
e
Code language: SQL (Structured Query Language) (sql)ORDER BY column1;
Se si vuole ordinare l’insieme dei risultati per colonne multiple, si specifica una lista di colonne separate da virgole nella clausola ORDER BY
:
Code language: SQL (Structured Query Language) (sql)ORDER BY column1, column2;
È possibile ordinare il risultato per una colonna in ordine crescente e poi per un’altra colonna in ordine decrescente:
Code language: SQL (Structured Query Language) (sql)ORDER BY column1 ASC, column2 DESC;
In questo caso, la clausola ORDER BY
:
- Prima, ordina l’insieme dei risultati per i valori nel
column1
in ordine crescente. - Poi, ordinate l’insieme dei risultati per i valori nel
column2
in ordine decrescente. Notate che l’ordine dei valori nelcolumn1
non cambierà in questo passo, solo l’ordine dei valori nelcolumn2
cambia.
Nota che la clausola ORDER BY
viene sempre valutata dopo le clausole FROM
e SELECT
.
MySQL ORDER BY esempi
Utilizzeremo la tabella customers
del database di esempio per la dimostrazione.
A) Utilizzo della clausola MySQL ORDER BY per ordinare i valori in una colonna esempio
La seguente query usa la clausola ORDER BY
per ordinare i clienti secondo i valori della colonna contactLastName
in ordine crescente.
Code language: SQL (Structured Query Language) (sql)SELECTcontactLastname,contactFirstnameFROMcustomersORDER BYcontactLastname;
Prova
Se volete ordinare i clienti per cognome in ordine decrescente, si usa il DESC
dopo la colonna contactLastname
nella clausola ORDER BY
come mostrato nella seguente query:
Code language: SQL (Structured Query Language) (sql)SELECTcontactLastname,contactFirstnameFROMcustomersORDER BYcontactLastname DESC;
Prova
B) Utilizzo della clausola MySQL ORDER BY per ordinare i valori in più colonne esempio
Se si desidera ordinare i clienti per il cognome in ordine decrescente e poi per il primo nome in ordine crescente, si specifica sia DESC
che ASC
nella colonna corrispondente come segue:
Code language: SQL (Structured Query Language) (sql)SELECTcontactLastname,contactFirstnameFROMcustomersORDER BYcontactLastname DESC,contactFirstname ASC;
Try It Out
In questo esempio, la clausola ORDER BY
ordina prima l’insieme dei risultati per cognome in ordine decrescente e poi ordina l’insieme dei risultati ordinati per nome in ordine crescente per produrre l’insieme dei risultati finale.
C) Usare MySQL ORDER BY per ordinare un insieme di risultati secondo un’espressione
Vedi la seguente tabella orderdetails
dal database di esempio.
La seguente query seleziona le righe dell’ordine dalla tabella orderdetails
. Calcola il subtotale per ogni riga e ordina il risultato in base al subtotale.
Code language: SQL (Structured Query Language) (sql)SELECT orderNumber, orderlinenumber, quantityOrdered * priceEachFROM orderdetailsORDER BY quantityOrdered * priceEach DESC;
Prova
Per rendere la query più leggibile, è possibile assegnare all’espressione nella clausola SELECT
un alias di colonna e utilizzare tale alias di colonna nella clausola ORDER BY
come mostrato nella seguente query:
Code language: SQL (Structured Query Language) (sql)SELECT orderNumber, orderLineNumber, quantityOrdered * priceEach AS subtotalFROM orderdetailsORDER BY subtotal DESC;
Try It Out
In questo esempio, abbiamo usato subtotal
come alias di colonna per l’espressione quantityOrdered * priceEach
e abbiamo ordinato il set di risultati per l’alias subtotal
.
L’alias di colonna può essere usato nella clausola ORDER BY
perché la clausola SELECT
viene valutata prima della clausola ORDER BY
. Nel momento in cui la clausola ORDER BY
viene valutata, l’alias di colonna è accessibile.
Utilizzare MySQL ORDER BY per ordinare i dati usando una lista personalizzata
La clausola ORDER BY
permette di ordinare i dati usando una lista personalizzata utilizzando la funzione FIELD()
.
Vedi la seguente tabella orders
dal database di esempio.
Supponiamo di voler ordinare gli ordini di vendita in base al loro stato nel seguente ordine:
- In Process
- On Hold
- Cancellato
- Risolto
- Disputato
- Spedito
Per fare questo, è possibile utilizzare la funzione FIELD()
per mappare ogni stato dell’ordine a un numero e ordinare il risultato in base al risultato della funzione FIELD()
:
Prova
La seguente espressione:
Code language: SQL (Structured Query Language) (sql)FIELD(status, 'In Process', 'On Hold', 'Cancelled', 'Resolved', 'Disputed', 'Shipped');
restituisce l’indice del status
nella lista 'In Process', 'On Hold', 'Cancelled', 'Resolved', 'Disputed', 'Shipped'
.
Per esempio, se il status
In Process
, la funzione restituirà 1. Se il status
On Hold
, la funzione restituirà 2, e così via.
In questo tutorial, hai imparato a usare la clausola di MySQL ORDER BY
per ordinare le righe nel set di risultati in base a una o più colonne in ordine crescente o decrescente.
- Questo tutorial è stato utile?
- SìNo