SQL interjúkérdések, amikre mindenképp tudnod kell a választ

Üdvözöljük a digitális aranykorban, ahol az adatok az új olaj, és az SQL (Structured Query Language) a kőolajfinomító. Ha adatvezérelt szerepkörre pályázol, legyen szó adatkutatóról, adatbázis-adminisztrátorról, adattudósról, szoftverfejlesztőről vagy üzleti intelligencia szakértőről, szinte garantált, hogy az interjú során találkozni fogsz SQL kérdésekkel. Az SQL nem csupán egy technikai készség; ez a logikus gondolkodásmód, a problémamegoldó képesség és a rendszerszemlélet alapja a modern informatikában. Cikkünkben átfogóan bemutatjuk azokat a kulcsfontosságú SQL interjúkérdéseket, amelyekre mindenképp tudnod kell a választ ahhoz, hogy sikeresen vehesd az akadályokat, és elnyerd álmaid állását.

Az interjúk során a leendő munkáltatók nem csak a szintaxis ismeretét várják el tőled, hanem azt is, hogy megértsd az alapelveket, optimalizálni tudd a lekérdezéseket, és hatékonyan alkalmazd az SQL-t komplex problémák megoldására. Ez az útmutató segít felkészülni a leggyakoribb és legfontosabb kérdésekre, a legalapvetőbb fogalmaktól a haladó technikákig.

I. Az SQL Alapjai: Szilárd Fundamentum a Kezdéshez

A legelső lépés, hogy megértsük, mi is az SQL, és milyen alapvető funkciókkal rendelkezik. Ezek a kérdések gyakran az interjú elején hangzanak el, hogy felmérjék az alapszintű tudásodat.

1. Mi az SQL, és miért fontos?

Az SQL egy szabványos programozási nyelv, amelyet relációs adatbázisok kezelésére és manipulálására használnak. Létfontosságú, mert lehetővé teszi számunkra az adatok tárolását, lekérdezését, frissítését és törlését strukturált, hatékony módon. Szinte minden modern alkalmazás a háttérben adatbázisokat használ, így az SQL ismerete elengedhetetlen a velük való kommunikációhoz.

2. Melyek az SQL alnyelvei (DDL, DML, DCL, TCL)?

Az SQL négy fő alnyelvből áll, amelyek mindegyike különböző célokat szolgál:

  • DDL (Data Definition Language): Adatbázis-objektumok (táblák, indexek, nézetek) létrehozására, módosítására és törlésére szolgál. Példák: CREATE TABLE, ALTER TABLE, DROP TABLE.
  • DML (Data Manipulation Language): Adatok manipulálására (beszúrás, frissítés, törlés, lekérdezés) szolgál. Példák: SELECT, INSERT, UPDATE, DELETE.
  • DCL (Data Control Language): Jogosultságok kezelésére szolgál. Példák: GRANT, REVOKE.
  • TCL (Transaction Control Language): Tranzakciók kezelésére szolgál. Példák: COMMIT, ROLLBACK, SAVEPOINT.

3. Mi a különbség a PRIMARY KEY és az UNIQUE KEY között?

Mindkettő az adatok egyediségének biztosítására szolgál, de van néhány kulcsfontosságú különbség:

  • PRIMARY KEY (elsődleges kulcs): Egy táblában csak egy elsődleges kulcs lehet. Nem engedélyezi a NULL értékeket, és egyértelműen azonosítja a tábla minden egyes sorát. Automatikusan clustered indexet hoz létre, ami gyorsabbá teszi az adatok lekérdezését.
  • UNIQUE KEY (egyedi kulcs): Egy táblában több egyedi kulcs is lehet. Engedélyezi az egyetlen NULL értéket (azaz egy oszlopban csak egyszer szerepelhet NULL érték, ha egyedi kulcs constraint van rajta). Automatikusan non-clustered indexet hoz létre.

4. Magyarázd el a WHERE és a HAVING záradékok közötti különbséget!

