Nelle lezioni precedenti abbiamo visto come filtrare le righe in base a determinate condizioni grazie alla clausola WHERE di SQL. Finora, però, abbiamo sempre ottenuto i risultati nell'ordine stabilito dal database. Quando visualizziamo molti dati, può essere utile invece stabilire l'ordine delle righe o mostrare soltanto una parte del risultato.
In questa lezione vedremo come utilizzare ORDER BY per ordinare i risultati e LIMIT e OFFSET per limitarli e suddividerli in più pagine.
La clausola ORDER BY permette di stabilire l'ordine con cui vengono restituite le righe di una query.
Per esempio, supponiamo di avere una tabella utenti con una colonna eta. Possiamo ordinare gli utenti dall'età più bassa a quella più alta utilizzando:
SELECT * FROM utenti ORDER BY eta;Per impostazione predefinita, ORDER BY ordina i valori in ordine crescente, cioè dal più piccolo al più grande.
Possiamo specificare esplicitamente questo comportamento utilizzando gli attributi:
ASC, per l'ordinamento crescente.DESC, per l'ordinamento decrescente.Ad esempio, per ordinare i risultati dal valore più grande al più piccolo di eta, utilizziamo DESC:
SELECT * FROM utenti
ORDER BY eta DESC;ORDER BY può essere utilizzato insieme alle altre clausole e condizioni che abbiamo già visto. Per esempio, possiamo prima utilizzare WHERE per filtrare gli utenti e poi ORDER BY per ordinarli.
Possiamo ordinare i risultati utilizzando più colonne. È sufficiente separarle con una virgola:
SELECT * FROM utenti
ORDER BY cognome ASC, nome ASC;In questo caso, SQL ordina prima gli utenti in base al cognome. Se due o più utenti hanno lo stesso cognome, utilizza nome per stabilire l'ordine tra loro.
È possibile indicare una colonna anche attraverso la sua posizione nella SELECT. Per esempio, possiamo indicare la seconda colonna in questo modo:
SELECT nome, eta FROM utenti
ORDER BY 2 DESC;In questo caso 2 indica la seconda colonna di SELECT, cioè eta. Gli utenti verranno quindi ordinati in base all'età decrescente.
Come abbiamo visto nella lezione su SELECT, possiamo utilizzare AS per assegnare un nome a una colonna o a un'espressione.
Il nuovo nome può essere utilizzato anche con ORDER BY.
SELECT eta * 2 AS eta_doppia FROM utenti
ORDER BY eta_doppia DESC;In questo caso eta_doppia è il nome assegnato al risultato dell'operazione eta * 2. Possiamo quindi utilizzarlo in ORDER BY per ordinare i risultati in base al valore calcolato.
Quando ordiniamo una colonna che può contenere NULL (che abbiamo visto nella lezione sulle condizioni avanzate), è importante sapere dove vengono posizionati questi valori.
In MySQL, durante un ordinamento crescente con ASC, i valori NULL vengono normalmente considerati più piccoli degli altri valori e quindi vengono posizionati all'inizio del risultato.
Con un ordinamento decrescente, invece, i valori NULL vengono posizionati alla fine.
Quando una tabella contiene molte righe, potrebbe non essere conveniente restituirle tutte contemporaneamente. Immaginiamo, per esempio, una pagina di un sito che deve mostrare gli utenti registrati: visualizzare migliaia di utenti in un'unica pagina renderebbe l'interfaccia poco pratica.
Possiamo quindi utilizzare LIMIT per stabilire il numero massimo di righe da restituire.
Questa query, ad esempio, restituisce al massimo 10 utenti:
SELECT * FROM utenti LIMIT 10;LIMIT può essere combinato con ORDER BY. Per esempio, possiamo ottenere i 10 utenti più anziani:
SELECT * FROM utenti
ORDER BY eta DESC LIMIT 10;Prima ORDER BY ordina gli utenti dal più anziano al più giovane, poi LIMIT mantiene soltanto i primi 10 risultati.
OFFSET permette di saltare un determinato numero di righe prima di iniziare a restituire i risultati.
Ad esempio, possiamo saltare i primi 10 utenti e mostrare i 10 successivi:
SELECT * FROM utenti
LIMIT 10 OFFSET 10;Possiamo immaginare il risultato diviso in pagine da 10 elementi:
LIMIT 10 e OFFSET 0LIMIT 10 e OFFSET 10LIMIT 10 e OFFSET 20Ad esempio, per ottenere la seconda pagina:
SELECT * FROM utenti
ORDER BY id LIMIT 10 OFFSET 10;L'uso di ORDER BY è particolarmente importante quando utilizziamo l'impaginazione di OFFSET, perché permette di stabilire un ordine preciso dei risultati.
MySQL permette anche di scrivere LIMIT e OFFSET utilizzando una sintassi abbreviata:
LIMIT numero, numero, dove il primo numero indica quante righe saltare (ovvero OFFSET), mentre il secondo indica quante righe restituire (ovvero LIMIT).
Ad esempio:
SELECT * FROM utenti
LIMIT 10, 10;