MySQL rendező lekérdezések – ORDER BY

A MySQL-ben az ORDER BY utasítást arra használjuk, hogy a lekérdezés eredményét egy vagy több oszlop értéke alapján növekvő vagy csökkenő sorrendbe rendezzük.

Például az ORDER BY segítségével:

Az ORDER BY nem változtatja meg az adatbázisban tárolt rekordok sorrendjét, hanem a lekérdezés eredményét rendezi át.

Az ORDER BY alapvető szintaxisa

Az ORDER BY általános felépítése:

SELECT oszlop1, oszlop2 FROM tabla_neve ORDER BY oszlop_neve;

Alapértelmezés szerint a MySQL növekvő sorrendbe rendezi az adatokat.

Ha ettől eltérő sorrendet szeretnénk, megadhatjuk az ASC vagy a DESC kulcsszót.

Növekvő sorrend – ASC

Az ASC az angol ascending szó rövidítése, jelentése: növekvő.

Növekvő rendezés esetén:

Példa: tanulók rendezése életkor szerint

Tegyük fel, hogy rendelkezésünkre áll a következő diakok tábla.

id nev osztaly eletkor
1 Anna 10.A 16
2 Béla 10.B 17
3 Csilla 10.A 15
4 Dávid 10.B 16
5 Erika 10.A 18
6 Ferenc 10.C 15
7 Gábor 10.B 16
8 Hanna 10.C 15

Feladat: Jelenítsük meg a tanulókat életkor szerint növekvő sorrendben!

SELECT * FROM diakok ORDER BY eletkor ASC;

Eredmény:

id nev osztaly eletkor
3 Csilla 10.A 15
8 Hanna 10.C 15
6 Ferenc 10.C 15
1 Anna 10.A 16
4 Dávid 10.B 16
7 Gábor 10.B 16
2 Béla 10.B 17
5 Erika 10.A 18

A tanulók a legfiatalabbtól a legidősebb felé haladva jelennek meg.

Fontos: az ASC kulcsszó elhagyható, mert a MySQL alapértelmezés szerint növekvő sorrendet használ.

Csökkenő sorrend – DESC

A DESC a descending szó rövidítése, jelentése: csökkenő.

Csökkenő rendezés esetén:

Példa: Jelenítsük meg a tanulókat a legidősebbtől a legfiatalabbig!

SELECT * FROM diakok ORDER BY eletkor DESC;

Eredmény:

id nev osztaly eletkor
5 Erika 10.A 18
2 Béla 10.B 17
1 Anna 10.A 16
4 Dávid 10.B 16
7 Gábor 10.B 16
3 Csilla 10.A 15
8 Hanna 10.C 15
6 Ferenc 10.C 15

A lekérdezés a legidősebb tanulókkal kezdődik.

Az ASC és a DESC összehasonlítása

Kulcsszó Jelentés Példa
ASC Növekvő sorrend 10, 20, 30, 40
DESC Csökkenő sorrend 40, 30, 20, 10

Megjegyzés: ha egy oszlopban több azonos érték található, azok egymáshoz viszonyított sorrendje nincs meghatározva, hacsak nem adunk meg további rendezési szempontot.

Fontos: Szöveges adatok rendezése esetén: az ékezetes karakterek rendezése a használt karakterkészlettől és az oszlophoz beállított kollációtól (collation) is függhet. Magyar szövegek rendezésekor ezért érdemes megfelelő magyar nyelvi rendezési szabályokat alkalmazni.

Rendezés több oszlop alapján

Az ORDER BY utasításban több oszlopot is megadhatunk.

Ilyenkor a MySQL először az első oszlop szerint rendez. Ha az első oszlop értéke több rekordnál azonos, akkor a második oszlop alapján rendezi ezeket a rekordokat.

Példa: rendezés osztály és életkor szerint

Feladat:

  1. Először rendezzük a tanulókat osztály szerint!
  2. Az egyes osztályokon belül a fiatalabb tanulók kerüljenek előre!
SELECT * FROM diakok ORDER BY osztaly ASC, eletkor ASC;

Eredmény:

id nev osztaly eletkor
3 Csilla 10.A 15
1 Anna 10.A 16
5 Erika 10.A 18
4 Dávid 10.B 16
7 Gábor 10.B 16
2 Béla 10.B 17
6 Ferenc 10.C 15
8 Hanna 10.C 15