Ez egy klasszikus kérdés, amely gyakran elválasztja a felületes tudást a mélyebb megértéstől:

  • A WHERE záradékot a sorok szűrésére használjuk a GROUP BY aggregációja ELŐTT. Nem tud aggregált függvényekkel (pl. COUNT(), SUM()) dolgozni.
  • A HAVING záradékot a csoportok szűrésére használjuk a GROUP BY aggregációja UTÁN. Csak a GROUP BY által létrehozott csoportokra alkalmazható, és tud aggregált függvényekkel dolgozni.

Egyszerűbben: a WHERE a nyers adatokon szűr, a HAVING az aggregált eredményeken szűr.

5. Mi a különbség a UNION és a UNION ALL között?

Mindkét operátor két vagy több SELECT lekérdezés eredményét egyesíti egyetlen eredménysorba, de a kulcsfontosságú különbség a duplikált sorok kezelésében rejlik:

  • UNION: Egyesíti az eredményeket, és automatikusan ELTÁVOLÍTJA a duplikált sorokat. Ez általában lassabb, mert az adatbázis-motor plusz munkát végez a duplikációk ellenőrzésével és eltávolításával.
  • UNION ALL: Egyesíti az eredményeket, de NEM távolítja el a duplikált sorokat. Ez általában gyorsabb, mint a UNION, mert kevesebb feldolgozást igényel.

Mindkettőhöz az szükséges, hogy a SELECT listákban szereplő oszlopok száma és típusa megegyezzen.

II. JOIN-ok: Az Adatkapcsolatok Mestere

A JOIN-ok az SQL egyik legfontosabb funkciói, amelyek lehetővé teszik számunkra, hogy adatokat kombináljunk több táblából. Ezek a kérdések szinte minden interjún előkerülnek, és gyakran gyakorlati feladatok formájában is megjelennek.

6. Magyarázd el a különböző JOIN típusokat, és mikor melyiket használod!

Négy fő JOIN típus létezik:

  • INNER JOIN (vagy egyszerűen JOIN): Csak azokat a sorokat adja vissza, amelyeknek VANNAK EGYEZŐ értékei mindkét táblában. Ez a leggyakrabban használt JOIN.
  • LEFT JOIN (vagy LEFT OUTER JOIN): Visszaadja a BAL oldali tábla ÖSSZES sorát, és a JOBB oldali tábla EGYEZŐ sorait. Ha nincs egyezés a jobb oldalon, akkor NULL értékek jelennek meg a jobb oldali tábla oszlopaiban.
  • RIGHT JOIN (vagy RIGHT OUTER JOIN): Visszaadja a JOBB oldali tábla ÖSSZES sorát, és a BAL oldali tábla EGYEZŐ sorait. Ha nincs egyezés a bal oldalon, akkor NULL értékek jelennek meg a bal oldali tábla oszlopaiban.
  • FULL JOIN (vagy FULL OUTER JOIN): Visszaadja az ÖSSZES sort mindkét táblából, egyező értékekkel, ha vannak. Ha nincs egyezés valamelyik oldalon, akkor NULL értékek jelennek meg a hiányzó tábla oszlopaiban.

A választás attól függ, hogy mely tábla sorait szeretnéd megtartani, ha nincs egyező érték a másikban.

III. Középhaladó SQL: Mélyebb Merülés

Ha az alapokat tudod, itt az ideje, hogy belevessz a komplexebb témákba, amelyek a problémamegoldó képességedet és az SQL-ben rejlő potenciál kiaknázásának képességét tesztelik.

7. Mik a subquery-k (alálekérdezések), és mikor használnád őket?

