Database
 sql >> Database >  >> RDS >> Database

SQL ORDER BY Clausola per principianti

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.