Példa: eltérő rendezési irányok

Feladat: Rendezzük a tanulókat osztály szerint növekvő, azon belül életkor szerint csökkenő sorrendbe!

SELECT * FROM diakok ORDER BY osztaly ASC, eletkor DESC;

Ebben az esetben:

Az egyes oszlopokhoz külön rendezési irányt rendelhetünk.

Rendezés számított oszlop alapján

Az ORDER BY segítségével olyan oszlop szerint is rendezhetünk, amelyet a lekérdezés során számítunk ki.

Ehhez használhatunk például matematikai műveleteket vagy összesítő függvényeket.

Példa: Jelenítsük meg a termékek árát 27%-os áfával növelve, a legdrágább terméktől a legolcsóbbig!

SELECT termek_nev, netto_ar, netto_ar * 1.27 AS brutto_ar FROM termekek ORDER BY brutto_ar DESC;

Rendezés összesítő függvénnyel és GROUP BY használatával

Az ORDER BY a csoportosító lekérdezésekkel együtt is használható.

Ez különösen hasznos, ha például osztálylétszámokat, termékkategóriák eladásait vagy részlegek átlagfizetéseit szeretnénk sorba rendezni.

Példa: Számoljuk meg, hogy hány tanuló jár az egyes osztályokba, majd jelenítsük meg az osztályokat létszám szerint csökkenő sorrendben!

SELECT osztaly, COUNT(*) AS letszam FROM diakok GROUP BY osztaly ORDER BY letszam DESC;

A lekérdezés működése:

  1. A FROM meghatározza a diakok táblát.
  2. A GROUP BY osztaly osztályok szerint csoportosítja a rekordokat.
  3. A COUNT(*) megszámolja az egyes osztályok tanulóit.
  4. Az ORDER BY letszam DESC a legnagyobb létszámtól a legkisebb felé rendezi az eredményt.

Az ORDER BY és a WHERE kapcsolata

A WHERE segítségével kiválaszthatjuk, mely rekordok kerüljenek be az eredménybe. Az ORDER BY ezután rendezi a megfelelő rekordokat.

Példa: csak a 16 éves vagy idősebb tanulók megjelenítése életkor szerint

SELECT * FROM diakok WHERE eletkor >= 16 ORDER BY eletkor ASC;

A lekérdezés először kiválasztja a legalább 16 éves tanulókat, majd életkor szerint növekvő sorrendbe rendezi őket.

Az eredményben megjelenő sorok számának korlátozása – LIMIT

Gyakran nem az összes rekordra vagyunk kíváncsiak, hanem csak néhányra.

A LIMIT segítségével megadhatjuk, hogy a lekérdezés eredményéből legfeljebb hány sort szeretnénk megjeleníteni.

Példa: a három legidősebb tanuló

SELECT * FROM diakok ORDER BY eletkor DESC LIMIT 3;

A LIMIT 3 azt jelenti, hogy legfeljebb három sort kérünk az eredményből.


Gyakorlófeladatok

A feladatokat a korábban bemutatott diakok táblán oldjuk meg! diakok.sql

1. feladat – Rendezés név szerint

Jelenítsd meg az összes tanulót név szerint növekvő sorrendben!

2. feladat – Fordított névsorrend

Jelenítsd meg a tanulókat fordított ábécérendben!

3. feladat – Rendezés életkor szerint

Jelenítsd meg a tanulókat életkor szerint növekvő sorrendben!

4. feladat – A legidősebb tanulók

Jelenítsd meg a tanulókat a legidősebbtől a legfiatalabbig!

5. feladat – Rendezés több oszlop alapján

Jelenítsd meg a tanulókat osztály szerint növekvő, azon belül életkor szerint csökkenő sorrendben!

6. feladat – Szűrés és rendezés

Jelenítsd meg csak a legalább 16 éves tanulókat, életkor szerint növekvő sorrendben!

7. feladat – A három legfiatalabb tanuló

Jelenítsd meg a három legfiatalabb tanulót!

8. feladat – Osztálylétszámok rendezése

Számold meg, hogy hány tanuló jár az egyes osztályokba, majd rendezd az osztályokat létszám szerint csökkenő sorrendbe!