A subquery egy SELECT lekérdezés egy másik SQL parancs (pl. SELECT, INSERT, UPDATE, DELETE, FROM, WHERE, HAVING) belsejében. Segítségével komplex lekérdezéseket építhetünk fel, ahol egy lekérdezés eredménye egy másik lekérdezés bemeneteként szolgál. Két fő típusa van:

  • Non-correlated subquery: A belső lekérdezés független a külső lekérdezéstől, egyszer fut le, és az eredményét használja a külső lekérdezés.
  • Correlated subquery: A belső lekérdezés a külső lekérdezés minden sorára egyszer fut le, és függ a külső lekérdezés egy vagy több oszlopától.

Használatuk indokolt, ha:

  • Adatokat szeretnél lekérdezni egy táblából, amelyek egy másik tábla eredményeitől függenek.
  • Aggragált függvényeket szeretnél használni WHERE záradékban (amit közvetlenül nem tehetsz meg).
  • Olyan értékeket kell összehasonlítani, amelyek egy másik lekérdezésből származnak.

8. Magyarázd el a CTE-ket (Common Table Expressions) és azok előnyeit!

A CTE (Common Table Expression), vagy a WITH záradék, egy ideiglenes, elnevezett eredménysor, amelyet egyetlen SELECT, INSERT, UPDATE, DELETE vagy CREATE VIEW parancs hatókörén belül definiálhatunk. Előnyei:

  • Olvashatóság: Segít felosztani a komplex lekérdezéseket kisebb, logikusabb részekre, javítva ezzel a kód olvashatóságát és karbantarthatóságát.
  • Ismételhetőség: Lehetővé teszi, hogy ugyanazt az eredménysort többször is felhasználjuk egyetlen lekérdezésen belül anélkül, hogy újra kellene írnunk a logikát.
  • Rekurzió: Rekurzív CTE-ket is létrehozhatunk, amelyekkel hierarchikus adatszerkezeteket (pl. szervezeti felépítés, fa struktúrák) dolgozhatunk fel.
  • Alternatíva subquery-khez: Gyakran jobb alternatíva a beágyazott subquery-khez, különösen, ha azok mélyen egymásba ágyazottak.

9. Mik az ablakfüggvények (Window Functions), és hogyan különböznek az aggregált függvényektől?

Az ablakfüggvények olyan függvények, amelyek egy sorhoz kapcsolódó, meghatározott „ablak” vagy csoport adatai felett végeznek számításokat. A kulcsfontosságú különbség az aggregált függvényektől, hogy az ablakfüggvények nem csökkentik az eredménysorok számát (nem aggregálnak egyetlen sorrá), hanem megtartják az eredeti sorok számát, és minden sorhoz hozzárendelik a számított értéket.

Gyakori ablakfüggvények:

  • Ranking functions: ROW_NUMBER(), RANK(), DENSE_RANK() – sorok rangsorolása.
  • Analytic functions: LAG(), LEAD() – előző/következő sorok adatainak elérése.
  • Aggregate functions as window functions: SUM() OVER (...), AVG() OVER (...) – aggregátumok számítása egy adott ablakon belül.

Rendkívül hasznosak például futó összegek, mozgóátlagok, a top N sor kiválasztása csoportonként, vagy az előző hónaphoz képesti változás számításához.

IV. Adatbázis Tervezés és Teljesítmény: Optimalizálás a Fókuszban

A jó SQL fejlesztő nemcsak írni tud lekérdezéseket, hanem hatékonyan is. Az alábbi kérdések a teljesítményre és az adatbázis-tervezési elvekre vonatkozó tudásodat tesztelik.

10. Mik az indexek, és milyen típusai vannak? Mikor érdemes indexet használni?

Az indexek speciális keresési táblázatok, amelyek segítségével az adatbázis-motor sokkal gyorsabban találja meg a lekérdezésekben szereplő adatokat. Olyanok, mint egy könyv tartalomjegyzéke: nem kell az egész könyvet átlapozni, ha keresel valamit.

