sql >> Database >  >> RDS >> Database

SQL ORDER BY-clausule voor beginners

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.


  1. Android Sqlite-database openen in fragment

  2. psycopg2-equivalent van mysqldb.escape_string?

  3. Hoe de implementatie van PostgreSQL-database te automatiseren

  4. Verschillende waarde telt op dezelfde kolom