2012. április 13. TARTALOM
|
|
|
- Kristóf Pásztor
- 7 évvel ezelőtt
- Látták:
Átírás
1 KENDE MÁRIA - NAGY ISTVÁN SQL BEVEZETŐ FELADATGYŰJTEMÉNY TARTALOM Előszó... 2 Megjegyzés Foglalkozás Adatbázis tervezés Foglalkozás Az SQL használatának alapjai, Egyszerű lekérdezések Foglalkozás Egytáblás csoportosító lekérdezések Foglalkozás Többtáblás lekérdezések, allekérdezések Foglalkozás Interaktív környezet Foglalkozás Adattáblák létrehozása, módosítása, tranzakciók, megszorítások Foglalkozás Nézettáblák, felső-n analízis, ROWNUM Foglalkozás SQL összefoglaló feladatsorok Foglalkozás Adatbázis-adminisztrátori ismeretek, jogosultság-kezelés Mellékletek Árnyék-objektumok Hierarchikus szerkezetű adattáblák feldolgozása Irodalom április 13.
2 ELŐSZÓ E feladatgyűjtemény a tankönyvek (lásd az Irodalomban) kiegészítését, az "Adatbázis-kezelés" gyakorlatokra való önálló felkészülés további támogatását szolgálja. Az egyes Foglalkozások anyagában természetesen ismertnek tételezzük fel, és ezért fel is használjuk a tankönyvekben részletesen tárgyalt, valamint a korábbi Foglalkozásokban bemutatott anyagot. A megoldásoknál célszerű betartani a "02_Mire ügyeljünk.doc" file-ban írottakat. A feladatok az alábbi emp és dept táblákra vonatkoznak: >> Az emp tábla (14 soros): EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO KING PRESIDENT BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK SCOTT ANALYST ADAMS CLERK MILLER CLERK >> A dept tábla (4 soros): DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON A táblák értelmezése: Az emp tábla a feladatokban szereplő vállalat dolgozóinak adatait tartalmazza. E tábla oszlopneveire a következő magyar nevekkel fogunk hivatkozni: empno a dolgozó azonosítója, ename a neve, job a munkaköre, mgr a főnöke azonosítója, hiredate a belépésének dátuma, sal a fizetése, comm a jutaléka, deptno a részlegének azonosítója. A dept tábla a vállalat részlegeinek adatait tartalmazza. E tábla oszlopneveire a következő módon fogunk hivatkozni: deptno a részleg azonosítója, dname a neve, loc a telephelye. MEGJEGYZÉS E feladatgyűjtemény pdf formátumban a honlapon található az "Adatbáziskezelés" témakör kiválasztása után az "AKT (Adatbázis-Kezelés Technológiája)" menüpont kijelölésével a Labor almenüpontban letölthető 413_Labor alkönyvtárban, ahol egyéb (részben ebben az anyagban is hivatkozott) kiegészítő oktatási anyagok is találhatók. (E file az Acrobat cég honlapjáról ingyenesen letölthető, és a saját gépen telepíthető AcrobatReader programja segítségével olvasható.) Jelen dokumentum szerzői jogi védelem alatt áll, kizárólag az egyéni felkészülés céljára használható. Csak számítógépen olvasható, sem a teljes dokumentum, sem annak bármely része nem nyomtatható ki, nem másolható le, illetve nem adható ki a szerzők írásos engedélye nélkül. #11_SQL Feladatgyűjtemény (30) - 2 -
3 0. Foglalkozás Adatbázis Tervezés Részletesebben lásd [1]: II. rész, 7. fejezet RELÁCIÓ-ALGEBRAI ÁTTEKINTÉS (Jelölések, definíciók) Elemek: a, b, c,... Halmazok: A, B, C,... Halmaz megadása (elemei felsorolásával): pl. A = {a, b, c}, ekkor pl. a A, azaz a eleme A-nak Halmaz megadása (az elemek tulajdonságának megadásával): pl. B = { x x >= 50, x < 200 } A halmazokat rendezetleneknek tekintjük (esetenként a rendezetlen halmaz kifejezést is használjuk), vagyis bennük az elemek sorrendje tetszőleges, például {a, b, c} = {c, b, a}. A gyakorlatban a legtöbb csoportosítás ilyen, például Péter barátai: { Laci, Zoli, Attila }. Részhalmaz: Egy B halmaz részhalmaza egy A halmaznak, ha B minden eleme az A-nak is eleme. Jelölése: B A. Például {c, a} {a, b, c}. Rendezett halmaz (más néven vektor): pl. q = a, b, c A rendezett halmazokban az elemek sorrendje kötött, a sorrendjük megváltoztatásával már egy másik rendezett halmazhoz jutunk, így nyílván a, b, c c, b, a. Ilyen például egy pont helyvektora valamely koordinátarendszerben, vagy a vezeték név kereszt név páros. (Nyilván nem mindegy, hogy valakinek Gábor Miklós, vagy Miklós Gábor a neve.) Halmazok Descartes szorzata: Például A = {a, b, c} és B = {0, 1} esetén A B = { a, 0, a, 1, b, 0, b, 1, c, 0, c, 1 }. A Descartes szorzat tehát egy rendezett elempárosokat tartalmazó halmaz. A halmazok Descartes szorzatát értelemszerűen kiterjeszthetjük kettőnél több tényezőre is, ekkor persze már nem párosokról, hanem hármasokról, négyesekről, vagy általánosabban n-esekről beszélünk. Ezeket az n-eseket az adatbázis-kezelésben rekordoknak nevezzük. Attribútumok (tulajdonság-halmazok): A, B, C,... Tehát az attribútumok maguk is halmazok. Attribútum halmaz: pl. Q = { A, B, C, D, E, F, G } Funkcionális függőség: pl. f = { A, B } { C, D, E } Gyakorlati példa f dolgozó = {NÉV, OSZTÁLY} {MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK} A funkcionális függőségeket (melyek tulajdonképpen többváltozós, többértékű függvények) a gyakorlatban röviden csak függőségeknek szoktuk nevezni. Kulcs (elsődleges kulcs, primary key) néven nevezzük a függőség baloldalán álló (úgynevezett elsődleges) attribútumok összességét. Ha a kulcs csak egyetlen attribútumból áll, akkor egyszerű kulcsról, egyébként összetett kulcsról beszélünk. A függőség jobboldalán álló attribútumokat másodlagos attribútumoknak nevezzük. A fenti példában tehát a K fdolgozó = {NÉV, OSZTÁLY} attribútumhalmaz kulcs, míg a Q fdolgozó = {MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK} a másodlagos attribútumok halmaza, és az f dolgozó, mint többváltozós, többértékű függvény azt jelenti, hogy a NÉV, és az OSZTÁLY #11_SQL Feladatgyűjtemény (30) - 3 -
4 attribútumok együttesen meghatározzák a MUNKAKÖR, a MUNKAKÖRI_FIZETÉS, és a JUTALÉK attribútumok mindegyikét külön-külön. Tehát a fenti függőség helyett ekvivalens módon megadhatjuk az alábbi függőségek együttesét: f dolgozó1 = {NÉV, OSZTÁLY} {MUNKAKÖR} f dolgozó2 = {NÉV, OSZTÁLY} {MUNKAKÖRI_FIZETÉS} f dolgozó3 = {NÉV, OSZTÁLY} {JUTALÉK} Ennek alapján fogjuk az alábbiakban értelmezni a függőségek ekvivalens felbontását és egyesítését. Függőségek ekvivalens egyesítése és felbontása: Két függőség ekvivalens módon egyesíthető, ha baloldaluk azonos. Ekkor az egyesített függőség jobboldala mindkét függőség jobboldalának attribútumait tartalmazza. Az egyesítés jele: Például f = { A, B } { C, D, E } és g = { A, B } { F, G } esetén: f g = { A, B } { C, D, E, F, G } Minden függőség ekvivalens módon bontható fel olyan függőségek halmazára, melyekben a baloldalak megegyeznek az eredeti függőség baloldalával, a jobboldalak pedig az eredeti függőség jobboldalának egy-egy attribútumát tartalmazzák. Az egyesíthetőség és felbonthatóság fenti ekvivalenciái a gyakorlatban azt jelentik, hogy mivel elvben mindegy, hogy például az f g függőséget, vagy az f, g függőségpárost használjuk, ezért gyakorlati szempontok alapján választhatunk. Relációséma az f függőség fölött: R f A, B, C, D, E = A B C D E A relációséma a pontos algebrai jelentése szerint tehát a benne szereplő attribútumoknak a megadásuk sorrendjében vett Descartes-szorzata, vagyis halmaz, melynek elemei attribútum-érték n-esek, vagyis rekordok. A relációsémát a továbbiakban azonosítani fogjuk egy olyan adattáblával, melynek oszlopnevei a relációséma attribútumai, a sorai pedig a relációséma rekordjai. Mivel az egyes attribútumok (tulajdonság-halmazok) a megengedett értékek mindegyikét tartalmazzák, ezért a relációséma ebben az algebrai értelemben az összes lehetséges tulajdonság érték összes lehetséges csoportosítását tartalmazza, ami nyilván sokkal több nemcsak annál, ami egy adott pillanatban egyáltalán lehetséges, hanem annál is, ami valaha előfordulhat. Például egy ember lehet 1 m magas és 18 kg testsúlyú (kb. 6 éves korában), és lehet 2 m-es, 150 kg-os felnőttként, de egész biztos nem lehet 1 m-es és 150 kg-os. A fentiek miatt a relációsémát a gyakorlatban inkább egy adattábla szerkezetének (más néven sémájának) megadására használjuk, és az őt reprezentáló adattábla helyett a gyakorlatban ténylegesen tárolt rekordokat tartalmazó adattáblával fogunk dolgozni. Ennek algebrai modelljét fogjuk a továbbiakban relációnak nevezni, mely tehát algebrailag nem más, mint a relációséma részhalmaza, gyakorlatilag pedig a ténylegesen feltöltött adattábla. Reláció az f függőség fölött: r f A, B, C, D, E R f A, B, C, D, E Gyakorlati példa: Jelölje dolgozó az f dolgozó függőség fölötti relációt. E reláció egy lehetséges értéke ekkor: dolgozó NÉV, OSZTÁLY, MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK = { Tóth Pál, TMK, asztalos, 60000, 30000, Kis Jolán, Bérosztály, könyvelő, 80000, 0, Kis Elemér, Áruforgalmi osztály, eladó, 50000, } A relációk elemeit rekordoknak is nevezzük, és a relációkat a gyakorlatban olyan adattáblának nevezett táblázatokban ábrázoljuk, ahol a rekordok alkotják a sorokat, az attribútumok rekordbeli értékei pedig az oszlopokat. Egy relációsémában, illetve relációban #11_SQL Feladatgyűjtemény (30) - 4 -
5 a rajta értelmezett függőség elsődleges, azaz kulcs- és másodlagos attribútumait a függőségnél mondottakkal azonos módon használjuk. Valamely r reláció rekordjainak attribútumkészletét (azaz tulajdonsághalmazát) ki tudjuk terjeszteni egy s reláció attribútumaira, ha az s valamely K s kulcsának minden attribútuma az r-nek is attribútuma. Ekkor a K s kulcsot az r reláció idegen kulcsának is nevezzük (lásd az alábbi mintapéldát), ha teljesül, hogy 1. a K s -beli attribútumok minden értékegyüttese az s-ben legfeljebb egyszer fordul elő, és 2. a K s -beli attribútumok minden r-beli értékegyüttese az s-ben is előfordul. Ezt nevezik idegen kulcs megszorításnak, az s és r relációk közötti kapcsolatot pedig 1:N kapcsolatnak, mivel minden s-beli kulcs az r relációban N-szeresen fordul elő, ahol N 0. Adatbázis: Általános értelemben adatbázisnak nevezzük valamely nyilvántartási feladatban fontosnak tekintett tulajdonságú tárolt objektumok (adat- és nézettáblák, jogosultságok, tárolt alprogramok, triggerek, stb.) összességét, szűkebb értelemben egy adott alkalmazáshoz tartozó adattáblák összességét. A nem megfelelő szerkezetű adattárolás több veszélyt is rejt magában (ezeket adatbázisanomáliáknak nevezzük, lásd e foglalkozási anyag végén), mely veszélyek elhárítása érdekében egy normalizálásnak nevezett adatbázis-tervezési eljárást használunk (lásd az alábbi mintapéldát). ADATBÁZIS TERVEZÉS (Vázlatos áttekintés) Az adatbázis tervezés, vagyis a normalizálás során a tárolni kívánt tulajdonságok (attribútumok) összességét kijelölő kezdeti adatbázis sémából (az úgynevezett ősmodellből), valamint az e tulajdonságok között felismert összefüggésekből (a függőségekből) indulunk ki. A függőségeken elvégzett transzformáció-sorozat (vagyis a tényleges normalizálás) eredményeként kapott, úgynevezett eredmény függőségek mindegyikéhez egyértelműen hozzárendelt eredmény relációsémák összessége alkotja az eredmény adatbázis sémát. Végül az eredmény relációsémákat reprezentáló adattáblák együttesen alkotják az eredetileg kijelölt nyilvántartási feladat adatbázisát. A normalizálás egyes lépései során a normalizálás adott szintjén létező függőségekre vonatkozóan bizonyos követelményeket fogalmazunk meg. Ezeket a követelményeket normálformáknak nevezzük. Mi a normalizálás folyamatát négy; az első, a második, a harmadik, és a Boyce- Codd normálforma fázisain keresztül valósítjuk meg. Ezek jelölése; 1NF, 2NF, 3NF és BCNF. Az alábbiakban az ezekben megfogalmazott követelményeket foglaljuk össze: 1.) Minden attribútum egyszerű (vagyis csak egyetlen adatot tartalmaz) [1NF]. 2.) A másodlagos attribútumok mindegyikét a kulcsattribútumok csak együttesen határozzák meg (vagyis nincs részleges függés) [2NF]. 3.) A másodlagos attribútumok egymástól (funkcionálisan) függetlenek (vagyis nincs belső függés) [3NF]. 4.) A kulcsattribútumoknak nincs olyan részhalmaza, mely más kulcs- vagy másodlagos attribútumoktól (funkcionálisan) függne (vagyis nincs kulcstörés) [BCNF]. A magasabb normálformákban értelemszerűen teljesülniük kell az alacsonyabb normálformákban megfogalmazott követelményeknek. Az alábbi mintapéldában a feladat egy olyan adatbázis séma megtervezése lesz, melyben egy ősmodellből (kiindulási adatbázis sémából) el kell jutni a BCNF normálformában megfogalmazott követelményeket is teljesítő (BCNF alakú) adatbázis sémához. #11_SQL Feladatgyűjtemény (30) - 5 -
6 Az adatbázis-tervezés első lépése tehát a tárolni kívánt tulajdonságok (attribútumok) összességének (az ősmodell) kijelölése. Ez egy kreatív, intellektuális tevékenység, mely alapos körültekintést igényel, ám a tervezés eljárásának szempontjából önkényes. Az ősmodellben már minden attribútum rögzített (bár esetleg összetett) adattípussal rendelkezik, vagyis az ősmodellel kijelöltük a tárolni kívánt objektum típusát, az ősobjektumtípust. Felmerülhet ezek után a kérdés, miért nem ezt implementáljuk, miért van szükség további lépésekre. A válasz lényege, hogy el akarjuk kerülni az úgynevezett adatbázis-anomáliákat (lásd alább!), vagyis az adatvesztést és az inkonzisztenciát (tartalom-ellentmondást). A tervezési folyamat, a normalizálás első, és egyben legfontosabb lépése, az attribútumok közötti összefüggések, az úgynevezett függőségek felismerése. Ez is intellektuális, nem automatizálható lépés, ám már semmiképpen nem önkényes. Az adattárolás céljának, valamint a tárolni kívánt attribútumoknak (tulajdonságoknak) az ismeretében, a függőségek felírása tulajdonképpen az általunk létrehozni kívánt zárt világ belső kapcsolatainak, összefüggéseinek feltérképezését jelenti. Maga a normalizálás a felírt függőségeknek a normálformák követelményei szerinti (lényegében mechanikus) transzformációját jelenti, melynek során (és ez nagyon lényeges!) automatikusan (!) elkülönülnek az ősmodell ősobjektumtípusából az adatmodell célszerű építőkövei, az elemi objektumtípusok, melyeket relációsémáknak is nevezünk, és amelyeknek implementációi maguk az adattáblák. Egyszerűbb feladatok esetén ezek az elemi objektumtípusok (relációsémák, adattáblák), szinte ránézésre elkülöníthetők (Raktár, Beszállítók, Vevők, Rendelések, stb. táblák), ám egy összetett feladat esetén csak a normalizálási folyamat automatizmusa adhat garanciát az üzembiztosan használható adatmodell létrehozására. Végül egy fontos gyakorlati javaslat. Mind a függőségek feltérképezésénél, mind a normalizáció transzformációs lépéseinél célszerű az összes lehetséges ekvivalens függőség-egyesítést elvégezni (lásd feljebb!). Ez a gyakorlatban azt jelenti, hogy kevesebb adattáblát kell használnunk, elvileg pedig azt, hogy ugyanannak az objektumtípusnak egyetlen relációsémában tartjuk az attribútumait. EGY ADATBÁZIS-TERVEZÉSI MINTAPÉLDA Legyen egy adatbázis sémája: dolgozó NÉV, OSZTÁLY, MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK, FŐNÖK, TELEPHELY_CÍME, ahol feltételezzük, hogy a.) a NÉV és az OSZTÁLY adatok csupán együtt azonosítják egyértelműen a dolgozót, b.) egy OSZTÁLY egy telephelyen található. Alakítsa át ezt az adatbázis sémát BCNF alakra. (Mutassa be a tervezés folyamatát, és adja meg az elsődleges és az idegen kulcsokat is.) MEGOLDÁS 1. lépés (A tárolandó attribútumok kijelölése az ősmodell relációsémája) dolgozó NÉV, OSZTÁLY, MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK, FŐNÖK, TELEPHELY_CÍME 2. lépés (A függőségek felismerése) A függőségeket részben az attribútumok szövegesen megadott kapcsolatai, részben a józan ész megfontolása alapján ismerjük fel. #11_SQL Feladatgyűjtemény (30) - 6 -
7 a.) Az a NÉV és az OSZTÁLY adatok csupán együtt azonosítják egyértelműen a dolgozót kapcsolatból az alábbi függőség következik: f dolgozó = { NÉV, OSZTÁLY } { MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK, FŐNÖK, TELEPHELY_CÍME } b.) Az egy OSZTÁLY egy telephelyen található kapcsolatból következik: f osztályok = { OSZTÁLY } { TELEPHELY_CÍME } Mivel a NÉV és az OSZTÁLY egyértelműen azonosítják a dolgozót, így a józan ész alapján nyilván felírható f főnök = { OSZTÁLY } { FŐNÖK }, a fenti két függőség pedig egyesíthető, hiszen a baloldaluk azonos. Így kapjuk: f osztályok1 = { OSZTÁLY } { FŐNÖK, TELEPHELY_CÍME } c.) A józan ész alapján felírható az alábbi függőség: f munkakörök = { MUNKAKÖR } { MUNKAKÖRI_FIZETÉS } Megjegyezzük, hogy a tervezés tehát az összes függőség felismerésével kezdődik, vagyis a további lépésekben új függőség nem "keletkezhet" (csak a már meglévők transzformálódhatnak a normalizálás lépéseinek megfelelően). A felismert függőségek közül azonban nem feltétlenül szükséges mindegyiket felhasználnunk a tervezés további részében, hiszen lehetnek közöttük olyanok, melyek egymás alternatíváinak tekinthetők (és az alkalmazás egyéb szempontjai alapján döntünk az egyik, vagy a másik mellett), és lehetnek olyanok is, amelyek az adott alkalmazás szempontjából érdektelenek. Ezt a redukciót azonban kellő körültekintéssel kell végeznünk, mert információvesztéssel járhat. 3. lépés (A függőségek normalizálása) A normalizálás folyamatában tulajdonképpen egymásután vizsgáljuk a függőségeket, egy adott függőség megítélése során azonban figyelembe kell venni az attribútumaira vonatkozó többi függőséget is (például az éppen vizsgált függőségnek egy másik nem belső függősége-e, stb.) 3.1. lépés (az f dolgozó függőség vizsgálata) 1NF: az f dolgozó 1NF-ben van, mivel nincs benne összetett attribútum, 2NF: az f dolgozó nincs 2NF-ben, mivel az f osztályok1 függőség értelmében az f dolgozó függőség másodlagos (a függőség jobboldalán álló) attribútumainak némelyike nem függ az elsődleges attribútumok (a baloldal) mindegyikétől. Az f osztályok1 függőséget kiemelve az f dolgozó függőségből, kapjuk az f dolgozó1 = { NÉV, OSZTÁLY } { MUNKAKÖR, MUNKAKÖRI_FIZETÉS, JUTALÉK } függőséget, mely már nyilvánvalóan 2NF alakban van. 3NF: az f dolgozó1 nincs 3NF-ben, mivel jobboldalán az f munkakör függőség, mint belső függés található. Ezt kiemelve, kapjuk az f dolgozó2 = { NÉV, OSZTÁLY } { MUNKAKÖR, JUTALÉK } függőséget, mely már 3NF alakban van. BCNF: a BCNF feltétele, hogy a függőség 3NF-ben legyen, továbbá a baloldalának egyetlen valódi részhalmaza se függjön egyetlen elsődleges, vagy másodlagos attribútumtól. Ez utóbbi az f dolgozó2 függőség esetén azért teljesül, mert az attribútumok megadott (vagy feltételezhető) tulajdonságaiból ilyen függések nem következnek. #11_SQL Feladatgyűjtemény (30) - 7 -
8 3.2. lépés (az f osztályok1 függőség vizsgálata) 1NF: az f osztályok1 1NF-ben van, mivel nincs benne összetett attribútum, 2NF: az f osztályok1 2NF-ben is van, mivel a másodlagos attribútumok mindegyike az elsődleges attribútumok mindegyikétől függ (hiszen a baloldalon csak egyetlen attribútum áll). 3NF: az f osztályok1 3NF-ben is van, mivel a másodlagos attribútumok között sem megadott, sem feltételezhető kapcsolat (azaz függőség) nincs. BCNF: mivel az f osztályok1 3NF-ben van, és a baloldalán csak egyetlen attribútum áll, így egyúttal BCNF-ben is van lépés (az f munkakörök függőség vizsgálata) Az f munkakörök függőség már BCNF-ben is van (tehát 1NF-ben, 2NF-ben és 3NF-ben is), mivel a bal- és a jobboldalon is csak egyetlen attribútum áll. 4. lépés (Az eredmény függőségek összefoglalása) Alábbiakban összefoglaljuk a fenti normalizálási folyamat során kapott eredmény függőségeket: f dolgozó2 = { NÉV, OSZTÁLY } { MUNKAKÖR, JUTALÉK } f osztályok1 = { OSZTÁLY } { FŐNÖK, TELEPHELY_CÍME } f munkakörök = { MUNKAKÖR } { MUNKAKÖRI_FIZETÉS } 5. lépés (Az eredmény adatmodell felírása) Az eredmény függőségek alapján az eredmény adatmodell (tehát az eredmény relációsémák, vagyis az adattáblák halmaza), valamint az elsődleges kulcsok és az idegen kulcsok az alábbi módon írhatók fel: dolgozók NÉV, OSZTÁLY, MUNKAKÖR, JUTALÉK, ahol a K dolgozók = { NÉV, OSZTÁLY } attribútum halmaz a dolgozók relációra vonatkozó elsődleges kulcsa, az F osztályok = { OSZTÁLY }, illetve az F munkakörök = { MUNKAKÖR } attribútum halmazok pedig a dolgozók relációnak az osztályok, illetve a munkakörök relációra vonatkozó idegenkulcsai (az elsődleges kulcsattribútumokat aláhúztuk, az idegen kulcsattribútumokat pedig dőlt betüvel jelenítettük meg), osztályok OSZTÁLY, FŐNÖK, TELEPHELY_CÍME, ahol a K osztályok = { OSZTÁLY } attribútum halmaz az osztályok relációra vonatkozó elsődleges kulcsa munkakörök MUNKAKÖR, MUNKAKÖRI_FIZETÉS, ahol a K munkakörök = { MUNKAKÖR } attribútum halmaz a munkakörök relációra vonatkozó elsődleges kulcsa. Ilymódon tehát minden eredmény függőséghez egyértelműen hozzárendeltünk egy relációsémát a függőség attribútumainak összességével. A relációsémákban a szokásoknak megfelően aláhúztuk az elsődleges kulcsok attribútumait. #11_SQL Feladatgyűjtemény (30) - 8 -
9 ADATBÁZIS-ANOMÁLIÁK A fentiekben áttekintettük az adatbázis-tervezés alapvető lépéseit, fogalmait. Az adatbázismodell 2NF, 3NF és BCNF alakra hozása érzékelhető redundancia-csökkenéssel járt (az 1NF még nem!), és ez összhangban volt eredeti célkitűzésünkkel. A Normalizálás alfejezet bevezetőjében azonban utaltunk arra is, hogy a normalizálással bizonyos rendellenes adatbázisműködéseket is ki szeretnénk zárni. Eljött az ideje annak, hogy mintegy a fejezet lezárásaként áttekintsük e rendellenességeket (más szóval anomáliákat), továbbá egyben azt is megvizsgáljuk, hogy az általunk bevezetett eszközök segítségével e rendellenességek kiküszöbölhetőkké váltak-e. Induljunk ki az 1NF alakból, hiszen az olyan relációsémák, melyek nincsenek 1NF alakban (tehát összetett attribútumokat, azaz ismétlődő csoportokat tartalmaznak) eleve alkalmatlanok arra, hogy adattáblákkal reprezentáljuk. Az alábbiak során tekintsük a korábban már bevezetett KATALÓGUS ISBN, KÖNYV_CÍME, TÉMA, KIADÁSI_ÉV, ÁR, KIADÓ, KIADÓ_CÍME, relációsémát, melyről tudjuk, hogy 2NF alakú (tehát 1NF alakú is), de nem 3NF alakú, és így nem BCNF alakú. Módosítási anomália Módosítási anomáliának nevezzük azt a jelenséget, amikor az adatbázis valamely adatának a megváltoztatása során történő hiba az adatbázis konzisztenciáját (azaz ellentmondásmentességét) veszélyezteti. Tegyük fel, hogy valamelyik kiadó elköltözik, tehát módosítani szeretnénk e kiadó címét. Ha az adatbázisunk modellje a fenti katalógus relációséma, akkor már önmagában kellemetlen, hogy ezt mindazon rekordon el kell végezni, amelyben az adott kiadó szerepelt (ezt a redundancia okozza). Az viszont már az adatbázis konzisztenciáját veszélyezteti, ha ez a módosítási folyamat bármilyen okból (például egy áramkimaradás, vagy rendszerösszeomlás miatt) megszakad, ugyanis így egyszerre szerepelhet az adatbázisban a régi és az új cím. Abban az esetben pedig, ha ez a módosítás nem egy megfelelő SQL utasítással, hanem kézzel (tehát közvetlen adatátírással) történik, akkor még az is előfordulhat, hogy tévesztés miatt különböző címadatok kerülnek az adatbázisba. Könnyen belátható, hogy a redundancia, vagyis a részleges függések, illetve a tranzitív függések megszüntetésével, tehát az adatbázis BCNF alakjában a módosítási anomália veszélye elhárul. Feltehető ezekután a kérdés, hogy egy BCNF alakú adatbázisban a módosítás nem okozhat-e hibát? Természetesen okozhat! Hibás adatot bármikor be lehet vinni egy adatbázisba, ez ellen nincs védelem. Ám egy irredundáns adatbázisban ez nem okoz inkonzisztenciát, ilymódon ha észrevesszük a hibát, könnyen ki tudjuk javítani. Nem az a végzetes baj tehát, ha például egy kiadó címét rosszul írjuk (csak észrevesszük előbb-utóbb), hanem az, ha ez a cím különbözőképpen szerepel. Ezt kijavítani egy nagy adatbázisban (mely erre az adatra nézve nem irredundáns) szinte lehetetlen. Az [1] könyv II. részének 7. fejezetéből átvéve #11_SQL Feladatgyűjtemény (30) - 9 -
10 Törlési anomália Törlési anomália fordul elő olyankor, amikor valamely fölöslegesnek, vagy hibásnak minősült adat törlése során információvesztés történik. Gondoljunk ismét a fenti katalógus relációsémára. Tegyük fel, hogy a könyvesboltból (melynek ez a katalógusa) kifogy egy olyan könyv, melynek kiadója csak ezzel a könyvvel szerepelt a kínálatban. Nagy baj ez, mivel az által, hogy kitöröltük a könyvet a katalógusból, kitöröltük a kiadójának adatait is, úgyhogy most már rendelni sem tudunk belőle. Mi is okozta ezt a rendellenességet? Láthatóan az, hogy a kiadó adatait együtt tároltuk a könyv adataival. A könyv és a kiadója két különböző objektum, melyek mindegyike fontos az adatbázisban, tehát különböző relációban (külön adattáblában) kell tárolni őket. A külön történő tárolás egy belső függést számolt fel, tehát ennek az anomáliának az elhárításához az adatbázis 3NF alakja szükséges. Bővítési anomália Bővítési anomália következik be olyankor, amikor valamely adat bevitele azért bizonyul lehetetlennek, mert rá vonatkozóan nincs kulcs. Tegyük fel, hogy fenti katalógus relációsémát alkalmazó könyvesbolt vezetője együttműködési szerződést ír alá valamelyik kiadóval. Ezt követően szeretné beírni az adatbázisba ennek a kiadónak az adatait, hogy majd rendelni tudjanak tőlük (tegyük fel, hogy ehhez az adatbázishoz kapcsolódik egy rendeléskezelő program is). Az előbbihez hasonló problémával kell szembenéznie, csak most nem elveszik a cím, hanem már be se tudja írni. Ennek az az oka, hogy a katalógus relációsémájú adatbázis objektumai könyvek, melyeknek az ISBN számuk a kulcsadatuk, így enélkül nem lehet adatot bevinni. Márpedig az új kiadó adataihoz nem rendelhető ISBN szám. A problémát ezúttal is az okozza, hogy egy rekordban két különböző objektum adatait tároljuk, de a rekord kulcsa csak az egyik objektumnak kulcsa. Miután a kiadó független e kulcstól, így az adataival önmagában nem lehet elvégezni a bővítést. A belsőfüggések felszámolása, külön relációséma megalkotása, vagyis az adatbázis 3NF alakra hozása nyilvánvalóan ezt a problémát is megoldja. IRODALOM [1] Kende M. Kotsis D. Nagy I.: Adatbázis-kezelés az Oracle-rendszerben, Panem, További ajánlott irodalom az adatbázis-tervezéshez Halassy Béla: Az adatbázis-tervezés alapjai és titkai, IDG, Ullman, J. D., Widom J.: Adatbázis-rendszerek - Alapvetés, Panem, Ensor, D., Stevenson I.: Oracle-tervezés, Kossuth, Halassy Béla: Adatmodellezés, Nemzeti tankönyvkiadó, Békéssy András, Demetrovics János: Adatbázis-szerkezetek, Akadémiai Kiadó, #11_SQL Feladatgyűjtemény (30)
11 1. Foglalkozás Az SQL használatának alapjai, Egyszerű lekérdezések Részletesebben lásd [2]: 3. melléklet, 1. fejezet, "00-2_Bevezetés az SQL-Plus-ba (Példatár).pdf" file FELADATGYŰJTEMÉNY 1.1. Feladat Írassa ki azon dolgozók munkakörét és fizetését, akiknek fizetése nincs az USD tartományban. A lista fejléce legyen Név, Munkakör, Fizetés, rendezzen a dolgozók neve szerint Feladat Írassa ki a salesman és a clerk munkakörű azon dolgozók nevét, munkakörét és jövedelmét, akiknek jövedelme nincs az USD tartományban. A lista fejléce legyen Név, Munkakör, Jövedelem. TOVÁBBI FELADATOK T1.3. Feladat Írassa ki azon dolgozók nevét, munkakörét, fizetését, jutalékát, részleg-azonosítóját, akik 1000 USD-nél többet keresnek, továbbá március 1. és szeptember 30. között léptek be a vállalathoz. T1.4. Feladat Írja ki azon dolgozók nevét, foglalkozását, fizetését és belépési dátumát, akik 1981-ben léptek be a vállalathoz. A lista legyen belépési dátum szerint rendezve. T1.5. Feladat Írassa ki azon alkalmazottak azonosítóját, nevét, foglalkozását, fizetését és jutalékát, akiknek jutaléka meghaladja a fizetésük 70 %-át. T1.6. Feladat Készítsen listát az összes alkalmazottról úgy, hogy a lista fejléce: Azonosító, Belépési dátum, Név, Foglalkozás, Jutalék, továbbá a Jutalék oszlopban azoknál, akik nem kapnak jutalékot, az a szöveg jelenjen meg, hogy nincs jutalék. T1.7. Feladat Belépési dátum szerint (év.hónap.nap.) listázza a salesman foglalkozású dolgozók azonosítóját, nevét, foglalkozását, hathavi fizetését és hathavi jövedelmét. T1.8. Feladat Listázza azon dolgozók nevét jövedelmét és részlegét, akiknek nevében az "R", vagy az "A" betű szerepel, és jövedelmük (fizetés+jutalék) 1000 és 2500 USD között van. A lista legyen rendezett a részleg szerint, azon belül pedig a foglalkozás szerint. T1.9. Feladat Listázza 1981-től dolgozók nevét, munkakörét, jövedelmét és belépési évszámát elsődlegesen a belépési évszám szerint, másodlagosan a dolgozók neve szerint rendezve. #11_SQL Feladatgyűjtemény (30)
12 T1.10. Feladat A részlegazonosító szerint csoportosítva listázza azokat a dolgozókat, akiknek fizetése 2000 és 5500 USD közötti érték. A keletkezett lista elsődlegesen a részlegazonosító szerint növekvően, másodlagosan pedig a fizetés szerint csökkenően legyen rendezve. T1.11. Feladat Írassa ki minden jutalékkal rendelkező alkalmazott nevét, jutalékát, főnökének azonosítóját. A lista legyen a főnök azonosítója és az alkalmazottak neve szerint rendezett. #11_SQL Feladatgyűjtemény (30)
13 MEGOLDÁSGYŰJTEMÉNY 1.1. Feladat Írassa ki azon dolgozók munkakörét és fizetését, akiknek fizetése nincs az USD tartományban. A lista fejléce legyen Név, Munkakör, Fizetés, rendezzen a dolgozók neve szerint. Megoldás SELECT ename AS "Név", job AS "Munkakör", sal AS "Fizetés" WHERE NOT sal BETWEEN 1500 AND 2500 ORDER BY "Név"; Eredmény Név Munkakör Fizetés ADAMS CLERK 1100 BLAKE MANAGER 2850 FORD ANALYST 3000 JAMES CLERK 950 JONES MANAGER 2975 KING PRESIDENT 5000 MARTIN SALESMAN 1250 MILLER CLERK 1300 SCOTT ANALYST 3000 SMITH CLERK 800 WARD SALESMAN sor kijelölve Feladat Írassa ki a salesman és a clerk munkakörű azon dolgozók nevét, munkakörét és jövedelmét, akiknek jövedelme nincs az USD tartományban. A lista fejléce legyen Név, Munkakör, Jövedelem. Megoldás SELECT ename AS "Név", job AS "Munkakör", sal + NVL(comm,0) AS "Jövedelem" WHERE UPPER(job) IN ( SALESMAN, CLERK ) AND NOT sal + NVL(comm,0) BETWEEN 1500 AND 2500 ORDER BY "Név"; Eredmény Név Munkakör Jövedelem ADAMS CLERK 1100 JAMES CLERK 950 MARTIN SALESMAN 2650 MILLER CLERK 1300 SMITH CLERK sor kijelölve. #11_SQL Feladatgyűjtemény (30)
14 2. Foglalkozás Egytáblás csoportosító lekérdezések Részletesebben lásd [2]: 2. fejezet FELADATGYŰJTEMÉNY 2.1. Feladat Listázza 1981-től éves csoportosításban a dolgozók nevét, munkakörét és jövedelmét a dolgozók neve szerint rendezve Feladat Listázza ki a dolgozók nevét, a belépésük dátumát, valamint azt, hogy a hónap. illetve a hét hányadik napján léptek be (például péntek a hét 5. napja) Feladat Listázza 1981-től belépési évenként a legkisebb jövedelmeket Feladat Listázza részlegenként és munkakörönként a legalább 1000 USD-os átlagjövedelmeket Feladat Listázza főnökönként a beosztottak összjövedelmét Feladat Írassa ki az első hat 1000 USD-os fizetésosztályban (0-999, , stb.) dolgozók számát valamilyen célszerű rendezésben Feladat Írassa ki évenként a belépett dolgozók számát. TOVÁBBI FELADATOK T2.8. Feladat Írassa ki munkakörönként a legkisebb és a legnagyobb fizetéseket valamilyen célszerű rendezésben. T2.9. Feladat Írassa ki a hét páros és páratlan sorszámú napjain belépett dolgozók átlagfizetését és átlagjövedelmét, a paritási csoportokban csökkenő átlagjövedelem szerint rendezve. T2.10. Feladat Írassa ki a hónap páros és páratlan sorszámú napjain belépett dolgozók átlagfizetését és átlagjövedelmét, a paritási csoportokban csökkenő átlagjövedelem szerint rendezve. T2.11. Feladat Írassa ki alfabetikus sorrendben az azonos betűvel kezdődő nevű dolgozók számát. #11_SQL Feladatgyűjtemény (30)
15 MEGOLDÁSGYŰJTEMÉNY 2.1. Feladat Listázza 1981-től éves csoportosításban a dolgozók nevét, munkakörét és jövedelmét a dolgozók neve szerint rendezve. 1. Megoldás SELECT TO_NUMBER(TO_CHAR(hiredate,'YYYY')) AS "Belépési év", ename AS "Dolgozó Neve", job AS "Munkaköre", sal + NVL(comm,0) AS "Jövedelem" WHERE TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY "Belépési év", "Dolgozó Neve"; Eredmény Belépési év Dolgozó Ne Munkaköre Jövedelem ALLEN SALESMAN BLAKE MANAGER CLARK MANAGER FORD ANALYST JAMES CLERK JONES MANAGER KING PRESIDENT MARTIN SALESMAN TURNER SALESMAN WARD SALESMAN MILLER CLERK ADAMS CLERK SCOTT ANALYST sor kijelölve. Megjegyzés 1. A Smith maradt ki, ő 1980-ban lépett be. 2. Miben fog különbözni a fenti utasítás listája, ha nem alkalmazzuk a TO_NUMBER függvényt? 2. Megoldás (EXTRACT függvénnyel) SELECT EXTRACT(YEAR FROM hiredate) AS "Belépési év", ename AS "Dolgozó Neve", job AS "Munkaköre", sal + NVL(comm,0) AS "Jövedelem" WHERE TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY "Belépési év", "Dolgozó Neve"; Eredmény Belépési év Dolgozó Ne Munkaköre Jövedelem ALLEN SALESMAN BLAKE MANAGER CLARK MANAGER FORD ANALYST JAMES CLERK JONES MANAGER KING PRESIDENT 5000 #11_SQL Feladatgyűjtemény (30)
16 1981 MARTIN SALESMAN TURNER SALESMAN WARD SALESMAN MILLER CLERK ADAMS CLERK SCOTT ANALYST sor kijelölve. Megjegyzés Az EXTRACT függvény használata Az EXTRACT SQL függvény visszaadja a paraméterében a FROM után megadott dátumkifejezés YEAR, MONTH, DAY, HOUR, MINUTE, illetve SECOND numerikus típusú értékét. Példa SELECT ename AS "Név", hiredate AS "Dátum", EXTRACT(YEAR FROM hiredate) AS "BeÉv", EXTRACT(MONTH FROM hiredate) AS "BeHónap", EXTRACT(DAY FROM hiredate) AS "BeNap" ; Eredmény Név Dátum BeÉv BeHónap BeNap SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER sor kijelölve Feladat Listázza ki a dolgozók nevét, a belépésük dátumát, valamint azt, hogy a hónap. illetve a hét hányadik napján léptek be (például péntek a hét 5. napja). Megoldás SELECT ename AS "DolgozóNév", hiredate AS "Dátum", EXTRACT(DAY FROM hiredate) AS "Nap a hónapban", TO_CHAR(hiredate, DAY ) AS "Nap neve", TO_NUMBER(TO_CHAR(hiredate, D )) AS "Nap a héten" ORDER BY "DolgozóNév"; Eredmény DolgozóNév Dátum Nap a hónapban Nap neve Nap a héten ADAMS SZOMBAT 6 ALLEN PÉNTEK 5 BLAKE PÉNTEK 5 CLARK KEDD 2 #11_SQL Feladatgyűjtemény (30)
17 FORD CSÜTÖRTÖK 4 JAMES CSÜTÖRTÖK 4 JONES CSÜTÖRTÖK 4 KING KEDD 2 MARTIN HÉTFŐ 1 MILLER SZOMBAT 6 SCOTT VASÁRNAP 7 SMITH SZERDA 3 TURNER KEDD 2 WARD VASÁRNAP 7 14 sor kijelölve Feladat Listázza 1981-től belépési évenként a legkisebb jövedelmeket. 1. Megoldás (Előszűréssel) SELECT TO_CHAR(hiredate,'YYYY') AS "Belépés", MIN(sal+NVL(comm,0)) AS "MinJöv" WHERE TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 GROUP BY TO_CHAR(hiredate,'YYYY') ORDER BY "Belépés"; Eredmény Belé MinJöv sor kijelölve. Megjegyzés Mi történik, ha a TO_CHAR függvény elé egyik, vagy mindkét helyre betesszük a TO_NUMBER függvényt? 2. Megoldás (Csoportszűréssel) SELECT TO_CHAR(hiredate,'YYYY') AS "Belépés", MIN(sal+NVL(comm,0)) AS "MinJöv" GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY "Belépés"; Eredmény Belé MinJöv sor kijelölve. Megjegyzés Láthatjuk a két megoldás azonos eredményt adott, de vajon melyik a hatékonyabb? 3. Megoldás (Csoportszűréssel és formázott kiíratással) COLUMN "Belépés" FORMAT A7 SELECT TO_CHAR(hiredate,'YYYY') AS "Belépés", MIN(sal+NVL(comm,0)) AS "MinJöv" #11_SQL Feladatgyűjtemény (30)
18 GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY "Belépés"; CLEAR COLUMNS Eredmény Belépés MinJöv sor kijelölve. columns törölve Megjegyzés A formázott kiíratásokkal a későbbiekben fogunk részletesebben foglalkozni Feladat Listázza részlegenként és munkakörönként a legalább 1000 USD-os átlagjövedelmeket. Megoldás SELECT deptno AS "Részleg", job AS "Munkakör", AVG(sal + NVL(comm,0)) AS "ÁtlagJövedelem" GROUP BY deptno, job HAVING AVG(sal + NVL(comm,0)) >= 1000 ORDER BY deptno ASC, job ASC, "ÁtlagJövedelem" DESC; Eredmény Részleg Munkakör ÁtlagJövedelem CLERK MANAGER PRESIDENT ANALYST MANAGER MANAGER SALESMAN sor kijelölve Feladat Listázza főnökönként a beosztottak összjövedelmét. 1. Megoldás SELECT mgr AS "Főnök", SUM(sal + NVL(comm,0)) AS "ÖsszJövedelem" GROUP BY mgr ORDER BY mgr ASC, "ÖsszJövedelem" DESC; Eredmény Főnök ÖsszJövedelem #11_SQL Feladatgyűjtemény (30)
19 sor kijelölve. 2. Megoldás (CASE szerkezettel és formázott kiíratással) COLUMN "Főnök" FORMAT A12 SELECT CASE WHEN mgr IS NULL THEN 'Nincs Főnök' ELSE TO_CHAR(mgr) END AS "Főnök", SUM(sal + NVL(comm,0)) AS "ÖsszJövedelem" GROUP BY mgr ORDER BY mgr ASC, "ÖsszJövedelem" DESC; CLEAR COLUMNS Eredmény Főnök ÖsszJövedelem Nincs Főnök sor kijelölve. columns törölve 3. Megoldás (Az NVL2 függvénnyel és formázott kiíratással) COLUMN "FőnökKód" FORMAT A12 SELECT NVL2(TO_CHAR(mgr),TO_CHAR(mgr),'Nincs Főnök') AS "FőnökKód", SUM(sal + NVL(comm,0)) AS "ÖsszJövedelem" GROUP BY mgr ORDER BY mgr ASC, "ÖsszJövedelem" DESC; CLEAR COLUMNS Eredmény FőnökKód ÖsszJövedelem Nincs Főnök sor kijelölve. columns törölve 2.6. Feladat Írassa ki az első hat 1000 USD-os fizetésosztályban (0-999, , stb.) dolgozók számát valamilyen célszerű rendezésben. Megoldás COLUMN "Fizetés Kategória" FORMAT A17 SELECT CASE WHEN TRUNC(sal/1000) = 0 THEN ' 0-999' WHEN TRUNC(sal/1000) = 1 THEN ' ' WHEN TRUNC(sal/1000) = 2 THEN ' ' #11_SQL Feladatgyűjtemény (30)
20 WHEN TRUNC(sal/1000) = 3 THEN ' ' WHEN TRUNC(sal/1000) = 4 THEN ' ' WHEN TRUNC(sal/1000) = 5 THEN ' ' ELSE 'nincs tovább!' END AS "Fizetés Kategória", COUNT(*) AS "Létszám" GROUP BY TRUNC(sal / 1000) ORDER BY "Fizetés Kategória" DESC; CLEAR COLUMNS Eredmény Fizetés Kategória Létszám sor kijelölve. columns törölve Megjegyzés A TRUNC függvény használata szám esetén szintaktika: TRUNC(n [, m]) ahol n, illetve m egész számok megadják az eredményben engedélyezett egész, illetve tizedesjegyek számát. A függvény által visszadott érték egész szám, illetve adott számú tizedesjegyet tartalmazó törtszám típusú. m1. Példa SQL> SELECT TRUNC(600/1000) 2 FROM dual; TRUNC(600/1000) m2. Példa SQL> SELECT TRUNC(3600/1000) 2 FROM dual; TRUNC(3600/1000) m3. Példa SQL> SELECT TRUNC(3600/1000, 1) 2 FROM dual; TRUNC(3600/1000,1) ,6 #11_SQL Feladatgyűjtemény (30)
21 2.7. Feladat Írassa ki évenként a belépett dolgozók számát. 1. Megoldás COLUMN "Belépési év" FORMAT A11 SELECT SUBSTR(TRUNC(hiredate,'YYYY'),1,4) AS "Belépési év", COUNT(*) AS "Létszám" GROUP BY TRUNC(hiredate, 'YYYY') ORDER BY "Belépési év"; CLEAR COLUMNS 2. Megoldás COLUMN "Belépési év" FORMAT A11 SELECT TO_CHAR(hiredate,'YYYY') AS "Belépési év", COUNT(*) AS "Létszám" GROUP BY TO_CHAR(hiredate,'YYYY') ORDER BY "Belépési év"; CLEAR COLUMNS Eredmény Belépési év Létszám sor kijelölve. columns törölve Megjegyzés A TRUNC függvény használata dátum esetén szintaktika: TRUNC(n, mask) ahol mask a TO_CHAR függvényben használható formátummaszk, és a visszadott érték dátum típusú. m1. Példa SQL> SELECT sysdate, 2 TRUNC(sysdate,'YYYY') 3 FROM dual; SYSDATE TRUNC(SYSD m2. Példa SQL> SELECT sysdate, 2 TRUNC(sysdate,'MM') 3 FROM dual; SYSDATE TRUNC(SYSD m3. Példa SQL> SELECT emp.*, 2 TRUNC(hiredate,'YYYY') AS "Belépés" 3 #11_SQL Feladatgyűjtemény (30)
22 4 WHERE TRUNC(hiredate,'YYYY') >= 5 TO_DATE(' ','YYYY-MM-DD'); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO Belépés KING PRESIDENT BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SCOTT ANALYST ADAMS CLERK MILLER CLERK sor kijelölve. Megjegyzés az m3.példához A Smith maradt ki, ő 1980-ban lépett be (lásd 2.1. Feladat). #11_SQL Feladatgyűjtemény (30)
23 3. Foglalkozás Többtáblás lekérdezések, allekérdezések Részletesebben lásd [2]: 3. fejezet FELADATGYŰJTEMÉNY 3.1. Feladat Listázza dolgozónként a fizetés és a legnagyobb fizetés közötti különbséget Feladat Listázza 1981-től éves csoportosításban a dolgozók nevét, munkakörét, főnökének nevét és a dolgozó belépési évszámát a dolgozók neve szerint rendezve. (Lásd a 2.1. feladat) 3.3. Feladat Listázza 1981-től belépési évenként a legkisebb fizetésű dolgozók nevét, munkakörét és fizetését a belépés éve szerint csökkenően rendezve. (Lásd a 2.3. feladat) 3.4. Feladat Listázza 1981-től belépési évenként a legnagyobb fizetésű nem-főnök dolgozók adatait, az évek szerint növekvően rendezve. TOVÁBBI FELADATOK T3.5. Feladat Listázza ki munkakörönként a legkisebb fizetésű dolgozók nevét, fizetését, főnökének nevét és főnökének fizetését. T3.6. Feladat Listázza ki a páros és a páratlan sorszámú napokon belépett dolgozók nevét, munkakörét, valamint azt, hogy páros, vagy páratlan napon lépett-e be. T3.7. Feladat Listázza ki növekvő módon rendezve az azonos betűvel kezdődő nevű dolgozók nevét, valamint a nevük mellett megadva azt, hogy csoportjukban hányan vannak. #11_SQL Feladatgyűjtemény (30)
24 MEGOLDÁSGYŰJTEMÉNY 3.1. Feladat Listázza dolgozónként a fizetést, valamint a fizetés és a legnagyobb fizetés közötti különbséget. 1. Megoldás (Allekérdezés a szelekciós listában) SELECT ename AS "Név", sal AS "Fizetés", sal (SELECT MAX(sal) ) AS "Defektus" ORDER BY "Név"; 2. Megoldás (Allekérdezés a FROM utasításrészben In-Line nézet) SELECT ename AS "Név", sal AS "Fizetés", sal x.maxfiz AS "Defektus", (SELECT MAX(sal) AS MaxFiz ) x ORDER BY "Név"; 3. Megoldás (Allekérdezés a WHERE utasításrészben megoldás a MAX függvény nélkül) SELECT a.ename AS "Név", a.sal AS "Fizetés", a.sal b.sal AS "Defektus" a, emp b WHERE b.sal >= ALL (SELECT sal ) ORDER BY "Név"; Eredmény (Mindhárom megoldás esetén) Név Fizetés Defektus ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD sor kijelölve. #11_SQL Feladatgyűjtemény (30)
25 3.2. Feladat Listázza 1981-től éves csoportosításban a dolgozók nevét, munkakörét, főnökének nevét és a dolgozó belépési évszámát a dolgozók neve szerint rendezve. (Lásd a 2.1. feladat) 1. Megoldás SELECT RPAD(d.ename,12) AS "Dolgozó Neve", d.job AS "Munkaköre", RPAD(TO_CHAR(d.hiredate,'YYYY'),12) AS "Belépési éve", RPAD(f.ename,8) AS "Főnöke" d, emp f WHERE d.mgr = f.empno(+) AND TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) >= 1981 ORDER BY "Belépési éve", "Dolgozó Neve"; Eredmény Dolgozó Neve Munkaköre Belépési éve Főnöke ALLEN SALESMAN 1981 BLAKE BLAKE MANAGER 1981 KING CLARK MANAGER 1981 KING FORD ANALYST 1981 JONES JAMES CLERK 1981 BLAKE JONES MANAGER 1981 KING KING PRESIDENT 1981 MARTIN SALESMAN 1981 BLAKE TURNER SALESMAN 1981 BLAKE WARD SALESMAN 1981 BLAKE MILLER CLERK 1982 CLARK ADAMS CLERK 1987 SCOTT SCOTT ANALYST 1987 JONES 13 sor kijelölve. 2. Megoldás (CASE szerkezettel) SELECT RPAD(d.ename,12) AS "Dolgozó Neve", d.job AS "Munkaköre", RPAD(TO_CHAR(d.hiredate,'YYYY'),12) AS "Belépési éve", CASE WHEN f.ename IS NULL THEN 'Nincs Főnöke' ELSE RPAD(f.ename,8) END AS "Főnöke" d, emp f WHERE d.mgr = f.empno(+) AND TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) >= 1981 ORDER BY "Belépési éve", "Dolgozó Neve"; 3. Megoldás (EXTRACT és NVL2 függvényekkel) SELECT RPAD(d.ename,12) AS "Dolgozó Neve", d.job AS "Munkaköre", RPAD(EXTRACT(YEAR FROM d.hiredate),12) AS "Belépési éve", NVL2(f.ename,f.ename,'Nincs Főnöke') AS "Főnöke" d, emp f WHERE d.mgr = f.empno(+) AND EXTRACT(YEAR FROM d.hiredate) >= 1981 ORDER BY "Belépési éve", "Dolgozó Neve"; Eredmény (2. és 3. megoldás esetén) Dolgozó Neve Munkaköre Belépési éve Főnöke ALLEN SALESMAN 1981 BLAKE BLAKE MANAGER 1981 KING CLARK MANAGER 1981 KING #11_SQL Feladatgyűjtemény (30)
26 FORD ANALYST 1981 JONES JAMES CLERK 1981 BLAKE JONES MANAGER 1981 KING KING PRESIDENT 1981 Nincs Főnöke MARTIN SALESMAN 1981 BLAKE TURNER SALESMAN 1981 BLAKE WARD SALESMAN 1981 BLAKE MILLER CLERK 1982 CLARK ADAMS CLERK 1987 SCOTT SCOTT ANALYST 1987 JONES 13 sor kijelölve. Megjegyzés Az NVL2 függvény használata Az NVL2 SQL függvény az első paraméterének nem-null értéke esetén visszaadja a második paraméterben szereplő kifejezés értékét, míg NULL értéke esetén a harmadik paraméterben szereplő kifejezés értékét. (Lásd a fenti példa.) 3.3. Feladat Listázza 1981-től belépési évenként a legkisebb fizetésű dolgozók nevét, munkakörét és fizetését a belépés éve szerint csökkenően rendezve. (Lásd a 2.3. feladat) 1. Megoldás COLUMN "Belépés" Format A8 SELECT TO_CHAR(hiredate,'YYYY') AS "Belépés", ename AS "Név", job AS "Munkakör", sal AS "MinFiz", (SELECT TO_CHAR(hiredate,'YYYY') AS Belépés, MIN(sal) AS MinFiz WHERE TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 GROUP BY TO_CHAR(hiredate,'YYYY')) WHERE TO_CHAR(hiredate,'YYYY') = Belépés AND sal = MinFiz ORDER BY "Belépés" DESC; CLEAR COLUMNS 2. Megoldás (TRUNC függvénnyel, Komáromi Zoltán megoldása) COLUMN "Belépés" Format A8 SELECT TO_CHAR(hiredate,'YYYY') AS "Belépés", ename AS "Név", job AS "Munkakör", sal AS "MinFiz", (SELECT TRUNC(hiredate,'YYYY') AS Belépés, MIN(sal) AS MinFiz WHERE TRUNC(hiredate,'YYYY') >= TO_DATE(' ','YYYY-MM-DD') GROUP BY TRUNC(hiredate,'YYYY')) WHERE TRUNC(hiredate,'YYYY') = Belépés AND sal = MinFiz ORDER BY "Belépés" DESC; CLEAR COLUMNS 3. Megoldás (Analitikus függvénnyel, Kubatovics Ferenc megoldása) COLUMN "Belépés" Format A8 SELECT TO_CHAR(hiredate,'YYYY') AS "Belépés", ename AS "Név", job AS "Munkakör", #11_SQL Feladatgyűjtemény (30)
27 sal AS "MinFiz" FROM (SELECT emp.*, RANK() OVER (PARTITION BY TO_CHAR(hiredate, 'YYYY') ORDER BY sal) AS Sorszám WHERE hiredate >= TO_DATE(' ', 'YYYY-MM-DD')) WHERE Sorszám = 1 ORDER BY "Belépés" DESC; CLEAR COLUMNS Eredmény Belépés Név Munkakör MinFiz ADAMS CLERK MILLER CLERK JAMES CLERK 950 columns törölve Megjegyzés 1. A fenti megoldások akkor is jól működnének, ha valamelyik évben több legkisebb fizetésű dolgozó is volna. 2. A 3. megoldás olyan eszközt használ, mely nem része az e foglalkozáshoz tartozó tananyagnak (értelmezéséhez lásd [2]: 1.rész, 13.fejezet) Feladat Listázza 1981-től belépési évenként a legnagyobb fizetésű nem-főnök dolgozók adatait, az évek szerint növekvően rendezve. 1. Megoldás 1.1. lépés A nem-főnök dolgozók listája (fontos a NULL-érték kezelése): SELECT empno AS azon, ename AS nev WHERE empno NOT IN (SELECT mgr WHERE mgr IS NOT NULL); Másként (egyszerűbben): SELECT empno as azon, ename as nev WHERE empno NOT IN (SELECT NVL(mgr,0) ); Eredmény AZON NEV TURNER 7521 WARD 7654 MARTIN 7499 ALLEN 7934 MILLER 7369 SMITH 7876 ADAMS 7900 JAMES #11_SQL Feladatgyűjtemény (30)
28 8 sor kijelölve lépés A nem-főnök dolgozók legnagyobb évenkénti fizetése az évek szerint növekvően rendezve től: SELECT MAX(sal) AS MaxFiz, TO_CHAR(hiredate,'YYYY') AS Év WHERE empno NOT IN (SELECT mgr WHERE mgr IS NOT NULL) GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY Év; Eredmény MAXFIZ ÉV Megjegyzés A HAVING utasításrészben azért volt szükség a TO_NUMBER fügvény használatára, mert számokat nem illik karakteresen összehasonlítani! 1.3. lépés Az előző lépésben megkapott adatokhoz illeszkedő dolgozók meghatározása: SET numwidth 5 SELECT *, (SELECT MAX(sal) AS MaxFiz, TO_CHAR(hiredate,'YYYY') AS Év WHERE empno NOT IN (SELECT mgr WHERE mgr IS NOT NULL) GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981) nemfőnök WHERE TO_CHAR(hiredate,'YYYY') = nemfőnök.év AND sal = nemfőnök.maxfiz ORDER BY év; SET numwidth 10 Eredmény EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO MAXFIZ ÉV ALLEN SALESMAN MILLER CLERK ADAMS CLERK Megoldás (Halmazkivonással) 2.1. lépés A nem-főnök dolgozók listája: SELECT empno MINUS SELECT mgr ; #11_SQL Feladatgyűjtemény (30)
29 Eredmény EMPNO sor kijelölve lépés A nem-főnök dolgozók adatai: SET numwidth 5 SELECT emp.*, (SELECT empno MINUS SELECT mgr ) al WHERE emp.empno = al.empno; SET numwidth 10 Eredmény EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SMITH CLERK ALLEN SALESMAN WARD SALESMAN MARTIN SALESMAN TURNER SALESMAN ADAMS CLERK JAMES CLERK MILLER CLERK sor kijelölve lépés A legnagyobb évenkénti fizetések az évek szerint növekvően rendezve 1981-től: SELECT MAX(sal) AS MaxFiz, TO_CHAR(hiredate,'YYYY') AS Év GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY Év; Eredmény MAXFIZ ÉV #11_SQL Feladatgyűjtemény (30)
30 2.4. lépés A nem-főnök dolgozók legnagyobb évenkénti fizetése az évek szerint növekvően rendezve től (vagyis a 3. lépésben meghatározott listához a 2. lista szerinti alaphalmaz illesztése): SELECT MAX(sal) AS MaxFiz, TO_CHAR(hiredate,'YYYY') AS Év FROM (SELECT sal, hiredate, (SELECT empno MINUS SELECT mgr ) al WHERE emp.empno = al.empno) GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981 ORDER BY Év; Eredmény MAXFIZ ÉV lépés Az előző lépésben megkapott adatokhoz illeszkedő dolgozók meghatározása: SET numwidth 5 SELECT *, (SELECT MAX(sal) AS MaxFiz, TO_CHAR(hiredate,'YYYY') AS Év FROM (SELECT sal, hiredate, (SELECT empno MINUS SELECT mgr ) al WHERE emp.empno = al.empno) GROUP BY TO_CHAR(hiredate,'YYYY') HAVING TO_NUMBER(TO_CHAR(hiredate,'YYYY')) >= 1981) nemfőnök WHERE TO_CHAR(hiredate,'YYYY') = nemfőnök.év AND sal = nemfőnök.maxfiz ORDER BY Év; SET numwidth 10 Eredmény EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO MAXFIZ ÉV ALLEN SALESMAN MILLER CLERK ADAMS CLERK Megjegyzés 1. A fenti megoldások akkor is jól működnének, ha valamelyik évben több legnagyobb fizetésű nem-főnök dolgozó is volna. 2. A 2. megoldás nem csupán logikájában nehézkesebb az 1. megoldásnál, de kevésbé is hatékony a halmazkivonás rosszabb megvalósíthatósága miatt. #11_SQL Feladatgyűjtemény (30)
31 4. Foglalkozás Interaktív környezet Részletesebben lásd [2]: 4. fejezet FELADATGYŰJTEMÉNY 4.1. Feladat Listázza a felhasználó által megadott dolgozó esetén a fizetése és a legnagyobb fizetés közötti különbséget. (Lásd a 3.1. feladat) 4.2. Feladat Listázza formázott módon a felhasználó által megadott évtől éves csoportosításban a dolgozók nevét, munkakörét, főnökének nevét és a dolgozó belépési évszámát a dolgozók neve szerint rendezve. (Lásd a 3.2. feladat) TOVÁBBI FELADATOK T4.3. Feladat Listázza a felhasználó által megadott évtől belépési évenként a legkisebb fizetésű dolgozók nevét, munkakörét és fizetését a belépés éve szerint csökkenően rendezve. (Lásd a 3.3. feladat) T4.4. Feladat Listázza formázott módon a felhasználó által megadott évtől belépési évenként a legnagyobb fizetésű nem-főnök dolgozók adatait, az évek szerint növekvően rendezve. (Lásd a 3.4. feladat) T4.5. Feladat Listázza ki a felhasználó által megadott telephelyű részleg, felhasználó által megadott munkakörű dolgozóinak nevét, fizetését, főnökének nevét és főnökének fizetését. (Lásd a T3.5. feladat) #11_SQL Feladatgyűjtemény (30)
32 MEGOLDÁSGYŰJTEMÉNY 4.1. Feladat Listázza a felhasználó által megadott dolgozó esetén a fizetése és a legnagyobb fizetés közötti különbséget. (Lásd a 3.1. feladat) Megoldás ACCEPT Név CHAR FORMAT A8 PROMPT 'A dolgozó neve: ' SELECT ename AS "Név", sal AS "Fizetés", sal - x.maxfiz AS "Defektus", (SELECT MAX(sal) AS MaxFiz ) x WHERE UPPER(ename) = UPPER('&Név'); Eredmény A dolgozó neve: smithsmithsmith SP2-0598: "smithsmithsmith" ütközik a(z) "A8" input formátummal A dolgozó neve: smith régi 7: WHERE UPPER(ename) = UPPER('&Név') új 7: WHERE UPPER(ename) = UPPER('smith') Név Fizetés Defektus SMITH sor kijelölve. Megjegyzés Az adatbekérések csak program file-ból adhatók ki (pl. abc.sql), parancssorból már nem Feladat Listázza formázott módon a felhasználó által megadott évtől éves csoportosításban a dolgozók nevét, munkakörét, főnökének nevét és a dolgozó belépési évszámát a dolgozók neve szerint rendezve. (Lásd a 3.2. feladat) Megoldás 1. Lépés (Formázatlan listázás) ACCEPT Év NUMBER PROMPT 'Kezdő év: ' SELECT RPAD(d.ename,12) AS "Dolgozó Neve", d.job AS "Munkaköre", RPAD(TO_CHAR(d.hiredate,'YYYY'),12) AS "Belépési éve", NVL2(f.ename,f.ename,'Nincs Főnöke') AS "Főnöke" d, emp f WHERE d.mgr = f.empno(+) AND TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) >= &Év ORDER BY "Belépési éve", "Dolgozó Neve"; Eredmény Kezdő év: 1981 régi 7: TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) >= &Év új 7: TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) >= 1981 #11_SQL Feladatgyűjtemény (30)
33 Dolgozó Neve Munkaköre Belépési éve Főnöke ALLEN SALESMAN 1981 BLAKE BLAKE MANAGER 1981 KING CLARK MANAGER 1981 KING FORD ANALYST 1981 JONES JAMES CLERK 1981 BLAKE JONES MANAGER 1981 KING KING PRESIDENT 1981 Nincs Főnöke MARTIN SALESMAN 1981 BLAKE TURNER SALESMAN 1981 BLAKE WARD SALESMAN 1981 BLAKE MILLER CLERK 1982 CLARK ADAMS CLERK 1987 SCOTT SCOTT ANALYST 1987 JONES 13 sor kijelölve. 2. Lépés (Formázott listázás) SET feedback OFF SET verify OFF SET linesize 50 SET pagesize 23 TTITLE "LISTA (éves csoportosításban)" BTITLE "Készült: 2006-ban" COLUMN "Dolgozó Neve" FORMAT A12 HEADING "Dolgozó Neve" JUSTIFY LEFT COLUMN "Munkaköre" FORMAT A9 COLUMN "Belépési éve" FORMAT A10 HEADING "Belépési éve" JUSTIFY CENTER COLUMN "Főnöke" FORMAT A13 BREAK ON "Belépési éve" ACCEPT Év NUMBER PROMPT 'Kezdő év: ' SELECT RPAD(d.ename,12) AS "Dolgozó Neve", d.job AS "Munkaköre", RPAD(' ',2) TO_CHAR(d.hiredate,'YYYY') AS "Belépési éve", NVL2(f.ename,f.ename,'Nincs Főnöke') AS "Főnöke" d, emp f WHERE d.mgr = f.empno(+) AND TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) >= &Év ORDER BY "Belépési éve", "Dolgozó Neve"; UNDEFINE Év CLEAR BREAKS CLEAR COLUMNS TTITLE OFF BTITLE OFF SET linesize 400 SET pagesize 40 SET verify ON SET feedback 6 #11_SQL Feladatgyűjtemény (30)
34 Eredmény Kezdő év: 1981 V. Febr. 26 lap 1 LISTA (éves csoportosításban) Dolgozó Belépési Neve Munkaköre éve Főnöke ALLEN SALESMAN 1981 BLAKE BLAKE MANAGER KING CLARK MANAGER KING FORD ANALYST JONES JAMES CLERK BLAKE JONES MANAGER KING KING PRESIDENT Nincs Főnöke MARTIN SALESMAN BLAKE TURNER SALESMAN BLAKE WARD SALESMAN BLAKE MILLER CLERK 1982 CLARK ADAMS CLERK 1987 SCOTT SCOTT ANALYST JONES Készült: 2006-ban #11_SQL Feladatgyűjtemény (30)
35 5. Foglalkozás Adattáblák létrehozása, módosítása, tranzakciók, megszorítások Részletesebben lásd [2]: 5. fejezet KULCSSZAVAK DML utasítások: INSERT UPDATE DELETE Tranzakciók: SAVEPOINT ROLLBACK COMMIT Megjegyzés: A tranzakciók logikailag a DML utasításokhoz kötődnek, mivel visszavonni csak DML utasításokat lehet. DDL utasítások: CREATE TABLE DROP TABLE ALTER TABLE MODIFY ADD DROP RENAME RENAME TABLE Megszorítások: PRIMARY KEY FOREIGN KEY REFERENCES UNIQUE NULL NOT NULL CHECK Megjegyzés: A megszorítások logikailag a DDL utasításokhoz kötődnek, mivel érvényesítésük és visszavonásuk az adattáblák szerkezetét módosítja. FELADATGYŰJTEMÉNY Az alábbi feladatokban az eredeti emp tábláról először készítsünk egy másolatot dolgozó néven annak megőrzése érdekében! A feladatok szövege e dolgozó táblára vonatkozik Feladat (UPDATE) Növelje meg a hivatalnokok (clerk) fizetését 20%-al. Listázással ellenőrizze a megoldás helyességét Feladat (UPDATE) Növelje meg az 1981-ben belépett dolgozók fizetését a következőképpen: 10%-kal azoknak, akiknek a fizetése az ugyanekkor belépett és azonos munkakörűek átlagfizetésénél kisebb, és 1%-kal azoknak, akiknek nagyobb, vagy egyenlő. Listázza a dolgozók adatait a fizetésemelés előtt és után, valamint a munkaköri átlagfizetéseket egy tizedesre kerekítve Feladat (INSERT) A vállalat felvesz a mai nappal (sysdate) egy új dolgozót, abba a részlegbe, ahol a legkevesebben dolgoznak. Azonosítója a legnagyobb azonosító értéknél eggyel nagyobb. Neve és munkaköre választható, főnöke közvetlenül az elnök, fizetése megfelel a részleg-átlagnak és jutalékot nem kap. Listázza a lekérdezett attribútumokat valamint a dolgozókat a felvétel előtt és után is. #11_SQL Feladatgyűjtemény (30)
36 5.4. Feladat (REFERENCES) Mutassa be az utólag hozzáadott hivatkozási megszorítást teljes és szűkített tábla esetén. TOVÁBBI FELADATOK T5.5. Feladat Növelje meg a munkakörönként legkisebb fizetésű dolgozó fizetését a munkaköri átlag és a saját fizetése felével. T5.6. Feladat Azoknak a dolgozóknak, akik nem kapnak jutalékot, adjon jutalékot a következőképpen: akik 1980-ban léptek be, azok a fizetésük 20%-át kapják, akik 1981-ben, azok 10%-ot, akik pedig 1981 után léptek be a vállalathoz, azok az összdolgozói átlagjutalék 1%-át kapják. T5.7. Feladat A vállalat egy új dolgozót vesz fel. Az azonosítója a már létező legkisebb azonosítónál kettővel kisebb legyen. A nevét és munkakörét válassza meg önállóan. A főnöke legyen a legnagyobb kódú főnök, belépési dátuma a három nappal ezelőtti dátum. Fizetése a páros hónapokban belépett dolgozók átlagfizetése, jutaléka e dolgozók minimális fizetésének harmada, részlege pedig a főnökének részlege legyen. T5.8. Feladat Adjon a dolgozó táblához egy új, jutalom nevű oszlopot. A jutalmat következőképpen kapják: a beosztottak a beosztottak átlagjövedelmének 10%-át, a főnökök pedig a főnöki átlagjövedelmek 25%-át. #11_SQL Feladatgyűjtemény (30)
37 MEGOLDÁSGYŰJTEMÉNY Az alábbi feladatokban az eredeti emp tábláról először készítsünk egy másolatot dolgozó néven annak megőrzése érdekében! A feladatok szövege e dolgozó táblára vonatkozik Feladat (UPDATE) Növelje meg a hivatalnokok (clerk) fizetését 20%-al. Listázással ellenőrizze a megoldás helyességét. Megoldás 0. lépés (Az SQL*Plus környezet inicializálása) -- Az emp tábla inicializálása (ezúttal elhagyjuk) -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van -- A dátum és megjelenítés inicializálása ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; SET numwidth 5 -- Az esetlegesen létező azonos nevű objektumok törlése DROP VIEW dolgozó; DROP TABLE dolgozó; A munkamenet módosítva. ORA-00942: a tábla vagy a nézet nem létezik ORA-00942: a tábla vagy a nézet nem létezik 1. lépés DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * ; SELECT * FROM dolgozó WHERE LOWER(job) = 'clerk'; ORA-00942: a tábla vagy a nézet nem létezik A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JAMES CLERK SMITH CLERK ADAMS CLERK MILLER CLERK lépés UPDATE dolgozó SET sal = 1.2*sal WHERE LOWER(job) = 'clerk'; 4 sor módosítva. SELECT * FROM dolgozó WHERE LOWER(job) = 'clerk'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JAMES CLERK SMITH CLERK ADAMS CLERK MILLER CLERK #11_SQL Feladatgyűjtemény (30)
38 5.2. Feladat (UPDATE) Növelje meg az 1981-ben belépett dolgozók fizetését a következőképpen: 10%-kal azoknak, akiknek a fizetése az ugyanekkor belépett és azonos munkakörűek átlagfizetésénél kisebb, és 1%-kal azoknak, akiknek nagyobb, vagy egyenlő. Listázza a dolgozók adatait a fizetésemelés előtt és után, valamint a munkaköri átlagfizetéseket egy tizedesre kerekítve. Megoldás 1. lépés (A dolgozó tábla létrehozása) -- A dolgozó tábla létrehozása CREATE TABLE dolgozó AS SELECT * ; -- A dolgozó tábla helytakarékos lekérdezése SET numwidth 5 SELECT * FROM dolgozó; SET numwidth 10 Eredmény A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK sor kijelölve. 2. lépés (Az 1981-es munkaköri átlag listázása) SELECT job AS Munkakör, ROUND (AVG(sal),1) AS MunkaÁtlag FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981' GROUP BY job; #11_SQL Feladatgyűjtemény (30)
39 vagy kihasználva az automatikus konverziós lehetőségeket: SELECT job AS Munkakör, ROUND (AVG(sal),1) AS MunkaÁtlag FROM dolgozó WHERE hiredate BETWEEN '1981/01/01' AND ' ' GROUP BY job; Eredmény MUNKAKÖR MUNKAÁTLAG ANALYST 3000 CLERK 950 MANAGER 2758,3 PRESIDENT 5000 SALESMAN sor kijelölve. 3. lépés (Az 1981-es dolgozók listázása) SET numwidth 5 SELECT * FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981'; SET numwidth 10 Eredmény EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER KING PRESIDENT TURNER SALESMAN JAMES CLERK FORD ANALYST sor kijelölve. 4. lépés (Az átlag alatt bérezettek listája) SELECT empno, ename, job, sal FROM dolgozó, (SELECT job AS Munkakör, ROUND (AVG(sal),1) AS MunkaÁtlag FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981' GROUP BY job) WHERE TO_CHAR(hiredate,'YYYY') = '1981' AND Munkakör = job AND sal < MunkaÁtlag; Eredmény EMPNO ENAME JOB SAL CLARK MANAGER WARD SALESMAN MARTIN SALESMAN sor kijelölve. #11_SQL Feladatgyűjtemény (30)
40 5. lépés (Az átlagon, vagy fölötte bérezettek listája) SELECT empno, ename, job, sal FROM dolgozó, (SELECT job AS Munkakör, ROUND (AVG(sal),1) AS MunkaÁtlag FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981' GROUP BY job) WHERE TO_CHAR(hiredate,'YYYY') = '1981' AND Munkakör = job AND sal >= MunkaÁtlag; Eredmény EMPNO ENAME JOB SAL FORD ANALYST JAMES CLERK BLAKE MANAGER JONES MANAGER KING PRESIDENT TURNER SALESMAN ALLEN SALESMAN sor kijelölve. 6. lépés (Az átlag alattiak fizetésének növelése) Most már tudjuk módosítani, mert tudjuk kik ők. Az azonosítás mindig az elsődleges kulccsal vagy egyedi kulccsal történhet. Ekkor a WHERE feltételben levő SELECT utasításnak csak egyetlen kimenő oszlopa lehet! UPDATE dolgozó SET sal = sal * sal WHERE empno IN (SELECT empno FROM dolgozó, (SELECT job AS Munkakör, ROUND(AVG(sal),1) AS MunkaÁtlag FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981' GROUP BY job) WHERE TO_CHAR(hiredate,'YYYY') = '1981' AND Munkakör = job AND sal < MunkaÁtlag); SET numwidth 5 SELECT * FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981'; SET numwidth 10 Eredmény EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER KING PRESIDENT TURNER SALESMAN JAMES CLERK FORD ANALYST #11_SQL Feladatgyűjtemény (30)
41 10 sor kijelölve. 7. lépés (Az átlagon, vagy fölötte bérezettek fizetésének növelése) UPDATE dolgozó SET sal = sal * sal WHERE empno IN (SELECT empno FROM dolgozó, (SELECT job AS Munkakör, ROUND(AVG(sal),1) AS MunkaÁtlag FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981' GROUP BY job) WHERE TO_CHAR(hiredate,'YYYY') = '1981' AND Munkakör = job AND sal >= MunkaÁtlag); SET numwidth 5 SELECT * FROM dolgozó WHERE TO_CHAR(hiredate,'YYYY') = '1981'; SET numwidth 10 Eredmény (Ez egyben a feladat végeredménye is) EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER KING PRESIDENT TURNER SALESMAN JAMES CLERK , FORD ANALYST sor kijelölve. #11_SQL Feladatgyűjtemény (30)
42 5.3. Feladat (INSERT) A vállalat felvesz a mai nappal (sysdate) egy új dolgozót, abba a részlegbe, ahol a legkevesebben dolgoznak. Azonosítója a legnagyobb azonosító értéknél eggyel nagyobb. Neve és munkaköre választható, főnöke közvetlenül az elnök, fizetése megfelel a részleg-átlagnak és jutalékot nem kap. Listázza a lekérdezett attribútumokat valamint a dolgozókat a felvétel előtt és után is. Megoldás 1. lépés (A dolgozó tábla létrehozása) -- A dolgozó tábla létrehozása CREATE TABLE dolgozó AS SELECT * ; -- A dolgozó tábla helytakarékos lekérdezése SET numwidth 5 SELECT * FROM dolgozó; SET numwidth 10 Eredmény A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK sor kijelölve. 2. lépés 2.A. lépés (A részlegenkénti létszám meghatározása) SELECT deptno AS Részleg, COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno; Eredmény RÉSZLEG LÉTSZÁM B. lépés (A legkisebb létszámú részleg létszámának meghatározása) SELECT MIN(Létszám) AS Legkisebb FROM (SELECT COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno); #11_SQL Feladatgyűjtemény (30)
43 Eredmény LEGKISEBB C. lépés (A legkisebb létszámú részleg meghatározása) SELECT Részleg FROM (SELECT deptno AS Részleg, COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno), (SELECT MIN(Létszám) AS Legkisebb FROM (SELECT COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno)) WHERE Létszám = Legkisebb; Eredmény DEPTNO vagy másképpen SELECT deptno AS részleg FROM dolgozó GROUP BY deptno HAVING COUNT(*) = (SELECT MIN(db) Eredmény RÉSZLEG FROM (SELECT deptno 3. Lépés (A legnagyobb azonosító meghatározása) SELECT MAX(empno) FROM dolgozó; Eredmény MAX(empno) COUNT(*) AS db FROM dolgozó GROUP BY deptno)); AS részleg, 4. Lépés (A legkisebb létszámú részleg átlagának meghatározása kerekítve) SELECT ROUND(AVG(sal)) AS átlag FROM dolgozó GROUP BY deptno HAVING deptno = (SELECT Részleg FROM (SELECT deptno AS Részleg, COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno), (SELECT MIN(Létszám) AS Legkisebb FROM (SELECT COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno)) WHERE Létszám = Legkisebb); #11_SQL Feladatgyűjtemény (30)
44 Eredmény ÁTLAG Lépés (Az elnök kódjának meghatározása) SELECT empno FROM dolgozó WHERE UPPER(job) = 'PRESIDENT'; Eredmény EMPNO Megoldás INSERT INTO dolgozó VALUES ( (SELECT MAX(empno) FROM dolgozó) +1, 'TÖHÖTÖM', 'Tanácsadó', (SELECT empno FROM dolgozó WHERE UPPER(job) = 'PRESIDENT'), sysdate, (SELECT ROUND(AVG(sal)) AS átlag FROM dolgozó GROUP BY deptno HAVING deptno = (SELECT Részleg FROM (SELECT deptno NULL, (SELECT Részleg AS Részleg, COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno), (SELECT MIN(Létszám) AS Legkisebb FROM (SELECT COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno)) WHERE Létszám = Legkisebb)), FROM (SELECT deptno AS Részleg, COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno), (SELECT MIN(Létszám) AS Legkisebb FROM (SELECT COUNT(*) AS Létszám FROM dolgozó GROUP BY deptno)) WHERE Létszám = Legkisebb) ); SELECT * FROM dolgozó; Eredmény 1 sor létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SMITH CLERK ALLEN SALESMAN WARD SALESMAN #11_SQL Feladatgyűjtemény (30)
45 7566 JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK TÖHÖTÖM Tanácsadó sor kijelölve. ROLLBACK; #11_SQL Feladatgyűjtemény (30)
46 5.4. Feladat (REFERENCES) Mutassa be az utólag hozzáadott hivatkozási megszorítást teljes és szűkített tábla esetén. 1. Megoldás -- Hivatkozási_Megszorítás-1.sql Utólagosan hozzáadott hivatkozási megszorítás hatásának bemutatása Utolsó javítás dátuma: PROMPT Utólagosan hozzáadott hivatkozási megszorítás hatásának bemutatása DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * ; SET numwidth 6 PROMPT >> Hivatkozási megszorítás nélkül: SELECT * FROM dolgozó WHERE UPPER(job) = 'MANAGER'; PROMPT >> Egy sikeres főnök-törlés: DELETE FROM dolgozó WHERE UPPER(ename) = 'BLAKE'; SELECT * FROM dolgozó WHERE UPPER(job) = 'MANAGER'; ROLLBACK; SELECT * FROM dolgozó WHERE UPPER(job) = 'MANAGER'; PROMPT PROMPT >> Hivatkozási megszorítással: ALTER TABLE dolgozó ADD CONSTRAINT c_empno PRIMARY KEY (empno); ALTER TABLE dolgozó ADD CONSTRAINT c_mgr FOREIGN KEY (mgr) REFERENCES dolgozó (empno); PROMPT >> Egy sikertelen főnök-törlés: DELETE FROM dolgozó WHERE UPPER(ename) = 'BLAKE'; SELECT * FROM dolgozó WHERE UPPER(job) = 'MANAGER'; SET numwidth 10 Eredmény Utólagosan hozzáadott hivatkozási megszorítás hatásának bemutatása DROP TABLE dolgozó * Hiba a(z) 1. sorban: ORA-00942: a tábla vagy a nézet nem létezik A tábla létrejött. >> Hivatkozási megszorítás nélkül: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER >> Egy sikeres főnök-törlés: 1 sor törölve. #11_SQL Feladatgyűjtemény (30)
47 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CLARK MANAGER JONES MANAGER A visszaállítás befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER >> Hivatkozási megszorítással: A tábla módosítva. A tábla módosítva. >> Egy sikertelen főnök-törlés: DELETE FROM dolgozó * Hiba a(z) 1. sorban: ORA-02292: integritás megszorítás (SCOTT.C_MGR) megsértés - gyermek rekord található meg EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER #11_SQL Feladatgyűjtemény (30)
48 2. Megoldás -- Hivatkozási_Megszorítás-2.sql Utólagosan hozzáadott hivatkozási megszorítás hatásának bemutatása -- szűkített tábla esetén Utolsó javítás dátuma: PROMPT Utólagosan hozzáadott hivatkozási megszorítás hatásának bemutatása PROMPT szűkített tábla esetén SET numwidth 6 PROMPT A szűkített dolgozótáblában csak azok lehetnek főnökök, PROMPT akik dolgozók is. CREATE OR REPLACE VIEW dolgozónézet AS SELECT d.empno d, emp f WHERE (TO_CHAR(d.hiredate,'YYYY') BETWEEN '1980' AND '1985') AND (f.sal > 2400) AND d.mgr = f.empno; SELECT * FROM dolgozónézet; DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT d.empno, d.ename, d.job, CASE WHEN d.mgr IN (SELECT empno FROM dolgozónézet) THEN d.mgr ELSE NULL END AS mgr, d.hiredate, d.sal, d.comm, d.deptno d, emp f WHERE (TO_CHAR(d.hiredate,'YYYY') BETWEEN '1980' AND '1985') AND (f.sal > 2400) AND d.mgr = f.empno; SELECT * FROM dolgozó; PROMPT >> Hivatkozási megszorítás nélkül PROMPT >> egy sikeres főnök-törlés: DELETE FROM dolgozó WHERE UPPER(ename) = 'BLAKE'; SELECT * FROM dolgozó; ROLLBACK; SELECT * FROM dolgozó; PROMPT PROMPT >> Hivatkozási megszorítással ALTER TABLE dolgozó ADD CONSTRAINT c_empno PRIMARY KEY (empno); ALTER TABLE dolgozó ADD CONSTRAINT c_mgr FOREIGN KEY (mgr) REFERENCES dolgozó (empno); PROMPT >> egy sikertelen főnök-törlés: DELETE FROM dolgozó WHERE UPPER(ename) = 'BLAKE'; SELECT * FROM dolgozó; SET numwidth 10 DROP VIEW dolgozónézet; DROP TABLE dolgozó; #11_SQL Feladatgyűjtemény (30)
49 Eredmény Utólagosan hozzáadott hivatkozási megszorítás hatásának bemutatása szűkített tábla esetén A szűkített dolgozótáblában csak azok lehetnek főnökök, akik dolgozók is. A nézet létrejött. EMPNO sor kijelölve. A tábla eldobva. A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. >> Hivatkozási megszorítás nélkül >> egy sikeres főnök-törlés: 1 sor törölve. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. #11_SQL Feladatgyűjtemény (30)
50 A visszaállítás befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve >> Hivatkozási megszorítással A tábla módosítva. A tábla módosítva. >> egy sikertelen főnök-törlés: DELETE FROM dolgozó * Hiba a(z) 1. sorban: ORA-02292: integritás megszorítás (SCOTT.C_MGR) megsértés - gyermek rekord található meg EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. A nézet eldobva. A tábla eldobva. #11_SQL Feladatgyűjtemény (30)
51 6. Foglalkozás Nézettáblák, felső-n analízis, ROWNUM Részletesebben lásd [2]: 6. fejezet FELADATGYŰJTEMÉNY 6.1. Feladat (Egyszerű alkalmazás a ROWNUM és a nézettáblák használatára) Listázza az ábécé szerinti első három dolgozó nevét, munkakörét és fizetését az ábécé szerint rendezve Feladat (Összetettebb alkalmazás a ROWNUM használatára) Listázza a három legkisebb átlagfizetésű munkakör dolgozóit úgy, hogy sorszámozza a munkaköröket az átlagfizetések alapján növekvő módon Feladat (Mintanézet) Írja ki munkakörönként a legkisebb és a legnagyobb jövedelmet és e jövedelemmel rendelkező dolgozók nevét, valamint a két jövedelemérték különbségét. Rendezze a listát a jövedelemkülönbség szerint csökkenően Feladat (Sorrendfüggő módosítás) A felhasználó által megadott munkakörben, ha létezik második legnagyobb fizetésű dolgozó, akkor annak (vagy azoknak) a fizetését növelje meg annyival, hogy az legyen a legnagyobb. Ha ilyen nem létezik, akkor a fizetések ne változzanak. Listázza a megadott munkakör dolgozóit a fizetésük szerint csökkenő, a nevük szerint pedig növekvő sorrendben a fenti módosítás előtt és után. TOVÁBBI FELADATOK T6.5. Feladat Írjon szkript programot, amely bővíti a táblát egy olyan új kereskedővel (salesman), akinek azonosítója a létező legnagyobb azonosító 5-tel növelt értéke, részlege és főnöke legyen azonos a Martin-éval, fizetése legyen a kereskedői fizetések közül a harmadik legkisebb, jutaléka a kereskedők átlagjutaléka. T6.6. Feladat Növelje meg minden munkakörben a második legkisebb fizetésű dolgozó fizetését (feltéve, hogy ilyen létezik!) a munkakör legkisebb és legnagyobb fizetésének felével. T6.7. Feladat Írjon szkript programot, amely a második legnagyobb létszámú részleg dolgozóinak jutalmat ad, ahol a jutalom az 1981-től belépett összes dolgozó második legnagyobb és második legkisebb fizetéskülönbségének 20%-a. #11_SQL Feladatgyűjtemény (30)
52 MEGOLDÁSGYŰJTEMÉNY 6.1. Feladat (Egyszerű alkalmazás a ROWNUM és a nézettáblák használatára) Listázza az ábécé szerinti első három dolgozó nevét, munkakörét és fizetését az ábécé szerint rendezve. Megoldás Az alábbiakban az egyes lépések által reprezentált néhány mintapéldán bemutatjuk a felső-n analízist lehetővé tevő ROWNUM rendszerváltozó és a nézettáblák legegyszerűbb használatát. 1. Lépés (Az emp tábla tárolás szerinti első három sorának listája) SELECT ename, job, sal WHERE ROWNUM <= 3; ENAME JOB SAL SMITH CLERK 800 ALLEN SALESMAN 1600 WARD SALESMAN Lépés (A Megoldás: az ábécé szerinti első három dolgozó listája) SELECT ename, job, sal FROM (SELECT * ORDER BY ename) WHERE ROWNUM <= 3; ENAME JOB SAL ADAMS CLERK 1100 ALLEN SALESMAN 1600 BLAKE MANAGER 2850 Megjegyzés Az ORDER BY rendező utasításrész csak a belső lekérdezésben állhat. Ha hibásan a külső lekérdezésbe helyezzük, akkor nem a kívánt rekordok rendezését kapjuk, amint azt az alábbi példában láthatjuk: SELECT ename, job, sal FROM (SELECT * ) WHERE ROWNUM <= 3 ORDER BY ename; vagy egyszerűbben: SELECT ename, job, sal WHERE ROWNUM <= 3 ORDER BY ename; ENAME JOB SAL ALLEN SALESMAN 1600 SMITH CLERK 800 WARD SALESMAN 1250 #11_SQL Feladatgyűjtemény (30)
53 3. Lépés (Az ábécé szerint rendezett emp tábla nézettáblája: rdolgozó) CREATE OR REPLACE VIEW rdolgozó AS SELECT * ORDER BY ename; A nézet létrejött. 4. Lépés (Másik Megoldás: az ábécé szerinti első három dolgozó listája nézettáblával) SELECT ename, job, sal FROM rdolgozó WHERE ROWNUM <= 3; ENAME JOB SAL ADAMS CLERK 1100 ALLEN SALESMAN 1600 BLAKE MANAGER Lépés (A Szép Megoldás: az ábécé szerinti első három dolgozó sorszámozott listája nézettáblával, másodlagos oszlopnevekkel) SELECT ROWNUM sorszám, ename név, job munkakör, sal fizetés FROM rdolgozó WHERE ROWNUM <= 3; SORSZÁM NÉV MUNKAKÖR FIZETÉS ADAMS CLERK ALLEN SALESMAN BLAKE MANAGER 2850 #11_SQL Feladatgyűjtemény (30)
54 6.2. Feladat (Összetettebb alkalmazás a ROWNUM használatára) Listázza a három legkisebb átlagfizetésű munkakör dolgozóit úgy, hogy sorszámozza a munkaköröket az átlagfizetések alapján növekvő módon. Az alábbi megoldások az eredeti emp táblát használják! 1. Megoldás -- Rownum_01.sql A ROWNUM és a nézettábla használatának bemutatása Utolsó javítás dátuma: PROMPT >> A1 << SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag; PROMPT >> A2 << SELECT ename, e.job, sal, átlag e, (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) al WHERE e.job = al.job; PROMPT >> A3 << SELECT ename, e.job, sal, átlag e, (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job) al WHERE e.job = al.job ORDER BY átlag; PROMPT >> A4 << SELECT job, átlag, ROWNUM AS sorszám FROM (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) WHERE ROWNUM <= 3; PROMPT >> A5 << #11_SQL Feladatgyűjtemény (30)
55 SELECT ename, e.job, sal, átlag, sorszám e, (SELECT job, átlag, ROWNUM AS sorszám FROM (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) WHERE ROWNUM <= 3) al WHERE e.job = al.job ORDER BY sorszám; PROMPT >> A6 << CREATE OR REPLACE VIEW mk_átlag AS SELECT job, átlag, ROWNUM AS sorszám FROM (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) WHERE ROWNUM <= 3; SELECT * FROM mk_átlag; SELECT ename, e.job, sal, átlag, sorszám e, mk_átlag al WHERE e.job = al.job ORDER BY sorszám; DROP VIEW mk_átlag; #11_SQL Feladatgyűjtemény (30)
56 2. Megoldás -- Rownum_02.sql A ROWNUM és a nézettábla használatának bemutatása Utolsó javítás dátuma: PROMPT >> A1 << SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag; PROMPT >> A2 << SELECT ename, e.job, sal, átlag e, (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) al WHERE e.job = al.job; PROMPT >> A3 << SELECT ename, e.job, sal, átlag e, (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job) al WHERE e.job = al.job ORDER BY átlag; PROMPT >> A4 << SELECT job, átlag, ROWNUM AS sorszám FROM (SELECT job, ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) WHERE ROWNUM <= 3; PROMPT >> A5 << SELECT ename, e.job, sal, átlag, sorszám e, (SELECT job, átlag, ROWNUM AS sorszám FROM (SELECT job, #11_SQL Feladatgyűjtemény (30)
57 ROUND(AVG(sal)) AS átlag GROUP BY job ORDER BY átlag) WHERE ROWNUM <= 3) al WHERE e.job = al.job ORDER BY sorszám; PROMPT >> A6 << CREATE OR REPLACE VIEW Munkakör_Átlag(Munkakör, Átlag) AS SELECT job, ROUND(AVG(sal)) GROUP BY job; SELECT * FROM Munkakör_Átlag; PROMPT >> A7 << CREATE OR REPLACE VIEW Átlag_Sorszám(Sorszám, Átlag) AS SELECT ROWNUM, átlag FROM (SELECT DISTINCT Átlag FROM Munkakör_Átlag ORDER BY Átlag) WHERE ROWNUM <= 3; SELECT * FROM Átlag_Sorszám; PROMPT >> A8<< CREATE OR REPLACE VIEW Munkakör_Sorszám(Sorszám, Munkakör, Átlag) AS SELECT Sorszám, Munkakör, Munkakör_Átlag.Átlag FROM Munkakör_Átlag, Átlag_Sorszám WHERE Munkakör_Átlag.Átlag = Átlag_Sorszám.Átlag ORDER BY sorszám; SELECT * FROM Munkakör_Sorszám; PROMPT >> A9<< SELECT ename, e.job, sal, átlag, sorszám e, Munkakör_Sorszám m WHERE e.job = m.munkakör ORDER BY sorszám; DROP VIEW Munkakör_Átlag; DROP VIEW Átlag_Sorszám; DROP VIEW Munkakör_Sorszám; #11_SQL Feladatgyűjtemény (30)
58 3. A két megoldás vizsgálata és összehasonlítása Probléma felvetés A fenti két szkript program az emp táblára azonos eredményt ad, így látszólag azonos hatásúak. Felvethető azonban, hogy miként viselkednek akkor, ha van két olyan munkakör, melyekben az átlagfizetés azonos. E vizsgálat érdekében tegyük azonossá a CLERK és a SALESMAN munkakörűek átlagfizetését. Könnyen belátható, hogy ez elérhető például az ADAMS fizetésének a 2548 USD értékre való beállításával. Ennek érdekében adjuk ki az alábbi SQL utasítást: 3.0. Lépés Az ADAMS fizetésének módosítása annak érdekében, hogy a CLERK és a SALESMAN munkakörűek átlagfizetése azonos legyen. UPDATE emp SET sal = 2548 WHERE UPPER(ename) = 'ADAMS'; Megjegyzés Ha az emp táblából a CREATE TABLE dolgozó AS SELECT * ; utasítással létrehozott dolgozó táblában végezzük az adatmódosítást, akkor a Rownum_01.sql, és a Rownum_02.sql szkript programokban, valamint az előbbi adatmódosító utasításban az emp tábla helyére mindenütt a dolgozó tábla neve írandó. Ha azonban az eredeti emp tábláben dolgozunk (mi most ezt fogjuk tenni!), akkor viszont ne felejtsük el a vizsgálat végén kiadni a ROLLBACK utasítást, illetve lefuttatni az [1] használata esetén az INIT1.sql, illetve a [2] használata esetén az INIT2.sql szkript programokat az emp tábla visszaállítása érdekében! 3.1. Lépés Tekintsük ezután a Rownum_01.sql futásának eredményét: >> A1 << JOB ÁTLAG CLERK 1400 SALESMAN 1400 MANAGER 2758 ANALYST 3000 PRESIDENT sor kijelölve. >> A2 << ENAME JOB SAL ÁTLAG FORD ANALYST SCOTT ANALYST JAMES CLERK SMITH CLERK MILLER CLERK ADAMS CLERK BLAKE MANAGER CLARK MANAGER #11_SQL Feladatgyűjtemény (30)
59 JONES MANAGER KING PRESIDENT MARTIN SALESMAN ALLEN SALESMAN WARD SALESMAN TURNER SALESMAN sor kijelölve. >> A3 << ENAME JOB SAL ÁTLAG JAMES CLERK SMITH CLERK MILLER CLERK ALLEN SALESMAN WARD SALESMAN MARTIN SALESMAN ADAMS CLERK TURNER SALESMAN BLAKE MANAGER JONES MANAGER CLARK MANAGER FORD ANALYST SCOTT ANALYST KING PRESIDENT sor kijelölve. >> A4 << JOB ÁTLAG SORSZÁM CLERK SALESMAN MANAGER sor kijelölve. >> A5 << ENAME JOB SAL ÁTLAG SORSZÁM JAMES CLERK SMITH CLERK MILLER CLERK ADAMS CLERK MARTIN SALESMAN WARD SALESMAN TURNER SALESMAN ALLEN SALESMAN BLAKE MANAGER CLARK MANAGER JONES MANAGER sor kijelölve. >> A6 << A nézet létrejött. JOB ÁTLAG SORSZÁM CLERK SALESMAN MANAGER sor kijelölve. #11_SQL Feladatgyűjtemény (30)
60 ENAME JOB SAL ÁTLAG SORSZÁM JAMES CLERK SMITH CLERK MILLER CLERK ADAMS CLERK MARTIN SALESMAN WARD SALESMAN TURNER SALESMAN ALLEN SALESMAN BLAKE MANAGER CLARK MANAGER JONES MANAGER sor kijelölve. A nézet eldobva Lépés Tekintsük ezután a Rownum_02.sql futásának eredményét: >> A1 << JOB ÁTLAG CLERK 1400 SALESMAN 1400 MANAGER 2758 ANALYST 3000 PRESIDENT sor kijelölve. >> A2 << ENAME JOB SAL ÁTLAG FORD ANALYST SCOTT ANALYST JAMES CLERK SMITH CLERK MILLER CLERK ADAMS CLERK BLAKE MANAGER CLARK MANAGER JONES MANAGER KING PRESIDENT MARTIN SALESMAN ALLEN SALESMAN WARD SALESMAN TURNER SALESMAN sor kijelölve. >> A3 << ENAME JOB SAL ÁTLAG JAMES CLERK SMITH CLERK MILLER CLERK ALLEN SALESMAN WARD SALESMAN MARTIN SALESMAN ADAMS CLERK #11_SQL Feladatgyűjtemény (30)
61 TURNER SALESMAN BLAKE MANAGER JONES MANAGER CLARK MANAGER FORD ANALYST SCOTT ANALYST KING PRESIDENT sor kijelölve. >> A4 << JOB ÁTLAG SORSZÁM CLERK SALESMAN MANAGER sor kijelölve. >> A5 << ENAME JOB SAL ÁTLAG SORSZÁM JAMES CLERK SMITH CLERK MILLER CLERK ADAMS CLERK MARTIN SALESMAN WARD SALESMAN TURNER SALESMAN ALLEN SALESMAN BLAKE MANAGER CLARK MANAGER JONES MANAGER sor kijelölve. >> A6 << A nézet létrejött. MUNKAKÖR ÁTLAG ANALYST 3000 CLERK 1400 MANAGER 2758 PRESIDENT 5000 SALESMAN sor kijelölve. >> A7 << A nézet létrejött. SORSZÁM ÁTLAG sor kijelölve. >> A8<< A nézet létrejött. SORSZÁM MUNKAKÖR ÁTLAG CLERK SALESMAN 1400 #11_SQL Feladatgyűjtemény (30)
62 4 sor kijelölve. 2 MANAGER ANALYST 3000 >> A9<< ENAME JOB SAL ÁTLAG SORSZÁM JAMES CLERK SMITH CLERK MILLER CLERK ALLEN SALESMAN MARTIN SALESMAN ADAMS CLERK WARD SALESMAN TURNER SALESMAN BLAKE MANAGER JONES MANAGER CLARK MANAGER FORD ANALYST SCOTT ANALYST sor kijelölve. A nézet eldobva. A nézet eldobva. A nézet eldobva Lépés Összehasonlítás, értékelés Láthatóan az első megoldás esetén az azonos átlagfizetésű munkakörök különböző sorszámot kaptak. Ez a feladat szempontjából nem logikus. A második megoldás már azonos sorszámmal látja el a logikailag (átlagfizetésben) azonos munkaköröket, tehát ez a helyes megoldás. A lényeges különbség a két megoldás között az, hogy a helyes (tehát a Rownum_02.sql) szkript programban a (DISTINCT kulsszó által biztosított módon) a különböző munkaköri átlagfizetéseket (a munkakörtől függetlenül) sorszámoztuk, és a következő lépésben a munkaköröket ezeken a (sorszámozott) átlagfizetéseken keresztül (közvetett módon) sorszámoztuk. (Ismét megjegyezzük, hogy az eredeti emp tábla visszaállítható az [1] használata esetén az INIT1.sql, a [2] használata esetén az INIT2.sql szkript program lefuttatásával, illetve a ROLLBACK utasítás segítségével.) Tanulság A fentiek lényeges tanulsága az, hogy a ROWNUM segítségével csak akkor kapunk helyes sorszámozást, ha a ROWNUM sorszámozó eljárást olyan szelekciós listákra alkalmazzuk, melyek csupán egyetlen oszlopot tartalmaznak, és annak is minden értéke különböző. #11_SQL Feladatgyűjtemény (30)
63 6.3. Feladat (Mintanézet) Írja ki munkakörönként a legkisebb és a legnagyobb jövedelmet és e jövedelemmel rendelkező dolgozók nevét, valamint a két jövedelemérték különbségét. Rendezze a listát a jövedelemkülönbség szerint csökkenően. Megoldás 1. Lépés (Munkakörönként a legkisebb jövedelműek) SELECT ename AS kisnev, legkisebb_jöv, munkak, (SELECT MIN(sal+NVL(comm,0)) AS legkisebb_jöv, job AS munkak GROUP BY job) al WHERE emp.job = al.munkak AND sal+nvl(comm,0) = al.legkisebb_jöv; Eredmény KISNEV LEGKISEBB_JÖV MUNKAK FORD 3000 ANALYST SCOTT 3000 ANALYST SMITH 800 CLERK CLARK 2450 MANAGER KING 5000 PRESIDENT TURNER 1500 SALESMAN 6 sor kijelölve. 2. Lépés (Az iménti lekérdezésből hozzunk létre nézetet) CREATE OR REPLACE VIEW Kicsi AS SELECT ename AS kisnev, legkisebb_jöv, munkak, (SELECT MIN(sal+NVL(comm,0)) AS legkisebb_jöv, job AS munkak GROUP BY job) al WHERE emp.job = al.munkak AND sal+nvl(comm,0) = al.legkisebb_jöv ; SELECT * FROM Kicsi; Eredmény A nézet létrejött. KISNEV LEGKISEBB_JÖV MUNKAK FORD 3000 ANALYST SCOTT 3000 ANALYST SMITH 800 CLERK CLARK 2450 MANAGER KING 5000 PRESIDENT TURNER 1500 SALESMAN 6 sor kijelölve. 3. Lépés (Hozzuk létre az előzők szerint a legnagyobb jövedelműek nézetét) #11_SQL Feladatgyűjtemény (30)
64 CREATE OR REPLACE VIEW Nagy AS SELECT ename, legnagyobb, munkakör, (SELECT MAX(sal+NVL(comm,0)) AS legnagyobb, job AS munkakör GROUP BY job) al WHERE emp.job = al.munkakör AND sal+nvl(comm,0) = al.legnagyobb; SELECT * FROM nagy; Eredmény ENAME LEGNAGYOBB MUNKAKÖR FORD 3000 ANALYST SCOTT 3000 ANALYST MILLER 1300 CLERK JONES 2975 MANAGER KING 5000 PRESIDENT MARTIN 2650 SALESMAN 6 sor kijelölve. 4. Lépés (A teljes megoldás) SELECT ename AS nagynév, legnagyobb, munkakör, kisnev, legkisebb_jöv, legnagyobb - legkisebb_jöv AS jöv_különbség FROM Nagy JOIN Kicsi ON (munkakör = munkak) ORDER BY jöv_különbség DESC; Eredmény NAGYNÉV LEGNAGYOBB MUNKAKÖR KISNEV LEGKISEBB_JÖV JÖV_KÜLÖNBSÉG MARTIN 2650 SALESMAN TURNER JONES 2975 MANAGER CLARK MILLER 1300 CLERK SMITH FORD 3000 ANALYST FORD SCOTT 3000 ANALYST FORD KING 5000 PRESIDENT KING FORD 3000 ANALYST SCOTT SCOTT 3000 ANALYST SCOTT sor kijelölve. #11_SQL Feladatgyűjtemény (30)
65 6.4. Feladat (Sorrendfüggő módosítás) A felhasználó által megadott munkakörben, ha létezik második legnagyobb fizetésű dolgozó, akkor annak (vagy azoknak) a fizetését növelje meg annyival, hogy az legyen a legnagyobb. Ha ilyen nem létezik, akkor a fizetések ne változzanak. Listázza a megadott munkakör dolgozóit a fizetésük szerint csökkenő, a nevük szerint pedig növekvő sorrendben a fenti módosítás előtt és után. Megoldás SET numwidth 5 ACCEPT munkakör PROMPT "Munkakör: " DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * ; CREATE OR REPLACE VIEW Sorrend(fizetés, sorszám) AS SELECT fizetés, ROWNUM FROM (SELECT DISTINCT sal AS fizetés FROM dolgozó WHERE UPPER(job) = UPPER('&munkakör') ORDER BY fizetés DESC) WHERE ROWNUM <= 2; SELECT * FROM Sorrend; CREATE OR REPLACE VIEW Különbség(érték) AS SELECT (SELECT fizetés FROM Sorrend WHERE sorszám = 1) - (SELECT fizetés FROM Sorrend WHERE sorszám = 2) FROM dual; SELECT * FROM dolgozó WHERE UPPER(job) = UPPER('&munkakör') ORDER BY sal DESC, ename ASC; UPDATE dolgozó SET sal = (SELECT CASE WHEN (SELECT COUNT(*) FROM Sorrend) = 1 THEN sal ELSE (SELECT fizetés FROM Sorrend WHERE sorszám = 2) + (SELECT érték FROM Különbség) + 1 END AS sal FROM dual) WHERE UPPER(job) = UPPER('&munkakör') AND sal = (SELECT fizetés FROM Sorrend WHERE sorszám = 2); SELECT * FROM dolgozó WHERE UPPER(job) = UPPER('&munkakör') ORDER BY sal DESC, ename ASC; SET numwidth 10 DROP VIEW Sorrend; #11_SQL Feladatgyűjtemény (30)
66 DROP VIEW Különbség; DROP TABLE dolgozó; 1. Próbafuttatás eredménye Munkakör: salesman A tábla eldobva. A tábla létrejött. régi 7: WHERE UPPER(job) = UPPER('&munkakör') új 7: WHERE UPPER(job) = UPPER('salesman') A nézet létrejött. FIZETÉS SORSZÁM A nézet létrejött. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('salesman') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ALLEN SALESMAN FEB TURNER SALESMAN SZE MARTIN SALESMAN SZE WARD SALESMAN FEB régi 11: új 11: WHERE UPPER(job) = UPPER('&munkakör') AND WHERE UPPER(job) = UPPER('salesman') AND 1 sor módosítva. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('salesman') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO TURNER SALESMAN SZE ALLEN SALESMAN FEB MARTIN SALESMAN SZE WARD SALESMAN FEB A nézet eldobva. A nézet eldobva. A tábla eldobva. 2. Próbafuttatás eredménye Munkakör: analyst DROP TABLE dolgozó * Hiba a(z) 1. sorban: ORA-00942: a tábla vagy a nézet nem létezik A tábla létrejött. régi 7: WHERE UPPER(job) = UPPER('&munkakör') új 7: WHERE UPPER(job) = UPPER('analyst') A nézet létrejött. #11_SQL Feladatgyűjtemény (30)
67 FIZETÉS SORSZÁM A nézet létrejött. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('analyst') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO FORD ANALYST DEC SCOTT ANALYST ÁPR régi 11: új 11: WHERE UPPER(job) = UPPER('&munkakör') AND WHERE UPPER(job) = UPPER('analyst') AND 0 sor módosítva. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('analyst') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO FORD ANALYST DEC SCOTT ANALYST ÁPR A nézet eldobva. A nézet eldobva. A tábla eldobva. #11_SQL Feladatgyűjtemény (30)
68 7. Foglalkozás SQL összefoglaló feladatsorok Részletesebben lásd [2]: 7. fejezet FELADATGYŰJTEMÉNY A. Feladatsor Az alábbi feladatokat megoldó programokat és azok futási eredményeit, ellenőrző listáit a főkönyvtár hallgató nevű könyvtárában az Ön nevét tartalmazó Word dokumentumba (pl. SasPál_1kurzus_A.doc) tárolja, majd ezt zip formátumba tömörítve küldje el egy -hez csatolva a doboz123@fre .hu címre. A részmegoldásokat próbafuttatásokkal ellenőrizze, és ezeket is dokumentálja. Az utasításokat struktúrált módon írja. Segítségként csak az Oracle Help funkciója, és a tankönyvek használhatók. A1. Feladat Konzisztens módon hozzon létre egy dolgozó nevű táblát az emp tábla azon dolgozóiból, akik 1980 és 1985 között léptek be, és a főnökük fizetése 2400 USD-nél több, majd egy részleg nevű táblát a dept táblából. E táblák létrehozása előtt győződjön meg róla, hogy az adott néven nem létezik-e már másik objektum (user_catalog), és ha igen, törölje azt. A további feladatok e táblákra vonatkoznak. A megoldások során rendszeresen alkalmazzon nézettáblákat! A2. Feladat Egy szkript programban végezzen megszorítás hozzáadást, ellenőrzést és visszaállítást (ROLLBACK) az alábbi módon: Lássa el hivatkozási megszorítással a dolgozó táblában az mgr oszlopot olymódon, hogy a hivatkozott oszlop az empno legyen. Kisérelje meg egy főnök törlését, majd törölje ezt a főnököt a beosztottai előzetes törlése után. Listázással ellenőrizze e műveletek végrehajtását, majd visszaállítás után annak hatását. A3. Feladat Bővítse a dolgozó táblát egy jutalom oszloppal, és töltse fel ezt olymódon, hogy akinek nagyobb a jövedelme, mint részlegének átlagjövedelme, az 400 USD jutalmat kapjon, a többiek pedig 800 USD-t. A4. Feladat Listázza formázva (fej-, és lábléccel, stb.) a dolgozók nevét, munkakörét, a részlegének nevét, a jutalmat is tartalmazó összjövedelmét, a főnökének nevét és a főnök telephelyének nevét, elsődlegesen a főnök neve szerint növekvően, másodlagosan az összjövedelem szerint csökkenően rendezve. Ha egy dolgozónak nincs főnöke, akkor a főnök-adatok helyére írja ki: "nincs főnöke". A5. Feladat A felhasználó által megadott munkakörben, ha létezik második legnagyobb fizetésű dolgozó, akkor annak (vagy azoknak) a fizetését növelje meg éppen annyival, hogy az legyen a legnagyobb. Ha ilyen nem létezik, akkor a fizetések ne változzanak. Listázza a megadott munkakör dolgozóit a fizetésük szerint csökkenő, a nevük szerint pedig növekvő sorrendben a fenti módosítás előtt és után. A listázás után állítsa vissza az eredeti állapotot. #11_SQL Feladatgyűjtemény (30)
69 B. Feladatsor Az alábbi feladatokat megoldó programokat és azok futási eredményeit, ellenőrző listáit a főkönyvtár hallgató nevű könyvtárában az Ön nevét tartalmazó Word dokumentumba (pl. SasPál_1kurzus_B.doc) tárolja, majd ezt zip formátumba tömörítve küldje el egy -hez csatolva a doboz123@fre .hu címre. A részmegoldásokat próbafuttatásokkal ellenőrizze, és ezeket is dokumentálja. Az utasításokat struktúrált módon írja. Segítségként csak az Oracle Help funkciója, és a tankönyvek használhatók. B1. Feladat Konzisztens módon hozzon létre egy dolgozó nevű táblát az emp tábla azon dolgozóiból, akiknek minden közvetlen beosztottja 1000 USD-nél magasabb jövedelemmel rendelkezik, majd egy részleg nevű táblát a dept táblából. E táblák létrehozása előtt győződjön meg róla, hogy az adott néven nem létezik-e már másik objektum (user_catalog), és ha igen, törölje azt. A további feladatok e táblákra vonatkoznak. A megoldások során rendszeresen alkalmazzon nézettáblákat! B2. Feladat Egy szkript programban végezzen megszorítás hozzáadást, ellenőrzést és visszaállítást (ROLLBACK) az alábbi módon: Egy MANAGER munkakörű dolgozó csak 2000 és 3000 USD tartománybeli fizetést kaphat. Kiséreljen meg egy megfelelő és egy nem megfelelő rekordot felvinni. Listázással ellenőrizze e műveletek végrehajtását, majd visszavonás után annak hatását. B3. Feladat Bővítse a dolgozó táblát egy jutalom oszloppal, és töltse fel ezt olymódon, hogy akinek valamelyik közvetlen beosztottja az ő jövedelmének felénél többet keres, az 1000 USD jutalmat kapjon, a többiek pedig 600 USD-t. B4. Feladat Listázza formázva (fej-, és lábléccel, stb.) a dolgozók nevét, munkakörét, a részlegének nevét, a jutalmat is tartalmazó összjövedelmét és a főnökének nevét, valamint telephelyét elsődlegesen a főnök neve szerint növekvően, másodlagosan az összjövedelem szerint csökkenő módon rendezve. Ha egy dolgozónak nincs főnöke, akkor a főnök nevének helyére írja ki: "=nincs főnöke=". #11_SQL Feladatgyűjtemény (30)
70 C. Feladatsor Az alábbi feladatokat megoldó programokat és azok futási eredményeit, ellenőrző listáit a főkönyvtár hallgató nevű könyvtárában az Ön nevét tartalmazó Word dokumentumba (pl. SasPál_1kurzus_C.doc) tárolja, majd ezt zip formátumba tömörítve küldje el egy -hez csatolva a doboz123@fre .hu címre. A részmegoldásokat próbafuttatásokkal ellenőrizze, és ezeket is dokumentálja. Az utasításokat struktúrált módon írja. Segítségként csak az Oracle Help funkciója, és a tankönyvek használhatók. C1. Feladat Konzisztens módon hozzon létre egy dolgozó nevű táblát az emp tábla azon dolgozóiból, akik 1980.február 1. és 1987.május 1. között léptek be, és ha van főnökük, akkor az legfeljebb 4000 USD-t keres, továbbá egy részleg nevű táblát a dept táblából. E táblák létrehozása előtt vizsgálja meg, hogy az adott néven létezik-e már másik objektum (user_catalog), és ha igen, törölje azt. A további feladatok e táblákra vonatkoznak. A megoldások során rendszeresen alkalmazzon nézettáblákat! C2. Feladat Egy szkript programban végezzen megszorítás hozzáadást, ellenőrzést és visszaállítást (ROLLBACK) az alábbi módon: A 2000 USD-nél nagyobb fizetésű dolgozók nem kaphatnak jutalékot. Kiséreljen meg egy megfelelő és egy nem megfelelő rekordot felvinni. Listázással ellenőrizze e műveletek végrehajtását, majd visszaállítás után annak hatását. C3. Feladat Bővítse a dolgozó táblát egy jutalom oszloppal, és töltse fel ezt a következő módon: A három legkisebb fizetésű dolgozó kapja meg egyszeri jutalomként a fizetésének 20 %-át, a három legnagyobb fizetésű a fizetésének 5 %-át, a többiek pedig a fizetésük 10 %-át. Ha valamelyik dolgozóra több feltétel is teljesül, akkor a legkisebbnek megfelelő jutalmat kapja. C4. Feladat Listázza formázva (fej-, és lábléccel, stb.) a dolgozók nevét, munkakörét, részlegének nevét, a jutalmat is tartalmazó összjövedelmét, a főnökének nevét, és annak telephelyét elsődlegesen a részleg neve szerint növekvően, másodlagosan a összjövedelem szerint csökkenő módon rendezve. Ha egy dolgozónak nincs főnöke, akkor a főnök adatainak helyére írja ki: "nincs főnök". #11_SQL Feladatgyűjtemény (30)
71 MEGOLDÁSGYŰJTEMÉNY A. Feladatsor A1. Feladat Konzisztens módon hozzon létre egy dolgozó nevű táblát az emp tábla azon dolgozóiból, akik 1980 és 1985 között léptek be, és a főnökük fizetése 2400 USD-nél több, majd egy részleg nevű táblát a dept táblából. E táblák létrehozása előtt győződjön meg róla, hogy az adott néven nem létezik-e már másik objektum (user_catalog), és ha igen, törölje azt. A további feladatok e táblákra vonatkoznak. A megoldások során rendszeresen alkalmazzon nézettáblákat! Megoldás 0.1. lépés (Az emp tábla és a megjelenítés inicializálása) -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; SET numwidth 5 A munkamenet módosítva lépés (Az esetlegesen létező azonos nevű objektumok törlése) SELECT * FROM user_catalog; TABLE_NAME TABLE_TYPE BONUS TABLE SALGRADE TABLE BIN$cf3RznwPTY+EvudRGHkQpA==$0 TABLE BIN$LyCk51gPQeGFtY6Vzpoqeg==$0 TABLE BIN$jbjmAQQlSP687PyXQeaGdA==$0 TABLE BIN$rFi9sCIrRUeZCwogOPc5ng==$0 TABLE BIN$HRjtpgeGS7+61D7GZeNSSQ==$0 TABLE BIN$0ySrJpEOQHSFkvoBFw6ReQ==$0 TABLE BIN$QUd8b6c8T7SJiG7sviD5MA==$0 TABLE BIN$wZ9aIlWzRSC4P2K5pQ3eKg==$0 TABLE DOLGOZÓ VIEW BIN$N+QGkUEwTGOeKajQfjBuVA==$0 TABLE BIN$R3gv3phyTYqHZ32rQOfM5Q==$0 TABLE BIN$dtyJYaRQQ4OXGTMY44AILQ==$0 TABLE BIN$+8fzRwI0TN+2frz59c9RxQ==$0 TABLE BIN$+O5j8FZGSmSddxZD0RkLQg==$0 TABLE BIN$Hl6MRiGSRA6TUyMVFn5z9g==$0 TABLE BIN$opEaC97PRMGFNZAr6GxRsw==$0 TABLE EMP TABLE BIN$HLIO/j11SWqL0BHKSp4V+w==$0 TABLE DEPT TABLE BIN$KWlSQ3NGQaiZkLDahyGHwQ==$0 TABLE BIN$7cWjDm8CRnugRC8rQ77uUw==$0 TABLE RÉSZLEG TABLE 24 sor kijelölve. DROP VIEW dolgozó; DROP TABLE részleg; A nézet eldobva. A tábla eldobva. #11_SQL Feladatgyűjtemény (30)
72 0.3. lépés (Jogosultságot adunk a Scott felhasználónak nézettábla létrehozására) CONNECT sys/gazda AS SYSDBA Kapcsolódva. GRANT CREATE VIEW TO scott; Az engedélyezés sikeresen befejeződött. CONNECT scott/tiger Kapcsolódva. 1. lépés (A dolgozó tábla létrehozása) -- A megfelelő dolgozók listája az eredeti táblában: SELECT d.*, f.ename AS Főnök, f.sal AS FőnökFiz d, emp f WHERE TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) BETWEEN 1980 AND 1985 AND d.mgr = f.empno AND f.sal > 2400; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO FŐNÖK FŐNÖKFIZ BLAKE MANAGER KING CLARK MANAGER KING JONES MANAGER KING MARTIN SALESMAN BLAKE ALLEN SALESMAN BLAKE TURNER SALESMAN BLAKE JAMES CLERK BLAKE WARD SALESMAN BLAKE FORD ANALYST JONES SMITH CLERK FORD MILLER CLERK CLARK sor kijelölve. Megjegyzés A származtatott dolgozó táblában csak azok lehetnek főnökök, akik dolgozók is, ám a fenti lista alapján létrehozható adattábla ezt még nem biztosítja, hiszen a KING főnökként szerepel, holott az adott kiválasztásban nincs a dolgozók között. Ez inkonzisztenciát (adatellentmondást) okozna! A dolgozó adattábla konzisztenciáját azáltal biztosíthatjuk, hogy mindazon dolgozók mgr kódját NULL értékkel helyettesítjük, akiknek főnökük a származtatott adattáblába nem került be. Az ehhez szükséges vizsgálat érdekében létrehozzuk az alábbi dolgozónézet nézettáblát. -- A megfelelő dolgozók nézettáblája: CREATE OR REPLACE VIEW dolgozónézet AS SELECT d.* d, emp f WHERE TO_NUMBER(TO_CHAR(d.hiredate,'YYYY')) BETWEEN 1980 AND 1985 AND d.mgr = f.empno AND f.sal > 2400; SELECT * FROM dolgozónézet; -- A megfelelelő dolgozók konzisztens adattáblája: DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT empno, ename, job, CASE WHEN mgr IN (SELECT empno FROM dolgozónézet) THEN mgr #11_SQL Feladatgyűjtemény (30)
73 ELSE NULL END AS mgr, hiredate, sal, comm, deptno FROM dolgozónézet; DROP VIEW dolgozónézet; SELECT * FROM dolgozó; A nézet létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. A tábla eldobva. A tábla létrejött. A nézet eldobva. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. 2. lépés (A részleg tábla létrehozása) DROP TABLE részleg; CREATE TABLE részleg AS SELECT * FROM dept; SELECT * FROM részleg; A tábla eldobva. A tábla létrejött. DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON #11_SQL Feladatgyűjtemény (30)
74 A2. Feladat Egy szkript programban végezzen megszorítás hozzáadást, ellenőrzést és visszaállítást (ROLLBACK) az alábbi módon: Lássa el hivatkozási megszorítással a dolgozó táblában az mgr oszlopot olymódon, hogy a hivatkozott oszlop az empno legyen. Kisérelje meg egy főnök törlését, majd törölje ezt a főnököt a beosztottai előzetes törlése után. Listázással ellenőrizze e műveletek végrehajtását, majd visszaállítás után annak hatását. Megoldás -- A dolgozó és a részleg táblák megszorításai: BREAK ON Tulajdonos ON TablaNeve COLUMN Tulajdonos FORMAT A10 HEADING " Tulajdonos" COLUMN TablaNeve FORMAT A10 HEADING " TáblaNév" COLUMN OszlopNeve FORMAT A12 HEADING " OszlopNév" COLUMN Megszoritas FORMAT A17 HEADING "Megszorítás Neve" COLUMN Tipus FORMAT A6 HEADING " Tipusa" COLUMN Leiras FORMAT A22 HEADING " Leírása" SELECT SUBSTR(LOWER(user_constraints.owner),1,10) Tulajdonos, SUBSTR(LOWER(user_constraints.table_name),1,10) TablaNeve, RPAD(user_cons_columns.column_name,12) OszlopNeve, SUBSTR(user_constraints.constraint_name,1,20) Megszoritas, RPAD(user_constraints.constraint_type,6) Tipus, user_constraints.search_condition Leiras FROM user_constraints, user_cons_columns WHERE (user_constraints.constraint_name = user_cons_columns.constraint_name) AND (LOWER(user_constraints.table_name) IN ('dolgozó','részleg')) ORDER BY Tulajdonos ASC, TablaNeve ASC, OszlopNeve ASC; CLEAR BREAKS CLEAR COLUMNS Megszorítás Tulajdonos TáblaNév OszlopNév Neve Tipusa Leírása scott dolgozó DEPTNO SYS_C C "DEPTNO" IS NOT NULL EMPNO SYS_C C "EMPNO" IS NOT NULL részleg DEPTNO SYS_C C "DEPTNO" IS NOT NULL breaks törölve columns törölve Megjegyzés Mivel definíció szerint az mgr oszlophoz csak akkor rendelhető hivatkozási megszorítás, ha az általa hivatkozott empno oszlop elsődleges kulcs, ezért először ezt kell beállítani. ALTER TABLE dolgozó ADD CONSTRAINT kulcs PRIMARY KEY (empno); ALTER TABLE dolgozó ADD CONSTRAINT hivatkozó FOREIGN KEY (mgr) REFERENCES dolgozó (empno); A tábla módosítva. A tábla módosítva. -- Ekkor a dolgozó tábla megszorításai: COLUMN table_name FORMAT A11 COLUMN constraint_name FORMAT A16 COLUMN constraint_type FORMAT A20 COLUMN search_condition FORMAT A20 SELECT table_name, constraint_name, constraint_type, search_condition FROM user_constraints WHERE LOWER(table_name) = 'dolgozó'; #11_SQL Feladatgyűjtemény (30)
75 CLEAR COLUMNS TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITION DOLGOZÓ HIVATKOZÓ R DOLGOZÓ KULCS P DOLGOZÓ SYS_C C "DEPTNO" IS NOT NULL DOLGOZÓ SYS_C C "EMPNO" IS NOT NULL columns törölve Ellenőrzés 1. Kísérlet (Sikertelen törlés) DELETE FROM dolgozó WHERE UPPER(ename) = 'BLAKE'; DELETE FROM dolgozó * Hiba a(z) 1. sorban: ORA-02292: integritás megszorítás (SCOTT.HIVATKOZÓ) megsértés - gyermek rekord található meg 2. Kísérlet (Sikeres törlés) -- Először a Blake közvetlen beosztottjait töröljük ki: DELETE FROM dolgozó WHERE ename IN (SELECT d.ename FROM dolgozó d, dolgozó f WHERE d.mgr = f.empno AND UPPER(f.ename) = 'BLAKE'); 5 sor törölve. -- Ezután már kitörölhető maga a Blake is: DELETE FROM dolgozó WHERE UPPER(ename) = 'BLAKE'; 1 sor törölve. SELECT * FROM dolgozó; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CLARK MANAGER JONES MANAGER FORD ANALYST SMITH CLERK MILLER CLERK Állítsuk vissza a törlés előtti állapotot: ROLLBACK; SELECT * FROM dolgozó; A visszaállítás befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. #11_SQL Feladatgyűjtemény (30)
76 A3. Feladat Bővítse a dolgozó táblát egy jutalom oszloppal, és töltse fel ezt olymódon, hogy akinek nagyobb a jövedelme, mint részlegének átlagjövedelme, az 400 USD jutalmat kapjon, a többiek pedig 800 USD-t. Megoldás ALTER TABLE dolgozó ADD jutalom NUMBER; A tábla módosítva. -- Az egyes részlegek átlagjövedelme: CREATE OR REPLACE VIEW rátlagjövedelem(deptno,rátlag) AS SELECT deptno, ROUND(AVG(sal+NVL(comm,0))) FROM dolgozó GROUP BY deptno; SELECT * FROM rátlagjövedelem; A nézet létrejött. DEPTNO RÁTLAG Azok listája, akinek jövedelmük nagyobb a részlegük átlagánál: CREATE OR REPLACE VIEW NagyJövedelműek(empno) AS SELECT empno FROM dolgozó e, rátlagjövedelem r WHERE e.deptno = r.deptno AND sal+nvl(comm,0) > r.rátlag; SELECT * FROM NagyJövedelműek; A nézet létrejött. EMPNO vagy másként: CREATE OR REPLACE VIEW NagyJövedelműek(empno) AS SELECT empno FROM dolgozó e WHERE sal+nvl(comm,0) > (SELECT rátlag FROM rátlagjövedelem r WHERE e.deptno = r.deptno); SELECT * FROM NagyJövedelműek; A nézet létrejött. EMPNO #11_SQL Feladatgyűjtemény (30)
77 Megjegyzés A két lista tartalma azonos, még ha a sorrend (a különböző lekérdezés miatt) különböző is. Adatmódosítás -- Legyen e dolgozók jutalom értéke 400 USD,... UPDATE dolgozó SET jutalom = 400 WHERE empno IN (SELECT empno FROM dolgozó e, rátlagjövedelem r WHERE e.deptno = r.deptno AND sal+nvl(comm,0) > r.rátlag); -- vagy másként (nézettábla használattal): UPDATE dolgozó SET jutalom = 400 WHERE empno IN (SELECT empno FROM NagyJövedelműek); 5 sor módosítva a többieké pedig 800 USD: UPDATE dolgozó SET jutalom = 800 WHERE jutalom IS NULL; 6 sor módosítva. SELECT * FROM dolgozó; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN JAMES CLERK WARD SALESMAN FORD ANALYST SMITH CLERK MILLER CLERK sor kijelölve. -- Töröljük a fölöslegessé vált nézettáblákat: DROP VIEW rátlagjövedelem; DROP VIEW NagyJövedelműek; A nézet eldobva. A nézet eldobva. #11_SQL Feladatgyűjtemény (30)
78 A4. Feladat Listázza formázva (fej-, és lábléccel, stb.) a dolgozók nevét, munkakörét, a részlegének nevét, a jutalmat is tartalmazó összjövedelmét, a főnökének nevét és a főnök telephelyének nevét, elsődlegesen a főnök neve szerint növekvően, másodlagosan az összjövedelem szerint csökkenően rendezve. Ha egy dolgozónak nincs főnöke, akkor a főnök-adatok helyére írja ki: "nincs főnöke". Megoldás SET verify OFF SET numwidth 5 SET pagesize 21 SET linesize 85 SET feedback OFF BREAK ON Munkakor ON DolgozoReszleg TTITLE 'Dolgozók adatainak nyilvántartása' BTITLE 'Budapesti Műszaki Főiskola' COLUMN DolgozoNeve HEADING 'A dolgozó neve' FORMAT A15 COLUMN Munkakor HEADING 'A dolgozó munkaköre' FORMAT A10 COLUMN DolgozoReszleg HEADING 'A dolgozó részlege' FORMAT A12 COLUMN Osszes HEADING 'A dolgozó összjövedelme' JUSTIFY RIGHT COLUMN FonokNeve HEADING 'A főnök neve' FORMAT A15 COLUMN FonokTelep HEADING 'A főnök telephelye' FORMAT A12 SELECT d.ename AS DolgozoNeve, d.job AS Munkakor, dr.dname AS DolgozoReszleg, d.sal+nvl(d.comm,0)+d.jutalom AS Osszes, NVL(f.ename,'nincs főnöke') AS FonokNeve, NVL(fr.loc,'nincs főnöke') AS FonokTelep FROM dolgozó d, dolgozó f, részleg dr, részleg fr WHERE d.mgr = f.empno(+) AND d.deptno = dr.deptno AND f.deptno = fr.deptno(+) ORDER BY FonokNeve ASC, Osszes DESC; SET verify ON SET numwidth 10 SET pagesize 40 SET linesize 400 SET feedback ON TTITLE OFF BTITLE OFF CLEAR BREAKS CLEAR COLUMNS Szo Nov. 19 lap 1 Dolgozók adatainak nyilvántartása A dolgozó A dolgozó A dolgozó A dolgozó A főnök A főnök neve munkaköre részlege összjövedelme neve telephelye MARTIN SALESMAN SALES 3050 BLAKE CHICAGO ALLEN 2700 BLAKE CHICAGO WARD 2550 BLAKE CHICAGO TURNER 2300 BLAKE CHICAGO JAMES CLERK SALES 1750 BLAKE CHICAGO MILLER ACCOUNTING 2100 CLARK NEW YORK SMITH RESEARCH 1600 FORD DALLAS #11_SQL Feladatgyűjtemény (30)
79 FORD ANALYST RESEARCH 3400 JONES DALLAS JONES MANAGER RESEARCH 3375 nincs főnöke nincs főnöke BLAKE SALES 3250 nincs főnöke nincs főnöke CLARK ACCOUNTING 2850 nincs főnöke nincs főnöke Budapesti Műszaki Főiskola #11_SQL Feladatgyűjtemény (30)
80 A5. Feladat A felhasználó által megadott munkakörben, ha létezik második legnagyobb fizetésű dolgozó, akkor annak (vagy azoknak) a fizetését növelje meg éppen annyival, hogy az legyen a legnagyobb. Ha ilyen nem létezik, akkor a fizetések ne változzanak. Listázza a megadott munkakör dolgozóit a fizetésük szerint csökkenő, a nevük szerint pedig növekvő sorrendben a fenti módosítás előtt és után. A listázás után állítsa vissza az eredeti állapotot. Megoldás (A feladat megoldásának szkript programja aaa.sql) - aaa.sql ACCEPT munkakör PROMPT "Munkakör: " CREATE OR REPLACE VIEW Sorrend(fizetés, sorszám) AS SELECT fizetés, ROWNUM FROM (SELECT DISTINCT sal AS fizetés FROM dolgozó WHERE UPPER(job) = UPPER('&munkakör') ORDER BY fizetés DESC) WHERE ROWNUM <= 2; SELECT * FROM Sorrend; CREATE OR REPLACE VIEW Különbség(érték) AS SELECT (SELECT fizetés FROM Sorrend WHERE sorszám = 1) - (SELECT fizetés FROM Sorrend WHERE sorszám = 2) FROM dual; SELECT * FROM dolgozó WHERE UPPER(job) = UPPER('&munkakör') ORDER BY sal DESC, ename ASC; UPDATE dolgozó SET sal = (SELECT CASE WHEN (SELECT COUNT(*) FROM sorrend) = 1 THEN sal ELSE (SELECT fizetés FROM Sorrend WHERE sorszám = 2) + (SELECT érték FROM Különbség) + 1 END AS sal FROM dual) WHERE UPPER(job) = UPPER('&munkakör') AND sal = (SELECT fizetés FROM Sorrend WHERE sorszám = 2); SELECT * FROM dolgozó WHERE UPPER(job) = UPPER('&munkakör') ORDER BY sal DESC, ename ASC; ROLLBACK; #11_SQL Feladatgyűjtemény (30)
81 1. Eredmény Munkakör: salesman régi 7: WHERE UPPER(job) = UPPER('&munkakör') új 7: WHERE UPPER(job) = UPPER('salesman') A nézet létrejött. FIZETÉS SORSZÁM sor kijelölve. A nézet létrejött. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('salesman') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM ALLEN SALESMAN TURNER SALESMAN MARTIN SALESMAN WARD SALESMAN régi 11: új 11: WHERE UPPER(job) = UPPER('&munkakör') AND WHERE UPPER(job) = UPPER('salesman') AND 1 sor módosítva. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('salesman') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM TURNER SALESMAN ALLEN SALESMAN MARTIN SALESMAN WARD SALESMAN A visszaállítás befejeződött. 2. Eredmény Munkakör: analyst régi 7: WHERE UPPER(job) = UPPER('&munkakör') új 7: WHERE UPPER(job) = UPPER('analyst') A nézet létrejött. FIZETÉS SORSZÁM sor kijelölve. A nézet létrejött. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('analyst') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM FORD ANALYST #11_SQL Feladatgyűjtemény (30)
82 1 sor kijelölve. régi 11: új 11: WHERE UPPER(job) = UPPER('&munkakör') AND WHERE UPPER(job) = UPPER('analyst') AND 0 sor módosítva. régi 3: WHERE UPPER(job) = UPPER('&munkakör') új 3: WHERE UPPER(job) = UPPER('analyst') EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM FORD ANALYST sor kijelölve. A visszaállítás befejeződött. Végül töröljük a létrehozott változókat, nézettáblákat, táblákat és állítsuk vissza az alapértelmezett megjelenítést: UNDEFINE munkakör DROP VIEW Sorrend; DROP VIEW Különbség; DROP TABLE dolgozó; DROP TABLE részleg; SET numwidth 10 A nézet eldobva. A nézet eldobva. A tábla eldobva. A tábla eldobva. #11_SQL Feladatgyűjtemény (30)
83 B. Feladatsor B1. Feladat Konzisztens módon hozzon létre egy dolgozó nevű táblát az emp tábla azon dolgozóiból, akiknek minden közvetlen beosztottja 1000 USD-nél magasabb jövedelemmel rendelkezik, majd egy részleg nevű táblát a dept táblából. E táblák létrehozása előtt győződjön meg róla, hogy az adott néven nem létezik-e már másik objektum (user_catalog), és ha igen, törölje azt. A további feladatok e táblákra vonatkoznak. A megoldások során alkalmazzon nézettáblákat! Megoldás 0.1. lépés (Az emp tábla és a megjelenítés inicializálása) -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; SET numwidth 5 A munkamenet módosítva lépés (Esetlegesen létező azonos nevű objektumok törlése) SELECT * FROM user_catalog WHERE UPPER(TABLE_NAME) NOT LIKE '%BIN%'; TABLE_NAME TABLE_TYPE BONUS TABLE SALGRADE TABLE EMP TABLE DEPT TABLE Nem szerepel a dolgozó és a részleg objektum (sem táblaként, sem nézetként), tehát nincs további teendő. 1. lépés (A dolgozó tábla létrehozása) 1-A megoldás -- A megfelelő dolgozók listája: SELECT * WHERE empno IN (SELECT mgr GROUP BY mgr HAVING MIN(sal+NVL(comm,0)) > 1000); -- Ennek alapján hozzuk létre a dolgozó táblát: DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * WHERE empno IN (SELECT mgr GROUP BY mgr HAVING MIN(sal+NVL(comm,0)) > 1000); SELECT * FROM dolgozó; #11_SQL Feladatgyűjtemény (30)
84 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JONES MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT #11_SQL Feladatgyűjtemény (30)
85 1-B megoldás -- A főnökök azonosítói: SELECT DISTINCT mgr WHERE MGR IS NOT NULL; -- Azon főnökök azonosítói, akiknek van olyan beosztottjuk, -- akinek a jövedelme kisebb 1000 USD-nél (ezek nem felelnek meg a feltételnek): SELECT mgr WHERE sal+nvl(comm,0) <= 1000; -- Ezeket ki kell hagyni az összes főnök közül: SELECT DISTINCT mgr WHERE mgr IS NOT NULL AND mgr NOT IN (SELECT mgr WHERE sal+nvl(comm,0) <= 1000); -- Ebből készítsünk egy nézettáblát: CREATE OR REPLACE VIEW JóFőnökök AS SELECT DISTINCT mgr WHERE mgr IS NOT NULL AND mgr NOT IN (SELECT mgr WHERE sal+nvl(comm,0) <= 1000); SELECT * FROM JóFőnökök; -- Hozzuk létre a dolgozó táblát: DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * WHERE empno IN (SELECT mgr FROM JóFőnökök); SELECT * FROM dolgozó; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JONES MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT Töröljük a fölöslegessé vált nézettáblákat: DROP VIEW JóFőnökök; A nézet eldobva. #11_SQL Feladatgyűjtemény (30)
86 1-C megoldás -- Azon dolgozók listája, akik 1000 USD-nél magasabb jövedelemmel rendelkeznek: SELECT empno WHERE sal+nvl(comm,0) > 1000; -- Azon dolgozók nézettáblája, akiknek van beosztottjuk (a főnökök): CREATE OR REPLACE VIEW Főnökök(fazon) AS SELECT DISTINCT mgr WHERE mgr IS NOT NULL; SELECT * FROM Főnökök; -- A főnökök közvetlen beosztottainak nézettáblája: CREATE OR REPLACE VIEW KözvetlenBeosztottak(fazon, fnév, dazon, dnév) AS SELECT f.empno, f.ename, d.empno, d.ename d, emp f WHERE d.mgr = f.empno AND d.mgr IS NOT NULL; SELECT * FROM KözvetlenBeosztottak; -- Azon főnökök nézettáblája, akiknek minden beosztottjuk 1000 USD-nél magasabb jövedelemmel -- rendelkezik (vagyis a közvetlen beosztottak halmaza a részhalmaza az 1000 USD-nél magasabb -- jövedelemmel rendelkezőknek, algebrailag felírva: A esetén A \ B = A B): CREATE OR REPLACE VIEW JóFőnökök AS SELECT fazon AS mgr FROM Főnökök f WHERE NOT EXISTS (SELECT k.dazon FROM KözvetlenBeosztottak k WHERE f.fazon = k.fazon MINUS SELECT empno WHERE sal+nvl(comm,0) > 1000); SELECT * FROM JóFőnökök; -- Hozzuk létre a dolgozó táblát: DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * WHERE empno IN (SELECT mgr FROM JóFőnökök); SELECT * FROM dolgozó; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JONES MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT Töröljük a fölöslegessé vált nézettáblákat: DROP VIEW Főnökök; DROP VIEW KözvetlenBeosztottak; #11_SQL Feladatgyűjtemény (30)
87 DROP VIEW JóFőnökök; A nézet eldobva. A nézet eldobva. A nézet eldobva. 2. lépés (A részleg tábla létrehozása) DROP TABLE részleg; CREATE TABLE részleg AS SELECT * FROM dept; SELECT * FROM részleg; A tábla eldobva. A tábla létrejött. DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON #11_SQL Feladatgyűjtemény (30)
88 B2. Feladat Egy szkript programban végezzen megszorítás hozzáadást, ellenőrzést és visszaállítást (ROLLBACK) az alábbi módon: Egy MANAGER munkakörű dolgozó csak 2000 és 3000 USD tartománybeli fizetést kaphat. Kiséreljen meg egy megfelelő és egy nem megfelelő rekordot felvinni. Listázással ellenőrizze e műveletek végrehajtását, majd visszavonás után annak hatását. Megoldás -- A dolgozó és a részleg táblák megszorításai: COLUMN table_name FORMAT A11 COLUMN constraint_name FORMAT A15 COLUMN constraint_type FORMAT A16 COLUMN search_condition FORMAT A21 SELECT table_name, constraint_name, constraint_type, search_condition FROM user_constraints WHERE LOWER(table_name) IN ('dolgozó','részleg'); CLEAR COLUMNS TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITION RÉSZLEG SYS_C C "DEPTNO" IS NOT NULL DOLGOZÓ SYS_C C "EMPNO" IS NOT NULL DOLGOZÓ SYS_C C "DEPTNO" IS NOT NULL columns törölve -- A kívánt megszorítás hozzáadása: ALTER TABLE dolgozó ADD CONSTRAINT kulcsfiz CHECK ((sal BETWEEN 2000 AND 3000 AND UPPER(job) = 'MANAGER') (UPPER(job)!= 'MANAGER')); A tábla módosítva. -- Ekkor a dolgozó tábla megszorításai: COLUMN table_name FORMAT A10 COLUMN constraint_name FORMAT A15 COLUMN constraint_type FORMAT A16 COLUMN search_condition FORMAT A40 SELECT table_name, constraint_name, constraint_type, search_condition FROM user_constraints WHERE LOWER(table_name) = 'dolgozó'; CLEAR COLUMNS TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITION DOLGOZÓ SYS_C C "DEPTNO" IS NOT NULL DOLGOZÓ SYS_C C "EMPNO" IS NOT NULL DOLGOZÓ KULCSFIZ C (sal BETWEEN 2000 AND 3000 AND UPPER( job) = ' columns törölve Ellenőrzés: INSERT INTO dolgozó VALUES(6666,'BOSZORKA','MANAGER',7788,' ',3400,NULL,20); INSERT INTO dolgozó VALUES(7876,'JANCSI','MANAGER',7788,' ',2500,NULL,20); INSERT INTO dolgozó VALUES(9999,'JULISKA','STUDENT',7788,' ',1200,NULL,20); OR #11_SQL Feladatgyűjtemény (30)
89 SELECT * FROM dolgozó; INSERT INTO dolgozó * Hiba a(z) 1. sorban: ORA-02290: ellenőrző megszorítás (SCOTT.KULCSFIZ) megsértése 1 sor létrejött. 1 sor létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JONES MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT JANCSI MANAGER JULISKA STUDENT Visszaállítás: ROLLBACK; SELECT * FROM dolgozó; A visszaállítás befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JONES MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT #11_SQL Feladatgyűjtemény (30)
90 B3. Feladat Bővítse a dolgozó táblát egy jutalom oszloppal, és töltse fel ezt olymódon, hogy akinek valamelyik közvetlen beosztottja az ő jövedelmének felénél többet keres, az 1000 USD jutalmat kapjon, a többiek pedig 600 USD-t. Megoldás -- Tábla bővítése jutalom oszloppal: ALTER TABLE dolgozó ADD jutalom NUMBER(4); A tábla módosítva. 1. Módosítás: UPDATE dolgozó SET jutalom = 1000 WHERE empno IN (SELECT f.empno FROM dolgozó d, dolgozó f WHERE d.sal+nvl(d.comm,0) > (f.sal+nvl(f.comm,0))/2 AND d.mgr = f.empno); 2 sor módosítva. 2. Módosítás: UPDATE dolgozó SET jutalom = 600 WHERE jutalom IS NULL; 2 sor módosítva. SELECT * FROM dolgozó; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM JONES MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT #11_SQL Feladatgyűjtemény (30)
91 B4. Feladat Listázza formázva (fej-, és lábléccel, stb.) a dolgozók nevét, munkakörét, a részlegének nevét, a jutalmat is tartalmazó összjövedelmét és a főnökének nevét, valamint telephelyét elsődlegesen a főnök neve szerint növekvően, másodlagosan az összjövedelem szerint csökkenő módon rendezve. Ha egy dolgozónak nincs főnöke, akkor a főnök nevének helyére írja ki: "=nincs főnöke=". Megoldás SET verify OFF SET pagesize 15 SET linesize 83 SET feedback OFF -- BREAK ON FonokNeve ON FonokTelep TTITLE 'Dolgozók adatainak nyilvántartása' BTITLE 'Budapesti Műszaki Főiskola' COLUMN DolgozoNeve HEADING 'A dolgozó neve' FORMAT A15 COLUMN Munkakor HEADING 'A dolgozó munkaköre' FORMAT A10 COLUMN ReszlegNev HEADING 'A dolgozó részlege' FORMAT A12 COLUMN OsszJov HEADING 'A dolgozó összjövedelme' JUSTIFY RIGHT COLUMN FonokNeve HEADING 'A főnök neve' FORMAT A15 COLUMN FonokTelep HEADING 'A főnök telephelye' FORMAT A12 SELECT d.ename AS DolgozoNeve, d.job AS Munkakor, dr.dname AS ReszlegNev, d.sal+nvl(d.comm,0)+d.jutalom AS OsszJov, NVL(f.ename,'=nincs főnöke=') AS FonokNeve, fr.loc AS FonokTelep FROM dolgozó d, dolgozó f, részleg dr, részleg fr WHERE d.mgr = f.empno(+) AND d.deptno = dr.deptno AND f.deptno = fr.deptno(+) ORDER BY FonokNeve ASC, OsszJov DESC; SET verify ON SET pagesize 40 SET linesize 400 SET feedback ON TTITLE OFF BTITLE OFF -- CLEAR BREAKS CLEAR COLUMNS Eredmény V. Nov. 06 lap 1 Dolgozók adatainak nyilvántartása A dolgozó A dolgozó A dolgozó A dolgozó A főnök A főnök neve munkaköre részlege összjövedelme neve telephelye SCOTT ANALYST RESEARCH 4000 JONES DALLAS JONES MANAGER RESEARCH 3975 KING NEW YORK CLARK MANAGER ACCOUNTING 3050 KING NEW YORK KING PRESIDENT ACCOUNTING 5600 =nincs főnöke= Budapesti Műszaki Főiskola #11_SQL Feladatgyűjtemény (30)
92 columns törölve #11_SQL Feladatgyűjtemény (30)
93 C. Feladatsor C1. Feladat Konzisztens módon hozzon létre egy dolgozó nevű táblát az emp tábla azon dolgozóiból, akik 1980.február 1. és 1987.május 1. között léptek be, és ha van főnökük, akkor az legfeljebb 4000 USD-t keres, továbbá egy részleg nevű táblát a dept táblából. E táblák létrehozása előtt vizsgálja meg, hogy az adott néven létezik-e már másik objektum (user_catalog), és ha igen, törölje azt. A további feladatok e táblákra vonatkoznak. A megoldások során rendszeresen alkalmazzon nézettáblákat! Megoldás 0.1. lépés (Az emp tábla és a megjelenítés inicializálása) -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; SET numwidth 5 A munkamenet módosítva lépés (Esetlegesen létező azonos nevű objektumok törlése) SELECT * FROM user_catalog WHERE UPPER(TABLE_NAME) NOT LIKE '%BIN%'; TABLE_NAME TABLE_TYPE BONUS TABLE DEPT TABLE EMP TABLE SALGRADE TABLE Nem szerepel a dolgozó és a részleg objektum (sem táblaként, sem nézetként), tehát nincs további teendő. 1. lépés (A dolgozó tábla létrehozása) -- Az első feltételt kielégítő dolgozók nézettáblája: CREATE OR REPLACE VIEW Dolgozók1 AS SELECT empno, ename, job, mgr, TO_CHAR(hiredate, 'YYYY.month DD.') AS hiredate, sal, comm, deptno WHERE hiredate BETWEEN ' ' AND ' '; SELECT * FROM Dolgozók1; A nézet létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO KING PRESIDENT 1981.november BLAKE MANAGER május CLARK MANAGER június JONES MANAGER április MARTIN SALESMAN szeptember ALLEN SALESMAN február TURNER SALESMAN szeptember JAMES CLERK december WARD SALESMAN február FORD ANALYST december SMITH CLERK december SCOTT ANALYST április MILLER CLERK január #11_SQL Feladatgyűjtemény (30)
94 13 sor kijelölve. -- A megfelelő főnökök nézettáblája: CREATE OR REPLACE VIEW JóFőnök(főnökazon) AS SELECT f.empno d, emp f WHERE f.sal+nvl(f.comm,0) < 4000 AND d.mgr = f.empno; SELECT * FROM JóFőnök; A nézet létrejött. FŐNÖKAZON sor kijelölve. -- A mindkét feltételt kielégítő dolgozók nézettáblája: CREATE OR REPLACE VIEW DolgozóNézet AS SELECT * FROM Dolgozók1 WHERE mgr IN (SELECT főnökazon FROM JóFőnök); SELECT * FROM DolgozóNézet; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO MARTIN SALESMAN szeptember ALLEN SALESMAN február TURNER SALESMAN szeptember JAMES CLERK december WARD SALESMAN február FORD ANALYST december SMITH CLERK december SCOTT ANALYST április MILLER CLERK január sor kijelölve. -- A megfelelelő dolgozók konzisztens adattáblája: DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT empno, ename, job, CASE WHEN mgr IN (SELECT empno FROM DolgozóNézet) THEN mgr ELSE NULL END AS mgr, hiredate, sal, comm, deptno FROM DolgozóNézet; SELECT * FROM dolgozó; A tábla eldobva. A tábla létrejött. #11_SQL Feladatgyűjtemény (30)
95 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO WARD SALESMAN 1981.február JAMES CLERK 1981.december TURNER SALESMAN 1981.szeptember ALLEN SALESMAN 1981.február MARTIN SALESMAN 1981.szeptember SCOTT ANALYST 1987.április FORD ANALYST 1981.december SMITH CLERK december MILLER CLERK 1982.január sor kijelölve. -- A feleslegessé vált nézettáblák törlése: DROP VIEW Dolgozók1; DROP VIEW JóFőnök; DROP VIEW DolgozóNézet; A nézet eldobva. A nézet eldobva. A nézet eldobva. 2. lépés (A részleg tábla létrehozása) DROP TABLE részleg; CREATE TABLE részleg AS SELECT * FROM dept; SELECT * FROM részleg; A tábla eldobva. A tábla létrejött. DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON #11_SQL Feladatgyűjtemény (30)
96 C2. Feladat Egy szkript programban végezzen megszorítás hozzáadást, ellenőrzést és visszaállítást (ROLLBACK) az alábbi módon: A 2000 USD-nél nagyobb fizetésű dolgozók nem kaphatnak jutalékot. Kiséreljen meg egy megfelelő és egy nem megfelelő rekordot felvinni. Listázással ellenőrizze e műveletek végrehajtását, majd visszaállítás után annak hatását. Megoldás ALTER TABLE dolgozó ADD CONSTRAINT msz1 CHECK(comm IS NULL AND sal > 2000 OR sal <= 2000); A tábla módosítva. INSERT INTO dolgozó VALUES(2020,'POTYKA1','MANAGER',7788,' ',3400,222,20); INSERT INTO dolgozó VALUES(1010,'POTYKA2','STUDENT',7788,' ',1200,555,20); SELECT * FROM dolgozó; ROLLBACK; SELECT * FROM dolgozó; INSERT INTO dolgozó * Hiba a(z) 1. sorban: ORA-02290: ellenőrző megszorítás (SCOTT.MSZ1) megsértése 1 sor létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO WARD SALESMAN 1981.február JAMES CLERK 1981.december TURNER SALESMAN 1981.szeptember ALLEN SALESMAN 1981.február MARTIN SALESMAN 1981.szeptember SCOTT ANALYST 1987.április FORD ANALYST 1981.december SMITH CLERK december MILLER CLERK 1982.január POTYKA2 STUDENT sor kijelölve. A visszaállítás befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO WARD SALESMAN 1981.február JAMES CLERK 1981.december TURNER SALESMAN 1981.szeptember ALLEN SALESMAN 1981.február MARTIN SALESMAN 1981.szeptember SCOTT ANALYST 1987.április FORD ANALYST 1981.december SMITH CLERK december MILLER CLERK 1982.január sor kijelölve. #11_SQL Feladatgyűjtemény (30)
97 C3. Feladat Bővítse a dolgozó táblát egy jutalom oszloppal, és töltse fel ezt a következő módon: A három legkisebb fizetésű dolgozó kapja meg egyszeri jutalomként a fizetésének 20 %-át, a három legnagyobb fizetésű a fizetésének 5 %-át, a többiek pedig a fizetésük 10 %-át. Ha valamelyik dolgozóra több feltétel is teljesül, akkor a legkisebbnek megfelelő jutalmat kapja. Megoldás ALTER TABLE dolgozó ADD jutalom NUMBER(4); A tábla módosítva. -- Módosítás-1 (A kisfizetésűek jutalmazása) -- A növekvő fizetés-sorrend nézettáblája (a kis fizetések elöl): CREATE OR REPLACE VIEW SorrendKICSI AS SELECT sal AS fizetés, ROWNUM AS sorszám FROM (SELECT DISTINCT sal FROM dolgozó ORDER BY sal ASC); SELECT * FROM SorrendKICSI; A nézet létrejött. FIZETÉS SORSZÁM sor kijelölve. -- A növekvő fizetés-sorrendhez tartozó dolgozók azonosítói (a kis fizetésűek elöl): CREATE OR REPLACE VIEW Sorrendazonosító1 AS SELECT empno, sorszám, fizetés FROM dolgozó, SorrendKICSI WHERE sal IN (SELECT sal FROM SorrendKICSI) AND SorrendKICSI.fizetés = dolgozó.sal; SELECT * FROM Sorrendazonosító1; A nézet létrejött. EMPNO SORSZÁM FIZETÉS sor kijelölve. -- A kisfizetésűek jutalmazása: UPDATE dolgozó #11_SQL Feladatgyűjtemény (30)
98 SET jutalom = sal * 0.2 WHERE empno IN (SELECT empno FROM Sorrendazonosító1 WHERE sorszám <= 3); SELECT * FROM dolgozó; 4 sor módosítva. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM WARD SALESMAN 1981.február JAMES CLERK 1981.december TURNER SALESMAN 1981.szeptember ALLEN SALESMAN 1981.február MARTIN SALESMAN 1981.szeptember SCOTT ANALYST 1987.április FORD ANALYST 1981.december SMITH CLERK december MILLER CLERK 1982.január sor kijelölve. -- Módosítás-2 (A nagyfizetésűek jutalmazása) -- A csökkenő fizetés-sorrend nézettáblája (a nagy fizetések elöl): CREATE OR REPLACE VIEW SorrendNagy AS SELECT sal AS fizetés, ROWNUM AS sorszám FROM (SELECT DISTINCT sal FROM dolgozó ORDER BY sal DESC); SELECT * FROM SorrendNagy; A nézet létrejött. FIZETÉS SORSZÁM sor kijelölve. -- A csökkenő fizetés-sorrendhez tartozó dolgozók azonosítói (a nagy fizetésűek elöl): CREATE OR REPLACE VIEW Sorrendazonosító2 AS SELECT empno, sorszám, fizetés FROM dolgozó, SorrendNagy WHERE sal IN (SELECT sal FROM SorrendNagy) AND SorrendNagy.fizetés = dolgozó.sal; SELECT * FROM Sorrendazonosító2; A nézet létrejött. EMPNO SORSZÁM FIZETÉS #11_SQL Feladatgyűjtemény (30)
99 9 sor kijelölve. -- A nagyfizetésűek jutalmazása: UPDATE dolgozó SET jutalom = sal * 0.05 WHERE empno IN ((SELECT empno FROM sorrendazonosító2 WHERE sorszám <= 3) MINUS (SELECT empno FROM sorrendazonosító1 WHERE sorszám <= 3)); SELECT * FROM dolgozó; 4 sor módosítva. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM WARD SALESMAN 1981.február JAMES CLERK 1981.december TURNER SALESMAN 1981.szeptember ALLEN SALESMAN 1981.február MARTIN SALESMAN 1981.szeptember SCOTT ANALYST 1987.április FORD ANALYST 1981.december SMITH CLERK december MILLER CLERK 1982.január sor kijelölve. -- Módosítás-3 (A többiek jutalmazása) UPDATE dolgozó SET jutalom = sal * 0.1 WHERE jutalom IS NULL; SELECT * FROM dolgozó; 1 sor módosítva. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO JUTALOM WARD SALESMAN 1981.február JAMES CLERK 1981.december TURNER SALESMAN 1981.szeptember ALLEN SALESMAN 1981.február MARTIN SALESMAN 1981.szeptember SCOTT ANALYST 1987.április FORD ANALYST 1981.december SMITH CLERK december MILLER CLERK 1982.január sor kijelölve. #11_SQL Feladatgyűjtemény (30)
100 C4. Feladat Listázza formázva (fej-, és lábléccel, stb.) a dolgozók nevét, munkakörét, részlegének nevét, a jutalmat is tartalmazó összjövedelmét, a főnökének nevét, és annak telephelyét elsődlegesen a részleg neve szerint növekvően, másodlagosan a összjövedelem szerint csökkenő módon rendezve. Ha egy dolgozónak nincs főnöke, akkor a főnök adatainak helyére írja ki, hogy "nincs főnök". Megoldás SET verify OFF SET pagesize 19 SET linesize 82 SET feedback OFF BREAK ON ReszlegNev TTITLE 'Dolgozók adatainak nyilvántartása' BTITLE 'Budapesti Műszaki Főiskola' COLUMN DolgozoNeve HEADING 'A dolgozó neve' FORMAT A15 COLUMN Munkakor HEADING 'A dolgozó munkaköre' FORMAT A10 COLUMN ReszlegNev HEADING 'A dolgozó részlege' FORMAT A12 COLUMN OsszJov HEADING 'A dolgozó összjövedelme' JUSTIFY RIGHT COLUMN FonokNeve HEADING 'A főnök neve' FORMAT A15 COLUMN FonokTelep HEADING 'A főnök telephelye' FORMAT A12 SELECT d.ename AS DolgozoNeve, d.job AS Munkakor, dr.dname AS ReszlegNev, d.sal+nvl(d.comm,0)+d.jutalom AS OsszJov, NVL(f.ename,'nincs főnök') AS FonokNeve, NVL(fr.loc,'nincs főnök') AS FonokTelep FROM dolgozó d, dolgozó f, részleg7 dr, részleg7 fr WHERE d.mgr = f.empno(+) AND d.deptno = dr.deptno AND f.deptno = fr.deptno(+) ORDER BY FonokNeve ASC, OsszJov DESC; SET verify ON SET pagesize 40 SET linesize 400 SET feedback ON TTITLE OFF BTITLE OFF CLEAR BREAKS CLEAR COLUMNS V. Nov. 20 lap 1 Dolgozók adatainak nyilvántartása A dolgozó A dolgozó A dolgozó A dolgozó A főnök A főnök neve munkaköre részlege összjövedelme neve telephelye SMITH CLERK RESEARCH 960 FORD DALLAS SCOTT ANALYST 3150 nincs főnök nincs főnök FORD ANALYST 3150 nincs főnök nincs főnök MARTIN SALESMAN SALES 2900 nincs főnök nincs főnök WARD SALESMAN 2000 nincs főnök nincs főnök ALLEN SALESMAN 1980 nincs főnök nincs főnök TURNER SALESMAN 1575 nincs főnök nincs főnök MILLER CLERK ACCOUNTING 1430 nincs főnök nincs főnök JAMES CLERK SALES 1140 nincs főnök nincs főnök Budapesti Műszaki Főiskola #11_SQL Feladatgyűjtemény (30)
101 8. Foglalkozás Adatbázis-adminisztrátori ismeretek, Jogosultságkezelés Részletesebben lásd [2]: 11. fejezet FELADATGYŰJTEMÉNY 8.1. Feladat Biztosítsa, hogy egy "Melós" létrehozhasson adattáblát, ám egy "Főnök" csak lekérdezhesse azt. Mindezt olymódon valósítsa meg szerepkörök felhasználásával, hogy azok utólagos objektumkezelési jogokkal való kiegészítésére NE legyen szükség. #11_SQL Feladatgyűjtemény (30)
102 MEGOLDÁSGYŰJTEMÉNY 8.1. Feladat Biztosítsa, hogy egy "Melós" létrehozhasson adattáblát, ám egy "Főnök" csak lekérdezhesse azt. Mindezt olymódon valósítsa meg szerepkörök felhasználásával, hogy azok utólagos objektumkezelési jogokkal való kiegészítésére NE legyen szükség. Megoldás -- Adminisztrátor.sql PROMPT Kapcsolódás Rendszergazdaként: CONNECT sys/rendszergazda AS SYSDBA PROMPT Nagytakarítás: DROP USER MelósLajos CASCADE; DROP USER FőnökArnold; -- DROP TABLE leltár; DROP TABLESPACE Raktár; DROP ROLE MelósJog; DROP ROLE FőnökJog; PROMPT A MelósJog szerepkör létrehozása: CREATE ROLE MelósJog; GRANT CREATE SESSION, CREATE TABLE TO MelósJog; PROMPT A FőnökJog szerepkör létrehozása: CREATE ROLE FőnökJog; GRANT CREATE SESSION, SELECT ANY TABLE TO FőnökJog; PROMPT Táblaterület létrehozása: CREATE TABLESPACE Raktár DATAFILE 'C:\#Raktár.dat' SIZE 10 M REUSE; PROMPT Egy Melós (MelósLajos) felhasználó létrehozása, és PROMPT a MelósJog hozzárendelése: CREATE USER MelósLajos IDENTIFIED BY kispénz DEFAULT TABLESPACE Raktár TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON Raktár; GRANT MelósJog TO MelósLajos; PROMPT Egy Főnök (FőnökArnold) felhasználó létrehozása, és PROMPT a FőnökJog hozzárendelése: CREATE USER FőnökArnold IDENTIFIED BY nagypénz; GRANT FőnökJog TO FőnökArnold; #11_SQL Feladatgyűjtemény (30)
103 PROMPT Kapcsolódás MelósLajosként: CONNECT MelósLajos/kispénz; PROMPT A leltár tábla létrehozása, feltöltése adattal és lekérdezése: CREATE TABLE leltár (név VARCHAR(8), költség NUMBER); INSERT INTO leltár VALUES('spakni',15); INSERT INTO leltár VALUES('pajszer',120); INSERT INTO leltár VALUES('vödör', 87); SELECT * FROM leltár; -- PROMPT A MelósJog szerepkör utólagos kiegészítése -- PROMPT a leltár tábla "MINDEN" objektumkezelési jogával: -- GRANT ALL -- ON leltár -- TO MelósJog; -- PROMPT A FőnökJog szerepkör utólagos kiegészítése -- PROMPT a leltár tábla "LEKÉRDEZÉS" objektumkezelési jogával: -- GRANT SELECT -- ON leltár -- TO FőnökJog; PROMPT A Főnök jogainak ellenőrzése: PROMPT 1. kapcsolódás Főnökként PROMPT 2. a leltár tábla lekérdezése PROMPT 3. a leltár tábla törlésének kisérlete CONNECT FőnökArnold/nagypénz; SELECT * FROM MelósLajos.leltár; DROP TABLE MelósLajos.leltár; PROMPT A Melós jogainak ellenőrzése: PROMPT 1. kapcsolódás Melósként PROMPT 2. a leltár tábla lekérdezése PROMPT 3. a leltár tábla törlése CONNECT MelósLajos/kispénz; SELECT * FROM MelósLajos.leltár; DROP TABLE MelósLajos.leltár; Eredmény Kapcsolódás Rendszergazdaként: Kapcsolódva. Nagytakarítás: A felhasználó eldobva. A felhasználó eldobva. A táblaterület eldobva. A szerepkör eldobva. A szerepkör eldobva. A MelósJog szerepkör létrehozása: A szerepkör létrejött. Az engedélyezés sikeresen befejeződött. A FőnökJog szerepkör létrehozása: A szerepkör létrejött. Az engedélyezés sikeresen befejeződött. Táblaterület létrehozása: A táblaterület létrejött. Egy Melós (MelósLajos) felhasználó létrehozása, és a MelósJog hozzárendelése: A felhasználó létrejött. #11_SQL Feladatgyűjtemény (30)
104 Az engedélyezés sikeresen befejeződött. Egy Főnök (FőnökArnold) felhasználó létrehozása, és a FőnökJog hozzárendelése: A felhasználó létrejött. Az engedélyezés sikeresen befejeződött. Kapcsolódás MelósLajosként: Kapcsolódva. A leltár tábla létrehozása, feltöltése adattal és lekérdezése: A tábla létrejött. 1 sor létrejött. 1 sor létrejött. 1 sor létrejött. NÉV KÖLTSÉG spakni 15 pajszer 120 vödör 87 3 sor kijelölve. A Főnök jogainak ellenőrzése: 1. kapcsolódás Főnökként 2. a leltár tábla lekérdezése 3. a leltár tábla törlésének kisérlete Kapcsolódva. NÉV KÖLTSÉG spakni 15 pajszer 120 vödör 87 3 sor kijelölve. DROP TABLE MelósLajos.leltár * Hiba a(z) 1. sorban: ORA-01031: nincs megfelelő jogosultsága A Melós jogainak ellenőrzése: 1. kapcsolódás Melósként 2. a leltár tábla lekérdezése 3. a leltár tábla törlése Kapcsolódva. NÉV KÖLTSÉG spakni 15 pajszer 120 vödör 87 3 sor kijelölve. A tábla eldobva. #11_SQL Feladatgyűjtemény (30)
105 1. Melléklet Árnyék-objektumok M1. Példa Az alábbiakban az azonos nevű nézettáblák és adattáblák használatának konfliktusát mutatjuk be. Megoldás 1. lépés (Egy egyszerű nézettábla létrehozása) CREATE OR REPLACE VIEW dolgozó AS SELECT * ; A nézet létrejött. 2. lépés (Egy adattábla törlésének kisérlete) DROP TABLE dolgozó; DROP TABLE dolgozó * Hiba a(z) 1. sorban: ORA-00942: a tábla vagy a nézet nem létezik 3. lépés (Egy egyszerű adattábla létrehozásának kisérlete) CREATE TABLE dolgozó AS SELECT * ; CREATE TABLE dolgozó * Hiba a(z) 1. sorban: ORA-00955: ez a név egy létező objektum neve Megjegyzés Ha az 1. lépésről nem tudunk, akkor a 2. lépésbeli tábla-törlési kisérlet hibaüzenetéből úgy gondolhatjuk, hogy a dolgozó adattáblát nyugodtan létrehozhatjuk, hiszen ilyen néven "tábla vagy a nézet nem létezik". Ám a 3. lépés adattábla-létrehozási kisérletének kudarca jelzi, hogy valami baj van. Mi a megoldás? Le kell kérdeznünk a felhasználó objektumait! 4. lépés (Az Objektum katalógus lekérdezése) SELECT * FROM user_catalog; TABLE_NAME TABLE_TYPE BONUS TABLE SALGRADE TABLE BIN$qsoIO/yYT+qL9ocOnn94Rg==$0 TABLE DOLGOZÓ VIEW BIN$HRjtpgeGS7+61D7GZeNSSQ==$0 TABLE BIN$0ySrJpEOQHSFkvoBFw6ReQ==$0 TABLE BIN$QUd8b6c8T7SJiG7sviD5MA==$0 TABLE BIN$wZ9aIlWzRSC4P2K5pQ3eKg==$0 TABLE BIN$HHROi1ZzTAiUFU2gOs6BLw==$0 TABLE BIN$rrM8+xqJRoaXI1dcG8hqWA==$0 TABLE BIN$dtyJYaRQQ4OXGTMY44AILQ==$0 TABLE BIN$Hl6MRiGSRA6TUyMVFn5z9g==$0 TABLE EMP TABLE BIN$HLIO/j11SWqL0BHKSp4V+w==$0 TABLE #11_SQL Feladatgyűjtemény (30)
106 DEPT TABLE BIN$KWlSQ3NGQaiZkLDahyGHwQ==$0 TABLE BIN$7cWjDm8CRnugRC8rQ77uUw==$0 TABLE BIN$pXLoaD9sSe+Fx6GcQsyHPQ==$0 TABLE BIN$5dNOHAlIQmuYbN3jR8dccw==$0 TABLE BIN$hgQH12k6RuCb2pwVQ+9Ltg==$0 TABLE BIN$II2W0au8QOOSymSJ0muaPA==$0 TABLE BIN$XbtNKE6HTFukOnNFtLFTdA==$0 TABLE BIN$TtGlSmVqRkWZCb6p1pP+uQ==$0 TABLE BIN$XVGyLrBDRHuKt308WBtVLQ==$0 TABLE BIN$VbjAbu/9Sr2c7nMFAzvJrg==$0 TABLE BIN$73zYMWXFRha13wlB6hImrg==$0 TABLE BIN$mO044dDIRsamltwvO/nZdw==$0 TABLE BIN$uqFCSi9FRaiJwBpKdjbVlg==$0 TABLE BIN$gSUkFqw0RVuWopgEWWrQZw==$0 TABLE BIN$ZUHVJm4xQnKApRdcO728fg==$0 TABLE BIN$COV8HJ2xR7q1aydEwgg2pQ==$0 TABLE BIN$l6w9tXgIQ/Cr8Ru/yANcsA==$0 TABLE BIN$DaWFiVKyT5COozYE8aGUYg==$0 TABLE BIN$je3xJCYDRRaJJ1g21MRTnQ==$0 TABLE RÉSZLEG TABLE 35 sor kijelölve. Megjegyzés Ha szeretnénk a számunkra érdektelen rendszer-objektumokat kihagyni a listából, akkor az Objektum katalógust az alábbi módon kérdezzük le: SELECT * FROM user_catalog WHERE UPPER(TABLE_NAME) NOT LIKE '%BIN%'; TABLE_NAME TABLE_TYPE BONUS TABLE DEPT TABLE DOLGOZÓ VIEW EMP TABLE FONOKOK VIEW RÉSZLEG TABLE SALGRADE TABLE 7 sor kijelölve. 5. lépés (Az alkalmatlan nézettábla törlése) DROP VIEW dolgozó; A nézet eldobva. 6. lépés (Az adattábla létrehozásának kisérlete) CREATE TABLE dolgozó AS SELECT * ; A tábla létrejött. Megjegyzés Sikerült...! #11_SQL Feladatgyűjtemény (30)
107 2. Melléklet Hierarchikus szerkezetű adattáblák feldolgozása M2.1. Példa Határozza meg az emp tábla hierarchia szintjeinek számát. Megoldás SET numwidth 5 SELECT LEVEL AS "HierarchiaSzint", empno AS "FőnökAzon", ename AS "FőnökNév" CONNECT BY mgr = PRIOR empno START WITH UPPER(job) = 'PRESIDENT'; HierarchiaSzint FőnökAzon FőnökNév KING JONES SCOTT ADAMS FORD SMITH BLAKE ALLEN WARD MARTIN TURNER JAMES CLARK MILLER 14 sor kijelölve. M2.2. Példa Listázza az emp táblabeli főnököket és a beosztottjaikat. Megoldás SET numwidth 5 -- Négyszintű beosztási hierarchia -- (Külső öszekapcsolás alkalmazása esetén) CREATE OR REPLACE VIEW Beo AS SELECT B1.empno AS empno1, B2.empno AS empno2, B3.empno AS empno3, B4.empno AS empno4 B1, emp B2, emp B3, emp B4 WHERE B1.empno (+) = B2.mgr AND B2.empno (+) = B3.mgr AND B3.empno (+) = B4.mgr; SELECT * FROM Beo; EMPNO1 EMPNO2 EMPNO3 EMPNO #11_SQL Feladatgyűjtemény (30)
108 Négyszintű beosztási hierarchia elemi nézetei (Beo1, Beo2, Beo3) -- (A beosztottaknál nem kell külső öszekapcsolás) CREATE OR REPLACE VIEW Beo1 AS SELECT UPPER(B1.ename) AS Főnök, UPPER(B2.ename) AS Beosztott B1, emp B2 WHERE B1.empno = B2.mgr; SELECT * FROM Beo1; CREATE OR REPLACE VIEW Beo2 AS SELECT UPPER(B1.ename) AS Főnök, UPPER(B3.ename) AS Beosztott B1, emp B2, emp B3 WHERE B1.empno = B2.mgr AND B2.empno = B3.mgr; SELECT * FROM Beo2; CREATE OR REPLACE VIEW Beo3 AS SELECT UPPER(B1.ename) AS Főnök, UPPER(B4.ename) AS Beosztott B1, emp B2, emp B3, emp B4 WHERE B1.empno = B2.mgr AND B2.empno = B3.mgr AND B3.empno = B4.mgr; SELECT * FROM Beo3; -- Négyszintű beosztási hierarchia az elemi nézetek alapján CREATE OR REPLACE VIEW Beo AS SELECT B.Főnök, B.Beosztott FROM ((SELECT * FROM Beo1) UNION (SELECT * FROM Beo2) UNION (SELECT * FROM Beo3)) B; SELECT * FROM Beo; FŐNÖK BEOSZTOTT BLAKE ALLEN BLAKE JAMES BLAKE MARTIN BLAKE TURNER BLAKE WARD CLARK MILLER FORD SMITH JONES ADAMS JONES FORD JONES SCOTT JONES SMITH KING ADAMS KING ALLEN KING BLAKE #11_SQL Feladatgyűjtemény (30)
109 KING KING KING KING KING KING KING KING KING KING SCOTT CLARK FORD JAMES JONES MARTIN MILLER SCOTT SMITH TURNER WARD ADAMS -- Például a King beosztottjai: SELECT * FROM Beo WHERE UPPER(Főnök) = UPPER('King'); FŐNÖK BEOSZTOTT KING ADAMS KING ALLEN KING BLAKE KING CLARK KING FORD KING JAMES KING JONES KING MARTIN KING MILLER KING SCOTT KING SMITH KING TURNER KING WARD M2.3. Példa Listázza az emp táblabeli főnököket a beosztottai összfizetése szerint csökkenő sorrendben. Megoldás 1. lépés (A King beosztottjainak átlagfizetése) COLUMN Fonok FORMAT A8 HEADING 'Főnök' JUSTIFY LEFT SELECT UPPER('King') AS Fonok, ROUND(AVG(sal)) AS BeoÁtlFiz, Beo WHERE UPPER(emp.ename) = UPPER(Beo.Beosztott) AND UPPER(Beo.Főnök) = UPPER('King'); CLEAR COLUMNS Főnök BEOÁTLFIZ KING lépés (A King beosztottjainak összfizetése) COLUMN Fonok FORMAT A8 HEADING 'Főnök' JUSTIFY LEFT COLUMN BeoOsszFiz FORMAT HEADING 'BeoÖsszFiz' SELECT UPPER('King') AS Fonok, SUM(sal) AS BeoOsszFiz, Beo WHERE UPPER(emp.ename) = UPPER(Beo.Beosztott) AND UPPER(Beo.Főnök) = UPPER('King'); CLEAR COLUMNS Főnök BeoÖsszFiz KING #11_SQL Feladatgyűjtemény (30)
110 3. lépés (A MEGOLDÁS: A főnökök csoportosítása a beosztottjaik összfizetése szerint) COLUMN Fonok FORMAT A8 HEADING 'Főnök' JUSTIFY LEFT COLUMN BeoOsszFiz FORMAT HEADING 'BeoÖsszFiz' SELECT Beo.Főnök AS Fonok, SUM(D.sal) AS BeoOsszFiz D, emp F, Beo WHERE D.mgr = F.empno AND D.ename = Beo.Beosztott GROUP BY Beo.Főnök ORDER BY BeoOsszFiz DESC; CLEAR COLUMNS Főnök BeoÖsszFiz KING JONES 7900 BLAKE 6550 CLARK 1300 SCOTT 1100 FORD sor kijelölve. #11_SQL Feladatgyűjtemény (30)
111 IRODALOM [1] Kende M. Kotsis D. Nagy I.: Adatbázis-kezelés az Oracle-rendszerben, Panem, [2] Kende M. Nagy I.: Oracle Példatár (SQL, PL/SQL), Panem, #11_SQL Feladatgyűjtemény (30)
Adatbázis használat I. 2. gyakorlat
Adatbázis használat I. 2. gyakorlat Tudnivalók Oracle 10g a weben: http://www.oracle.com/technetwork/databa se/database10g/downloads/index.html FF kiírásokat legkésőbb a jövő hétre hozni! 2011. 02. 15.
KENDE MÁRIA NAGY ISTVÁN: Oracle Példatár(SQL-PL/SQL) Házi feladatok a 3.gyakorlathoz: 1. fejezet: Egyszerű lekérdezések
KENDE MÁRIA NAGY ISTVÁN: Oracle Példatár(SQL-PL/SQL) Házi feladatok a 3.gyakorlathoz: 1. fejezet: Egyszerű lekérdezések 1.1. Feladat Listázza ki a 20-as részleg dolgozóinak nevét, belépési idejét, foglalkozását
Adatbázis használat I. 2. gyakorlat
Adatbázis használat I. 2. gyakorlat Tudnivalók Oracle 10g a weben: http://www.oracle.com/technetwork/database/ database10g/downloads/index.html Egyéb letöltési lehetőség: http://jerry.gorextar.hu/ab1/oracle/
1.1. Feladat Listázza ki a 20-as részleg dolgozóinak nevét, belépési idejét, foglalkozását a nevek szerint csökkenően rendezve.
SELECT * ; SELECT * FROM dept; 1.1. Feladat Listázza ki a 20-as részleg dolgozóinak nevét, belépési idejét, foglalkozását a nevek szerint csökkenően rendezve. SELECT ename, hiredate, job WHERE deptno=20
Adatbázis használat I. 1. gyakorlat
Adatbázis használat I. 1. gyakorlat Tudnivalók Nagy Gabriella [email protected] BA. 306. szoba www.orakulum.com => Adatbázis-kezelés => AKT (Adatbázis-Kezelés Technológiája) 2011. 02. 08.
2007. február 25. TARTALOM
KENDE MÁRIA - NAGY ISTVÁN ANALITIKUS SQL FELADATGYŰJTEMÉNY TARTALOM 9. Foglalkozás Részletező csoportosítások... 2 10. Foglalkozás Analitikus függvények... 5 Melléklet A ROW_NUMBER szintaktikája... 10
Oracle Példatár (SQL-PL/SQL)
KENDE MÁRIA NAGY ISTVÁN Oracle Példatár (SQL-PL/SQL) (FELADATGYŰJTEMÉNY) PANEM Tartalomjegyzék KENDE MÁRIA NAGY ISTVÁN...1 Oracle Példatár (SQL-PL/SQL)...1 PANEM...1 Tartalomjegyzék...2 1. fejezet...4
ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT
ÓBUDAI EGYETEM Neumann János Informatikai Kar Nappali Tagozat ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT NÉV: MÁK VIRÁG NEPTUN KÓD: A DOLGOZAT CÍME: Jani bácsi székadatbázisa Beadási határidő: 14. oktatási hét
Adatbázis-kezelés. alapfogalmak
Adatbázis-kezelés alapfogalmak Témakörök Alapfogalmak Adatmodellek Relációalgebra Normalizálás VÉGE Adatbázis-kezelő rendszer Database Management System - DBMS Integrált programcsomag, melynek funkciói:
NORMALIZÁLÁS. Funkcionális függés Redundancia 1NF, 2NF, 3NF
NORMALIZÁLÁS Funkcionális függés Redundancia 1NF, 2NF, 3NF FUNKCIONÁLIS FÜGGŐSÉG Legyen adott R(A 1,, A n ) relációséma, valamint P, Q {A 1,, A n } (magyarán P és Q a séma attribútumainak részhalmazai)
Adatbáziskezelés. Indexek, normalizálás NZS 1
Adatbáziskezelés Indexek, normalizálás NZS 1 Fáljszervezés módjai Soros elérés: a rekordok a fájlban tetszőleges sorrendben, például a felvitel sorrendjében helyezkednek el. A rekord azonosítója vagyis
ADATBÁZIS HASZNÁLAT I. 4. gyakorlat
ADATBÁZIS HASZNÁLAT I. 4. gyakorlat Figyelem!!! A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele a minimum elégséges érdemjegynek!
AB1 ZH mintafeladatok. 6. Minősítse az állításokat! I-igaz, H-hamis
AB1 ZH mintafeladatok 1. Töltse ki, és egészítse ki! Matematikai formalizmus arra, hogy hogyan építhetünk új relációkat a régi relációkból. Az adatoknak egy jól strukturált halmaza, amelyből információ
Adatmodellezés. 1. Fogalmi modell
Adatmodellezés MODELL: a bonyolult (és időben változó) valóság leegyszerűsített mása, egy adott vizsgálat céljából. A modellben többnyire a vizsgálat szempontjából releváns jellemzőket (tulajdonságokat)
Adatbázisok gyakorlat
Adatbázisok gyakorlat 4. gyakorlat Adatmodellezés II Relációs adatbázisséma készítése E-K modellből Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Közérdekű Honlap: http://antalgabor.hu
6. Gyakorlat. Relációs adatbázis normalizálása
6. Gyakorlat Relációs adatbázis normalizálása Redundancia: Az E-K diagramok felírásánál vagy az átalakításnál elképzelhető, hogy nem az optimális megoldást írjuk fel. Ekkor az adat redundáns lehet. Példa:
BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei
1. Mi az elsődleges következménye a gyenge logikai redundanciának? inkonzisztencia veszélye felesleges tárfoglalás feltételes függés 2. Az olyan tulajdonság az egyeden belül, amelynek bármely előfordulása
INFORMATIKA ÁGAZATI ALKALMAZÁSAI. Az Agrármérnöki MSc szak tananyagfejlesztése TÁMOP-4.1.2-08/1/A-2009-0010
INFORMATIKA ÁGAZATI ALKALMAZÁSAI Az Agrármérnöki MSc szak tananyagfejlesztése TÁMOP-4.1.2-08/1/A-2009-0010 2. Adatbáziskezelés eszközei Adatbáziskezelés feladata Adatmodell típusai Relációs adatmodell
ADATBÁZIS-KEZELÉS. Relációs modell
ADATBÁZIS-KEZELÉS Relációs modell Relációséma neve attribútumok ORSZÁGOK Azon Ország Terület Lakosság Főváros Földrész 131 Magyarország 93036 10041000 Budapest Európa 3 Algéria 2381740 33769669 Algír Afrika
Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER
Adatbázisok I 1 SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER Módosítás: DML: - rekord felvitel INSERT - rekord törlés
Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17
Adatbázisok 8. gyakorlat SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT 2015. október 26. 2015. október 26. Adatbázisok 1 / 17 SQL nyelv Structured Query Language Struktúrált lekérdez
ADATBÁZISOK gyakorlat: SQL 2. rész SELECT
ADATBÁZISOK 9-10. gyakorlat: SQL 2. rész SELECT SELECT utasítás általános alakja SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel] [GROUP BY oszloplista [HAVING feltétel] ] [ORDER BY oszloplista];
Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14
Adatbázisok 9. gyakorlat SQL: SELECT 2015. október 26. 2015. október 26. Adatbázisok 1 / 14 SQL SELECT Lekérdezésre a SELECT utasítás szolgál, mely egy vagy több adattáblából egy eredménytáblát állít el
Adatbázisok I. Jánosi-Rancz Katalin Tünde 327A 1-1
Adatbázisok I. 5 Jánosi-Rancz Katalin Tünde [email protected] 327A 1-1 Normalizálás logikai adatbázis megtervezésére szolgáló módszer táblázat szétbontó relációs műveletek sorozata, eredményeképpen
7. előadás. Karbantartási anomáliák, 1NF, 2NF, 3NF, BCNF. Adatbázisrendszerek előadás november 3.
7. előadás,,,, Adatbázisrendszerek előadás 2008. november 3. és Debreceni Egyetem Informatikai Kar 7.1 relációs adatbázisokhoz Mit jelent a relációs adatbázis-tervezés? Az csoportosítását, hogy jó relációsémákat
RELÁCIÓS ADATBÁZISSÉMÁK. Egyed-kapcsolat modellről átírás
RELÁCIÓS ADATBÁZISSÉMÁK Egyed-kapcsolat modellről átírás A RELÁCIÓS ADATMODELL Az adatokat egyszerűen reprezentálja: kétdimenziós adattáblákban Minden sor azonos számú oszlopból áll; egy sor egy rekord,
Adatbázis-lekérdezés. Az SQL nyelv. Makány György
Adatbázis-lekérdezés Az SQL nyelv Makány György SQL (Structured Query Language=struktúrált lekérdező nyelv): relációs adatbázisok adatainak visszakeresésére, frissítésére, kezelésére szolgáló nyelv. Születési
Adatbázis rendszerek Ea: A rendes állapot. Normalizálás
Adatbázis rendszerek 1. 3. Ea: A rendes állapot Normalizálás 19/1 B ITv: MAN 2015.09.08 Normalizálás A normalizálás az adatbázis belső szerkezetének ellenőrzése, lépésenkénti átalakítása oly módon, hogy
Csima Judit október 24.
Adatbáziskezelés Funkcionális függőségek Csima Judit BME, VIK, Számítástudományi és Információelméleti Tanszék 2018. október 24. Csima Judit Adatbáziskezelés Funkcionális függőségek 1 / 1 Relációs sémák
Adatbázisok elmélete 12. előadás
Adatbázisok elmélete 12. előadás Katona Gyula Y. Budapesti Műszaki és Gazdaságtudományi Egyetem Számítástudományi Tsz. I. B. 137/b [email protected] http://www.cs.bme.hu/ kiskat 2005 ADATBÁZISOK ELMÉLETE
Relációs adatbázisok tervezése ---2
Relációs adatbázisok tervezése ---2 Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 3.2.8. Funkcionális függ-ek vetítése 3.3.3. Boyce-Codd normálforma 3.3.4.
Adatbázis, adatbázis-kezelő
Adatbázisok I. rész Adatbázis, adatbázis-kezelő Adatbázis: Nagy adathalmaz Közvetlenül elérhető háttértárolón (pl. merevlemez) Jól szervezett Osztott Adatbázis-kezelő szoftver hozzáadás, lekérdezés, módosítás,
Adatbázisok gyakorlat
Adatbázisok gyakorlat 5. gyakorlat Adatmodellezés III/IV Funkcionális függés, redundancia. Normalizálás Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Funkcionális függés
Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2
Tartalomjegyzék Tartalomjegyzék 1 Az SQL nyelv 1 Az SQL DDL alapjai 2 Adatbázis parancsok 2 Táblaparancsok 2 A táblázat létrehozása 2 A táblázat módosítása 3 A tábla törlése 3 Indextábla létrehozása 3
SQL DDL-2 (aktív elemek) triggerek
SQL DDL-2 (aktív elemek) triggerek Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 7.fej.: Megszorítások és triggerek 7.4. Önálló megszorítások 7.5. Triggerek
Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.
Adatbázis létrehozása Adatleíró műveletek CREATE DATABASE "tan1" WITH ENCODING= LATIN2 ; vagy parancssorból a terminál alatt $ createdb tan1 E=latin2 Kapcsolódás az adatbázishoz $ psql tan1 Adattábla létrehozása
SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák
SQL Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák A SELECT UTASÍTÁS ÁLTALÁNOS ALAKJA (ISM.) SELECT [DISTINCT] megjelenítendő oszlopok FROM táblá(k direkt szorzata) [WHERE feltétel]
SELECT DISTINCT deptno FROM emp; (distinct) SELECT STATEMENT HASH UNIQUE TABLE ACCESS FULL EMP
SELECT * FROM emp; SELECT ename FROM emp; (projekció) SELECT ename FROM emp WHERE ename='jones'; (szelekció) ------------------------------------------ SELECT DISTINCT deptno FROM emp; (distinct) --------------------------------
SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére
SQL PÉLDATÁR készült a PTE TTK Iskolai informatika III. kurzus teljesítésére PTE TTK Czimmermann Gergely MA matematika informatika tanár szakos hallgató 2017 Tartalomjegyzék 1. Adatleíró műveletek... 3
Többtáblás lekérdezések megjelenítése
Többtáblás lekérdezések megjelenítése Célkitűzés Egynél több táblának egyenlőségen vagy nem-egyenlőségen alapuló összekapcsolást végző SELECT utasítások írása. Egy táblának önmagával történő összekapcsolása.
ADATBÁZISOK I. Az esetleges hibákat kérlek a [email protected] címen jelezd! Utolsó módosítás: 2013. március 20.
ADATBÁZISOK I. Szerkesztette: Bókay Csongor Az esetleges hibákat kérlek a [email protected] címen jelezd! Utolsó módosítás: 2013. március 20. Ez a Mű a Creative Commons Nevezd meg! - Ne add el!
Bevezetés: az SQL-be
Bevezetés: az SQL-be Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 2.3. Relációsémák definiálása SQL-ben, adattípusok, kulcsok megadása 02B_BevSQLsemak
Adatbázis rendszerek Ea: A rendes állapot. Normalizálás
Adatbázis rendszerek 1. 3. Ea: A rendes állapot Normalizálás 1/31 B ITv: MAN 2017.10.08 Normalizálás A normalizálás az adatbázis belső szerkezetének ellenőrzése, lépésenkénti átalakítása oly módon, hogy
Adatbázis Rendszerek II. 3. SQL alapok
Adatbázis Rendszerek II. 3. SQL alapok 22/1 B IT v: 2016.10.20 MAN Oracle adattípusok Szöveges adattípusok CHAR (1-2000) VARCHAR (1-4000) VARCHAR2 (1-4000, nemzeti karakterekhez) CLOB (max. 8 TB) NCLOB
KOVÁCS BÉLA, MATEMATIKA I.
KOVÁCS BÉLA, MATEmATIkA I. 4 IV. FÜGGVÉNYEk 1. LEkÉPEZÉSEk, függvények Definíció Legyen és két halmaz. Egy függvény -ből -ba egy olyan szabály, amely minden elemhez pontosan egy elemet rendel hozzá. Az
2006. május 1. TARTALOM
KENDE MÁRIA - NAGY ISTVÁN PL/SQL FELADATGYŰJTEMÉNY TARTALOM 9. Foglalkozás Hivatkozási és összetett adattípusok, kurzor, ROWID... 2 10. Foglalkozás Összefoglaló feladatok... 11 Melléklet Dinamikus SQL...
Több felhasználó párhuzamosan olvashatja, bővítheti, módosíthatja és törölheti az adatokat Az adatok konzisztenciájának és biztonságának biztosítása
4. gyakorlat Több felhasználó párhuzamosan olvashatja, bővítheti, módosíthatja és törölheti az adatokat Az adatok konzisztenciájának és biztonságának biztosítása Eszközök az adatok biztonsági mentésére,
7. Előadás tartalma A relációs adatmodell
7. Előadás tartalma A relációs adatmodell 7.1 A relációs adatmodell 7.2 Relációs adatbázisséma meghatározása 7.3 E/K diagram átírása relációs modellé 7.4 Osztályhierarchia reprezentálása 1 7.1 A relációs
ADATBÁZISOK, 2018 ősz
ADATBÁZISOK, 2018 ősz Előadók: Nappali tagozaton: Dr. Balázs Péter, Dr. Németh Gábor Gyakorlatvezetők koordinátora: Dr. Kardos Péter Óraterv Előadás A szögletes zárójeles témák elhagyhatók. 1. Bevezetés,
Adatbázis használat I. 5. gyakorlat
Adatbázis használat I. 5. gyakorlat Tudnivalók Jövő hétre a normalizálást hozni vagy e- mailben beküldeni! 7. héten (= két hét múlva!) nagyzh + FF checkpoint: adattáblák feltöltése, megszorítások 2010.
Mezők viszonya a relációs adatbázis tábláiban
Mezők viszonya a relációs adatbázis tábláiban A normalizálás megértéséhez szükségünk van néhány további fogalom ismeretére, ezért most kisebb kitérőt teszünk. Megismerjük - a funkcionális függés, - a teljes
Adatbázis rendszerek. dr. Siki Zoltán
Adatbázis rendszerek I. dr. Siki Zoltán Adatbázis fogalma adatok valamely célszerűen rendezett, szisztéma szerinti tárolása Az informatika elterjedése előtt is számos adatbázis létezett pl. Vállalati személyzeti
Adatmodellezés, alapfogalmak. Vassányi István
Adatmodellezés, alapfogalmak Vassányi István Alapok A helyes modell az információs rendszer későbbi használhatóságánakazalapja, olyanmint a jómunkaruha: véd, de nem akadályozza a munkát Objektum-orientált
Adatbázisrendszerek. Karbantartási anomáliák, 1NF, 2NF, 3NF, BCNF, 4NF, 5NF március 13.
Adatbázisrendszerek,,,,,, 4NF, 5NF 2018. március 13. Nem hivatalos tervezési relációs adatbázisokhoz 2, Mit jelent a relációs adatbázis-tervezés? Az csoportosítását, hogy jó relációsémákat alkossanak.
Programozás. Adatbázis-kezelés (alapok) Fodor Attila
Programozás Adatbázis-kezelés (alapok) Fodor Attila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék [email protected] 2010. április 22. Bevezetés Adatbáziskezelés
Relációs adatbázisok tervezése ---1
Relációs adatbázisok tervezése ---1 Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 3.3.1. Bevezetés: anomáliák 3.3.2. Relációk felbontása 3.1. Funkcionális
7. előadás. Karbantartási anomáliák, 1NF, 2NF, 3NF, BCNF, 4NF, 5NF. Adatbázisrendszerek előadás november 7.
7. előadás,,,,, 4NF, 5NF Adatbázisrendszerek előadás 2016. november 7., és Debreceni Egyetem Informatikai Kar Az előadások Elmasry & Navathe: Database Systems alapján készültek. Nem hivatalos tervezési
Adatbázis-kezelés alapjai 1. Ea: Infó Mátrix. Lehet, nem lehet
Adatbázis-kezelés alapjai 1. Ea: Infó Mátrix Lehet, nem lehet 35/1 B ITv: MAN 2018.09.08 Info Mátrix 35/2 Rólam 35/3 Szűcs Miklós Alias: BitMan Mesteroktató Informatika épület, 108-as szoba [email protected]
A SELECT működése. Ttanar tábla: Tdiak tábla:
A SELECT működése A SELECT utasítás általános formája: SELECT [ALL/DISTINCT] {*/,, } FROM [],, [] [WHERE
T Adatbázisok-adatmodellezés
T Adatbázisok-adatmodellezés Adatbázis-kezelő feladatai: Az adatbázis hosszú ideig meglévő információk gyűjteménye, ezt az adatbázis-kezelő kezel. Lehetővé teszi az adatbázisok létrehozását( az adatdefiníciós
ADATBÁZISOK, 2017 ősz
ADATBÁZISOK, 2017 ősz Előadók: Nappali tagozaton: Dr. Balázs Péter, Dr. Németh Gábor Gyakorlatvezetők koordinátora: Dr. Kardos Péter Óraterv Előadás A szögletes zárójeles témák elhagyhatók. 1. Bevezetés,
Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések
Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 2.4. Relációs algebra (áttekintés) 5.1.
ADATBÁZISOK. 4. gyakorlat: Redundanciák, funkcionális függőségek
ADATBÁZISOK 4. gyakorlat: Redundanciák, funkcionális függőségek Példa: szállodai adattábla vendég kód vendég név 200005 Pécsi Ádám 333230 Tóth Júlia 200005 Pécsi Ádám 123777 Szép László lakcím Budapest,
ADATBÁZIS-KEZELÉS Demetrovics Katalin
ADATBÁZIS-KEZELÉS Demetrovics Katalin 1. Alapfogalmak...1 1.1. Adat... 1 1.2. Információ... 1 1.3. Egyed, Tulajdonság, Kapcsolat... 1 1.4. Adatmodellek... 2 1.5. Adatbázis (DATABASE, DB)... 3 2. A relációs
A relációs adatmodell
A relációs adatmodell E. Codd vezette be: 1970 A Relational Model of Data for Large Shared Data Banks. Communications of ACM, 13(6). 377-387. 1982 Relational Databases: A Practical Foundation for Productivity.
2012. április 27. TARTALOM
KENDE MÁRIA - NAGY ISTVÁN PL/SQL FELADATGYŰJTEMÉNY TARTALOM 9. Foglalkozás Hivatkozási és összetett adattípusok, kurzor, ROWID... 2 10. Foglalkozás Összefoglaló feladatok... 15 Melléklet Dinamikus SQL...
Lekérdezések az SQL SELECT utasítással
Lekérdezések az SQL SELECT utasítással Az SQL SELECT utasítás lehetőségei Vetítés Kiválasztás 1. tábla 1. tábla Összekapcsolás 1. tábla 2. tábla Elemi SELECT utasítások SELECT * {[DISTINCT] column expression
ADATBÁZISKEZELÉS ADATBÁZIS
ADATBÁZISKEZELÉS 1 ADATBÁZIS Az adatbázis adott (meghatározott) témakörre vagy célra vonatkozó adatok gyűjteménye. - Pl. A megrendelések nyomon követése kereskedelemben. Könyvek nyilvántartása egy könyvtárban.
LOGISZTIKAI ADATBÁZIS RENDSZEREK UNIÓ, ALLEKÉRDEZÉSEK
LOGISZTIKAI ADATBÁZIS RENDSZEREK UNIÓ, ALLEKÉRDEZÉSEK Lénárt Balázs tanársegéd TANTERV Hét Dátum Előadó Előadások Időpont: szerda 8:30-10:00, helye: LFSZÁMG Dátum Gyakvezető 1. 9. 11. Tokodi Adatbázis
SQL DDL-1: táblák és megszorítások
SQL DDL-1: táblák és megszorítások Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 2.3. Relációsémák definiálása 7.1. Kulcsok és idegen kulcsok 7.2. Értékekre
ALAPOK. 0 és 255 közé eső számértékek tárolására. Számértékek, például távolságok, pontszámok, darabszámok.
ADATBÁZIS-KEZELÉS ALAPOK Főbb Adattípusok: Igen/Nem Bájt Ez az adattípus logikai adatok tárolására alkalmas. A logikai adatok mindössze két értéket vehetnek fel. (Igen/Nem, Igaz/Hamis, Férfi/Nő, Fej/Írás
Több tábla összekapcsolásán alapuló lekérdezések. Copyright 2004, Oracle. All rights reserved.
Több tábla összekapcsolásán alapuló lekérdezések Copyright 2004, Oracle. All rights reserved. Célkitűzés Egynél több táblának egyenlőségen vagy nem-egyenlőségen alapuló összekapcsolást végző SELECT utasítások
ADATBÁZIS-KEZELÉS. 1. Alapfogalmak
ADATBÁZIS-KEZELÉS 1. Alapfogalmak... 1 1.1. Adat... 1 1.2. Információ... 1 1.3. Egyed, Tulajdonság, Kapcsolat... 2 1.4. Adatmodellek... 2 1.5. Adatbázis (DATABASE, DB)... 3 2. A relációs adatmodell...
Adatbázis rendszerek. 4. előadás Redundancia, normalizálás
Adatbázis rendszerek 4. előadás Redundancia, normalizálás Molnár Bence Szerkesztette: Koppányi Zoltán HF tapasztalatok HF tapasztalatok [ABR] az email címbe! Ne emailbe küldjük a házikat, töltsétek fel
ABR ( Adatbázisrendszerek) 2. Előadás : Műveletek a relációs modellben
ABR ( Adatbázisrendszerek) 2. Előadás : Műveletek a relációs modellben 2.2 Műveletek a relációs modellben 2.2.1 Relációra vonatkozó megszorítások 2.2.2 Multihalmazon értelmezett műveletek 2.2.3 A relációs
SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok
SQL jogosultság-kezelés Privilégiumok Grant és Revoke Grant Diagrammok 1 Jogosultság-kezelés Egy fájlrendszer általában jogosultságokat rendel az általa kezelt objektumokhoz. Tipikusan olvasható, írható,
Adatbázisok-1 előadás Előadó: dr. Hajas Csilla
Adatbázisok-1 előadás Előadó: dr. Hajas Csilla Áttekintés az I.zh-ig Áttekintés az 1ZH-ig // Adatbázisok-1 elıadás // Ullman (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1 Hol tartunk? Mit tanultunk
Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)
Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány) 23/1 B IT v: 2018.10.31 MAN DML adatokon műveletet végző utasítások DML Data Manipulation Language Rekordok (sorok) beszúrása (felvitele) Mezők
Adatbázisok. 1. gyakorlat. Adatmodellezés október október 1. Adatbázisok 1 / 42
Adatbázisok 1. gyakorlat Adatmodellezés 2016. október 1. 2016. október 1. Adatbázisok 1 / 42 Elérhet ség Web: http://www.inf.u szeged.hu/~mkatona E-mail: [email protected] Fogadóóra: Kedd 15 16 Árpád
Informatikus informatikus 54 481 04 0010 54 07 Térinformatikus Informatikus É 1/6
A 10/2007 (II. 27.) SzMM rendelettel módosított 1/2006 (II. 17.) OM rendelet Országos Képzési Jegyzékről és az Országos Képzési Jegyzékbe történő felvétel és törlés eljárási rendjéről alapján. Szakképesítés,
Lekérdezések az SQL-ben 1.rész
Lekérdezések az SQL-ben 1.rész Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 6.1. Egyszerű (egy-relációs) lekérdezések az SQL-ben - Select-From-Where utasítás
Lekérdezések az SQL-ben 1.rész
Lekérdezések az SQL-ben 1.rész Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 6.1. Egyszerű (egy-relációs) lekérdezések az SQL-ben - Select-From-Where utasítás
Adatbázismodellek. 1. ábra Hierarchikus modell
Eddig az adatbázisokkal általános szempontból foglalkoztunk: mire valók, milyen elemekből épülnek fel. Ennek során tisztáztuk, hogy létezik az adatbázis fogalmi modellje (adatbázisterv), amely az egyedek,
INFORMATIKAI ALAPISMERETEK
Informatikai alapismeretek középszint 0631 ÉRETTSÉGI VIZSGA 2006. október 24. INFORMATIKAI ALAPISMERETEK KÖZÉPSZINTŰ ÍRÁSBELI ÉRETTSÉGI VIZSGA JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ OKTATÁSI ÉS KULTURÁLIS MINISZTÉRIUM
SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1
SQL 1.rész 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1 SQL története, szabványok Szabvány adatbázis-kezelő nyelv: SQL SQL (angol kiejtésben
Gazdasági informatika II (SZIE GTK GVAM 1. évfolyam) 2009/2010. tanév 2. félév
Gazdasági informatika II (SZIE GTK GVAM 1. évfolyam) 2009/2010. tanév 2. félév Egyed: minden olyan dolog, amit minden más dologtól jól meg tudunk különböztetni és amiről adatokat akarunk tárolni. (pl.
8. előadás. normálformák. Többértékű függés, kapcsolásfüggés, 4NF, 5NF. Adatbázisrendszerek előadás november 10.
8. előadás 4NF, 5NF Adatbázisrendszerek előadás 2008. november 10. ek és Debreceni Egyetem Informatikai Kar 8.1 (multivalued dependency, MVD) Informálisan, valahányszor két független 1 : N számosságú A
SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók
SQL*Plus Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP dolgozó), DEPT osztály) "közönséges" felhasználók Adatszótár: metaadatokat tartalmazó, csak olvasható táblák táblanév-prefixek:
A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:
1 Adatbázis kezelés 3. gyakorlat A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni: Tábla kapcsolatok létrehozása,
Adatbázis rendszerek SQL nyomkövetés
Adatbázis rendszerek 1. 12. SQL nyomkövetés 1/32 B ITv: MAN 2017.10.26 Nyomkövetési feladat 2/32 Gyakorló feladatok Termék-Vásárlás-Vásárló Oktató-Tantárgy-Hallgató 3/32 Gyakorló feladat: Termék-Vásárlás-Vásárló
Adatmodellek. 2. rész
Adatmodellek 2. rész Makány György Alapfogalmak JEL ADAT INFORMÁCIÓ ADATHALMAZ ADATÁLLOMÁNY ADATBÁZIS 2 Alapfogalmak JEL ADATHALMAZ észlelhető, felfogható fizikai érték ADAT a valós világ egy jelenségéből
5.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)
5.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK) http://sila.hajas.elte.hu/ SQL gyakorlatban: SELECT záradékai és a kiterjesztett relációs algebra Tankönyv: 5.1.- 5.2. Kiterjesztett relációs algebra
A könyv tartalomjegyzéke
A könyv tartalomjegyzéke Elıszó Bevezetés Adatbázis-kezelı rendszerek Adatmodellezés Alapfogalmak Egyedhalmaz, egyed Kapcsolat, kapcsolat-elıfordulás, kapcsolat típusa Tulajdonság, tulajdonságérték, értékhalmaz
Adatbázisok elmélete 11. előadás
Adatbázisok elmélete 11. előadás Katona Gyula Y. Budapesti Műszaki és Gazdaságtudományi Egyetem Számítástudományi Tsz. I. B. 137/b [email protected] http://www.cs.bme.hu/ kiskat 2004 ADATBÁZISOK ELMÉLETE
Adatbázisok* tulajdonságai
Gazdasági folyamatok térbeli elemzése 4. előadás 2010. 10. 05. Adatbázisok* tulajdonságai Rendezett, logikailag összefüggő és meghatározott szempont szerint tárolt adatok és/vagy információk halmaza Az
Csima Judit november 15.
Adatbáziskezelés Normalizálás Csima Judit BME, VIK, Számítástudományi és Információelméleti Tanszék 2017. november 15. Csima Judit Adatbáziskezelés Normalizálás 1 / 26 Normalizálás Tétel Tetszõleges (R,
SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások
SQL haladó Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások 1 Külső összekapcsolás Összekapcsoljuk R és S relációkat: R C S. R azon sorait,
Adatbázisok 1. Kósa Balázs gyakorlata alapján Készítette: Nagy Krisztián. 1. gyakorlat
Adatbázisok 1. Kósa Balázs gyakorlata alapján Készítette: Nagy Krisztián 1. gyakorlat Relációs adatbázis Alap fogalmak (Forrás: http://digitus.itk.ppke.hu/~fodroczi/dbs/gyak2_1/ ) A relációs algebra egy
ABR ( Adatbázisrendszerek) 1. Előadás : Műveletek a relációs medellben
Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR ( Adatbázisrendszerek) 1. Előadás : Műveletek a relációs medellben 1.0 Bevezetés. A relációs adatmodell. 1.1 Relációs algebra 1.2 Műveletek a relációs
Példa 2012.05.11. Többértékű függőségek, 4NF, 5NF
Többértékű függőségek, 4NF, 5NF Szendrői Etelka datbázisok I [email protected] harmadik normálformáig mindenképpen érdemes normalizálni a relációkat. Legtöbbször elegendő is az első három normálformának