Fő típusai:

  • Clustered Index (fürtözött index): A fizikai adatok sorrendjét határozza meg a lemezen. Egy táblának csak egy clustered indexe lehet. Általában az elsődleges kulcson jön létre.
  • Non-clustered Index (nem fürtözött index): A fizikai adatok sorrendje nem változik meg, ehelyett az index tartalmazza az oszlopértékeket és a rájuk mutató fizikai címeket. Egy táblának több non-clustered indexe is lehet.

Érdemes indexet használni:

  • Oszlopokon, amelyeken gyakran végzel WHERE, ORDER BY, GROUP BY műveleteket.
  • JOIN feltételekben szereplő oszlopokon.
  • Külső kulcsokon.

Hátrányai: növeli az adatok beszúrásának, frissítésének és törlésének idejét, és extra tárhelyet igényel.

11. Mi a normalizálás, és melyek a leggyakoribb normálformák?

Az adatbázis normalizálás egy olyan folyamat, amely az adatbázis-táblákat úgy rendezi, hogy:

  • Minimalizálja az adatredundanciát (adatismétlődést).
  • Biztosítsa az adatintegritást (adatkövetkezetességet).

A normalizálás célja a hatékony adatkezelés és a frissítési anomáliák elkerülése. A leggyakoribb normálformák:

  • 1NF (First Normal Form): Minden oszlop atomi értékeket tartalmaz, és nincsenek ismétlődő csoportok.
  • 2NF (Second Normal Form): 1NF, ÉS minden nem-kulcs attribútum teljesen függ az elsődleges kulcstól (nincs részleges függőség).
  • 3NF (Third Normal Form): 2NF, ÉS nincsenek tranzitív függőségek (azaz a nem-kulcs attribútumok nem függenek más nem-kulcs attribútumoktól).

Léteznek magasabb normálformák (pl. BCNF, 4NF, 5NF) is, de a 3NF a leggyakrabban alkalmazott gyakorlati szint.

12. Mikor érdemes denormalizálni az adatbázist?

Bár a normalizálás jó gyakorlat, néha a denormalizálás előnyösebb lehet, különösen adatraktárakban (data warehouses) vagy olyan rendszerekben, ahol a lekérdezési teljesítmény kritikusabb, mint a szigorú adatintegritás. A denormalizálás azt jelenti, hogy szándékosan redundáns adatokat tárolunk, hogy elkerüljük a komplex JOIN-okat és felgyorsítsuk a lekérdezéseket. Ezt akkor használjuk, ha:

  • Jelentős lekérdezési teljesítményjavulást várunk.
  • A JOIN-ok túl költségesek lennének a lekérdezési idő szempontjából.
  • Az adatok viszonylag ritkán változnak.

13. Hogyan diagnosztizálnál egy lassú SQL lekérdezést?

Ez egy nagyon gyakorlati és fontos kérdés. A válaszodnak be kell mutatnia a problémamegoldó képességedet:

  • EXPLAIN / EXPLAIN ANALYZE (vagy hasonló eszközök): Az első lépés a lekérdezési terv elemzése. Ezek a parancsok megmutatják, hogyan hajtja végre az adatbázis-motor a lekérdezést (milyen indexeket használ, milyen JOIN sorrendet választ, stb.).
  • Indexek ellenőrzése: Győződj meg róla, hogy a megfelelő indexek léteznek és használatban vannak a WHERE záradékokban, JOIN feltételekben és ORDER BY záradékokban szereplő oszlopokon.
  • SELECT * elkerülése: Csak azokat az oszlopokat kérdezd le, amelyekre szükséged van.
  • Subquery-k és CTE-k optimalizálása: Néha a subquery-k helyett JOIN-ok, vagy a CTE-k helyett temporális táblák lehetnek hatékonyabbak (bár általában a CTE-k javítják a teljesítményt).
  • Adatok mennyiségének szűkítése: A LIMIT / TOP záradék használata fejlesztés során, vagy a WHERE záradék optimalizálása a lekérdezett adatok körének szűkítésére.
  • Statisztikák frissítése: Az adatbázis-motor a statisztikák alapján hoz döntéseket a lekérdezési tervről. Elavult statisztikák rossz tervekhez vezethetnek.

