Mit kell tudni mindenképp az SQL utasításokból az emelt szintű digitális kultúra érettségire?

Ebben a cikkben végigvesszük, hogy hogyan épül fel egy SQL lekérdezés és mit érdemes alaposan átnézni az emelt szintű digitális kultúra érettségihez.
Vegyük például a következő adatbázis táblát:

A fenti kép az employee nevű táblát tartalmazza. Ennek első mezője az employee_id (int, egész szám), ami a dolgozó azonosítóját tárolja, a tábla második mezője a name (szöveg), ami a dolgozó nevét tárolja, a harmadik mezője a department (szöveg), ami a dolgozó munkahelyi részlegét tárolja, és a negyedik mező a salary (int, egész szám) ami pedig az adott dolgozó éves fizetését jelenti.

Egy SQL lekérdezés formája mindig a következő:

Azaz amikor az SQL lekérdezéseket írod, akkor ugyanilyen sorrendben fogod írni a SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY szavakat. A feladattól függ függni, hogy melyik „kulcsszót”/utasítást kell kihagynod, melyiket kell használnod.

A fenti szavak a következőt jelentik:

  • SELECT: melyik mező(k) jelenjenek meg. Itt használatunk számolást, illetve beépített függvényeket is. Pár hasznos példa: SELECT *> minden mező megjelenik. SELECT COUNT(*) > megszámolja, hogy hány adatsor (rekord) jelenik meg. SELECT SUM(salary)> összeadja a salary mező értékét és azt írja ki.
  • FROM: melyik táblá(k)ból kell az adatoknak megjelenni, melyik táblá(k)-at használjuk fel (pl.: feltételre). A fenti employee nevű tábla egyedül van az adatbázisunkban, így csak őt fogjuk felhasználni (FROM employee;)
  • WHERE: milyen feltétel(eke)t szabunk. Itt figyelni kell arra, ha kettő vagy több táblát használunk, akkor azokat itt kell „összekötni”, azaz az egyes táblák mezőit egyenlővé kell tenni. Pár hasznos példa: WHERE name LIKE „% %” -> olyan szűrés ahol a name mezőben van bármilyen karakter, majd egy szóköz végül bármilyen karakter. WHERE salary BETWEEN 55000 AND 70000 -> salary 55.000 és 70.000 közötti legyen. WHERE department IN („IT”, „HR”) -> a departyment mező értékei vagy „IT”, vagy „HR” legyen. Itt használhatunk feltételek összeÉS-eslésére AND-et, VAGY-olására OR-t és több feltétel esetén zárójeleket ( ) is.
  • GROUP BY: mező(k) szerinti csoportosítást tudunk beállítani. Például a fenti adattáblában az IT department egy csoportként tudjuk kezelni és így pl.: az IT department salary-ját tudjuk összeadni. Például: GROUP BY department -> csoportosítunk a department mező szerint. Azaz a department mezőben szereplő ugyanolyan értékeket egyben fogjuk kezelni (azaz most nem két IT-s lesz, hanem egy, ha SUM-ot, AVG-t számolsz a SELECT-ben akkor a csoportra fog vonatkozni a SUM, AVG, stb.)
  • HAVING: a már csoportosított eredményre tudunk egy újabb feltételt megadni.
  • ORDER BY: a megjelenítés sorrendjét tudjuk beállítani. A mezőNeve helyett használhatjuk a megjelenítés sorrendjét (azaz, hogy a SELECT után hányadik mező szerint akarod rendezni) illetve, hogy növekvő (ASC) vagy csökkenő (DESC) rendben akarod az adatokat megjeleníteni.

