• 1 nap telt el az utolsó módosítás óta
  • 6perc
  • 1522szó
  • 14olvasás

2522371

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)
  1. 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%';
  1. 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;
  1. 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'
  1. 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)

  1. 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;
  1. 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'
  1. 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
)
  1. 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:

  1. Dátum formátum: Mindig ‘YYYY-MM-DD’ formátumot használj
  2. Karakterlánc egyezés: Figyelj a kis/nagybetűkre
  3. NULL értékek: LEFT JOIN esetén COUNT(k.id) != COUNT(*), mert a NULL-okat nem számolja
  4. GROUP BY: Minden nem aggregált mezőt bele kell tenni (standard SQL)
  5. HAVING vs WHERE: WHERE a csoportosítás előtt szűr, HAVING utána
  6. 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:

  1. 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:

  1. 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
  2. Ó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:

  1. ✅ Használd a LIKE ‘9%’ megoldást (egyszerű, várható)
  2. Megjegyzésben írd oda: „Feltételezem, hogy az adatbázisban nincs 910-es vegyes csoport”
  3. ✅ 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:

  1. Feltételezd az egyszerű esetet (egy Majer Melinda, egy Angol Anna)
  2. Ha van idő, írd meg a biztonságos verziót is kommentben
  3. 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!

 

Hogyan értékeli a posztot?

Kattins a megfelelő csillagra!

Átlagpontszám 0 / 5. Értkelés 0

Még nem értékeltél!

Vélemény, hozzászólás?