V. Gyakorlati Feladatok és Algoritmikus Gondolkodás

Az elméleti tudás mellett elengedhetetlen, hogy képes legyél az SQL-t konkrét problémák megoldására használni. Az interjúk gyakran tartalmaznak valós élethelyzetekhez hasonló gyakorlati feladatokat.

14. Írj egy lekérdezést, amely megtalálja a N-edik legmagasabb fizetést!

Ez egy klasszikus feladat, amely több megoldással is rendelkezhet. A ablakfüggvényes (Window Functions) megoldás a legmodernebb és legelegánsabb:

SELECT DISTINCT salary
FROM (
    SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) as rank_num
    FROM employees
) AS ranked_salaries
WHERE rank_num = N;

Vagy subquery-vel (kevésbé hatékony nagy adathalmazon):

SELECT salary
FROM employees
ORDER BY salary DESC
LIMIT 1 OFFSET (N-1);
-- Megjegyzés: Ez nem kezeli a holtversenyt az N-edik helyen, ha több embernek van azonos fizetése.

15. Hogyan találod meg a duplikált sorokat egy táblában, és hogyan törölnéd őket?

Duplikált sorok megtalálása:

SELECT column1, column2, COUNT(*)
FROM your_table
GROUP BY column1, column2
HAVING COUNT(*) > 1;

Duplikált sorok törlése (csak az egyik példányt megtartva):

DELETE FROM your_table
WHERE id NOT IN (
    SELECT MIN(id)
    FROM your_table
    GROUP BY column1, column2
);
-- Feltételezve, hogy van egy egyedi 'id' oszlopod. Ha nincs, akkor ablakfüggvényekkel is megoldható.

VI. Amit még elvárhatnak tőled

Az SQL interjú nem csak a helyes válaszokról szól, hanem arról is, hogy hogyan közelíted meg a problémákat, és hogyan kommunikálsz.

16. Hogyan magyaráznál el egy komplex lekérdezést egy nem-technikai személynek?

Ez a kérdés a kommunikációs képességeidet méri. A lényeg, hogy egyszerűsítsd le a technikai részleteket, és a lényegre, az üzleti értékre fókuszálj. Használj analógiákat, vizuális segítséget (ha lehetséges), és magyarázd el lépésről lépésre, mit csinál a lekérdezés, és miért fontos az eredmény.

17. Milyen kérdéseket tennél fel, mielőtt elkezdenél megoldani egy SQL feladatot?

Ez azt mutatja, hogy proaktív és alapos vagy. Kérdezz rá:

  • A forrásadatok szerkezetére (táblanevek, oszlopnevek, adattípusok).
  • A kívánt kimeneti formátumra.
  • Az esetleges speciális üzleti szabályokra vagy edge case-ekre.
  • A várt adatok mennyiségére és a teljesítményre vonatkozó elvárásokra.
  • Hogy milyen adatbázis-rendszerrel dolgozunk (pl. MySQL, PostgreSQL, SQL Server), mert a szintaxis kissé eltérhet.

Záró gondolatok

Az SQL interjúkra való felkészülés nem egy egyszeri feladat, hanem egy folyamatos tanulási és gyakorlási folyamat. Minél többet gyakorolsz, minél több különböző problémával találkozol, annál magabiztosabbá válsz. Használj online platformokat (LeetCode, HackerRank, SQLZoo), építs saját adatbázisokat, és kísérletezz a lekérdezésekkel. Ne feledd, az interjú célja nem csak az, hogy teszteljék a tudásodat, hanem az is, hogy megismerjék a gondolkodásmódodat és a problémamegoldó képességedet.

Készülj fel alaposan, gyakorolj rendszeresen, és higgy magadban! Sok sikert kívánunk a következő SQL interjúdhoz!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük