ORDER BY
klausul används vanligtvis i SQL för att sortera resultaten av en fråga.
Det låter dig ange i vilken ordning resultaten returneras.
Du kan ange om resultaten sorteras i stigande eller fallande ordning. Du kan också ange flera kolumner för sortering.
Exempel
Här är ett exempel för att demonstrera 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 stigande . När du använder ORDER BY
sats, den är som standard stigande, så du kan utelämna ASC
del om du vill.
Så vi kan också skriva frågan så här:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Fallande ordning
För att sortera det i fallande ordning, använd 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 | +------------+---------------------------------+----------------+
Ordna efter flera kolumner
Du kan ange flera kolumner att sortera efter. Detta gör att du kan ange hur raderna ska sorteras när det finns flera rader med samma värde i den första sorterade kolumnen.
Det är förmodligen lättare att visa detta med ett exempel.
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 | +------------+---------------------------------+----------------+
Om vi fokuserar på de tre raderna med en VendorId
av 1001
, kan vi se att det föregående exemplet returnerade produktnamnen i stigande ordning, men i det här exemplet returnerade vi dem i fallande ordning. Detta beror på att vi nominerade ProductName
som den andra kolumnen i vår ORDER BY
sats, och vi specificerade DESC
för fallande ordning.
Den andra kolumnen träder bara i kraft om det finns dubbletter i den första ORDER BY
kolumn. Om inte, är eventuella efterföljande kolumner irrelevanta när det gäller ytterligare sortering.
Om vi tittar på ProductPrice
kolumnen kan vi se att den här kolumnen inte hade någon effekt på sorteringen, även om vi angav ProductPrice DESC
. Vi kan se att priserna alla är i stigande ordning, trots att vi insisterar på att de ska vara i fallande ordning. Anledningen till att denna kolumn inte hade någon effekt är att det inte fanns några dubbletter i den tidigare sorterade kolumnen. Därför påverkade ordningen av de två första kolumnerna resultaten, men ordningen i den tredje kolumnen inte.
Därmed inte sagt att den tredje kolumnen aldrig kommer att ha någon effekt. Om vi senare infogade en annan Left handed screwdriver
, men till ett annat pris, sedan ProductPrice
kolumnens ordning skulle träda i kraft, på grund av att det finns dubbla värden i ProductName
kolumn.
Blanda stigande med fallande
Du kan blanda varje kolumn med stigande och fallande ordning. De behöver inte alla vara likadana. Vi skulle till exempel kunna göra detta:
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 | +------------+---------------------------------+----------------+
Beställ efter kolumnalias
ORDER BY
klausul accepterar kolumnalias som en kolumn som ska sorteras efter.
Vi skulle till exempel kunna göra detta:
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 | +------+---------------------------------+---------+
Ordna efter kolumner som inte finns i SELECT-listan
ORDER BY
satsen accepterar kolumner som inte är specificerade i SELECT
lista.
Med andra ord, du behöver inte välja en kolumn för att sortera efter den kolumnen.
Exempel:
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 | +---------------------------------+---------+
Här beställde vi efter VendorId
kolumnen, även om vi inte inkluderade den i SELECT
lista.
Beställ efter kolumn-ID
ORDER BY
klausulen accepterar också kolumn-ID i stället för kolumnnamnet.
Vi skulle till exempel kunna göra detta:
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 | +------+---------------------------------+---------+
Detta rekommenderas dock inte.
För det första gör det frågan svårare för andra att läsa och förstå.
För det andra, om någon senare ändrade ordningen på kolumnerna i SELECT
listan måste de också ändra ordningen på ORDER BY
lista. Det skulle vara mycket lätt att glömma att göra detta, och sökfrågans resultat kommer att hamna i fel ordning.
Här är ett exempel på vad jag menar.
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 | +---------------------------------+------+---------+
Allt jag gjorde var att flytta ProductPrice
kolumnens position i SELECT
listan, och det förstörde ordningen på resultaten totalt.
Standardbeställning
I SQL, om du inte använder ORDER BY
klausul, det finns ingen garanti i vilken ordning dina resultat kommer att vara. Även om det kan se ut som att din databas sorterar resultaten efter en viss kolumn, kanske detta inte är fallet.
I allmänhet utan en ORDER BY
klausul, kommer data att sorteras i den ordning som den laddades in i tabellen. Men om rader har tagits bort eller uppdaterats kommer ordningen att påverkas av hur DBMS återanvänder återvunnet lagringsutrymme.
Lita därför inte på DBMS för att sortera resultaten i någon meningsfull ordning. Om du vill att dina resultat ska sorteras, använd ORDER BY
klausul.
Beställa med undantag
Du kan stöta på tillfällen då du behöver inkludera ett undantag i din ORDER BY
klausul.
Till exempel vill du sortera alfabetiskt efter en kolumn förutom en rad. Du kanske vill att en rad (eller flera rader) ska visas överst, medan alla återstående rader är ordnade i en viss ordning.
Lyckligtvis finns det ett enkelt sätt att göra detta. Se Hur man skriver en ORDER BY-klausul med undantag om du behöver göra detta.