Az egyes feladatok megoldásánál a következő lépések betartását javaslom:

  1. Indulj egy SELECT *-al, azaz jeleníts meg minden mezőt!
  2. Állítsd be, hogy melyik táblából (vagy táblákból) kellenek az adatok, azaz töltsd ki a FROM utáni részt!
  3. Teszteld le a lekérdezést, nézd meg az eredményeket!
  4. Ezek után állítsd be a feltételt, azaz a WHERE utáni részt!
  5. Teszteld le az eddigi lekérdezést, nézd meg az eredményeket!
  6. Ha kell csoportosítani (GROUP BY), akkor azt most csináld meg, alakítsd a lekérdezésedet!
  7. Teszteld le, hogy eddig mit csináltál!
  8. Állítsd be a csoportosításra a szűrést (ha kell), azaz használd a HAVING-et!
  9. Teszteld le, ellenőrizd, hogy mit csinál a lekérdezés!
  10. Végezetül nyúlj hozzá a SELECT-hez és állítsd be, hogy melyik mezők jelenjenek meg!

A fenti lépések alapján nézzünk meg egy példafeladat megoldási lépéseit.

A feladat legyen az, hogy: Lekérdezéssel jelenítsük meg az átlagosan 60.000-es éves fizetésnél nagyobb departmentek nevét és átlagos fizetését, a fizetések szerint csökkenően rendezve!

1. lépés: SELECT * FROM employee;
Megjelenik minden rekord az employee táblából, azaz látni fogod, hogy milyen rekordok (adatsorok) vannak az employee táblában.

2. lépés: SELECT * FROM employee GROUP BY department;
Azaz csoportosítsunk a department (részlegek) szerint. Vedd észre, hogy a department értékekből nincs dupla, minden csak 1x szerepel.

3. lépés: SELECT *, AVG(salary) FROM employee GROUP BY department;
Azaz számítsunk egy átlagot és azt is jelenítsük meg. Figyelj arra, hogy ilyenkor a csoportosítás szerint fog átlagot számolni.
(Nézd meg a példa adatokat az 1. lépésnél. Az IT-sok keresete: 70.000 + 72.000 -> ennek átlaga 71.000 lesz!)

4. lépés: SELECT *, AVG(salary) FROM employee GROUP BY department HAVING AVG(salary)>60000;
Azaz a csoportosított eredményre (lásd 3. lépéshez tartozó kép) beállítunk egy feltételt, hogy a salary > 60.000 legyen! Vedd észre, hogy az ennél kisebb számított értékű részleg (Marketing) nem fog megjelenni.

5. lépés: SELECT *, AVG(salary) FROM employee GROUP BY department HAVING AVG(salary)>60000 ORDER by AVG(salary) DESC;
Azaz fogjuk meg és állítsuk be a rendezést. Itt arra figyelj, hogy most leírtam a mező számítási módját (AVG(salary)) , ami alapján rendezni kell. Ha e helyett egy 4-t írtam volna a helyére, akkor a negyedik mező szerint rendezte volna. Ez most ugyanúgy működik, mivel a negyedik megjelenített mező a számított mező, viszont később ezt nem fogom megjeleníteni, mert a feladatban csak a department neve kell és az átlag, ami csak két megjelenített mező…

6. lépés: SELECT department, AVG(salary) FROM employee GROUP BY department HAVING AVG(salary)>60000 ORDER by AVG(salary) DESC;
Végezetül megcsináljuk, hogy mely mezők jelenjenek meg a végső lekérdezésben. Itt beállítottam, hogy csak a department és a számított átlag jelenjen meg.

Megjegyzés: itt igazából az utolsó két lépést (5-6. lépés) akár fel is cserélhetted volna. Azaz miután beállítod melyik mezők jelennek meg utána is tudsz állítani sorrendet. Ekkor valami hasonló lekérdezést kapsz: SELECT department, AVG(salary) FROM employee GROUP BY department HAVING AVG(salary)>60000 ORDER by 2 DESC;

Remélem a fenti példa alapján Te is belátod, hogy egyszerűbb lépésenként haladni és lépésenként bővíteni az SQL lekérdezésünket, mint sem egyből, fejből megírni… 🙂

Ha szeretnéd, akkor Te letöltheted a fenti példa adatbázist létrehozó sql-t ide kattintva és akár Te is kipróbálhatod a fenti lépéseket…