Tagadós lekérdezések

Tagadós lekérdezések

Tagadós lekérdezésekAz 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.

Oracle HR séma

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.

SQL-1

Az eredmény:

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

SQL-2

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.

SQL-3

Az eredmény:

SQL-3-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.

SQL-4

Az eredmény:

SQL-4-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.

SQL-5

Az eredmény:

SQL-5-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.

Hello World! másképpen

Hello World! - Piet programozási nyelven

Hello World! - Piet programozási nyelvenA programozási nyelvek tanulásának első lépése a „Hello World!” szintaktikájának megismerése, és egyben teszt arra is, hogy megfelelő-e a fejlesztői környezet telepítése, konfigurálása. Megjelenik-e a „Hello World!” a konzolon, felbukkanó ablakban, önálló ablakban, weblapon, üzenetben? Mit kell ezért tenni? Néhány Java példát nézünk erre.

1. Konzolos megoldás

Ez a kiinduló állapot. Futtatva a programot, a konzolon jelenik meg a szöveg.

2. Swing 1. megoldás

Itt felbukkanó párbeszédablakban jelenik meg a szöveg. A JOptionPane ablaka itt önálló, így nincs olyan szülője/tulajdonosa ( null), ahonnan elveheti a fókuszt.

3. Swing 2. megoldás

Itt egy testre szabott JFrame utód készül, alapvető beállításokkal. Az ablak címsorában jelenik meg a szöveg. Az ablak saját magát példányosítja és főablakként viselkedik, vagyis gondoskodik saját maga láthatóságáról, fókusz- és eseménykezeléséről (utóbbi 2 most nincs).

4. JavaFX megoldás

Itt egy testre szabott  Application utód készül, minimál beállításokkal. Az ablak címsorában jelenik meg a szöveg. Az ablak saját magát példányosítja és főablakként viselkedik.

5. Applet megoldás

Böngészőben fut a testre szabott JApplet utód. A weblapon elfoglalt téglalap alakú területen vízszintesen balra és függőlegesen középen jelenik meg a címke komponensben a szöveg.

6. JSP 1. megoldás

Ez egy JSP weboldal automatikusan generált forráskódja. Böngészőben jelenik meg a szöveg.

7. JSP 2. megoldás

Ez egy JSP weboldal egyszerű direktívával a h1 címsorban.

8. Servlet megoldás

Itt egy szervlet által generált weboldal, amely fixen tartalmazza a szöveget.

9. Atipikus 1. megoldás

„Adatbázisból is lekérdezhető” a szöveg.

10. Atipikus 2. megoldás

Ebben az esetben a Java nyelv által biztosított véletlenszám generáló osztályra támaszkodva állítjuk elő a szöveget. Mivel a random objektum által előállított számok csupán a véletlenség látszatát keltik, de valójában egy algoritmus szerint készülnek, ezért előre teljes pontossággal megjósolható a kimenet. Csupán meg kell találni azt a kezdőértéket, ami után „véletlenül” pont a h, e, l, l, o betűk fognak következni. Megismételve a folyamatot egy másik kezdőértékkel, megkapjuk a w, o, r, l, d  betűket is.

A bejegyzéshez tartozó teljes forráskódot – több projektben – ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A példák a Java SE szoftverfejlesztő tanfolyam, a Java EE szoftverfejlesztő tanfolyam és a Java adatbázis-kezelő tanfolyam több alkalmához is kötődnek (kivéve 4. és 5.).

Hivatkozások a témakörben, amelyek más programozási nyelvek példáit is tartalmazzák:

Hogyan értékeljük az online vizsgafeladatot?

értékelés

Tanfolyamaink követelményeinek teljesítéséhez több online tesztet kell kitölteni és egy komplex, online vizsgafeladatot kell megoldani.

A feladatspecifikáció mindig részletes, maximum 1 db A4-es oldal terjedelmű, folyó szövegben felsorolásokat is tartalmaz és szándékosan nincsenek benne ábrák. Törekszünk az egyértelmű megfogalmazása, de hagyunk mozgásteret egyéni értelmezésre is, amit – megfelelő indoklással – elfogadhatunk. Az online vizsgafeladat megoldásához bármilyen segédeszközt lehet használni.

Az online vizsgafeladat megoldásának tervezésére, implementálására, tesztelésére és dokumentálására és határidőre való feltöltésére körülbelül egy hét áll rendelkezésre. Közben online konzultációt biztosítunk, ahol megbeszéljük az ezzel kapcsolatos kérdéseket és rávezető (nem konkrét) segítséget biztosítunk.

