Menjünk végig feladatonként, mindig ugyanazzal a sémával:
- ✔️ pontos-e a kérdés
- ⚠️ tipikus buktatók
- ❌ hogyan lehet beleesni
- ✅ hogyan kerülöd ki (vizsgabiztos megoldás)
- Barnamalom településről érkezők (2barnamalom.sql)
SELECT nev FROM diakok WHERE telepules = 'Barnamalom';
Magyarázat:
- Egyszerű szűrés a telepules mező alapján
- Buktató: A település nevének pontos egyezés kell (kis/nagybetű érzékeny lehet az SQL szerver beállításától függően)
- Alternatíva: Ha biztosak akarunk lenni: WHERE LOWER(telepules) = ‘barnamalom’
❌ Tipikus hiba
SELECT * FROM diakok WHERE telepules LIKE '%Barnamalom%';
- Angol nyelvórák időpontjai (3angol.sql)
SELECT datum, terem, orasorszam FROM orak WHERE targy = 'angol' ORDER BY datum ASC, orasorszam ASC;
Magyarázat:
- Szűrés a tantárgy neve alapján
- Rendezés: először dátum szerint, azon belül óra sorszáma szerint
- Buktató: A tantárgy neve lehet „angol”, „Angol” vagy „angol nyelv” – de a feladat alapján „angol”-nak kellene lennie
- Trükk: Az ORDER BY-nál az ASC elhagyható, mert az az alapértelmezett
❌ Tipikus hiba
ORDER BY orasorszam, datum;
- 9. évfolyamos matek és fizika órák (4matfiz.sql)
SELECT csoport, targy, datum FROM orak WHERE csoport LIKE '9%' AND (targy = 'matematika' OR targy = 'fizika') ORDER BY targy;
Magyarázat:
- LIKE ‘9%’ – a csoport neve 9-cel kezdődik
- Két tantárgy szűrése OR operátorral
- Alternatíva: WHERE csoport LIKE ‘9%’ AND targy IN (‘matematika’, ‘fizika’)
- Buktató: Ha a tantárgy neve „matematika” helyett „matek” lenne az adatbázisban, nem találná; OR helytelen használata; LIKE helyett = használata
- Az ábécérend miatt a fizika lesz előbb, majd a matematika
❌ Tipikus hiba
WHERE csoport = '9'
- Települések szerinti létszám (5telepulesfo.sql)
SELECT telepules, COUNT(*) AS letszam FROM diakok GROUP BY telepules ORDER BY letszam DESC;
Magyarázat:
- GROUP BY csoportosítás település szerint
- COUNT(*) számlálja a diákokat településenként
- Csökkenő sorrend a létszám szerint
- Alternatíva: COUNT(id) vagy COUNT(nev) is működne
- Buktató: GROUP BY kihagyása; rossz oszlop szerinti rendezés
- Trükk: Az alias (letszam) használható az ORDER BY-ban
❌ Tipikus hiba
ORDER BY COUNT(*) DESC;
(nem minden SQL-ben engedett)
- Tantárgyak listája (6tantargyak.sql)
SELECT DISTINCT targy FROM orak ORDER BY targy;
Magyarázat:
- DISTINCT biztosítja, hogy minden tantárgy csak egyszer jelenjen meg
- Ábécérend
- Alternatíva: GROUP BY targy is működne, de a DISTINCT egyszerűbb és hatékonyabb
❌ Tipikus hiba
SELECT targy, COUNT(*) FROM orak GROUP BY targy;
- Angol Anna órájára regisztráltak (7angolanna.sql)
SELECT d.nev, d.email, d.telefon FROM diakok d INNER JOIN kapcsolo k ON d.id = k.diakid INNER JOIN orak o ON k.oraid = o.id WHERE o.tanar = 'Angol Anna' AND o.datum = '2028-11-10';
Magyarázat:
- Három tábla összekapcsolása a kapcsoló táblán keresztül
- Buktató: A dátum formátuma! SQL-ben általában ‘YYYY-MM-DD’ formátumot kell használni; JOIN kihagyása; felesleges mezők használata
- Alternatíva: Lehet DATE(‘2028-11-10’) konverzióval is
- Trükk: Aliasok (d, k, o) használata a lekérdezés átláthatóságáért
❌ Tipikus hiba
WHERE datum = '2028.11.10'
- Majer Melindával azonos településről regisztráltak (8majer.sql)
SELECT nev FROM diakok WHERE telepules = ( SELECT telepules FROM diakok WHERE nev = 'Majer Melinda' ) AND nev != 'Majer Melinda';
Magyarázat:
- Allekérdezés (subquery) meghatározza Majer Melinda települését
- Külső lekérdezés szűri az azonos településről valókat
- Kizárjuk Majer Melindát
Alternatíva JOIN-nal:
SELECT d1.nev FROM diakok d1 INNER JOIN diakok d2 ON d1.telepules = d2.telepules WHERE d2.nev = 'Majer Melinda' AND d1.nev != 'Majer Melinda';
- Buktató: ha több Majer Melinda is lenne, a subquery hibát dobna (több érték). A feladat feltételezi, hogy egyedi; saját név benne marad; JOIN helyett nem al-lekérdezés.
❌ Tipikus hiba
WHERE telepules IN ( SELECT telepules FROM diakok )
- Szabad helyek listája (9szabad.sql)
SELECT datum, orasorszam, targy, tanar, (ferohely - COUNT(k.id)) AS szabad FROM orak o LEFT JOIN kapcsolo k ON o.id = k.oraid GROUP BY o.id, datum, targy, tanar HAVING (ferohely - COUNT(k.id)) > 0 ORDER BY szabad DESC;
Magyarázat:
- LEFT JOIN azért kell, mert lehet olyan óra, amire még senki sem regisztrált
- GROUP BY az óra azonosítója szerint csoportosít
- COUNT(k.id) számolja a regisztrációkat
- Számított mező: ferohely – regisztrációk száma
- HAVING szűri a 0-nál nagyobb szabad helyeket
- Buktató: A GROUP BY-ba minden nem aggregált mezőt bele kell tenni (SQL szabvány szerint); INNER JOIN használata; WHERE használata HAVING helyett; NULL értékek figyelmen kívül hagyása
- MySQL specifikus: MySQL-ben elég lenne csak o.id-t GROUP BY-ba tenni, de más adatbázisokban nem
- Alternatíva COUNT-ra: COUNT(*) helyett COUNT(k.id) azért jobb, mert ha nincs regisztráció, 0-t ad vissza
❌ Tipikus hiba
JOIN kapcsolo k ON o.id = k.oraid
Általános buktatók és tippek:
- Dátum formátum: Mindig ‘YYYY-MM-DD’ formátumot használj
- Karakterlánc egyezés: Figyelj a kis/nagybetűkre
- NULL értékek: LEFT JOIN esetén COUNT(k.id) != COUNT(*), mert a NULL-okat nem számolja
- GROUP BY: Minden nem aggregált mezőt bele kell tenni (standard SQL)
- HAVING vs WHERE: WHERE a csoportosítás előtt szűr, HAVING utána
- Aliasok: Tisztább, olvashatóbb kódot eredményeznek
Trükkös megoldás – 8. feladat SELF JOIN nélkül
SELECT nev FROM diakok WHERE telepules IN ( SELECT telepules FROM diakok WHERE nev = 'Majer Melinda') AND nev != 'Majer Melinda';
- <> ugyanaz, mint a !=
- IN használata subquery-vel
ESETLEGES PROBLÉMÁK
A probléma:
- feladat szövege:
„A 9. évfolyamon látogatható „matematika” és „fizika” tanórákat lekérdezés segítségével írassa ki! … Tudjuk, hogy minden 9. évfolyamos csoport nevének a kezdete „9″.”
Mit mond a feladat?
- ✅ Minden 9. évfolyamos csoport 9-cel kezdődik
- ❌ DE NEM mondja, hogy CSAK a 9. évfolyamos csoportok kezdődnek 9-cel!
Lehetséges csoportnevek:
- 9a, 9b, 9mat ← ezek évfolyam ✅
- 910matkorrep ← 9-10. évfolyam ❌ (de 9-cel kezdődik!)
- 9-10haladok ← vegyes csoport ❌
- 90-es_evek_klub ← egyéb 😄
Mit tegyünk?
🎓 Vizsga szempontjából:
A feladat azt mondja: „Tudjuk, hogy minden 9. évfolyamos csoport nevének a kezdete „9″.”
Ez NEM zárja ki, hogy más is kezdődjön 9-cel!
Két lehetőség:
- Elfogadjuk a feladat logikáját:
- A feladat tudatosan mondja, hogy „tudjuk, hogy…”
- Ez implicit garancia, hogy az adatbázisban nincs 910-es csoport
- Elfogadjuk a LIKE ‘9%’ megoldást
- Ez valószínűleg a várt megoldás
- Óvatosak vagyunk:
- Használjuk a REGEX-et: REGEXP ‘^9[^0-9]’
- De ez bonyolultabb, mint amit várnak
- Túlgondolás?
📊 Az adatbázis tartalmától függ!
Ha megnéznéd az adatokat:
SELECT DISTINCT csoport FROM orak WHERE csoport LIKE '9%' ORDER BY csoport;
Ha csak ezeket látod:
- 9a, 9b, 9mat, 9fiz → biztonságos a LIKE ‘9%’
Ha ezeket is látod:
- 910korr, 9-10haladok → kell a REGEX!
Végső válasz:
A feladat kétértelmű!
Javaslatom vizsgára:
- ✅ Használd a LIKE ‘9%’ megoldást (egyszerű, várható)
- ✅ Megjegyzésben írd oda: „Feltételezem, hogy az adatbázisban nincs 910-es vegyes csoport”
- ✅ Ha van lehetőség, ellenőrizd az adatokat előre!
B probléma
A 7. feladatnál feltételezzük, hogy:
- ✅ Egy tanár csak egy órát tart adott napon adott időpontban
- ✅ Egy diák egyedi (csak egy „Majer Melinda” van)
- ✅ A nevek egyediek azonosítóként
De …
MI VAN, HA:
- 🤔 Angol Anna két órát is tart 2028-11-10-én? (4. és 5. óra)
- 🤔 Van két különböző tanár „Angol Anna” néven?
MI VAN, HA:
- 🤔 Két Majer Melinda regisztrált (különböző településről)?
- 💥 HIBA: Subquery returns more than 1 row!
MI VAN, HA:
- 🤔 Egy diák kétszer regisztrál ugyanarra az órára?
- 🤔 Egy diáknak nincs telefonszáma?
Vizsgán mit tegyél?
Pragmatikus megközelítés:
- ✅ Feltételezd az egyszerű esetet (egy Majer Melinda, egy Angol Anna)
- ✅ Ha van idő, írd meg a biztonságos verziót is kommentben
- ✅ Megjegyzésben jelezd: „Feltételezem, hogy egy diák neve egyedi”
A VALÓDI VÁLASZ:
- 📚 Iskolai feladatnál: egyszerű eset feltételezése OK
- 💼 Valós projektben: MINDIG kezeld ezeket!
- 🎓 Vizsgán: ha van idő, jelezd, hogy tudod!