Il ORDER BY
La clausola è comunemente usata in SQL per ordinare i risultati di una query.
Consente di specificare l'ordine in cui vengono restituiti i risultati.
È possibile specificare se i risultati vengono ordinati in ordine crescente o decrescente. Puoi anche specificare più colonne per l'ordinamento.
Esempio
Ecco un esempio per dimostrare il ORDER BY
clausola.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Risultato:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | | 1002 | Sledge Hammer | 33.49 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | +------------+---------------------------------+----------------+
Il ASC
parte significa ascendente . Quando usi il ORDER BY
clausola, per impostazione predefinita è ascendente, quindi puoi omettere ASC
parte se lo desideri.
Quindi potremmo anche scrivere la query in questo modo:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Ordine discendente
Per ordinarlo in decrescente ordinare, utilizzare DESC
.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Risultato:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Ordine per più colonne
È possibile specificare più colonne in base alle quali eseguire l'ordinamento. Ciò ti consente di specificare come devono essere ordinate le righe quando sono presenti più righe con lo stesso valore nella prima colonna ordinata.
Probabilmente è più facile dimostrarlo con un esempio.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Risultato:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------------+---------------------------------+----------------+
Se ci concentriamo sulle tre righe con un VendorId
di 1001
, possiamo vedere che l'esempio precedente ha restituito i nomi dei prodotti in ordine crescente, ma in questo esempio li abbiamo restituiti in ordine decrescente. Questo perché abbiamo nominato il ProductName
come seconda colonna nel nostro ORDER BY
clausola, e abbiamo specificato DESC
per ordine decrescente.
La seconda colonna ha effetto solo se sono presenti duplicati nella prima ORDER BY
colonna. In caso contrario, le colonne successive sono irrilevanti per l'ulteriore ordinamento.
Se osserviamo il ProductPrice
colonna, possiamo vedere che questa colonna non ha avuto alcun effetto sull'ordinamento, anche se abbiamo specificato ProductPrice DESC
. Possiamo vedere che i prezzi sono tutti in ordine crescente, nonostante la nostra insistenza sul fatto che dovrebbero essere in ordine decrescente. Il motivo per cui questa colonna non ha avuto effetto è perché non c'erano duplicati nella colonna precedentemente ordinata. Pertanto, l'ordinamento delle prime due colonne ha influito sui risultati, ma non l'ordinamento della terza colonna.
Questo non vuol dire che la terza colonna non avrà mai alcun effetto. Se in seguito abbiamo inserito un altro Left handed screwdriver
, ma a un prezzo diverso, quindi il ProductPrice
l'ordinamento delle colonne avrà effetto, poiché ci sono valori duplicati in ProductName
colonna.
Combinazione ascendente e discendente
Puoi mescolare ogni colonna con ordine crescente e decrescente. Non devono essere tutti uguali. Ad esempio, potremmo fare questo:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Risultato:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Ordine per alias di colonna
Il ORDER BY
La clausola accetta gli alias di colonna come colonna da ordinare.
Ad esempio, potremmo fare questo:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Risultato:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Ordina per colonne non presenti nell'elenco SELECT
Il ORDER BY
La clausola accetta colonne che non sono specificate in SELECT
elenco.
In altre parole, non è necessario selezionare una colonna per ordinare in base a quella colonna.
Esempio:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Risultato:
+---------------------------------+---------+ | Name | Price | |---------------------------------+---------| | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Straw Dog Box | 55.99 | | Chainsaw | 245.00 | | Sledge Hammer | 33.49 | | Long Weight (green) | 11.99 | | Long Weight (blue) | 14.75 | | Left handed screwdriver | 25.99 | +---------------------------------+---------+
Qui, abbiamo ordinato per VendorId
colonna, anche se non l'abbiamo inclusa nella colonna SELECT
elenco.
Ordine per ID colonna
Il ORDER BY
La clausola accetta anche l'ID della colonna al posto del nome della colonna.
Ad esempio, potremmo fare questo:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Risultato:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Tuttavia, questo non è raccomandato.
In primo luogo, rende la query più difficile da leggere e capire per gli altri.
Secondo, se qualcuno in seguito ha cambiato l'ordine delle colonne in SELECT
list, dovrebbero anche cambiare l'ordine del ORDER BY
elenco. Sarebbe molto facile dimenticarsi di farlo e i risultati della query finiranno nell'ordine sbagliato.
Ecco un esempio di cosa intendo.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Risultato:
+---------------------------------+------+---------+ | Name | ID | Price | |---------------------------------+------+---------| | Straw Dog Box | 1003 | 55.99 | | Sledge Hammer | 1002 | 33.49 | | Long Weight (green) | 1001 | 11.99 | | Long Weight (blue) | 1001 | 14.75 | | Left handed screwdriver | 1001 | 25.99 | | Chainsaw | 1003 | 245.00 | | Bottomless Coffee Mugs (4 Pack) | 1004 | 9.99 | +---------------------------------+------+---------+
Tutto quello che ho fatto è stato spostare il ProductPrice
posizione della colonna in SELECT
list e ha completamente incasinato l'ordine dei risultati.
Ordine predefinito
In SQL, se non utilizzi ORDER BY
clausola, non c'è alcuna garanzia in quale ordine saranno i tuoi risultati. Anche se potrebbe sembrare come se il tuo database stesse ordinando i risultati in base a una colonna particolare, questo potrebbe non essere effettivamente il caso.
In generale, senza un ORDER BY
clausola, i dati verranno ordinati nell'ordine in cui sono stati caricati nella tabella. Tuttavia, se le righe sono state eliminate o aggiornate, l'ordine sarà influenzato dal modo in cui il DBMS riutilizza lo spazio di archiviazione recuperato.
Pertanto, non fare affidamento sul DBMS per ordinare i risultati in un ordine significativo. Se vuoi che i tuoi risultati siano ordinati, usa il ORDER BY
clausola.
Ordini con eccezioni
Potresti incontrare momenti in cui devi includere un'eccezione nel tuo ORDER BY
clausola.
Ad esempio, si desidera ordinare alfabeticamente in base a una colonna eccetto una riga. Potresti voler visualizzare una riga (o più righe) in alto, mentre tutte le righe rimanenti sono ordinate in un ordine particolare.
Fortunatamente, c'è un modo semplice per farlo. Se è necessario, vedere Come scrivere una clausola ORDER BY con eccezioni.