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.
Próbálkoztam az alábbi lekérdezésekkel:
– Mely régiókban/országokban nincs részlege/telephelye a cégnek?
– Kik egy-egy részleg középvezetői (aki legalább 1 főnek a részlegből vezetője az EMPLOYEES->MANAGER_ID alapján, de nem részlegvezető a DEPARTMENTS->MANAGER_ID alapján)?
A másodikat kétféleképpen is megoldottam, de egyikben sem vagyok biztos, hogy helyes ill. általános-e a megoldás. Megnézhetjük a következő órán?
Andrea: hogyne. Örülök, hogy kitartóan gyakorolsz.
Ezek a tagadós lekérdezések összeépíthetők a dátumtartományok kezelésével:
https://it-tanfolyam.hu/datumtartomanyok-kezelese/
Például egy webáruház üzemeltetőjében július 1-jén felmerül a kérdés:
Mi azon ügyfeleink e-mailcíme, akik az elmúlt negyedévben nem rendeltek? Értesítsük őket hírlevélben az aktuális akciós termékekről! Ezzel növelhető a nyári, egyébként is uborkaszezonos forgalom.
Írtam egy lekérdező parancsot és ezt az eredményt kaptam. Két kérdésem van.
1. Vajon mi lehetne bölcsész mondatban tagadósan megfogalmazva a kérdés?
2. Lehetne másképpen, „szebben” megkapni ugyanezt?
Örülök, hogy gyakorolsz Dávid. A válaszokat megírtam privátban és a vasárnapi órán meg is beszéljük.
Imádtam az ILIAS-os példában a „//a nem igaz, hogy nem igaz, az igaz” kommentet.
Először azt hittem, hogy poén, de azután láttam az igazságtáblás bizonyításokat.
Én is. Azóta már 😉 nincs több kérdésem.