28th Nov 2023 Tempo di lettura: 8 minuti Cosa significa ORDER BY 1 in SQL? Dominika Florczykowska sql ORDER BY Indice Vediamo ORDER BY 1 in azione! Ordine ascendente e discendente Cosa significa ORDER BY 1, 2, 3? Attenzione: Non usare la sintassi ORDER BY 1 Siete curiosi di saperne di più su ORDER BY 1? 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! Tags: sql ORDER BY