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