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

SQL ORDER BY klausul for begyndere

ORDER BY klausul bruges almindeligvis i SQL til at sortere resultaterne af en forespørgsel.

Det giver dig mulighed for at angive den rækkefølge, som resultaterne returneres i.

Du kan angive, om resultaterne skal sorteres i stigende eller faldende rækkefølge. Du kan også angive flere kolonner til sortering.

Eksempel

Her er et eksempel for at demonstrere ORDER BY klausul.

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId ASC;

Resultat:

+------------+---------------------------------+----------------+
| 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           |
+------------+---------------------------------+----------------+

ASC del betyder stigende . Når du bruger ORDER BY klausul, er den standard til stigende, så du kan udelade ASC del, hvis du ønsker det.

Så vi kunne også skrive forespørgslen sådan her:

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId;

Faldende rækkefølge

For at sortere det i faldende rækkefølge, brug DESC .

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId DESC;

Resultat:

+------------+---------------------------------+----------------+
| 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          |
+------------+---------------------------------+----------------+

Bestil efter flere kolonner

Du kan angive flere kolonner, som du vil sortere efter. Dette giver dig mulighed for at angive, hvordan rækkerne skal sorteres, når der er flere rækker med samme værdi i den første sorterede kolonne.

Det er nok nemmere at demonstrere dette med et eksempel.

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;

Resultat:

+------------+---------------------------------+----------------+
| 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          |
+------------+---------------------------------+----------------+

Hvis vi fokuserer på de tre rækker med et VendorId af 1001 , kan vi se, at det forrige eksempel returnerede produktnavnene i stigende rækkefølge, men i dette eksempel returnerede vi dem i faldende rækkefølge. Dette skyldes, at vi nominerede ProductName som den anden kolonne i vores ORDER BY klausul, og vi specificerede DESC for faldende rækkefølge.

Den anden kolonne træder kun i kraft, hvis der er dubletter i den første ORDER BY kolonne. Hvis ikke, er eventuelle efterfølgende kolonner irrelevante, hvad angår yderligere sortering.

Hvis vi ser på ProductPrice kolonne, kan vi se, at denne kolonne ikke havde nogen effekt på sorteringen, selvom vi specificerede ProductPrice DESC . Vi kan se, at priserne alle er i stigende rækkefølge, på trods af vores insisteren på, at de skal være i faldende rækkefølge. Grunden til, at denne kolonne ikke havde nogen effekt, er, at der ikke var nogen dubletter i den tidligere sorterede kolonne. Derfor påvirkede rækkefølgen af ​​de to første kolonner resultaterne, men rækkefølgen af ​​den tredje kolonne gjorde det ikke.

Dermed ikke sagt, at den tredje kolonne aldrig vil have nogen effekt. Hvis vi senere indsatte en anden venstrehåndsskruetrækker , men til en anden pris, så ProductPrice kolonnens bestilling vil træde i kraft på grund af det faktum, at der er duplikerede værdier i ProductName kolonne.

Blanding af stigende med faldende

Du kan blande hver kolonne med stigende og faldende rækkefølge. De behøver ikke alle være ens. For eksempel kunne vi gøre dette:

SELECT 
    VendorId,
    ProductName,
    ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;

Resultat:

+------------+---------------------------------+----------------+
| 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          |
+------------+---------------------------------+----------------+

Bestil efter kolonnealiaser

ORDER BY klausul accepterer kolonnealiaser som en kolonne, der skal sorteres efter.

For eksempel kunne vi gøre dette:

SELECT 
    VendorId AS ID,
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;

Resultat:

+------+---------------------------------+---------+
| 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   |
+------+---------------------------------+---------+

Bestil efter kolonner, der ikke er på SELECT-listen

ORDER BY klausul accepterer kolonner, der ikke er angivet i SELECT liste.

Med andre ord er du ikke forpligtet til at vælge en kolonne for at sortere efter den kolonne.

Eksempel:

SELECT
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;

Resultat:

+---------------------------------+---------+
| 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   |
+---------------------------------+---------+

Her bestilte vi efter VendorId kolonne, selvom vi ikke inkluderede den i SELECT liste.

Bestil efter kolonne-id

ORDER BY klausul accepterer også kolonne-id'et i stedet for kolonnenavnet.

For eksempel kunne vi gøre dette:

SELECT 
    VendorId AS ID,
    ProductName AS Name,
    ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;

Resultat:

+------+---------------------------------+---------+
| 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   |
+------+---------------------------------+---------+

Dette anbefales dog ikke.

For det første gør det forespørgslen sværere for andre at læse og forstå.

For det andet, hvis nogen senere ændrede rækkefølgen af ​​kolonnerne i SELECT liste, ville de også skulle ændre rækkefølgen af ​​ORDER BY liste. Det ville være meget nemt at glemme at gøre dette, og forespørgslens resultater vil ende i den forkerte rækkefølge.

Her er et eksempel på, hvad jeg mener.

SELECT 
    ProductName AS Name,
    VendorId AS ID,
    ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;

Resultat:

+---------------------------------+------+---------+
| 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    |
+---------------------------------+------+---------+

Alt jeg gjorde var at flytte ProductPrice kolonnens position i SELECT liste, og det forkludrede fuldstændig rækkefølgen af ​​resultaterne.

Standardbestilling

I SQL, hvis du ikke bruger ORDER BY klausul, er der ingen garanti for, hvilken rækkefølge dine resultater vil være i. Selvom det kan se ud Ligesom din database sorterer resultaterne efter en bestemt kolonne, er dette muligvis ikke tilfældet.

Generelt uden en ORDER BY klausul, vil data blive sorteret i den rækkefølge, som de blev indlæst i tabellen. Men hvis rækker er blevet slettet eller opdateret, vil rækkefølgen blive påvirket af, hvordan DBMS genbruger genvundet lagerplads.

Stol derfor ikke på, at DBMS sorterer resultaterne i nogen meningsfuld rækkefølge. Hvis du ønsker, at dine resultater skal sorteres, skal du bruge ORDER BY klausul.

Bestilling med undtagelser

Du kan støde på tidspunkter, hvor du skal inkludere en undtagelse i din ORDER BY klausul.

For eksempel vil du sortere alfabetisk efter en kolonne bortset fra én række. Du ønsker måske, at en række (eller flere rækker) skal vises øverst, mens alle de resterende rækker er ordnet i en bestemt rækkefølge.

Heldigvis er der en nem måde at gøre dette på. Se, hvordan du skriver en ORDER BY-klausul med undtagelser, hvis du skal gøre dette.


  1. Forstå indekser i MySQL:Tredje del

  2. flette opdatering oracle ude af stand til at få et stabilt sæt rækker

  3. Ruller Oracle transaktionen tilbage ved en fejl?

  4. Embedded Postgres til fjederstøvletest