Az SQL nyelv utasításai többféleképpen csoportosíthatók. Például: adatdefiníciós utasítások (DDL), adatmanipulációs utasítások (DML), lekérdező utasítások (DQL), adatelérést vezérlő nyelv (DCL). A lekérdezések tanítása során másféle rendszerezés is adható. Például a tagadást tartalmazó lekérdezések önálló kategóriát alkothatnak.
Az Oracle HR sémát használjuk és bemutatunk tagadást tartalmazó lekérdezésre öt példát.

1. Kik dolgoznak olyan részlegekben, ahonnan senki sem vett részt korábban projektmunkában?
A
DEPARTMENTS és
EMPLOYEES táblák között
1:N fokszámú kapcsolat van, és a
DEPARTMENT_ID köti össze ezeket. A belső lekérdezés visszaadja azoknak a részlegeknek az azonosítóját (
DEPARTMENT_ID), amelyekből már legalább egyszer legalább egy alkalmazott részt vett korábban projektmunkában (ez most egy 6 elemből álló halmaz). A külső lekérdezésben a
NOT IN predikátum – építve a belső lekérdezés eredményeire – megadja azon részlegek nevét (
DEPARTMENT_NAME), illetve az ott dolgozó alkalmazottak nevét (
EMPLOYEE_NAME), ahol az alkalmazotthoz tartozó részleg azonosítója nincs benne a belső lekérdezés által visszaadott eredménytáblában. 5 részlegben 15 alkalmazottra teljesül a feltétel. A
NOT IN predikátum adja a tagadást.

Az eredmény:

2. Melyek azok a részlegek, ahol nem minden alkalmazott azonos munkakörben dolgozik?
A
DEPARTMENTS és
EMPLOYEES táblák között
1:N fokszámú kapcsolat van, és a
DEPARTMENT_ID köti össze ezeket. A lekérdezés csoportosítást végez részleg azonosítóra és névre (
DEPARTMENT_ID,
DEPARTMENT_NAME), és aggregálja – most megszámolja – a csoportban előforduló egyedi munkakör azonosítókat (
JOB_ID), majd ezek közül kihagyja azokat, ahol a megszámolás 1-et ad (másképpen: azokat hagyja meg, ahol a megszámolás különbözik 1-től, 0 nem lehet, igazából 1-nél több) – ez biztosítja a tagadást. 7 részleget kapunk eredményül.

Az eredmény:

3. Kik azok az alkalmazottak, akik az életpálya modell alapján már nem kaphatnak fizetésemelést?
A
JOBS és az
EMPLOYEES táblák között
1:N fokszámú kapcsolat van, és a
JOB_ID köti össze ezeket. Az életpálya modellhez tartozik egy munkakörhöz tartozó minimális és maximális fizetés (
MIN_SALARY és
MAX_SALARY). Azok az alkalmazottak listázandók, akiknél a fizetés megegyezik a betöltött munkakörükhöz adható legmagasabb fizetéssel (
SALARY=MAX_SALARY). Ez jelenti a tagadást. Eredményül egyetlen alkalmazottat kapunk.

Az eredmény:

4. Kik a nem vezető munkakörben dolgozó alkalmazottak?
A belső lekérdezés 18 olyan alkalmazott vezetőjének azonosítóját (
MANAGER_ID) adja vissza, akik lehetnek részlegvezetők vagy középvezetők. A külső lekérdezés minden olyan alkalmazott azonosítóját és nevét (
EMPLOYEE_ID,
EMPLOYEE_NAME) adja vissza, akik nincsenek benne a belső lekérdezés által visszaadott eredményhalmazban. Ez adja a tagadást. Eredményül 89 alkalmazottat kapunk.

Az eredmény:

5. Milyen részlegek találhatók nem amerikai régió területén lévő országokban?
A
REGIONS,
COUNTRIES,
LOCATIONS,
DEPARTMENTS táblák között balról-jobbra páronként
1:N fokszámú kapcsolat van és ugyanebben a sorrendben a
REGION_ID,
COUNTRY_ID,
LOCATION_ID köti ezeket össze. A belső lekérdezés azért szükséges, mert vannak üres/fiktív részlegek is, amelyeket ki kell hagyni. Az amerikai régió azonosítója 2 (
REGION_ID), ezt adja most a tagadást. Eredményül 3 részleget kapunk 2 országban és 1 régióban.

Az eredmény:

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
A feladatok megoldása során nem foglalkoztam külön azzal az egy alkalmazottal, akinek nincs részlege. A feladatok a Java adatbázis-kezelő tanfolyam 13-16. óra: Konzolos kliensalkalmazás fejlesztése JDBC alapon, 1. rész alkalmához és a 33-36. óra: Grafikus kliensalkalmazás fejlesztése JDBC alapon, 1. rész alkalmához kötődnek.
Az SQL forráskód formázásához a Free Online SQL Formatter-t használtam.