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

Cosa significa ORDER BY 1 in SQL?

Avete mai visto la sintassi "ORDER BY 1" nelle query SQL e vi siete chiesti cosa significhi? In questo articolo esploreremo questa sintassi, ne chiariremo lo scopo e la renderemo più facile da comprendere.

Sia che siate utenti esperti di SQL o che abbiate appena iniziato a esplorare questo linguaggio, è probabile che abbiate già incontrato la clausola ORDER BY. In SQL, la clausola ORDER BY viene utilizzata per ordinare le righe di una tabella in base a una o più colonne. Consente di ordinare i dati in ordine crescente (A-Z, 1-10) o decrescente (Z-A, 10-1) in base a criteri specifici.

Dopo la clausola ORDER BY, di solito si specifica la colonna in base alla quale si desidera ordinare i dati. Tuttavia, forse vi sorprenderà sapere che è possibile utilizzare la sintassi ORDER BY 1 anche in una query SQL. La sintassi per una query di questo tipo è la seguente:

SELECT column_name(s)
FROM table_name
ORDER BY 1;

Se avete visto questo tipo di codice nelle query SQL e siete rimasti perplessi, non preoccupatevi! Alla fine di questo articolo capirete esattamente come funziona e quando usarlo. E se durante la lettura dell'articolo avete bisogno di ripassare la sintassi SQL, non esitate a consultare il nostro pratico SQL Basics Cheat Sheet!

Per diventare davvero bravi con l'SQL, è necessario esercitarsi. Se volete esercitarvi con molti problemi, vi consigliamo di provare il nostro percorso SQL Practice. Imparerete a risolvere problemi reali, utilizzando il nostro editor di codice online e set di dati reali. Questo percorso comprende nove corsi e oltre 1.100 esercizi pratici con cui esercitarsi.

Vediamo ORDER BY 1 in azione!

Immaginate di avere una tabella chiamata movie con le seguenti colonne:

  • id - L'ID del film, che è anche la chiave primaria (PK) della tabella.
  • title - Il titolo del film.
  • length - La durata del film in minuti.
  • director - Il nome del regista del film.
  • year - L'anno di uscita del film.
  • rating - La valutazione del film (da 1 a 10).

Qui è possibile vedere una manciata di righe della tabella:

idtitlelengthdirectoryearrating
1The Secret Quest110David Anderson20227
2Lost in Time95Emily Roberts20196
3Starship Odyssey150Michael Turner20218
4The Enchanted Forest85Sarah Johnson20227
5Epic Journey130Mark Lewis20207
6Space Explorers115Lisa Adams20227
7Time Travelers100Paul Miller20216
8Mystic Island140Jessica White20238
9The Great Discovery105Robert Green20217
10Underwater120Mary Johnson20216

Cosa succede se eseguiamo la seguente query?

SELECT 
	title,
	length,
	director
FROM movie
ORDER BY 1;

Specificando ORDER BY 1, si ordina al database di ordinare i risultati in base alla prima colonna dell'elenco SELECT, che in questo caso è title.

Ciò significa che la query precedente è equivalente a questa:

SELECT 
	title,
	length,
	director
FROM movie
ORDER BY title;

La prima query è un po' più breve, ma può essere più difficile da capire. Nella seconda query è possibile vedere facilmente quale colonna viene utilizzata per l'ordinamento. Questo riduce la possibilità di commettere errori.

Questo è il risultato della nostra query:

titlelengthdirector
Epic Journey130Mark Lewis
Lost in Time95Emily Roberts
Mystic Island140Jessica White
Space Explorers115Lisa Adams
Starship Odyssey150Michael Turner
The Enchanted Forest85Sarah Johnson
The Great Discovery105Robert Green
The Secret Quest110David Anderson
Time Travelers100Paul Miller
Underwater120Mary Johnson

Se l'ordine delle colonne selezionate cambiasse, si dovrebbe usare un numero di colonna diverso:

SELECT
	director,
	title,
	length
FROM movie
ORDER BY 2;

Come si può vedere, l'uso di questa sintassi può essere un po' complicato.

Sapevate che è possibile utilizzare una sintassi simile nella clausola GROUP BY? Consultate il nostro articolo sulla sintassi GROUP BY 1!

Ordine ascendente e discendente

Per impostazione predefinita, la clausola ORDER BY ordina i risultati dal più basso al più alto, cioè in ordine crescente. Tuttavia, a volte potrebbe essere necessario ordinare i dati in ordine decrescente. È possibile farlo utilizzando anche la sintassi ORDER BY 1. È sufficiente aggiungere la parola chiave ASC o DESC dopo 1.

Ad esempio, se si vuole recuperare l'elenco dei film e ordinarlo dal più lungo al più corto, si può eseguire una query come questa:

SELECT
	title,
	length,
	director
FROM movie
ORDER BY 2 DESC;

La query di cui sopra è l'equivalente di:

SELECT
	title,
	length,
	director
FROM movie
ORDER BY length DESC;

Ed ecco il risultato della nostra interrogazione:

titlelengthdirector
Starship Odyssey150Michael Turner
Mystic Island140Jessica White
Epic Journey130Mark Lewis
Underwater120Mary Johnson
Space Explorers115Lisa Adams
The Secret Quest110David Anderson
The Great Discovery105Robert Green
Time Travelers100Paul Miller
Lost in Time95Emily Roberts
The Enchanted Forest85Sarah Johnson

Cosa significa ORDER BY 1, 2, 3?

Nell'esempio precedente, abbiamo ordinato i dati in base a una sola colonna. Ora vogliamo ordinare le righe in base a tre colonne diverse: year, rating, e title.

Per farlo, possiamo utilizzare la seguente query:

SELECT
	year,
	rating,
	title
FROM movie
ORDER BY 1, 2, 3;

Quando si utilizza ORDER BY con più colonne, il database ordina prima le righe in base alla prima colonna specificata. Se ci sono valori duplicati nella prima colonna, il database ordina ulteriormente le righe usando la seconda colonna specificata e così via. Quando si usa ORDER BY 1, 2, 3, si indica al database di ordinare i risultati in base alla prima, alla seconda e alla terza colonna dell'elenco SELECT.

Ciò equivale a eseguire la seguente query:

SELECT
year,
rating,
title
FROM movie
ORDER BY year, rating, title;

Ecco cosa restituisce la query:

yearratingtitle
20196Lost in Time
20207Epic Journey
20216Time Travelers
20216Underwater
20217The Great Discovery
20218Starship Odyssey
20227Space Explorers
20227The Enchanted Forest
20227The Secret Quest
20238Mystic Island

La query precedente ordina i risultati in ordine crescente per tutte le colonne. E se volessimo ordinare i risultati per anno, dal più recente al più vecchio, poi per valutazione, dalla più alta alla più bassa, e infine per titolo in ordine alfabetico? Possiamo fare tutto questo scrivendo ASC o DESC dopo ogni colonna:

SELECT
	year,
	rating,
	title
FROM movie
ORDER BY 1 DESC, 2 DESC, 3 ASC;

Il risultato di questa query è:

yearratingtitle
20238Mystic Island
20227Space Explorers
20227The Enchanted Forest
20227The Secret Quest
20218Starship Odyssey
20217The Great Discovery
20216Time Travelers
20216Underwater
20207Epic Journey
20196Lost in Time

Si noti che i numeri delle colonne nella clausola ORDER BY non devono essere consecutivi. Si può anche scrivere una query come questa:

SELECT
	title,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, 1 ASC;

Ora, stiamo istruendo il database a raggruppare i risultati in base alla seconda, terza e prima colonna dell'elenco SELECT.

È anche possibile combinare numeri e nomi di colonne in una singola clausola ORDER BY:

SELECT
	title,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, title ASC;

Questa volta, raggruppiamo i risultati in base alla seconda e terza colonna dell'elenco SELECT e alla colonna title.

Le query precedenti restituiscono quanto segue:

titleyearrating
Mystic Island20238
Space Explorers20227
The Enchanted Forest20227
The Secret Quest20227
Starship Odyssey20218
The Great Discovery20217
Time Travelers20216
Underwater20216
Epic Journey20207
Lost in Time20196

Attenzione: Non usare la sintassi ORDER BY 1

L'uso della sintassi ORDER BY 1 e ORDER BY 1, 2, 3 in SQL è generalmente considerato una cattiva pratica perché rende le query più difficili da leggere e da mantenere. Se da un lato può far risparmiare un po' di battitura, dall'altro può causare problemi imprevisti.

Il problema principale di questo approccio è che si basa sull'ordine delle colonne nell'istruzione SELECT invece di specificare direttamente i nomi delle colonne. Se l'ordine delle colonne cambia o ne vengono aggiunte di nuove, i risultati della query potrebbero cambiare in modo imprevisto.

Per esempio, supponiamo di aver usato la seguente query per ottenere l'elenco dei film ordinati per anno dal più recente al più vecchio, poi per valutazione dal più alto al più basso e infine per titolo in ordine alfabetico:

SELECT
	title,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, 1 ASC;

Ora, immaginiamo di voler visualizzare anche il nome del regista nel nostro elenco. Possiamo ottenere questo risultato modificando leggermente la query:

SELECT
	title,
	director,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, 1 ASC;

Ma quando eseguiamo questa query, non ci dà la risposta giusta! Questo è il risultato che otteniamo:

titledirectoryearrating
The Enchanted ForestSarah Johnson20227
The Great DiscoveryRobert Green20217
Time TravelersPaul Miller20216
Starship OdysseyMichael Turner20218
UnderwaterMary Johnson20216
Epic JourneyMark Lewis20207
Space ExplorersLisa Adams20227
Mystic IslandJessica White20238
Lost in TimeEmily Roberts20196
The Secret QuestDavid Anderson20227

Sembra che le righe non siano ordinate per year, rating e title come previsto. Questo dimostra le potenziali insidie di affidarsi all'ordine delle colonne invece di specificare i nomi delle colonne direttamente nella clausola ORDER BY. Riuscite a individuare l'errore nella nostra query modificata?

Il risultato non è corretto perché abbiamo cercato di ordinare le righe in base alle colonne director, year e title invece che in base all'anno, alla valutazione e al titolo.

La query corretta sarebbe stata la seguente:

SELECT
	title,
	director,
	year,
	rating
FROM movie
ORDER BY 3 DESC, 4 DESC, 1 ASC;

Ma possiamo evitare questo errore utilizzando semplicemente la clausola ORDER BY con i nomi completi delle colonne:

SELECT
	title,
	director,
	year,
	rating
FROM movie
ORDER BY year DESC, rating DESC, title ASC;

Ora, anche se decidiamo di cambiare o spostare le colonne nell'istruzione SELECT, non dobbiamo pensare alla parte ORDER BY.

Come si può notare, è meglio indicare esplicitamente i nomi delle colonne per le quali si vuole fare l'ordinamento nella clausola ORDER BY. Questo rende la query più facile da leggere e meno soggetta a errori.

Il trucco di ORDER BY 1 va bene quando si guardano i dati da soli e si vuole velocizzare la digitazione. Ma se si intende riutilizzare la query in qualche modo, è meglio usare la sintassi completa con i nomi delle colonne.

Siete curiosi di saperne di più su ORDER BY 1?

Per oggi è tutto! Se volete saperne di più su come usare la clausola ORDER BY, date un'occhiata ai nostri articoli per imparare a usare l'ORDER BY in modo dettagliato e vedere alcuni esempi reali di utilizzo dell'ORDER BY.

E per fare più pratica, ricordatevi di dare un'occhiata alla nostra traccia SQL Practice!