De ORDER BY
clausule wordt vaak gebruikt in SQL om de resultaten van een query te sorteren.
Hiermee kunt u de volgorde specificeren waarin de resultaten worden geretourneerd.
U kunt aangeven of de resultaten in oplopende of aflopende volgorde worden gesorteerd. U kunt ook meerdere kolommen opgeven om te sorteren.
Voorbeeld
Hier is een voorbeeld om de ORDER BY
. te demonstreren clausule.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Resultaat:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
De ASC
deel betekent oplopend . Wanneer u de ORDER BY
. gebruikt clausule, is deze standaard oplopend, dus u kunt de ASC
. weglaten deel als je wilt.
We kunnen de query dus ook als volgt schrijven:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Aflopende volgorde
Om het te sorteren in aflopend bestel, gebruik DESC
.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Resultaat:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Orden op meerdere kolommen
U kunt meerdere kolommen opgeven waarop u wilt sorteren. Hiermee kunt u specificeren hoe de rijen moeten worden gesorteerd als er meerdere rijen met dezelfde waarde in de eerste gesorteerde kolom staan.
Het is waarschijnlijk makkelijker om dit aan te tonen met een voorbeeld.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Resultaat:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Als we ons concentreren op de drie rijen met een VendorId
van 1001
, kunnen we zien dat in het vorige voorbeeld de productnamen in oplopende volgorde zijn geretourneerd, maar in dit voorbeeld hebben we ze in aflopende volgorde geretourneerd. Dit komt omdat we de ProductName
hebben genomineerd als de tweede kolom in onze ORDER BY
clausule, en we specificeerden DESC
voor aflopende volgorde.
De tweede kolom is alleen van kracht als er duplicaten zijn in de eerste ORDER BY
kolom. Zo niet, dan zijn eventuele volgende kolommen niet relevant voor wat betreft verdere sortering.
Als we kijken naar de ProductPrice
kolom, kunnen we zien dat deze kolom geen effect had op de sortering, ook al hebben we ProductPrice DESC
opgegeven . We kunnen zien dat de prijzen allemaal in oplopende volgorde staan, ondanks dat we erop staan dat ze in aflopende volgorde moeten staan. De reden dat deze kolom geen effect had, is omdat er geen duplicaten waren in de eerder gesorteerde kolom. Daarom had de volgorde van de eerste twee kolommen invloed op de resultaten, maar de volgorde van de derde kolom niet.
Dit wil niet zeggen dat de derde kolom nooit enig effect zal hebben. Als we later een andere Left handed screwdriver
hebben geplaatst , maar tegen een andere prijs, dan de ProductPrice
de volgorde van de kolom zou van kracht worden, vanwege het feit dat er dubbele waarden in de ProductName
. zijn kolom.
Oplopend met aflopend mengen
U kunt elke kolom in oplopende en aflopende volgorde mengen. Ze hoeven niet allemaal hetzelfde te zijn. We zouden dit bijvoorbeeld kunnen doen:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Resultaat:
+------------+---------------------------------+----------------+ | 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 | +------------+---------------------------------+----------------+
Orden op kolomaliassen
De ORDER BY
clausule accepteert kolomaliassen als een kolom waarop moet worden geordend.
We zouden dit bijvoorbeeld kunnen doen:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Resultaat:
+------+---------------------------------+---------+ | 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 | +------+---------------------------------+---------+
Orden op kolommen die niet in de SELECT-lijst staan
De ORDER BY
clausule accepteert kolommen die niet zijn gespecificeerd in de SELECT
lijst.
Met andere woorden, u hoeft geen kolom te selecteren om op die kolom te sorteren.
Voorbeeld:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Resultaat:
+---------------------------------+---------+ | 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 | +---------------------------------+---------+
Hier hebben we besteld op de VendorId
kolom, ook al hebben we deze niet opgenomen in de SELECT
lijst.
Orden op kolom-ID
De ORDER BY
clausule accepteert ook de kolom-ID in plaats van de kolomnaam.
We zouden dit bijvoorbeeld kunnen doen:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Resultaat:
+------+---------------------------------+---------+ | 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 | +------+---------------------------------+---------+
Dit wordt echter niet aanbevolen.
Ten eerste maakt het de zoekopdracht moeilijker voor anderen om te lezen en te begrijpen.
Ten tweede, als iemand later de volgorde van de kolommen in de SELECT
lijst, zouden ze ook de volgorde van de ORDER BY
. moeten veranderen lijst. Het zou heel gemakkelijk zijn om dit te vergeten, en de resultaten van de zoekopdracht zullen in de verkeerde volgorde eindigen.
Hier is een voorbeeld van wat ik bedoel.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Resultaat:
+---------------------------------+------+---------+ | 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 | +---------------------------------+------+---------+
Het enige wat ik deed was de ProductPrice
. verplaatsen de positie van de kolom in de SELECT
lijst, en het heeft de volgorde van de resultaten volledig verpest.
Standaardbestelling
In SQL, als u de ORDER BY
. niet gebruikt clausule, is er geen garantie in welke volgorde uw resultaten zullen staan. Hoewel het er misschien lijkt alsof uw database de resultaten sorteert op een bepaalde kolom, is dit mogelijk niet het geval.
Over het algemeen zonder ORDER BY
clausule, worden gegevens gesorteerd in de volgorde waarin ze in de tabel zijn geladen. Als rijen echter zijn verwijderd of bijgewerkt, wordt de volgorde beïnvloed door de manier waarop het DBMS de teruggewonnen opslagruimte opnieuw gebruikt.
Vertrouw daarom niet op het DBMS om de resultaten in een zinvolle volgorde te sorteren. Als u wilt dat uw resultaten worden gesorteerd, gebruikt u de ORDER BY
clausule.
Bestellen met uitzonderingen
Het kan voorkomen dat u een uitzondering moet opnemen in uw ORDER BY
clausule.
U wilt bijvoorbeeld alfabetisch sorteren op een kolom, behalve op één rij. Misschien wilt u dat één rij (of meerdere rijen) bovenaan wordt weergegeven, terwijl alle resterende rijen in een bepaalde volgorde worden gerangschikt.
Gelukkig is er een eenvoudige manier om dit te doen. Zie Hoe u een ORDER BY-clausule schrijft met uitzonderingen als u dit moet doen.