Figyelembe vett szempontok az online vizsgafeladat értékelése során

  • Objektumorientált szemléletmód alkalmazása
  • MVC architektúrális tervezési minta alkalmazása
  • Logikus MVC szeparáció
  • Egyértelműen elhatárolódó felelősségi kör: a modell, a nézet és a vezérlő azt és csak azt oldja meg, amit, ahogyan, amikor, ahányszor kell
  • Adatbázis-kapcsolatért felelős rész szeparációja
  • Vezérlésért felelős rész szeparációja
  • Megjelenítésért felelős rész szeparációja
  • MVC kommunikációs irányok betartása, megfelelő adatkonverzió
  • Szükség esetén singleton és factory típusú tervezési minta alkalmazása
  • Adatbázis-kapcsolat megfelelő menedzselése, nyitás, zárás, kivételkezelés
  • Szükséges adatbázis-karbantartó (CRUD) művelek megfelelő megvalósítása
  • Specifikáció pontos értelmezése
  • Specifikáció pontos megvalósítása
  • Specifikáció alapján tesztelés megvalósítása
  • Megfelelő GUI komponensek alkalmazása, elhelyezése, paraméterezése, kommuniká­ciója, eseménykezelése
  • Adatbázis olvasása során a keletkező eredménytábla és/vagy kivételobjektum megfelelően jut el a nézet réteghez
  • Modellvezérelt fejlesztés elveinek alkalmazása
  • Szükség esetén POJO és ezek adatszerkezeteinek konstrukciós és szelekciós műve­letei
  • Eseménykezelés logikus működésének megtervezése és megvalósítása
  • Extrém tesztadatokkal való hibakeresés, tesztelés
  • Felesleges forráskód-részletek nincsenek
  • Szintaktikai és/vagy szemantikai hibák nincsenek (Java, SQL, HQL oldalon egyaránt)
  • Projekt megfelelő elnevezése és szerkezete
  • Logikus és konvencióknak megfelelő elnevezések következetes alkalmazása
  • Algoritmusban, folyamatokban, saját modellekben való eligazodás, alkalmazkodás ké­pessége, ezek szintjei és megvalósulása
  • Szükséges programozási tételek felismerése, megvalósításuk, összeépítésük
  • Logikus gondolkodás és feladatmegoldás szintjei és alkalmazásuk
  • Hatékonysági szempontok ismerete és alkalmazása

Az online vizsgafeladatot – a tanfolyamot záró 53-56. óra: Összefoglalás alkalommal – közösen, részletesen meg is beszéljük: lépések, rétegek, funkciók, ellenőrzési/tesztelési lehetőségek, hibakeresés, tipikus problémák a megoldás során.

Munkakör, létszám, névsor lekérdezése

Munkakör, létszám, névsor

Munkakör, létszám, névsorAz a fela­da­tunk, hogy az Oracle HR sé­má­ból le­kér­dez­ve állít­suk elő munka­kö­rön­ként cso­por­to­sít­va az al­kal­ma­zottak lét­szá­mát és név­so­rát. Adott a JOBS és az EMPLOYEES táb­lák kö­zötti 1:N kap­cso­lat. A JOBS táb­lá­ban (szó­tár) lé­vő JOB_ID egye­di kulcs­hoz tar­to­zik egy hosszabb szö­ve­ges JOB_TITLE le­í­rás (mun­ka­kör), va­la­mint az EMPLOYEES táb­lá­ban meg­ta­lál­ha­tó a JOB_ID kül­ső kulcs­ként. Az EMPLOYEES táb­lá­ban elér­he­tő az al­kal­ma­zottak neve: FIRST_NAME és LAST_NAME. Min­den mun­ka­kört be­tölt leg­alább 1 al­kal­ma­zott és min­den al­kal­ma­zott­hoz van hozzá­ren­delt mun­ka­kör.

Oracle HR séma

Tanfolyamainkon többféleképpen modellezzük és tervezzük meg a feladat megoldását.

Megoldás (Java SE szoftverfejlesztő tanfolyam)

A Java SE szoftverfejlesztő tanfolyam 45-52. óra: Adatbázis-kezelés JDBC alapon alkalmain a következők szerint modellezünk és tervezünk.

Kiindulunk az alábbi egyszerű SQL parancsból:

Munkakör-létszám-névsor-SQL-1

Eredményül ezt kapjuk (részlet):

Munkakör, létszám, névsor eredmény 1

A kapott eredménytáblát a Java kliensprogram fejlesztése során leképezzük egy generikus POJO listába, a rekordonként összetartozó 3 adatból előállítva az objektumok tulajdonságait. A generikus listát csoportváltás algoritmussal feldolgozva, könnyen listázzuk a létszámot és a névsort munkakörönként csoportosítva. A munkakörönkénti létszámot a listafeldolgozás során megkapjuk. Ezt most nem részletezzük, de tanfolyamaink hallgatói számára ILIAS e-learning tananyagban tesszük elérhetővé a teljes forráskódot. Ennél a megoldásnál egyszerűbb a lekérdező parancs, de összetett az eredmény feldolgozása.

Megoldás (Java adatbázis-kezelő tanfolyam)

A Java adatbázis-kezelő tanfolyam 9-12. óra: Oracle HR séma elemzése, 13-16. óra: Konzolos kliensalkalmazás fejlesztése JDBC alapon, 1. rész, 33-36. óra: Grafikus kliensalkalmazás fejlesztése JDBC alapon, 2. rész alkalmával a következők szerint modellezünk és tervezünk.

Denormalizált eredményt közvetlenül visszaadni képes összetett SQL parancsot készítünk:

Munkakör, létszám, névsor SQL-2

Eredményül ezt kapjuk (részlet):

Munkakör, létszám, névsor, eredmény-2

A kapott eredménytáblát a Java kliensprogram fejlesztése során közvetlenül kiíratjuk, hiszen minden szükséges adatot tartalmaz. Az utolsó oszlopban összefűzve megkapjuk az adott részleghez tartozó alkalmazottak névsorát. Ezt most nem részletezzük, de tanfolyamaink hallgatói számára ILIAS e-learning tananyagban tesszük elérhetővé a teljes forráskódot. Ennél a megoldásnál összetettebb a lekérdező parancs, de egyszerű az eredmény feldolgozása.

Érdemes átgondolni és összehasonlítani a kétféle különböző megközelítés lehetőségeit, korlátait. Ha egyensúlyozni kell a kliensprogram és az adatbázis-szerver terhelése között, valamint az MVC modell összetettsége, karbantarthatósága, könnyen dokumentálhatósága a/is szempont, akkor többféle alternatív módszer is bevethető, valamint építhetünk a különböző Oracle verziók (dialektusok) képességeire is.

Az SQL forráskódok formázásához a Free Online SQL Formatter-t használtam.