ORDER BY: sortera och begränsa
“Visa de tio senaste ordrarna.” “Vem är rikast?” “Vilken produkt säljer sämst?”
Alla de frågorna handlar om ordning. Och här finns en överraskning: utan ORDER BY har ett resultat ingen garanterad ordning alls.
Exemplen använder övningsdatan.
Vad gör ORDER BY?
ORDER BY sorterar resultatet efter en eller flera kolumner.
Visa namn och guld från person, sorterat på guld med mest först.
SELECT name, gold FROM personORDER BY gold DESC;
| name | gold |
|---|---|
| David | 500 |
| Bertil | 300 |
| Eva | 250 |
| Anna | 120 |
| Cissi | 80 |
| Nyckelord | Betyder |
|---|---|
ASC | stigande: minst först, A till Ö. Det är standard om du inte skriver något. |
DESC | fallande: störst först, Ö till A |
Utan ORDER BY finns ingen ordning
När du kör SELECT * FROM person; kommer raderna ofta i den ordning de lades in. Det ser ut som en regel, men det är det inte.
Databasen får lämna tillbaka raderna i vilken ordning den vill. Med fler rader, ett index eller en ny version av databasen kan ordningen ändras utan förvarning.
Om ordningen spelar roll, skriv ORDER BY.
Sortera på flera kolumner
SELECT name, job, gold FROM personORDER BY job ASC, gold DESC;| name | job | gold |
|---|---|---|
| Anna | baker | 120 |
| Cissi | baker | 80 |
| Eva | merchant | 250 |
| David | pilot | 500 |
| Bertil | smith | 300 |
Först sorteras allt på job. Bara när två rader har samma yrke används nästa kolumn, gold, för att avgöra ordningen mellan dem. Det är som i en telefonkatalog: först efternamn, och bara vid samma efternamn tittar du på förnamnet.
Var hamnar NULL?
SELECT name, village_id FROM personORDER BY village_id;I SQLite hamnar NULL först vid stigande sortering, så David kommer överst. Andra databaser gör olika: PostgreSQL lägger NULL sist. Vill du bestämma själv kan du i SQLite och PostgreSQL skriva ORDER BY village_id NULLS LAST.
LIMIT: bara de första

SELECT name, gold FROM personORDER BY gold DESCLIMIT 3;| name | gold |
|---|---|
| David | 500 |
| Bertil | 300 |
| Eva | 250 |
LIMIT klipper resultatet efter ett visst antal rader. Tillsammans med ORDER BY blir det “de tre rikaste”, “de tio senaste” eller “den dyraste”.
LIMIT utan ORDER BY ger dig några rader, men inte nödvändigtvis de du tror.
OFFSET: hoppa över
SELECT name, gold FROM personORDER BY gold DESCLIMIT 2 OFFSET 2;OFFSET 2 hoppar över de två första raderna, och sedan tar LIMIT 2 de två nästa. Resultatet är Eva och Anna.
Det är så sidindelning fungerar på webben: sida 1 är LIMIT 10 OFFSET 0, sida 2 är LIMIT 10 OFFSET 10, och så vidare.
Olika databaser, olika syntax
| Databas | De tre första |
|---|---|
| SQLite, MySQL, PostgreSQL | SELECT ... ORDER BY gold DESC LIMIT 3 |
| SQL Server | SELECT TOP 3 ... ORDER BY gold DESC |
| SQL Server (med offset) | ... ORDER BY gold DESC OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY |
Idén är densamma. Det är bara orden som skiljer.
Clean Code: ORDER BY
Så här gör du ordningen tydlig.
-- ❌ Vilken ordning? Och vilka tre?SELECT name, gold FROM person LIMIT 3-- ✅ Ordningen är uttalad, och det syns vad "de tre" betyderSELECT name, goldFROM personORDER BY gold DESCLIMIT 3;- Alltid
ORDER BYtillsammans medLIMIT - Skriv
ASCuttryckligen när frågan har flera sorteringskolumner, så att ingen behöver gissa - Sortera på kolumnnamn, inte på nummer.
ORDER BY 2(den andra kolumnen) fungerar, men går sönder i det tysta när någon ändrar iSELECT.
Vanliga misstag
| Misstag | Vad händer? | Gör så här i stället |
|---|---|---|
Förlita sig på ordningen utan ORDER BY | Ordningen kan ändras när som helst | Skriv ORDER BY |
LIMIT utan ORDER BY | Du får några rader, inte de första | Kombinera alltid med ORDER BY |
ORDER BY gold, DESC | Syntaxfel | ORDER BY gold DESC, utan kommatecken |
ORDER BY job, gold DESC och tro att båda blir fallande | DESC gäller bara gold, och job blir stigande | Skriv riktning för varje kolumn |
LIMIT 3 i SQL Server | Syntaxfel | SELECT TOP 3 ... |
Sammanfattning
ORDER BYsorterar.ASC(standard) är stigande ochDESCär fallande.- Utan
ORDER BYfinns ingen garanterad ordning. - Flera kolumner: nästa kolumn används bara när de föregående är lika.
LIMIT ntar de n första ochOFFSET mhoppar över m rader.- SQL Server skriver
TOP ni stället förLIMIT n.
Övningar
Använd övningsdatan.
🟢 Övning 1: Fattigast först
Visa namn och guld för alla, med den som har minst guld först.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
SELECT name, goldFROM personORDER BY gold ASC;Resultatet är Cissi, Anna, Eva, Bertil och David. ASC är standard, så det fungerar lika bra utan.
🟢 Övning 2: De två rikaste
Visa namnen på de två som har mest guld.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
SELECT nameFROM personORDER BY gold DESCLIMIT 2;Resultatet är David och Bertil. Du kan sortera på en kolumn som inte finns i SELECT.
🟡 Övning 3: Alfabetiskt per yrke
Visa namn och yrke, sorterat på yrke och sedan namn, båda i bokstavsordning.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
SELECT name, jobFROM personORDER BY job ASC, name ASC;| name | job |
|---|---|
| Anna | baker |
| Cissi | baker |
| Eva | merchant |
| David | pilot |
| Bertil | smith |
🔴 Övning 4: Tredje rikast
Vem är tredje rikast? Svaret ska vara exakt en rad.
💡 Klicka här för ett lösningsförslag
Din lösning kan se annorlunda ut och ändå vara helt korrekt!
SELECT name, goldFROM personORDER BY gold DESCLIMIT 1 OFFSET 2;Resultatet är Eva med 250. OFFSET 2 hoppar över David och Bertil, och LIMIT 1 tar nästa.
Tänk på vad som hade hänt om två personer hade haft lika mycket guld. Då är “tredje rikast” inte längre entydigt, och vem som hamnar där beror på slumpen. Lägg till en andra sorteringskolumn, t.ex. ORDER BY gold DESC, name ASC, så blir svaret alltid detsamma.
Föregående: WHERE · Tillbaka till översikten · Nästa: Aggregatfunktioner