Information Technology | Databases » Az adatbázis-kezelés alapjai

Datasheet

Year, pagecount:2003, 208 page(s)

Language:Hungarian

Downloads:3568

Uploaded:December 12, 2004

Size:918 KB

Institution:
-

Comments:

Attachment:-

Download in PDF:Please log in!



Comments

No comments yet. You can be the first!

Content extract

1 Az adatbáziskezelés alapjai 1. Előszó Előszó Napjainkban a felgyülemlett óriási adatmennyiséget - egyre szélesebb körben - adatbázisokba szervezve tárolják. A világméretű hálózatok kialakulásával lehetővé vált nyilvános adatbázisok létrehozása és felhasználása. Ezért fontos, hogy az adatbázisok elméleti alapjaival és kezelésükkel egyre többen megismerkedjenek. Ezen jegyzet keretében az adatbázisokat felhasználói szemszögből közelítjük meg, alapfokú számítástechnikai ismereteket feltételezve. A jegyzet célja, hogy az adatbáziskezelés alapjaival megismertesse a hallgatót, áttekintést adjon az adatbáziskezelés elméleti hátteréről, és segítséget nyújtson a legkorszerűbb adatbáziskezelő eszközök használatának elsajátításához. Az adatkezelés hagyományos módjai 2 Az adatbáziskezelés alapjai 2. Az adatkezelés hagyományos módjai A nagymennyiségű adat tárolásának és feldolgozásának

igénye fontos szerepet játszott a számítógépek fejlesztésében. Hollerith az 1890-es években az általa kialakított lyukkártyát használta az Amerikai Egyesült Államok népszámlálási adatainak tárolására. Azonban a lyukkártyás és lyukszalagos adattárolás nagyon kényelmetlen volt. Az olvasók lassúak voltak, hibáztak, begyűrték a kártyát, vagy elszakították a szalagot. Nagy mennyiségű adat tárolása már sok doboz kártyát, vagy több tekercs szalagot igényelt. Ezért gyorsan előtérbe kerültek a mágneses adathordozó eszközök. Az első mágneslemezek még elég kis kapacitásúak voltak, ezért nagy mennyiségű adat tárolására elsősorban mágnesszalagot használtak. Adattárolás mágnesszalagon A mágnesszalagos adatrögzítés elve hasonló a magnószalagéhoz. A mágnesszalag egy kemény mágneses anyaggal bevont műanyag szalag. A mágnesszalag írás vagy olvasás közben áttekeredik az egyik orsóról a másikra, miközben elhalad

a mozdulatlan író/olvasó fej előtt. Az adatok a szalagon kilenc hosszanti sávon, úgynevezett csatornán kerülnek felírásra. Az egymás melletti kilenc bitből nyolc egy byte-ot alkot, a kilencedik az ellenőrzésre használt paritásbit. A mágnesszalag nem címezhető adathordozó, ezért az adatokat csak a szalag végigolvasásával lehet megkeresni rajta. A mágnesszalagra az adatok blokkokban kerülnek felírásra Adattárolás mágneslemezen A mágneslemez fémből vagy műanyagból készült, mágnesezhető réteggel bevont vékony tárcsa. A lemezfelületek logikailag koncentrikus körökre oszlanak, ezeket a köröket sávoknak nevezzük. Egyegy sávra egyforma mennyiségű adat írható függetlenül attól, hogy a sáv milyen hosszú, ugyanis a belső sávokon nagyobb az írássűrűség. A sávok szektorokra vannak osztva A lemezre az adatok blokkokban kerülnek felírásra. Mivel a sáv és a szektor címezhető, a lemezen elhelyezett adatokat közvetlenül, a

többi adat végigolvasása nélkül is el lehet érni, ugyanis a fej rá tud pozícionálni a megfelelő címre. Ezért a nagy kapacitású mágneslemezek megjelenése döntő változást hozott az adatfeldolgozásban. Az adatbáziskezelés alapjai 3 Az adatkezelés hagyományos módjai Optikai adattárolók Az optikai adattárolók közül a legelterjedtebb a CD-ROM. Az 12 mm vastagságú polikarbonát lemezre gyárilag égetik rá az információt. Ezt a számítógéphez kapcsolt olvasó-berendezés lézersugár segítségével olvassa ki. Széles körben használnak újraírható CD lemezeket is A lemezeken az információkat szektorokban tárolják, ezek a szektorok címezhetőek. Pufferek A számítógép memóriája és a perifériák közötti adatmozgatás során az adatok nem byte-onként, hanem nagyobb egységenként - általában blokkonként - kerülnek átvitelre. Ezért a memóriában az adatok átmeneti tárolására pufferterületeket jelöl ki az operációs

rendszer. A pufferterületek mérete paraméterezhető. Az adatok a beolvasás során az adathordozóról a pufferterületre kerülnek, kiírás során pedig a pufferterületről történik az adatok tényleges kiírása az adathordozóra. A nagyobb mennyiségű adat együttes mozgatása gyorsítja a ki- illetve beviteli műveleteket. 4 Adatszervezési alapfogalmak 3. Az adatbáziskezelés alapjai Adatszervezési alapfogalmak Az adatok összessége és az adatok közötti kapcsolatok a logikai és a fizikai értelmezés valamelyike szerint írhatók le. A fizikai adatleírás azt mutatja be, hogy az adatokat milyen módon rögzítik fizikailag a hardware-eszközökkel, a logikai adatleírás pedig azt a módot adja meg, ahogyan az adat a programozó, vagy a felhasználó számára megjelenik. Tekintsük át először az adatok logikai leírásának alapfogalmait. Az adatmező a névvel ellátott adatok legkisebb egysége. Az adatmező definiálásánál a nevén kívül meg

kell adni a típusát és a méretét is. Az adatmező típusa valamely elemi adattípus lehet, például numerikus, karakteres, vagy dátum. Az adatmező mérete mindig rögzített A legkisebb méretű adatmező 1 bit, felső korlát gyakorlatilag nincs. Az adatmezők méretét általában byte-okban adják meg. Például a Név adatmező karakteres típusú, 40 byte méretű Az adatmező mérete nem függ attól, hogy milyen hosszú nevet tárolunk benne, 40 byte-os lesz akkor is, ha a név Kis Pál, és akkor is, ha Kerekharaszti Eufrozina Angelika. A rekord az összetartozó adatmezők együttese. A file, vagy állomány adott típusú (logikai) rekord összes előfordulásának névvel ellátott gyűjteménye. Egy file-ban a rekordok lehetnek fix és változó hosszúságúak Fix hosszúságú rekordok esetén minden rekord ugyanazokból a mezőkből épül fel. A változó hosszúságú rekordokban általában valamely mező, vagy mezőcsoport többször ismétlődik. Tekintsünk

például egy hallgatói nyilvántartást. Az összes hallgató adatai alkotják a file-t, a rekordok az egyes hallgatók adatait tartalmazzák, többek között a következőket: név, születési dátum, lakhely, évfolyam, csoport. Ezek az adatmezők Az egyes adatmezők konkrét értéke lehet: Kiss Péter, 1972.0901, Gödöllő, 2, 1 Ha a hallgatói nyilvántartásban az egyes rekordokban a hallgatók vizsgajegyeit is tárolnánk, akkor változó hosszúságú rekordokat kapnánk, hiszen az egyes hallgatóknak különböző számú vizsgája lehet, így a tantárgy és vizsgajegy mezők az egyik hallgatónál ötször szerepelnek, mert öt tárgyból vizsgázott, míg a másiknál kilencszer, mert neki ennyi vizsgája volt. Az adatok fizikai tárolása gyakran eltér a logikai formájuktól. A fizikai rekord az adatoknak az az alapegysége, amelyet a számítógép egyszeri ki-, illetve bemeneti utasításával írunk ki, vagy olvasunk be. Az adatoknak azt a csoportját, amely egy

fizikai rekorddá áll össze, blokknak nevezzük. Az adatbáziskezelés alapjai 5 Adatszervezési alapfogalmak A fizikai rekordok összessége a fizikai file, amely azonosítóval van ellátva. A fizikai file jellemezhető méretével és az adathordozón való elhelyezkedésével. A továbbiakban a logikai adatszervezéssel foglalkozunk. A file-ban szereplő rekordokon, illetve azok egyes mezőin különböző műveleteket végezhetünk el, melyeket összefoglaló néven file-kezelésnek nevezünk. A file-kezelő műveletek három fő csoportba sorolhatók: Szerkesztés jellegű műveletek. Ide tartozik a file létrehozása, megszüntetése, valamint az újraszervezése. Újraszervezésre például akkor lehet szűkség, ha egy file az adathordozón - az új rekordok felviteléből adódóan - több területen helyezkedik el, és ez lassítja a feldolgozást. Az újraszervezés legegyszerűbb módja, hogy a file-t átmásolják az adathordozó egy másik - összefüggő -

területére. Ennek eredményeként a file folyamatosan helyezkedik el az adathordozón. Karbantartás jellegű műveletek, melyekhez az új rekordok beszúrása, rekordok törlése, valamint módosítása tartozik. Feldolgozás jellegű műveletek, amelyek segítségével adott feltételeknek megfelelő rekordokat keresünk ki a file-ból. A file-ok feldolgozása különböző módokon történhet: • Soros (szekvenciális) feldolgozás esetén a file rekordjait a file elejéről, - esetleg a végéről kezdve egyesével sorban olvasva dolgozzuk fel. Ez a feldolgozás a legtöbb esetben nem elég hatékony, bár a hatékonysága növelhető, ha a rekordokat a feldolgozási szempontnak megfelelő rendezettségben helyezzük el a file-ban. Például, ha egy hallgatói nyilvántartásból ki szeretnénk írni az egyes évfolyamok hallgatóinak névsorát, akkor amennyiben az adatok évfolyam, azon belül pedig névsor szerinti rendezettségben találhatók az adatállományban, akkor

ezt a feladatot az adatállomány egyszerű végigolvasásával és a nevek nyomtatásával elvégezhetjük. Amennyiben adatainkat csak szekvenciálisan kívánjuk feldolgozni, ez semmi különös fileszervezést nem igényel, az adatrekordokat szekvenciális szervezésű file-ban tárolhatjuk. Mágnesszalagon csak szekvenciális file-ok hozhatók létre. • Az index szerinti feldolgozáshoz minden rekordnak rendelkeznie kell egy kulcsmezővel, amely a rekordot azonosítja. Egyes megvalósítások kikötik, hogy a kulcsnak egyedinek - vagyis minden rekordban különbözőnek - kell lennie. A file-hoz tartozik egy index, amely tartalmazza az egyes kulcsokhoz tartozó rekordok fizikai címét. Így a kulcs alapján egy-egy rekordot könnyen megtalálhatunk. Például, ha a hallgatói nyilvántartásunkban a hallgatók személyi Adatszervezési alapfogalmak • • 6 Az adatbáziskezelés alapjai számát választjuk kulcsnak és erre felépítjük az indexet, akkor egy

konkrét hallgató adatainak megkereséséhez elég megadnunk a hallgató személyi számát és az index segítségével a keresett rekord fizikai címe ismeretében a kívánt rekord beolvasható. Az adatok index szerinti feldolgozása megvalósítható az index-szekvenciális file-szervezéssel. Az adatok a kulcs szerinti sorrendben szekvenciálisan kerülnek tárolásra az adat-file-ban. Az index kezeléséről, a megadott kulcsú rekord megkereséséről a software gondoskodik. Az új rekordok beszúrása egy túlcsordulási területre történik. Ha már túl sok rekord van a túlcsordulási területen, célszerű a file-t újraszervezni. A file természetesen szekvenciálisan is feldolgozható. Nem szekvenciális szervezésű file-ok is lehetnek indexeltek. Indexelt file-t csak közvetlen elérésű adathordozón, elsősorban mágneslemezen, lehet létrehozni. Direkt feldolgozás esetén a rekordokat fizikai címük alapján érjük el, így nincs szükség indextáblára. A

fizikai cím megadásán általában a rekordsorszám megadását értjük A rekordsorszám alapján a file-kezelő rendszer meg tudja állapítani a rekord fizikai címét. Ez a feldolgozás csak fix rekordméret esetén alkalmazható. Direkt file-szervezéssel valósíthatók meg a listák, vagy a fa-struktúrák. Ezen adatstruktúráknál egy-egy rekordban mutatók találhatók, melyek a rekordot megelőző, vagy követő rekordokra mutatnak. A mutatók a rekord fizikai sorszámát tartalmazzák. Direkt file-ok is csak közvetlen elérésű adathordozón hozhatók létre Az adatbáziskezelés alapjai 7 Az adatbázisok kialakulása 4. Az adatbázisok kialakulása A hagyományos adatfeldolgozásban elsősorban az index-szekvenciális file-okat használták. A nagyméretű, komplex rendszereknél több probléma is felvetődött. • Az index-szekvenciális file-ban az adatokat a leggyakrabban használt kulcsmező szerint tárolják, azonban szükség lehet rá, hogy az

adatokat másféle rendezettség szerint dolgozzák fel. Ekkor vagy létrehoznak még egy file-t, ami a kívánt kulcs szerinti rendezettségű - ezzel redundánsan (többszörösen) tárolják az adatokat - vagy ragaszkodnak az egyszeres tároláshoz és az adatokat a feldolgozás előtt rendezik, ekkor a feldolgozási idő növekedik meg jelentősen. A redundáns tárolásnak a hátránya a nagyobb tárfoglalás mellett az is, hogy nagyméretű adatfeldolgozó rendszerek esetén szinte lehetetlen a redundáns adatokat az aktualizálás azonos szintjén tartani. Például egy vállalati ügyviteli rendszerben egy dolgozó személyi adatai több helyen is szerepelnek (pl. munkaügyi rendszer, bérrendszer) Ha megváltozik a dolgozó lakcíme, előfordulhat, hogy az egyik rendszerben még a régi lakcím szerepel, egy másikban pedig már az új. • A hagyományos feldolgozásnál a rekordstruktúra leírását a program tartalmazza. Maga az állomány - a file-szervezéstől

függetlenül - csak az adatokat tartalmazza, bitsorozatok formájában. Azt, hogy egy rekordban található bitsorozatot hogyan kell mezőkre bontani (hány bit tartozik egy-egy mezőhöz), valamint, hogy egy mező tartalmát milyen típusú adatként kell értelmezni (pl. karakteres, vagy decimális, stb) , meg kell adni a feldolgozó program számára Ezért minden programnak tartalmaznia kell az általa használt állományok rekordstruktúrájának leírását. Ha egy rendszer több programja ugyanazt a rekordstruktúrát használja, azt mindegyikben le kell írni. Ha valamelyik feldolgozásnak új, eddig nem használt adatra van szüksége, vagy valamely mező méretét kell megváltoztatni, akkor megváltozik a rekordkép, amely az állományt használó összes programot érinti. Vagyis a módosítást minden programban el kell végezni. Ez időigényes, és számos hiba forrása lehet • A hagyományos adatfeldolgozásban egy-egy szervezetnél több egymástól független

adatfeldolgozó rendszert használtak. Minden rendszer a saját állományaival dolgozott Voltak olyan adatok, amelyek egyszerre több rendszerben is előfordultak (redundáns adatok). A különböző rendszerekben található adatok integrálásával sokkal több összefüggés vizsgálata válhatott volna lehetővé. • Egy integrált adatstruktúrának általában több felhasználója van, de többnyire mindegyiküknek az adatoknak csak egy részére van szüksége, sőt sok esetben nem is szabad megengedni, hogy Az adatbázisok kialakulása 8 Az adatbáziskezelés alapjai minden felhasználó minden adathoz hozzáférjen. Ez a hagyományos feldolgozási rendszerekben is megvalósítható volt - komoly programozói munkával. Ezeknek a problémáknak és igényeknek a kezelésére új típusú software-re volt szükség, hiszen a hagyományos file-kezelő rendszerek nem tudták ezt biztosítani. Ezek az új típusú software-k az adatbáziskezelő rendszerek lettek. Az

1960-as években jelentek meg az első adatbáziskezelő rendszerek, ezek a hagyományos filekezelő rendszerekből alakultak ki. Az első alkalmazási területei a bank-rendszerek, repülőgéphelyfoglalás és a vállalti nyilvántartási rendszerek voltak 1971-ben a Data Base Task GROUP (DBTG) konferenciát tartott, amelyen elkészítették a CODASYL (COnference on DAta System Languages) javaslatot. Ennek során kidolgozták az adatbázisokkal szembeni követelményeket. Ezek közül a legfontosabbak, hogy az adatbázisok az adatokat redundancia mentesen tárolják, az adatbázist használó programok adatfüggetlenek legyenek, egy időben több alkalmazás is használhassa ugyanazokat az adatokat, továbbá kényelmes adatkezelési és adatvédelmi szolgáltatásokat nyújtsanak. Az adatfüggetlenség azt jelenti, hogy az adat és az őt használó program független egymástól, azaz bármelyik megváltoztatható a másik módosítása nélkül. Ezt úgy érik el, hogy az adatok

leírását, vagyis az adatbázisban tárolt adatok struktúráját is maga az adatbázis tartalmazza, nem pedig az alkalmazói programok, így az adatstrruktúra megváltozása nem feltétlenül igényel programmódosítást. Az első adatbáziskezelő software-k a hierarchikus, majd a hálós adatmodellen alapultak. 1970-ben Ted Codd publikált egy cikket, amelyben egy új típusú adatbázismodellt vázolt fel. Eszerint az adatokat a felhasználó felé táblázatokban kellene megjeleníteni. Ezeket a táblázatokat relációknak nevezte, ebből származik a modell neve is (relációs adatmodell). A gyakorlatban azonban sokáig nem sikerült elkészíteni ennek a modellnek megfelelő adatbáziskezelő software-t. Az IBM cég 1982-ben jelentette meg az első relációs adatbáziskezelő rendszert, ezután egyre több software-gyártó cég fejlesztett ki ilyen rendszereket. A relációs adtbáziskezelő rendszerek hamar népszerűvé váltak és szinte teljesen kiszorították a

hierarchikus és a hálós adatbázisokat. Az adatbáziskezelő rendszereket folyamatosan fejlesztik, hiszen ma már nagyon nagy mennyiségű adat tárolására és gyors feldolgozására van igény. Egy-egy nagyobb adatbázis akár több terabyte-nyi adatmennyiséget is tartalmazhat. A hagyományos adatok - karakterek, számok - mellett ma már egyre nagyobb az igény újabb adattípusok tárolására, mint például a multimédiás adatokéra. A képek, hangok videofelvételek általában sokkal nagyobb adatmennyiséget jelentenek, mint a hagyományos adatok. Egy másik új kihívás a világháló Számos adatbázis már interneten keresztül is hozzáférhető, és sok estben több adatbázisban található ugyanarra a dologra vonatkozó információ. Például egyre népszerűbbek az interneten történő vásárlások, ehhez katalógusokat kell közzétenni a világhálón. Ha egy cikket szerertnénk megrendelni, nem árt, ha több katalógusban is utánanézünk és így

választjuk ki a legmegfelelőbbet. Felvetődött a gondolat, hogy ezeket az információkat célszerű lenne egyetlen adatbázisba integrálni. Így alakultak ki az adattárházak, Az adatbáziskezelés alapjai 9 Az adatbázisok kialakulása amelyek több adatbázis adatait tartalmazzák. Ha valamely adat megváltozott az eredeti adatbázisban, akkor a változtatást elvégzik az adattárházban is. Persze általában nem azonnal, hanem például éjszakánként frissítik az adattárház adatatit, amikor kevés felhasználó dolgozik az adatbázisokkal. Az adatbázis fogalma Adatbázisnak nevezzük a szükségtelen redundancia nélkül együtt tárolt, egymással kapcsolatban levő adatok együttesét, amelynek célja egy vagy több alkalmazás optimális kiszolgálása. Az adatokat úgy tároljuk, hogy azok függetlenek legyenek az őket használó programoktól. Az adatbázison belül közös és ellenőrzött hozzáférés szolgál az új adatok felvitelére, a már

felvitt adatok módosítására és lekérdezésére. A teljes redundanciamentességet általában nem lehet megkövetelni, az adatok bizonyos ismétlődésére szükség lehet biztonsági okokból, vagy az elérés meggyorsítása miatt. Az adatfüggetlenség mértéke is adatbázisról adatbázisra változik. Az adatbázisokban az adatokat meghatározott logikai struktúra szerint szervezik, ezt a struktúrát az adatbázis sémájának nevezik. Az adatbázisok kezelését ellátó software-t adatbáziskezelő rendszernek (ABKR) nevezzük, angolul Data Base Management System - DBMS. Az adatbáziskezelő rendszer az adatokat fileokban tárolja, melyek rekordokból épülnek fel Az adatbázist alkotó file-ok belső struktúrája az adatbáziskezelő rendszer függvénye. Ezért az adatbáziskezelő rendszer tulajdonképpen egy bonyolult file-kezelő rendszer, melynek egyik alapvető feladata a bonyolult adatstruktúrák hatékony kezelése. Egy adatbáziskezelő rendszer legfontosabb

feladatai: • • • Az adatbázis létrehozása Az adatbázis adatainak karbantartása (módosítás, törlés, új adatok felvitele) Az adatok visszakeresésének biztosítása • A minél nagyobb adatbiztonság elérése. Védje az adatokat az illetéktelen felhasználótól és a meghibásodásoktól, a lehetőségek szerínt szűrje ki az adatbázisba bekerülő adatok közötti hibákat. Az adatbázisok kialakulása • 10 Az adatbáziskezelés alapjai Szinkronizáció Biztosítani kell, hogy az adatbázis adataihoz egyidőben több felhasználó is hozzáférhessen úgy, hogy az egyes felhasználó műveletei ne okozzanak hibát a többi felhasználó munkájában. Bizonyos esetekben viszont azt kell biztosítani, hogy amíg az egyik felhasználó dolgozik, a többiek ne férhessenek hozzá az adatokhoz. Az adatbáziskezelő rendszerhez tartozik egy adatbáziskezelő nyelv, amelynek segítségével az adatbázis felépíthető, továbbá az alkalmazások

készítői megfogalmazhatják módosítási, illetve lekérdezési igényeiket. Ez a nyelv lehet önálló programozási nyelv, vagy pedig beágyazott (embedded) nyelv, amelynek utasításait más programnyelvekbe (host nyelv) beépítve használhatjuk, kifejezetten az adatbázis kezelésére. Az adatbáziskezelő nyelv legfontosabb utasításcsoportjai a következők: • adatdefiníciós nyelv, ez az adatbázis sémájának megadására szolgál • adatmanipulációs nyelv, segítségével vihetünk fel, módosíthatunk, vagy törölhetünk adatokat • lekérdező nylev, amely az adatok visszakeresésére szolgál Maga az adatbázis az adatokat és azok szerkezetének leírását tartalmazza. Az utóbbit szokás metaadatoknak is nevezni. Az adatbázis létrehozását, az adatok kezelését az adatbáziskezelő rendszer végzi. A felhasználók általában nem közvetlenül az adatbáziskezelő rendszerrel dolgoznak, hanem különböző alkalmazások segítségével végzik az

adatok felvitelét, módosítását, vagy visszakeresését. Ezeket az alklamazásokat programozók készítik valamilyen programnyelven Az alkalmazások az adatbáziskezelő rendszernek adnak utasításokat, az adatokat csak az adatbáziskezelő rendszeren keresztül érik el. 11 Az adatbáziskezelés alapjai 5. Adatmodellezés Adatmodellezés Az adatmodellezés olyan eljárás, melynek során a valós világ tényeit és összefüggéseit tükröző adatok lényeges sajátosságait és lényeges összefüggéseit emeljük ki. Eredménye az adatmodell Az adatbázisok mindig valamilyen adatmodellen alapulnak. Az adatmodelleket az alábbi jellemzők segítségével adjuk meg, írjuk le: • Azokat a dolgokat, amelyek adatait le szeretnénk írni, egyedeknek, vagy objektumoknak nevezzük. Ezek lehetnek tárgyak, személyek, vagy akár események is Például Dolgozók, Raktárak, Szállítások. Az egyedek konkrét előfordulásai például "Kovács János",

"200-as raktár", "2134-es szállítás". Egy adott egyed által képviselt összes előfordulás halmazát egyedhalmaznak nevezzük. Például a Dolgozók nevű egyedhalmaz az összes dolgozóból áll, a Raktár nevű egyedhalmaz pedig az összes raktárból. • Az egyedeket tulajdonságokkal, attribútumokkal írjuk le. Az adatmodellezés fontos lépése, hogy az egyed számtalan tulajdonsága közül kiválasszuk azokat, amelyek számunkra lényegesek. Az adatmodellben csak ezek a tulajdonságok szerepelnek Például egy dolgozó tulajdonságai lehetnek a név, munkahely, fizetés, testmagasság, szeme színe stb. Ha egy vállalatnál dolgozói nyilvántartást készítenek, úgy ezek közül a név, munkahely, fizetés tulajdonságokkal fogják jellemezni a dolgozókat, míg egy rendőrségi nyilvántartásban a név, munkahely, testmagasság, szeme színe tulajdonságokat fogják használni. • Amennyiben egy tulajdonság, vagy a tulajdonságok egy

csoportja egyértelműen meghatározza, hogy az egyed melyik értékéről, vagyis az egyedhalmaz melyik eleméről van szó, akkor ezeket a tulajdonságokat kulcsnak, vagy azonosítónak nevezzük. Elvileg minden egyedhalmaznak van kulcsa, hiszen az egyedeket úgy határoztuk meg, hogy egymástól megkülönböztethetők legyenek. Így legrosszabb esetben az összes tulajdonság együtt alkotja a kulcsot Ha nem tudunk kiválasztani olyan tulajdonságokat, melyek az egyedhalmaz elemeit egyértelműen meghatározzák, nagyon sok tulajdonság értékét kell megadni az egyértelmű azonosításhoz, akkor be kell vezetnünk egy olyan tulajdonságot - például sorszám, kódszám - amely ezt biztosítja. A Dolgozók egyedhalmazban például a személyi szám megfelelő kulcs, mert egyértelműen azonosítja a dolgozókat. A termékeket cikkszámmal látják el a könnyebb azonosítás végett. A dolgozónak a személyi szám nem természetes tulajdonsága, épp így a cikkszám sem

természetes tulajdonsága a terméknek. • A különböző egyedhalmazok kapcsolatban állhatnak egymással. Azokat a logikai összefüggéseket, amelyeket az egyedhalmazok közös tulajdonságai fejeznek ki, kapcsolatoknak 12 Adatmodellezés Az adatbáziskezelés alapjai nevezzük. Például a Dolgozók és a Raktárak egyedhalmazok közötti kapcsolat lehet az, hogy egy-egy dolgozó melyik raktárban dolgozik. A kapcsolatoknak három típusát különböztetjük meg. ◊ Egy-egy típusú kapcsolat (1:1 kapcsolat) Az egyik egyedhalmaz minden eleméhez a másik egyedhalmaznak pontosan egy eleme kapcsolódik. Például a vidéki önkormányzatok halmaza és a polgármesterek egyedhalmaza között egy-egy típusú kapcsolat van. 1:1 típusú kapcsolat ◊ Egy-több típusú kapcsolat (1:N kapcsolat) Az egyik egyedhalmaz egy eleméhez a másik egyedhalmaz több eleme is tartozhat, de a másik egyedhalmaz egy eleméhez az egyik egyedhalmaz csak egy eleme tartozhat. Például a

Raktárak és a Dolgozók közötti kapcsolatban egy raktárhoz több dolgozó is tartozhat, de egy dolgozó csak egy raktárban dolgozhat. 1:N típusú kapcsolat ◊ Több-több típusú kapcsolat (N:M kapcsolat) Az egyik egyedhalmaz egy eleméhez a másik egyedhalmaz több eleme is tartozhat és ennek a fordítottja is igaz. Például az Áruk és a Szállítások közötti kapcsolat több-több típusú kapcsolat, hiszen egy szállítás során többféle árut is vihetnek, de egy áruféleséget több szállítással is szállíthatnak. 13 Az adatbáziskezelés alapjai N:M típusú kapcsolat Adatmodellezés 14 Adatbázis-típusok 6. Az adatbáziskezelés alapjai Adatbázis-típusok Attól függően, hogy az adatmodellben milyen logikai kapcsolatokat engednek meg az egyedhalmazok között és ezeket a kapcsolatokat hogyan kezelik, az adatbáziskezelő rendszereket három fő típusba sorolhatjuk: - hierarchikus - hálós - relációs adatbáziskezelő rendszerek.

6.1 Hierarchikus adatbázisok Az első adatbáziskezelő rendszerek nagyszámítógépeken jelentek meg. Ezek többsége a hierarchikus modell szerint épült fel. Ennek lényege, hogy az egyedhalmazok között csak hierarchikus kapcsolatot enged meg (1:N típusú kapcsolat). Ez az adatstruktúra egy fával ábrázolható. Például egy tantárgynyilvántartás esetén a tantárgyak rekordjai tartalmazzák a tantárgyakat jellemző adatokat (tantárgy kódja, címe, óraszám, követelmény, stb.), a tanszékek rekordjai pedig a tanszékekre jellemző adatokat (tanszék kódja, neve, vezető neve, stb.) Egy tanszék több tantárgyat is meghirdethet, de egy tantárgyat csak egy tanszék hirdet meg, így a tantárgyak és a tanszékek között 1:N típusú kapcsolat van, vagyis hierarchikus kapcsolatban állnak egymással. tanszék tantárgy tantárgy tantárgy tanszék tantárgy tantárgy tantárgy tantárgy A tanszékrekord a szülő, vagy tulajdonos, a tantárgyrekordok

pedig a gyerek, vagy tag rekordok. A fastruktúra több szintű is lehet. Példánkban a tanszékek valamilyen szervezeti egységhez tartoznak, az egyes szervezeti egységek pedig valamilyen szervezeti egység-csoporthoz. 15 Az adatbáziskezelés alapjai Adatbázis-típusok egyetem kar kar tanszék tanszék tanszék tanszék tanszék dolgozó . dolgozó dolgozó . dolgozó dolgozó . dolgozó dolgozó . dolgozó dolgozó . dolgozó A legegyszerűbb hierarchikus modellek csak egyfajta fastruktúrából állnak, míg bonyolultabb modellek esetén egy adatbázison belül többféle fastruktúra előfordulhat. A fastruktúra fizikai megvalósítása általában az adatrekordokban elhelyezett pointerek (mutatók) segítségével történik. Egy adatrekordban pointer mutat a szülő rekordra, valamint a gyerek rekordokra, vagy a testvérekre. Az így kialakított hierarchikus struktúrában könnyen válaszolhatunk azokra a kérdésekre, amelyek illeszkednek az adatok

logikai szerkezetéhez. Azon kérdések megválaszolása azonban, amelyeknél a visszakereséshez a logikai kapcsolatok nem használhatók, sok időt vehetnek igénybe, hiszen ekkor soros keresést lehet csak alkalmazni. A fenti példában arra a kérdésre, hogy mennyi egy tanszék dolgozóinak átlagos életkora, könnyen megadható a válasz, hiszen a szervezeti egység hierarchián, vagyis a fa ágain lefelé haladva el lehet jutni a keresett tanszékhez, amelynek levelei a dolgozók adatait tartalmazzák. Azonban csak hosszas kereséssel tudjuk megadni azokat, akik ebben az évben érik el a nyugdíjkorhatárt, hiszen bármelyik szervezeti egységben lehet ilyen dolgozó, ezért minden dolgozó születési dátumát meg kell vizsgálni. A hierarchikus struktúra csak 1:N típusú kapcsolatok leírását teszi lehetővé, a valóságban az adatok között azonban gyakoribb az N:M kapcsolat. Ezt a kapcsolattípust próbálják leírni a hálós adatbázisok. 6.2 Hálós

adatbázisok A hálós adatbázisokban az egyedtípusok között fennálló N:M kapcsolatot egy új csomóponttípus, a kapcsolatrekord segítségével kezeljük. A kapcsolatrekord általában azokat az adatokat tartalmazza, amelyek mindkét egyedtípustól függnek. Így az N:M típusú kapcsolatot lebontjuk 1:N és 1:M kapcsolatokra. Ezek a kapcsolatok már ábrázolhatók egyszerű hierarchiával Tehát a hálós adatbázisok lényege, hogy kapcsolatrekordok segítségével olyan egyszerű hierarchiákat alakítunk 16 Adatbázis-típusok Az adatbáziskezelés alapjai ki, melynek elemei egyidejűleg több hierarchiában is részt vehetnek. Bonyolult adatösszefüggéseknél előfordulhat, hogy többféle típusú kapcsolatrekordot kell létrehozni. Az adatmodell használata során semmilyen különbséget nem teszünk az adatrekordok és a kapcsolatrekordok között. Például tekintsük a hallgatók és a tantárgyak nyilvántartását. A hallgatórekordok tartalmazzák a

hallgatók adatait, a tantárgyrekordok pedig az egyes tantárgyakra vonatkozó adatokat. Egy hallgató egyszerre több tantárgyat hallgat, és egy tantárgyat több hallgató hallgat egy félévben. Így a hallgató és a tantárgy rekordok között N:M típusú kapcsolat van. hallgató 1 tantárgy 1 hallgató 2 tantárgy 2 hallgató 3 tantárgy 5 tantárgy 4 tantárgy 3 Vezessünk be kapcsolatrekordokat, amelyek a hallgató kódját és a tantárgy kódját tartalmazzák. Ekkor egy hallgatórekordhoz azok a kapcsolatrekordok tartoznak, amelyek az adott hallgató által felvett tantárgyak kódját tartalmazzák, az egyes tantárgyrekordokhoz pedig azok a kapcsolatrekordok, melyek azoknak a hallgatóknak a kódját tartalmazzák, akik a tárgyat hallgatják. Így mind a hallgató és a kapcsolat, mind a tantárgy és a kapcsolat rekordok között 1:N típusú kapcsolat áll fenn. hallgató 1 kapcs a kapcs b tantárgy 1 kapcs a hallgató 2 kapcs c kapcs d tantárgy 2

kapcs b kapcs c hallgató 3 kapcs e tantárgy 3 kapcs d kapcs e kapcs f tantárgy 4 kapcs f kapcs g tantárgy 5 kapcs g 17 Az adatbáziskezelés alapjai Adatbázis-típusok A kapcsolatrekordok mind a két hierarchiában szerepelnek. Ha összekapcsoljuk a két hierarchiát a kapcsolatrekordokon keresztül, akkor a kiinduló hálózatot kapjuk eredményül, vagyis a kiinduló N:M kapcsolatot kezelni lehet a két hierarchia segítségével. hallgató 1 kapcs a tantárgy 1 hallgató 2 kapcs b kapcs c tantárgy 2 hallgató 3 kapcs d kapcs e tantárgy 3 tantárgy 4 kapcs f kapcs g tantárgy 5 Relációs adatbázisok 6.3 18 Az adatbáziskezelés alapjai Relációs adatbázisok A személyi számítógépeken főként a relációs adatbázisok használata terjedt el, ezért ezekkel részletesebben foglalkozunk. A reláció fogalma Legyen S1, S2,., Sn adott halmazok R az ezen n halmaz közötti reláció, ha olyan (s1,s2,sn) nesekből áll, amelyek

első eleme S1-ből, második eleme S2-ből, n eleme Sn-ből származik Az S1, S2,.,Sn halmazokat a reláció tartományainak nevezzük A relációban szereplő tartományok száma (n) adja meg a reláció fokát. Az adatmodellben az egyedeket tulajdonságokkal írjuk le. Ezeknek a tulajdonságoknak egy-egy halmaz feleltethető meg. A halmaz elemei az adott tulajdonság értékei, vagyis az egyedhalmazban szereplő egyedek ezen tulajdonsághoz tartozó értékei. Például tekintsük a hallgató egyedhalmazt. A hallgató egyedtípust jellemezzük a hallgatókód, név, születési dátum, szak, évfolyam tulajdonságokkal. A név tulajdonságértékeinek halmaza az összes hallgató neve, a születési dátum tulajdonságértékeinek halmaza az összes hallgató születési idejének halmaza. Az évfolyam halmaz 5 elemből áll (1, 2, 3, 4, 5), mert a hallgatók vagy az 1, vagy a 2, , vagy az 5. évfolyamra járnak A hallgatókód, név, születési dátum, szak, évfolyam halmazok

közötti reláció azon ötösökből áll, amelyek 1. eleme a hallgatókód, 2 eleme a név, 3 eleme a születési dátum, 4 eleme a szak, 5 eleme az évfolyam halmazból származik. Pl: (1234, Nagy Judit, 19710711, magyar, 2) Ez a reláció ötödfokú. Természetesen a relációt alkotó ötösök a lehetséges ötösöknek csak egy részhalmaza, mégpedig azok, amelyek valamely egyed tulajdonságait írják le. Így ezek az ötösök az öt halmaz, illetve azok elemei közötti összefüggéseket fejezik ki. A reláció tehát n-esekből áll. Ezeket elrendezhetjük táblázatos formában úgy, hogy egy-egy n-es lesz a táblázat egy-egy sora. Vagyis egy sor egy egyed tulajdonságértékeit tartalmazza A táblázat oszlopai az egyes tulajdonságok, például név oszlop, születési dátum oszlop. Egy oszlopban az adott tulajdonságérték-halmaz valamely eleme szerepelhet. A táblázat könnyen áttekinthető, a felhasználó számára természetes megjelenése az adatoknak. Azt

az adatmodellt, amely az adatok táblázatos ábrázolásán alapul, relációs adatmodellnek nevezzük. A relációs adatmodellben minden egyes reláció egy névvel ellátott táblázat Az adatmodell elemeinek megfeleltethetők a reláció elemei: Az adatbáziskezelés alapjai 19 Relációs adatbázisok A reláció tartományai a tulajdonságok. A táblázatban a tartományoknak az oszlopok felelnek meg. Minden egyes oszlopnak önálló neve van, az oszlopokat adattípusukkal és méretükkel jellemezhetjük. Így a tarományok a hagyományos adatfeldolgozás adatmezőinek felelnek meg A sorok egy-egy egyed tulajdonságértékeit tartalmazzák. A sorok a hagyományos adatfeldolgozás rekordjainak megfelelői. Az egyedhalmaz megfelelője pedig maga a táblázat A reláció definíciójából következnek a tulajdonságai: - Minden sorban, minden oszlophoz egyetlen érték van hozzárendelve., vagyis a táblázat minden cellájában egy elemi érték szerepel. Ez abból

következik, hogy a reláció elemeit úgy képeztük, hogy 1 halmazból pontosan 1 értéket vettünk. - A sorok és oszlopok sorrendje a modell szempontjából közömbös. Hiszen a reláció képzésénél tetszőlegesen választhatjuk meg, hogy a tulajdonsághalmazok milyen sorrendben szerepeljenek, a reláció elemeit szintén tetszőleges sorrendben rendezhetjük egymás alá, amikor táblázatot alkotunk belőlük. A modell adattartalma nem változik meg ha a sorok, vagy az oszlopok sorrendjét megváltoztatjuk. - Egy relációban nem lehet két teljesen azonos sor. Az adatmodellben egy egyedhalmazban nem lehet két teljesen azonos tulajdonságokkal rendelkező egyed, a definíció szerint a reláció elemei között sem lehet két teljesen azonos n-es. - Minden relációban kiválasztható a tartományoknak legalább egy olyan kombinációja, melyeknek tartalma egyértelműen egyetlen sort határoz meg. Ezt a tartományt (oszlopot), vagy tartománycsoportot nevezzük az adott

reláció kulcstartományának. Amennyiben a kulcstartomány csak egyetlen tulajdonságból áll, akkor egyszerű kulcsról beszélünk, egyébként pedig összetett kulcsról. Mivel az egyedhalmaz rendelkezett kulccsal, a megfelelő reláció szintén rendelkezni fog vele. A kulcstartományok az egyedhalmaz kulcsát alkotó tulajdonságoknak megfelelő oszlopok lesznek. A gyakorlatban előfordul, hogy egyes egyedek valamely tulajdonságértékét nem ismerjük, ezért megengedjük, hogy egy sorban valamely oszlopban, vagy oszlopokban ne szerepeljen érték. (Vagyis üres érték szerepeljen. Az üres értéket szokás NULL értéknek nevezni) Relációs adatbázisok 20 Az adatbáziskezelés alapjai 6.31 Normál formák, normalizálási eljárás Tekintsük a következő példát: Egy raktári nyilvántartásban a raktárakban található anyagokról a következő adatok szerepelnek: raktárszám, cikkszám, megnevezés, mennyiség, egységár. Készítsünk egy Raktár

táblát, amelynek oszlopai ezek a tulajdonságok. Az anyag megnevezése és az egységára annyiszor szerepel a táblázatban, ahány raktárban az adott anyag megtalálható. Ha egy anyag egységára megváltozik, ez minden olyan sort érint, amely erre az anyagra vonatkozik. Ha egy anyag kifogy a raktárakból, akkor ennek az anyagnak a megnevezése és egységára sehol sem fog szerepelni a táblában. Ha újra érkezik ebből az anyagból valamelyik raktárba, az anyag jellemzőit újra fel kell vinni valahonnan. Ezen problémák kiküszöbölésére célszerű a táblázatban szereplő tulajdonságok összefüggéseinek elemzése, és a táblázatok átalakítása normál formájú táblázatokká. Első normál forma Azon relációkat, amelyek ábrázolhatók táblázatos formában és minden sor és oszlop metszéspontjában csak egyetlen érték (elemi érték) található, első normál formájúnak (1NF) nevezzük. Funkcionális függőség Egy relációban az A

tulajdonság funkcionálisan függ a B tulajdonságcsoporttól), ha B értéke egyértelműen meghatározza A értékét. tulajdonságtól (vagy Például a felsőoktatási intézményeket a következő tulajdonságokkal írjuk le: név, cím, a vezető (rektor, főigazgató) neve, hallgatói létszám Az oktatási intézmény neve egyértelműen meghatározza az intézmény vezetőjének nevét, ezért a vezető neve funkcionálisan függ az intézmény nevétől. Az adatbáziskezelés alapjai 21 Relációs adatbázisok Teljes függés Amennyiben A tulajdonság funkcionálisan függ a B tulajdonságcsoporttól, az A tulajdonság teljesen függ a B tulajdonságcsoporttól, ha csak a teljes B tulajdonságcsoporttól függ, de annak részeitől nem. Vagyis a teljes B tulajdonság-csoport egyértelműen meghatározza az A tulajdonság értékét, azonban a B tulajdonság-csoport bármely összetevője önmagában nem határozza meg A értékét. Például egy

élelmiszer-áruházban a vásárlásokról a következő adatokat tartják nyilván: a pénztárgép számát, a vásárlás dátumát és időpontját, valamint a fizetett összeget. A pénztárgép száma, a vásárlás dátuma és időpontja együttesen egyértelműen meghatározza a fizetett összeget, azonban a pénztárgép száma önmagában nem határozza meg, hiszen egy pénztárgépen nagyon sok vásárlást blokkolnak, a dátum és az időpont sem határozza meg egyértelműen, hogy melyik vásárlásról van szó, mert egy adott időpontban több pénztárgép is blokkolhat. Tehát a vásárláskor fizetett összeg teljesen függ a pénztárgép száma, a vásárlás dátuma és időpontja tulajdonságcsoporttól. Második normál forma Azon relációkat, amelyek első normál formában vannak és minden olyan tulajdonság, amely nem elsődleges kulcs teljesen függ az elsődleges kulcstól, második normál formájúnak (2NF) nevezzük. Ez tulajdonképpen azt jelenti,

hogy a lehető legszűkebb tulajdonságcsoportot választottuk kulcsnak. Ha egy reláció első normál formájú, és minden kulcsa egyszerű kulcs, akkor második normál formájú is. Az egyszerű kulcs egyetlen tulajdonságból áll, ezért itt nem fordulhat elő, hogy valamely tulajdonság csak a kulcs egy részétől függ. Tranzitív függés Egy relációban egy A tulajdonság tranzitíven függ a B tulajdonság(csoport)tól, ha van olyan C tulajdonság(csoport), amely teljesen függ B-től és az A pedig teljesen függ C-től, de B nem függ Ctől és C nem függ A-tól. Vagyis, ha egy relációban egy tulajdonság funkcionálisan függ az elsődleges kulcstól, de olyan tulajdonságtól is függ, amely nem része a kulcsnak, ezt nevezzük tranzitív függésnek. Relációs adatbázisok 22 Az adatbáziskezelés alapjai Például: A dolgozók napi munkadíj-elszámolását egy táblázatban tartjuk nyilván, melynek oszlopai (a tulajdonságok): dátum, személyi szám,

órabér, dolgozott órák száma, fizetés A kulcs a dátum és a személyi szám. A fizetés azonban függ az órabértől és a dolgozott órák számától, ezért ez a reláció tranzitív függést tartalmaz. Harmadik normál forma Azon relációkat, amelyek második normál formában vannak és nem tartalmaznak tranzitív függőséget (vagyis minden tulajdonság csak az elsődleges kulcstól függ), harmadik normál formájúnak (3NF) nevezzük. Az első normál formájú relációk csak egy része teljesíti a második normál forma feltételeit, ezeknek pedig csak egy része teljesíti a harmadik normál forma feltételeit. relációk 1 NF relációk 2 NF relációk 3 NF relációk Bebizonyítható, hogy minden reláció előállítható 3NF relációk összességeként. Azt az eljárást, amelynek segítségével egy reláció harmadik normál formájú relációkká alakítható, normalizálásnak nevezzük. Egy reláció normalizálását általában további

relációkra történő bontással valósíthatjuk meg. Egy reláció további relációkra történő bontásán azt értjük, hogy a kiinduló táblázat helyett kisebb táblázatokat alakítunk ki úgy, hogy a létrejövő táblázatok együttesen ugyanazt az információtartalmat hordozzák, mint a kiinduló táblázat. 23 Az adatbáziskezelés alapjai Relációs adatbázisok normalizálatlan forma táblázatos formára hozás 1NF a kulcs részeitől való függőségek eltávolítása 2NF a tranzitív függőségek eltávolítása 3NF A normalizálási eljárás az adatbázistervezés témakörébe tartozik, ezért ebben a könyvben csak egy példán keresztül szemléltetjük, hogy hogyan bontható részekre egy reláció. Sem az algoritmussal nem foglalkozunk, sem annak bizonyításával, hogy az így kapott relációk együttese pontosan azt az adattartalmat hordozza, mint a kiinduló reláció. A feladatunk a hallgatók adatainak nyilvántartása. Első közelítésben

adatainkat a következő táblázatban ábrázolhatjuk: HALLGATÓK (HALLGATÓKÓD, SZÜLETÉSI DÁTUM, NÉV, KAR, SZAK, ÉVFOLYAM, TANTÁRGYKÓD, TANTÁRGYNÉV, TANTÁRGY KREDITÉRTÉKE, JEGY, TANÁRKÓD, TANÁR NEVE, TANSZÉK NEVE) Egy sor egy hallgató adatait és vizsgajegyeit tartalmazza. A táblázat kulcsa a hallgatókód. A név nem lehet kulcs, mert egy oktatási intézményben előfordulhatnak azonos nevű hallgatók és tanárok, ezért volt szükség a hallgatókód, és a tanárkód bevezetésére. Két különböző tanszék is meghirdethet azonos nevű tantárgyat, így célszerűbb a tantárgyakat is kóddal azonosítani. Mivel egy hallgató több tantárgyat tanul egy félévben, a táblázatban egy hallgatóhoz több tantárgyra vonatkozó tulajdonságérték (tantárgykód, tantárgy neve stb.) tartozhat Tehát ez a tábla nem normalizált. Alakítsuk át úgy a táblázatot, hogy egy sorban csak egy tantárgy szerepeljen, vagyis minden hallgatóhoz annyi sor

tartozzon, ahány tantárgyat hallgat az adott félévben. Az így kapott tábla Relációs adatbázisok 24 Az adatbáziskezelés alapjai sorait már nem azonosítja egyértelműen a hallgatókód, ezért a hallgatókódot és a tantárgykódot választjuk kulcsnak. A tábla így első normál formában van Vizsgáljuk meg, hogy milyen összefüggések vannak a tulajdonságok között: Csak a hallgatókódtól függ: születési dátum, név, kar, szak, évfolyam Csak a tantárgykódtól függ: tantárgynév, tantárgy kreditértéke, tanárkód, tanár neve, tanszék neve A teljes kulcstól függ: jegy Ennek megfelelően bontsuk három táblára a kiinduló táblánkat. Az első táblában helyezzük el a hallgatóra vonatkozó tulajdonságokat, a másodikban a tantárgyakra vonatkozókat. A harmadikba kerül a jegy, amelyik függ a hallgatókódtól és a tantárgykódtól, ezért mindkét kódnak szerepelnie kell benne. HALLGATÓ-1 (HALLGATÓKÓD, SZÜLETÉSI DÁTUM, NÉV,

KAR, SZAK, ÉVFOLYAM) A kulcs a hallgatókód. TANTÁRGY (TANTÁRGYKÓD, TANTÁRGYNÉV, TANTÁRGY KREDITÉRTÉKE, TANÁRKÓD, TANÁR NEVE, TANSZÉK NEVE) A kulcs a tantárgykód. EREDMÉNY (HALLGATÓKÓD, TANTÁRGYKÓD, JEGY) A hallgatókód és a tantárgykód alkotja a kulcsot. A kapott táblák második normál formában vannak, mert az első két tábla kulcsa egyszerű kulcs, a harmadik táblában a jegy tulajdonság pedig az összetett kulcs mindkét tagjától függ. Hiszen csak a hallgatókód ismeretében nem tudom megmondani, hogy milyen jegyet kapott a hallgató. Csak a tantárgykód ismeretében sem lehet tudni a jegyet, mert számos hallgató kaphatott jegyet abból a tantárgyból. Az adatbáziskezelés alapjai 25 Relációs adatbázisok A HALLGATÓ-1 és az EREDMÉNY tábla harmadik normál formájú, a tulajdonságok csak a kulcstól függnek. A TANTÁRGY tábla azonban nem harmadik normál formájú, mert a tanár neve és a tanszék függ a tanár

kódjától, ami pedig nem kulcs. Ezért ezt a táblát bontsuk két újabb táblára, úgy, hogy a tanárra vonatkozó adatokat emeljük ki egy másik táblába: TANTÁRGY-1 (TANTÁRGYKÓD, TANTÁRGYNÉV, TANTÁRGY KREDITÉRTÉKE, TANÁRKÓD) A kulcs a tantárgykód. TANÁR (TANÁRKÓD, TANÁR NEVE, TANSZÉK NEVE) A tábla kulcsa a tanárkód. Az így kapott táblák már harmadik normál formában vannak. A normalizálási eljárás eredményeként a kiinduló táblánkat négy táblára bontottuk: HALLGATÓ-1 EREDMÉNY TANTÁRGY-1 TANÁR Most vizsgáljuk meg, milyen előnyök származnak ebből a felbontásból, a 3NF táblázatok használatából. Sokkal kevesebb adat kerül többszörösen tárolásra (minimális redundancia). A tantárgyakat leíró adatok (név, kreditérték) csak egyszer kerülnek tárolásra a TANTÁRGY-1 táblában, míg az eredeti táblánk esetén annyiszor tároltuk őket, ahány hallgató felvette az adott tantárgyat. Ha módosítani kell egy tantárgy

valamely adatát, például a kreditértéket, elegendő ezt egyetlen helyen elvégezni. A kiinduló tábla esetén, ha minden olyan hallgatót törlünk a táblából, akik egy adott tantárgyat felvettek, akkor a tantárgy adatai is törlődnek. Míg a harmadik normál formában levő tábláink esetén a TANTÁRGY-1 táblában benne maradhat az a tantárgy, amelyet abban a félévben nem oktatnak, így a rá vonatkozó adatok nem vesznek el a törlés során. Rugalmasabb adatfelvitelt biztosít, hiszen ha egy új tantárgyat szeretnénk bevezetni, már akkor is felvihetjük az adatait a TANTÁRGY-1 táblába, amikor még egyetlen hallgató sem vette fel. Ezt a kiinduló tábla esetén nem tehetjük meg. Relációs adatbázisok 26 Az adatbáziskezelés alapjai A továbbiakban csak olyan relációkkal foglalkozunk, melyek harmadik normál formában vannak. Az előbbi példánkban a kiinduló táblánkat négy táblára bontottuk. A kapott táblák egymással kapcsolatban

állnak, kulcsmezőiken keresztül. Az EREDMÉNY tábla a hallgatókód segítségével kapcsolódik a HALLGATÓ-1 táblához, a tantárgykód segítségével pedig a TANTÁRGY-1 táblához. A TANÁR tábla a tanárkódon keresztül áll kapcsolatban a TANTÁRGY-1 táblával A relációs adatbázisban egyes táblázatok - többnyire kulcsmezőiken keresztül - kapcsolatban állhatnak egymással. A relációs adatbázisok terminológiájában szokásos a táblázat sorait azonosító kulcstartományt elsődleges kulcsnak (primary key) nevezni. Azt a tartományt pedig, amely az adott táblázatban szerepel, és egy másik táblázatban kulcstartomány, idegen kulcsnak (foreign key) nevezik. Előző példánkban a TANÁR táblában a tanár kódja elsődleges kulcs, hiszen ebben a táblában egyértelműen meghatároz egy sort egy tanárkód érték. A TANTÁRGY-1 táblában a tanárkód nem kulcs, mert értéke nem határoz meg egyértelműen egy sort, hiszen egy tanár több tantárgyat

is taníthat, így több sorban is szerepelhet a kódja. A TANTÁRGY-1 táblában a tanárkód idegen kulcs, mert egy másik tábla, mégpedig a TANÁR tábla elsődleges kulcsa. Egy relációnak több kulcsa is lehet, ekkor döntés kérdése, hogy melyiket választjuk elsődleges kulcsnak. A relációs adatmodellben mind az 1:N mind az N:M típusú kapcsolatokat ki tudjuk fejezni. A táblázatos forma előnye, hogy jól áttekinthető, sokkal könnyebb benne eligazodni, mint a kusza hálózatokban. Minden hálózat - esetleg bizonyos redundanciák bevezetésével - táblázattá alakítható, vagyis mind a hierarchikus, mind a hálózatos adatmodell átalakítható relációs adatmodellé. Nézzük meg a hálós adatbázisoknál bemutatott hallgatók és tantárgyak nyilvántartását és vessük össze a normalizálási példában bemutatottal. A hallgatók és tantárgyak nyilvántartását három táblázattal célszerű megvalósítani. Az első a Hallgató tábla, mely az egyes

hallgatók adatait tartalmazza, a második a Tantárgy tábla, amely a tantárgyakra vonatkozó adatokat tartalmazza, a harmadik pedig a Kapcsolat tábla, amelynek két oszlopa van, az egyik a hallgatókód, a másik a tantárgykód, sorai az összetartozó hallgatókód-tantárgykód párokat tartalmazzák. Vagyis egy hallgatókód annyiszor szerepel benne, ahány tantárgyat hallgat, egy tantárgykód pedig annyiszor, ahány hallgató hallgatja. Amennyiben a tantárgyból kapott jegyet is felvesszük a tulajdonságok közé, úgy ez is a Kapcsolat táblába kerül. Ekkor a Kapcsolat tábla a normalizálási példában az 27 Az adatbáziskezelés alapjai Relációs adatbázisok Eredmény táblának felel meg. Mivel a hálós adatbázisoknál alkalmazott feladatban a tanárokra vonatkozó adatok nem szerepeltek, a normalizálási példa Tanár táblájának nincs megfelelője. A Hallgató táblázatban a hallgatókód a kulcs, hiszen ez az érték azonosítja egyértelműen a

hallgatót. A Tantárgy táblázatban a tantárgykód a kulcs, a Kapcsolat táblázatban pedig a hallgatókód és a tantárgykód alkotják a kulcsot. H allgató táblázat hallgatókód név születési dátum 10005 K I SS Á D Á M 69.0515 10012 ERD EI Á GOSTON 71.1012 10021 H A JÓS A M Á L I A 70.0404 20333 H ORV Á TH TÜ N D E 71.1231 39567 V I G V A L ÉRI A 69.0312 39876 A RA TÓ A N D RÁ S 70.0101 K apcsolat táblázat hallgatókód tantárgykód 1012 10005 1012 39876 1123 10012 1123 20333 1123 39876 1543 10021 2001 39567 2001 39876 . Relációs adatbázisok 28 Az adatbáziskezelés alapjai 6.32 Műveletek relációkon Ugyanazon adatbázis különböző felhasználóinak az egyedhalmazokról és a közöttük levő kapcsolatokról eltérő felfogása lehet, ezért egyes felhasználók számára a táblázat oszlopainak részhalmazait kell kiemelni, más felhasználók számára pedig a táblázatokat össze kell vonni,

létrehozva ezzel egy magasabb rendű táblázatot. A relációs modell egyik nagy előnye, hogy a különböző igényeknek megfelelő adatelemek matematikailag könnyen és jól definiálhatók a relációalgebra, vagy a relációanalízis segítségével. 6.321 Relációalgebra A relációalgebrai műveletek olyan műveletek, melyek relációkon vannak értelmezve, s eredményük szintén reláció. Tekintsük át a legfontosabb relációalgebrai műveleteket Projekció (vetítés). Egy R reláció T1, T2, , Ti tartományokra történő vetítésének eredménye az a reláció, melyet R-ből úgy kapunk, hogy csak a felsorolt oszlopokat vesszük a táblázatból. Jelölése: ΠT1,T2,.,Ti(R) Például: A hallgatók adatait tartalmazó táblából csak a hallgatók nevét és az évfolyam számát szeretnénk látni. Szelekció (korlátozás) . Egy R reláció F feltétel szerinti korlátozása az a reláció, melyet R-ből úgy kapunk, hogy csak az F feltételt kielégítő

sorait hagyjuk meg. Az F feltétel oszlopnevekből, konstansokból, logikai műveletekből és összehasonlító operátorokból épül fel. Jelölése: σF(R) Az adatbáziskezelés alapjai 29 Relációs adatbázisok Például: A hallgatók adatait tartalmazó táblából csak azokat a hallgatókat szeretnénk látni, akik a 3. évfolyamra járnak. A szelekció feltétele évfolyam=3 Egyesítés (unió) . Az R és S relációk egyesítése azon sorok összessége, melyek vagy az R, vagy az S relációban benne vannak. Az esetleges azonos sorok csak egyszer szerepelnek az unióban Ez a művelet csak azonos sorhosszúságú relációkon értelmezhető. Jelülése: R U S Például: Az egyik tábla tartalmazza a Mezőgazdaságtudományi Kar hallgatóinak nevét, születési dátumát, lakcímét, a másik ugyanolyan felépítésű tábla a Gazdaság- és Társadalomtudományi Kar hallgatóinak adatai. A két kar hallgatóinak adatait tartalmazó táblát a két tábla

egyesítésével kapjuk meg. Azon hallgatók, akik beiratkoztak mindkét karra, csak egyszer fognak szerepelni az eredménytáblában. Különbség. Egy R és S reláció különbsége azon sorokból áll, melyek benne vannak R-ben, de nincsenek benne S-ben. Az R és S relációnak azonos sorhosszúságúnak kell lennie Jelölése: R - S Relációs adatbázisok 30 Az adatbáziskezelés alapjai Például: Az egyik tábla tartalmazza a Mezőgazdaságtudományi Kar hallgatóinak nevét, születési dátumát, lakcímét, a másik ugyanolyan felépítésű tábla a Gazdaság- és Társadalomtudományi Kar hallgatóinak adatai. Azon hallgatók adatait, akik csak a Mezőgazdaságtudományi Karra járnak úgy kaphatjuk meg, hogy az első táblából kivonjuk a második táblát. Metszet. Egy R és S reláció metszete azokat a sorokat jelenti, melyek mindkét relációban benne vannak. Jelölése: R ∩ S Például: Az egyik tábla tartalmazza a Mezőgazdaságtudományi Kar

hallgatóinak nevét, születési dátumát, lakcímét, a másik ugyanolyan felépítésű tábla a Gazdaság- és Társadalomtudományi Kar hallgatóinak adatai. A két tábla metszete azon hallgatók adatait tartalmazza, akik mindkét karra beiratkoztak. Direkt szorzat. Ha egy R reláció sorai r elemből állnak, egy S relációé pedig s elemből, akkor a két reláció direkt szorzataként kapott reláció sorai r+s elemből fognak állni, úgy, hogy a sor első r eleme egy R-beli sor, utolsó s eleme pedig egy S-beli sor, s ezek minden lehetséges összeállításban szerepelnek. Ha R-ben k db sor volt, S-ben pedig n db, akkor a direkt szorzat eredményeként kapott relációban k*n db sor lesz! Jelölése: R X S Az adatbáziskezelés alapjai 31 Relációs adatbázisok Például: Az egyik tábla tartalmazza a könyvtár szak 1. évfolyamára járó hallgatók nevét és születési dátumát. A másik tábla a könyvtár szakon az 1 félévben oktatott vizsgaköteles

tárgyak nevét és óraszámát. Egy olyan táblázatot szeretnénk készíteni, amelyben minden egyes 1 éves könyvtár szakos hallgatóról szerepel, hogy milyen vizsgákat kell letennie. Ezt a két tábla direkt szorzataként tudjuk előállítani. Az eredménytábla oszlopai a hallgatók nevét, születési dátumát, a tantárgy nevét és óraszámát fogják tartalmazni. Az eredménytábla sorainak száma annyi lesz, amennyi a hallgatók száma szorozva a tantárgyak számával. Összekapcsolás (join) . Legyen R és S két reláció, valamint tekintsünk egy összehasonlító operátort. Az R és S reláció összekapcsolása az a reláció, amelyet az R x S relációból úgy kapunk, hogy csak azokat a sorokat hagyjuk meg, amelyekben az R reláció i-edik és az S reláció j-edik oszlopa között fennáll az összehasonlító operátornak megfelelő reláció. Ha a megadott reláció egyenlőség, akkor az összekapcsolást egyenlőség-összekapcsolásnak (equijoin)

nevezzük. Jelölése: R * S iΘj Például: Az egyik tábla gyerekek nevét és zsebpénzét tartalmazza. A másik tábla az üzletben kapható játékok nevét és árát. Egy gyerek csak olyan játékot vásárolhat meg, amelynek ára nem több, mint a saját zsebpénze. Tudni szeretnénk, hogy melyik gyerek melyik játékokat veheti meg Ehhez készítsük el a két tábla összekapcsolását, amelynek feltétele, hogy a zsebpénz oszlopban található érték nagyobb, vagy egyenlő legyen az ár oszlopban található értéknél. Vagyis a két tábla direkt szorzatából csak azokat a sorokat vesszük, ahol zsebpénz>=ár . Relációs adatbázisok 32 Az adatbáziskezelés alapjai Természetes összekapcsolás (natural join) . Legyen R és S két reláció Állítsuk elő R x S -t és csak azokat a sorokat hagyjuk meg, melyek R és S azonos nevű tartományain megegyeznek. Vagyis, az azonos mezőkben azonos érték található. Az azonos mezőkből csak egyet-egyet

hagyunk meg. Az így kapott eredményreláció a két reláció természetes összekapcsolása Jelölése: R * S Például: Az egyik tábla tartalmazza a hallgatók nevét, születési dátumát, a szak kódját és az évfolyamot. A másik táblázat a szak kódját és nevét tartalmazza Olyan táblázatot szeretnénk készíteni, amelyben a hallgatók adatai mellett nemcsak a szak kódja, hanem a neve is szerepel. Készítsük el a két tábla természetes összekapcsolását. Az azonos oszlop a szak kódja, ez az eredménytáblában csak egyszer fog szerepelni. Minden hallgatóhoz annak a szaknak a neve lesz hozzákapcsolva, amelyikre jár, vagyis amelyik szak kódja megegyezik a hallgató táblázatban feltüntetett szakkóddal. Ha egy táblában idegen kulcsként szerepel egy másik tábla kulcsa, akkor a két tábla természetes összekapcsolása ennek a kulcstartománynak a segítségével történhet. A normalizálásnál bemutatott példában a TANTÁRGY-1 és a TANÁR

tábla természetes összekapcsolásához a tanár kódját használhatjuk. Az eredménytábla a következő lesz: (TANTÁRGYKÓD, TANTÁRGYNÉV, TANTÁRGY KREDITÉRTÉKE, TANÁRKÓD, TANÁR NEVE, TANSZÉK NEVE) Az adatbáziskezelés alapjai 33 Relációs adatbázisok 6.322 Relációanalízis A relációanalízis segítségével a felhasználó azt az eredményt definiálja, amit az adatbázisból kapni kíván. A megfogalmazott feltételekkel sorokat, vagy mezőket lehet kiválasztani A feltételek definiálásához a mezőneveket, konstansokat, összehasonlító operátorokat, logikai műveleteket (és, vagy, negálás), továbbá a "létezik" és a "minden" szimbólumokat lehet felhasználni. ∧ ∨ ¬ ∃ ∀ és vagy negálás létezik minden Példák: Egy hallgatói nyilvántartásból keressük ki a harmadik évfolyamból azokat a csoportokat, amelyekben volt olyan hallgató, aki jeles eredményt ért el. Ennek megfogalmazása: azon csoportokat

választjuk ki, amelyekre igaz, hogy az évfolyam értéke 3 és létezik 4.5-nél jobb eredmény: { csoport  evf=3 ∧ ∃ ered > 4.5 } Egy hallgatói nyilvántartásból keressük ki a harmadik évfolyamból azokat a csoportokat, amelyekben minden hallgató eredménye jobb volt, mint 3.5 Ennek megfogalmazása: azon csoportokat választjuk ki, amelyekre igaz, hogy az évfolyam értéke 3 és minden eredmény jobb, mint 3.5 : { csoport  evf=3 ∧ ∀ ered > 3.5 } A relációanalízis és a relációalgebra egymással egyenértékű. Bármely relációanalízissel felírt kifejezést megfogalmazhatunk relációalgebrai formulákkal és ez fordítva is igaz. Egyes relációs adatbáziskezelők lekérdező nyelve a relációalgebrán alapul, vannak azonban a relációanalízisre támaszkodó nyelvek is, sőt olyanok is, amelyek mindkettőt támogatják. A relációanalízis műveleteinek segítségével a felhasználó a kívánt adatokat tulajdonságaik alapján

választhatja ki, míg a relációalgebrai műveletek esetében az adatok előállításához szükséges műveleteket kell megadni. Interaktív adatbáziskezelő-rendszerek 7. 34 Az adatbáziskezelés alapjai Interaktív adatbáziskezelő rendszerek Az interaktív adatbáziskezelő rendszerek használatakor a felhasználó párbeszédet folytat a számítógéppel. Vagyis a felhasználó megadja parancsait, vagy kérdéseit, amelyekre azonnali választ vár a számítógéptől. Fontos, hogy a felhasználó elfogadható időn belül választ kapjon kérdéseire A megfelelő válaszidő 2-3 másodpercen belül van, de a fél percen belüli válasz még elfogadható. Nem lenne szerencsés például egy könyvtári nyilvántartási rendszernél, ha fél óra alatt derítené ki, hogy a Háború és béke bent van-e a könyvtárban. Az interaktív adatbáziskezelés egyik legnagyobb problémája az adatok olyan fizikai szervezésének kialakítása, amely nagy mennyiségű adat

esetén is gyors válaszadást biztosít. Az interaktív adatbáziskezelés során is adódhatnak olyan feldolgozási igények, melyek kielégítése hosszabb időt vesz igénybe. Ezeket célszerű külön futtatni, például a kórházi statisztikákat rendelési időn kívül. 7.1 Konkurens műveletek Egy adatbázis adataihoz általában egyszerre nem csak egy felhasználó szeretne hozzáférni. Gyakori, hogy egy időben számos lekérdezési és módosítási igény érkezik az adatbázishoz. Az adatbázis-kezelő feladata, hogy összehangolja ezeket az igényeket. Tekintsük az előző könyvtári példát! Tegyük fel, hogy két kölcsönző helyen is a Háború és békét szeretnék kikölcsönözni. A könyvtárosok mindkét helyen megkérdezik az adatbázist, hogy bent van-e a könyv a könyvtárban. Mind a ketten azt a választ kapják, hogy egy példány van jelenleg bent. Ezután mindketten jelzik az adatbázisnak, hogy a könyvet kiadták. A probléma csak akkor derül

ki, amikor a raktárból két kötetet kellene kihozni, pedig ott csak egy van. Az adatbázis általában egy központi gépen található, amelyhez más gépek, vagy terminálok csatlakoznak. Ha ugyanazt az adatrekordot egyszerre több felhasználó is kiolvassa az adatbázisból, ez semmilyen problémát nem okoz. Ha azonban egyszerre két felhasználó szeretné módosítani ugyanazt a rekordot, akkor adatvesztés történhet. Mindketten kiolvassák az adatbázisból a rekordot, a saját gépük memóriájába kerül a rekord tartalma. Itt elvégzik a módosítást, majd visszaírják a rekord új tartalmát az adatbázisba. Csakhogy a második visszaírás felülírja az elsőt, így azok a módosítások, amelyeket az a felhasználó hajtott végre, aki előbb visszaírta a rekordot, elvesznek. Példaként tekintsünk egy hallgatói nyilvántartást. Az A felhasználó egy hallgató ösztöndíját kívánja módosítani, a B felhasználó pedig ugyanezen hallgató lakcímét.

Interaktív adatbáziskezelő-rendszerek 35 Az adatbáziskezelés alapjai Adatbázis hallgatókód 1011 név K iss Jolán lakcím ösztöndíj Gödöllõ, Ó utca 3. 5000 A felhasználó B felhasználó kiolvassa a rekordot kiolvassa a rekordot 1011 K iss Jolán Gödöllõ, Ó utca 3. 5000 1011 K iss Jolán Gödöllõ, Ó utca 3. 5000 a lakcímet Budapest, Fürdõ utca 10.-re változtatja az ösztöndíjat 1000 Ft-tal megnöveli 1011 K iss Jolán Gödöllõ, Ó utca 3. 6000 1011 K iss Jolán Bp., Fürdõ utca 10 5000 B felhasználó A felhasználó visszaírja a rekordot az adatbázisba visszaírja a rekordot az adatbázisba Adatbázis 10 11 Kiss Jolán Gödöllõ, Ó utca 3. 6000 Adatbázis 10 11 Kiss Jolán Bp., Fürdõ utca 10 5000 Mivel az A felhasználó előbb írta vissza a rekordot az adatbázisba, a B felhasználó rekordja felülírja azt, így az adatbázisba csak a lakcímmódosítás kerül be, az ösztöndíj összege változatlan marad. A

hibát észre sem veszik, hiszen az A felhasználó úgy látta, hogy az ő módosítása rendben megtörtént. Ezen problémák megelőzésére vezették be a többfelhasználós adatbáziskezelő rendszerekben az egyes adatbázisok, vagy azok bizonyos részeinek zárolását (lock). A zárolást egy alkalmazás kezdeményezi, hogy a számára szükséges adatokat más alkalmazás ne módosíthassa. A zárolás lehet Interaktív adatbáziskezelő-rendszerek 36 Az adatbáziskezelés alapjai sor szintű (rekord szintű), ekkor csak a meghatározott sorra vonatkozik, a többi sor változatlanul használható a többi alkalmazás számára. Lehet tábla szintű, ekkor egy teljes tábla tartalma kerül elzárásra, vagy adatbázis szintű, ekkor az adatbázis teljes tartalma zárolva van a többi alkalmazás számára. Ha valamely alkalmazás zárol egy sort, vagy egy adatbázist, akkor a zárolt rész adatait csak olvasni tudja egy másik alkalmazás. Ha a másik alkalmazás

zárolni szeretné ezt a sort, illetve adatbázist, várnia kell addig, míg az első felhasználó a zárat fel nem oldja (unlock). Ha egy teljes adatbázis zárolva van, akkor más felhasználó sor szintű lockolást sem valósíthat meg benne. Könyvtári példánkban fölösleges lenne a teljes adatbázist zárolni, elegendő csak az adott könyvre vonatkozó adatokat, vagyis sor szintű lockolást megvalósítani. Így más könyvek adatait továbbra is lehet zárolni, így módosítani. A lockolás megvalósítása a konkrét adatbáziskezelőtől függ Van amelyik ténylegesen csak a kívánt sort lockolja, van amelyik a sor környezetében lévőket is, mindazokat, amelyek egyszerre kerülnek a memóriában levő munkaterületre. (Az adatbázis valamilyen háttértáron, többnyire mágneslemezen található. Ha valamilyen adatra szükségünk van az adatbázisból, akkor be kell hozni a megfelelő rekordot a memóriába. Az adatbáziskezelő azonban általában nem egyetlen

rekordot mozgat egyszerre, mert így nem lenne hatékony a működése, hanem rekordcsoportokat, blokkokat.) Amennyiben módosítani akarunk egy adatbázisban szereplő adatot, ha az új érték független a régitől, akkor elég, ha csak a beírás idejére zároljuk az adatot tartalmazó sort, de ha az új érték a régi függvénye, akkor már a kiolvasás előtt zárolnunk kell a sort, nehogy a kiolvasás és a beírás között más módosítsa azt. Könyvtári rendszerünkben is ezt az eljárást kell alkalmazni, ekkor nem fordulhat elő, hogy ketten kölcsönzik ki egyszerre ugyanazt a könyvet. Mivel egy adat módosítása sok ideig tarthat, például azért, mert a felhasználó közben telefonál, vagy akkor kezdi keresni, hogy mit kell begépelnie, amikor a rekordot már beolvasta, ezért egyes adatbáziskezelők a rekord beolvasás előtti zárolása helyett a visszaírás előtt ellenőrzik, hogy módosult-e az adatbázisban a rekord a kiolvasás óta. Csak akkor írják

vissza a rekordot, ha nem történt módosítás a kiolvasás óta Egyébként pedig a rekord új tartalmát jelenítik meg a felhasználónak, akinek újra el kell végeznie a módosítást. Ebben az esetben a rekordokat csak a visszaírás idejére zárolják. A teljes adatbázis zárolására akkor lehet szükség, ha olyan műveletet akarunk végezni, amely az adatbázis teljes egészét érinti, ilyen például az adatbázis újraszervezése. Akkor azonban, ha olyan módosítást végzünk, amely minden rekordot érint, - például egy hallgatói ösztöndíj-nyilvántartásban minden ösztöndíjat 1000 Ft-tal emelni kell - nem érdemes a teljes adatbázist zárolni, mert a zárolást soronként is meg lehet tenni. Egy ciklus segítségével a program sorra veszi a sorokat, a sort zárolja, módosítja, majd a zárolást feloldja. Ennek az az előnye, hogy a módosítás idején mindig csak egy sor van elzárva a többi alkalmazás elől. A zárolások következtében előállhat

patt-helyzet, amikor a felhasználók egymásra várnak. Például, két felhasználó ugyanazt a két adatbázist szeretné használni. Az egyik felhasználó zárolja az A adatbázist a másik pedig a B-t. Ezután az első felhasználó zárolni szeretné a B adatbázist is, a második pedig az A-t. Ekkor mindketten a másikra várnak , egyik sem tud továbblépni Az így Az adatbáziskezelés alapjai 37 Interaktív adatbáziskezelő-rendszerek kialakult helyzetet angol szakkifejezéssel deadlock-nak hívják. Ennek elkerülésének egyik módja, hogy a programozók úgy készítik az alkalmazásokat, hogy a használni kívánt adatbázisokat minden alkalmazás azonos sorrendben próbálja zárolni. A szükséges rekordlockolásokat bizonyos adatbáziskezelők automatikusan végzik és az alkalmazás készítőjének csak speciális esetekben kell gondoskodnia róla, más adatbáziskezelőknél az alkalmazás készítőjének feladata a lockolások kiadása. 38

Adatvédelem 8. Az adatbáziskezelés alapjai Adatvédelem Egy adatbáziskezelő rendszerben az adatvédelemnek három területét szoktuk megkülönböztetni. Ezek az adatok integritása, a hozzáférési jog és az adatok fizikai védelme. Az adatok integritásán tulajdonképpen az adatbázisban található adatok közötti összefüggések folyamatos meglétét értjük. Az adatbázisban minden adatnak ugyanakkori állapotot kell tükröznie Például egy könyvelési rendszerben a mérleg két oldalának mindig egyeznie kell, vagy egy raktári nyilvántartásban a raktárforgalmi adatoknak összhangban kell lenniük a raktári adatokkal. (Ha a raktárból kiszállítottak 10 tonna acélt, akkor a raktárkészletnek ennyivel kevesebbnek kell lennie.) Az adatok integritása általában valamiféle tévműködés, vagy hardware hiba miatt sérül meg. Sok esetben helyreállítása csak az adatbázis mentett állapotának visszatöltésével lehetséges. Az adatok integritásának

biztosításához, figyeléséhez az adatbáziskezelő programokba ellenőrzéseket kell beépíteni. Ezek azt vizsgálják, hogy az adatbázisba bekerülő adatok tartalmi és formai szempontból az előírtaknak megfeleljenek. Az adatellenőrzés legalacsonyabb szintje a mező szintű ellenőrzés. Ez egy adott mezőbe bekerülő adatoknak a többi adattól független vizsgálatát jelenti, ami általában rögtön az adatmező tartalmának bevitelekor történik. Ekkor ellenőrizhetők a következők: - a bevitt adat megfelel-e a mező típusának és méretének (pl. numerikus mező esetén nem lehet benne nem numerikus karakter) - az adat tartalmilag megfelel-e az előírtaknak (pl. dátum típusú adat helyes dátumot tartalmaz-e, vagy az adat a megadott értékhatárok közé esik-e, vagy a megengedett értékek valamelyikével megegyezik-e.) Az adatellenőrzés következő szintje a mezők közötti összefüggések vizsgálata. Ez a sor (rekord) szintű ellenőrzés. Ezt

általában a rekord tartalmának bevitele, illetve módosítása után kell elvégezni Például egy dolgozó esetén a munkábalépés dátuma nem lehet kisebb, mint a születési dátuma. A tábla szintű ellenőrzések egy adott táblában levő sorok közötti összefüggések vizsgálata, például a táblában nem lehet két azonos kulcsú, vagy két egyforma tartalmú sor. Az adatellenőrzés másik szintje a táblák közötti összefüggések ellenőrzése. Például egy raktári nyilvántartás esetén a raktár táblába nem kerülhet olyan cikk, amelynek adatai nem szerepel a cikk táblában, továbbá a forgalom táblában nem szerepelhet olyan cikk kivétele egy raktárból, amilyen cikk ott nem is szerepel, vagyis a raktár táblában nincs benne. Egy cikkből nem lehet nagyobb mennyiséget kiszállítani egy raktárból, mint amennyi ott található. A táblák közötti összefüggések vizsgálatát az ellenőrzés jellegétől függően lehet mező szinten, vagy

magasabb szinten végezni. Az adatbáziskezelés alapjai 39 Adatvédelem Az adatokhoz történő illetéktelen hozzáférés megakadályozását segíti, ha a felhasználók azonosítót kapnak és csak jelszóval férhetnek hozzá az adatbázis adataihoz. A felhasználók különböző jogokkal rendelkezhetnek az adatbázis adataival kapcsolatban, például lekérdezési jog, adatmódosítási jog. Nemcsak a felhasználókhoz rendelhető jog, hanem az adatbázis objektumaihoz is. Lehetnek olyan objektumok, amelyeket bizonyos felhasználók egyáltalán nem érhetnek el, számukra ezek nem léteznek. Előfordulhat, hogy egy táblához csak lekérdezési jogot rendelt hozzá a tábla tulajdonosa (aki a táblát létrehozta). Egy másik felhasználónak hiába van adatmódosítási joga, ezen a táblán csak lekérdezéseket hajthat végre. Vagyis, a tényleges jogokat a felhasználóhoz rendelt és az objektumokhoz rendelt jogok együttesen határozzák meg. Az

adatbázis-állományok belső szerkezete operációs rendszer szintről többnyire nem értelmezhető, csak az adatbáziskezelő rendszer segítségével. Így illetéktelen felhasználó, aki nem tud belépni az adatbáziskezelő rendszerbe, nem tudja operációs rendszer szintről sem megnézni annak adattartalmát. Az adatok fizikai védelmén azt értjük, hogy az adatbázis adatai ne vesszenek el, vagy váljanak használhatatlanná egy esetleges hardware, vagy software hiba következtében. Ezért az adatbázis adatait bizonyos időközönként le kell menteni. Ez valamilyen adathordozóra történik, például streamerszalagra. Nagyméretű adatbázisoknál egy-egy mentés hosszadalmas, túl gyakran nem végezhető, ugyanakkor egyetlen napi elveszett adatmennyiség felvitele is nagy problémát okozhat egyes rendszerekben. Ezért különböző megoldások születtek az adatok mentésére Az adatbázisban található összes adat mentését teljes mentésnek nevezzük. Bizonyos

adatbázisoknál megvalósítható az adatok szelektív mentése, vagyis az adatbázis egyes részeit különböző gyakorisággal mentik le. Ezt akkor célszerű alkalmazni, ha vannak az adatbázisnak viszonylag állandó részei, melyeket nem kell nagy gyakorisággal menteni. Ekkor az állandó részeket ritkán, a gyakran változó részeket pedig sűrűbben mentik. Ezzel lényegesen lerövidülhet a mentési idő. Célszerű lehet az adatmódosítások megőrzése. Ez esetben nagyobb időközönként (például havonta) készítenek másolatot az adatbázisról. A mentés után történt adatkarbantartásokat egy állományban gyűjtik (on-line mentés), így az adatbázis esetleges meghibásodása esetén az utolsó teljes mentésből és a megőrzött módosításokból az adatbázis helyreállítható. A módosítások állandó könyvelése azonban lassítja a karbantartási folyamatot. Gyorsabb lehet az adatbázis helyreállítása ha nem a módosításokat őrizzük meg,

hanem a rekordok módosítás utáni állapotát. Ekkor a helyreállításnál az utolsó mentett állapot visszatöltése után csak be kell tölteni az azóta módosított rekordok új állapotát. Ez valamivel gyorsabb, mint a módosítások ismételt elvégzése. Adatvédelmi szempontból hasznos lehet a rekordok karbantartás előtti állapotának megőrzése (before image). Segítségével kiküszöbölhető egy helytelenül végrehajtott karbantartás hatása úgy, hogy egyszerűen visszatöltik a karbantartás előtti állapotot. Relációs adatbáziskezelő nyelvek 40 Az adatbáziskezelés alapjai 9. Relációs adatbáziskezelő nyelvek Az 1970-es évektől kezdve számos nyelvet dolgoztak ki a relációs adatbázisok kezelésére, azonban sokáig egyik sem tudott népszerűvé válni. A személyi számítógépek megjelenésével azonban változott a helyzet. 1982-ben az Ashton-Tate cég létrehozta személyi számítógépekre a dBASE II. , majd 1984-ben a dBASE III

relációs adatbáziskezelő nyelveket, melyek gyorsan elterjedtek a PC-s felhasználók körében. Ezek a nyelvek azonban még nem teljesen valósították meg a relációalgebra műveleteit. 1982-ben az IBM kifejlesztette az első sikeres nagygépes relációs adatbáziskezelő nyelvet, majd 1983-ban megjelentette a DB2 nagygépes adatbáziskezelő rendszert, amely az SQL (Structured Query Language) lekérdező nyelvre alapult, amely már teljesen a relációalgebrai műveleteket alkalmazta. Ennek alapján az Amerikai Szabványügyi Hivatal szabványosította az SQL nyelvet (STANDARD SQL) és azóta számos SQL alapú adatbáziskezelő rendszert fejlesztettek ki (pl. INGRES, ORACLE). Azonban a dBASE változatlanul népszerű maradt, újabb változatai kerültek piacra, a dBASE III+, A dBASE IV - amely SQL alapú - valamint a CLIPPER nyelv, amely dBASE III alapú adatbáziskezelő rendszer, de szemben a dBASE nyelvekkel, amelyek interpreterek, a CLIPPER fordítóprogrammal rendelkező

fejlesztő eszköz. A későbbiekben a személyi számítógépeken elterjedt számos relációs adatbáziskezelő közül a dBASE III adatbáziskezelővel és a hozzá tartozó adatbáziskezelő nyelvvel, valamint az SQL alapú ORACLE-lel és GUPTA-val fogunk megismerkedni Adatbáziskezelő architektúrák 41 Az adatbáziskezelés alapjai 10. A file-server és a kliens-server architektúrájú adatbáziskezelő rendszerek Az adatbáziskezelő rendszerek általában több felhasználó kiszolgálását végzik. A felhasználók hálózaton keresztül érik el az adatbázist. A hálózat felépítése lehet file-server architektúrájú, vagy kliens-server architektúrájú. A file-server architektúra esetén az adatbázist alkotó file-ok a file-server gép lemezegységein találhatók. A server géphez kapcsolódnak a hálózaton keresztül a különböző felhasználói számítógépek (pl. PC-k), amelyeken futó alkalmazások segítségével a felhasználók az

adatbázisban található adatokat lekérdezni, módosítani, stb. tudják Ezek az alkalmazások tartalmazzák az adatbáziskezelő műveleteket is. A server gép az adatbázist alkotó file-okat bocsátja a felhasználó gépén futó alkalmazások rendelkezésére. Ha valamely felhasználói alkalmazás egy leválogatást szeretne elvégezni, akkor ez a művelet a felhasználó számítógépén fog végrehajtódni, ami azt jelenti, hogy a teljes állomány átkerül a számítógépre - a hálózati vonalakon keresztül -, és itt történik meg a leválogatás. Ez nagy adatbázisok esetén nagyon megnöveli a vonali forgalmat, továbbá a leválogatás hosszú időt vesz igénybe. Kulcs szerinti keresés esetén ez a probléma nem merül fel, mert ekkor a server gép lemezegységéről csak a keresett adatok kerülnek beolvasásra és átvitelre. File-server architektúrával működik a dBASE adatbáziskezelő rendszer (CLIPPER 87, CLIPPER 5.0, CLIPPER 51, CLIPPER 52, CLIPPER 53)

FI L E - SERVER ar chitektur a File ser ver Adatbázis File-olvasás A datblokkok A lkalmazás PC PC PC Adatbáziskezelő architektúrák 42 Az adatbáziskezelés alapjai A kliens-server architektúra esetén az adatbázist alkotó file-ok szintén a server gép lemezegységein vannak, de maga az adatbáziskezelő software is a server gépen fut (adatbázisserver). A hálózatba kapcsolt kliens gépeken futnak azok az alkalmazások, amelyek segítségével a felhasználók az adatbázis adataival dolgozni tudnak. Ezek az alkalmazások nem tartalmazzák az adatbáziskezelő műveleteket. Ha az alkalmazás az adatbázisban tárolt adatokkal szeretne műveletet végezni, akkor az adatkezelő utasítást továbbítja az adatbázis-servernek, amely azt végrehajtja. Például egy leválogatás esetén a kliens gép egy leválogatási kérelmet küld az adatbázis-servernek, az elvégzi a leválogatást, és csak a leválogatott adatokat küldi át a hálózaton keresztül a

kliens géphez. A kliens-server architektúra a leválogatások esetén lényegesen kisebb vonali forgalmat bonyolít, de ahhoz, hogy az adatbázis-server sok klienst ki tudjon szolgálni, megfelelő kapacitású számítógépre van szükség. Kliens-server architektúra szerint épül fel például az ORACLE és a GUPTA adatbáziskezelő rendszer. KL IENS - SERVER ar chi tektur a Adatbázi s ser ver Adatbázi s SQL parancs Leválogatott adatok Kl i ens Kl i ens Kl i ens 43 Az adatbáziskezelés alapjai Osztott adatbázisok Osztott adatbázisok 11. A számítógép-hálózatok kialakulásával felmerült az igény arra, hogy fizikailag különböző helyeken tárolt adatokat együtt használjanak. Így jöttek létre az osztott adatbázisok Az osztott adatbázis különböző adatbázis-serverek által vezérelt adatbázisok hálózata, amely a felhasználó számára egy logikai adatbázisként jelenik meg. A fizikailag különböző helyeken található adatokat a

felhasználók logikailag összekapcsolhatják a különböző lekérdezések során. Egy lekérdezés eredményeként kapott tábla alapulhat fizikailag különböző adatbázisokban levő adatokon is. HALLGATO tábla HKOD 1011 2020 2321 3051 NÉV Kiss Á dám Erdei Á goston Hajós A mália Víg Valéria SZÜL.DA T 76.0215 73.1123 75.0810 77.0101 SZA KKOD I01 K02 M 01 K02 SZAK tábla SZA KKOD I01 K02 M 01 HALLGATO adatbázis SZA KNÉV Informatika Kögazdász M atematikus SZAK adatbázis HALLGATO nézettábla NÉV Kiss Á dám Erdei Á goston Hajós A mália Víg Valéria SZÜL.DA T 76.0215 73.1123 75.0810 77.0101 SZA KNÉV Informatika Közgazdász M atematikus Közgazdász Azokat a számítógépeket, amelyek az osztott adatbázisban található adatokhoz hozzáférhetnek, node-oknak nevezzük. Azt az adatbázist, amelyhez a felhasználó közvetlenül hozzákapcsolódik, lokális adatbázisnak hívjuk. Az ezen felhasználó által elérhető többi adatbázist pedig

távoli (remote) adatbázisnak nevezzük. Amikor egy lokális adatbázis egy távoli adatbázis adataival dolgozik, akkor a lokális adatbázis a kliens, a távoli adatbázis pedig a távoli server (remote-server). Egy node lehet server, kliens, vagy mindkettő. Az osztott adatbázisok kezelésének egyik legnagyobb problémája a fizikailag különböző adatbázisokban végzett egyidejű, összefüggő módosítások kezelése. Ugyanis előfordulhat, hogy a módosítás sikeresen lezajlik az első adatbázisban, azonban hiba történik a második adatbázisbeli módosítás esetén. Ekkor az első adatbázisba a módosítások belekerültek, míg a másodikba nem Így az adatok integritása már nem áll fenn. Ezért olyan megoldásra van szükség, amely garantálja, hogy az összefüggő módosítások minden adatbázisban megtörténjenek. Erre szolgál a két fázisú commit Osztott adatbázisok 44 Az adatbáziskezelés alapjai (two-phase commit) eljárás, melyet az

ORACLE adatbáziskezelő rendszer bemutatásánál ismertetünk. Az osztott adatbázisok tipikus példái a banki rendszerek. Egy banknak számos városban lehet fiókja. Minden bankfiók a saját adatbázisában tartja nyilván az ügyfeleinek adatait Általában a bankfiókban van egy központi számítógép, amelyen ez az adatbázis található, ehhez kapcsolódhat a bankfiókban található többi számítógép. Ha a bankfiókok között nincs számítógépes kapcsolat, akkor két különböző fiókban vezetett számla közötti átutalást úgy kell kezelni, hogy az egyik bankfiókban a számláról leemelik az összeget, ezt a saját adatbázisukban átvezetik. Értesítik a másik bankfiókot (pl. postai úton), hogy az összeget írja jóvá a másik számlán Ezután a másik bankfiókban is megtörténik az adatbázisban az adatmódosítás. Mivel a pénzügyi tranzakció rögzítése kétszer történik meg, előfordulhat hiba (pl. a két összeg eltér egymástól),

továbbá időbe telik, míg a leemelt összeg a másik számlán megjelenik. Ha a bankfiókokban található számítógépeket illetve hálózatokat összekapcsolják egy számítógépes hálózatba, akkor lehetőség nyílik arra, hogy a fizikailag különböző városokban található adatbázisokat logikailag összekapcsolják egyetlen adatbázissá. Így a különböző helyeken vezetett számlák között történő tranzakciók könnyen kezelhetővé válnak. Egyetlen bankfiókban elegendő rögzíteni a tranzakciót, a módosítás meg fog történni mind a két adatbázisban. Ebben a példában a bankfiókokban található adatbázisok együttesen osztott adatbázist alkotnak. Egy bankfiókban található adatbázis annak a bankfióknak a lokális adatbázisa, míg a többi bankfiókban levő adatbázis ennek a bankfióknak távoli adatbázis. Az adatbáziskezelés alapjai 12. 45 Képek tárolása az adatbázisban Képek tárolása az adatbázisban Számos

nyilvántartásban a dolgok, vagy személyek adatai mellett fontos azok fényképének a tárolása is. Például egy ingatlan-nyilvántartásban az ingatlanok adatai (cím, alapterület, ár stb) mellett az ingatlan fényképe is szerepelhet. Vagy egy személyi nyilvántartásban a dolgozók adatai mellet a dolgozó fényképét is őrzik. A fénykép olyan többletinformációt hordoz, amelyet strukturált adatokkal nehezen tudnánk kifejezni. Több adatbáziskezelő rendszer lehetőséget biztosít arra, hogy az adatbázisban a strukturált adatok mellett képeket, ábrákat is tárolni lehessen. A fényképeket általában szkenner (scanner) segítségével viszik fel a számítógépre, ahol valamilyen grafikus file-formában kerül tárolásra. Ábrákat pedig készíthetünk egy rajzolóprogram segítségével is, ezek szintén egy-egy file-ban kerülnek tárolásra. Adatbázisban tárolt kép megjelenítése GUPTA adatbáziskezelő alkalmazásban Az adatbázisokban

általában a long (long char) - hosszú karakteres - típusú mezők szolgálnak a képek tárolására. Ha az egyedek tulajdonságai mellett egy képet is szeretnénk megadni, akkor az egyedet leíró oszlopok közé fel kell venni egy long típusú oszlopot is, ebbe kerülnek majd a képeket Képek tárolása az adatbázisban 46 Az adatbáziskezelés alapjai tartalmazó file-ok. (Ha a file túl nagy, akkor célszerű csak a file nevét tárolni az adatbázisban Ekkor egy erre szolgáló eljárás segítségével tudjuk a név alapján a képet megtalálni.) A képeket tartalmazó adatbázis adataival dolgozó alkalmazásoknak rendelkezniük kell képmegjelenítő eszközzel. Mind az ORACLE, mind a GUPTA adatbáziskezelő rendszerben megvalósítható a képek tárolása. 13. A dBASE adatbáziskezelő rendszer 47 Az adatbáziskezelés alapjai A dBASE adatbáziskezelő rendszer A dBASE adatbázis táblázatokat tartalmazó adatállományokból és a hozzájuk tartozó

indexállományokból áll. Egy adat-file egy táblázatot (relációt) tartalmaz, kiterjesztése alapértelmezés szerint - DBF A file neve a DOS file-név konvencióinak megfelelő tetszőleges név lehet, de tartózkodjunk az olyan file-nevek használatától, amelyek egyetlen betűből állnak, és ez a betű az ABC első 10 betűjének (A-J) valamelyike. A táblázat sorai a file-ban az egyes rekordok, oszlopai pedig a mezők. Egy adat-file-ban minden rekord felépítése egyforma Az adatállományokban az információkat mezőkben tároljuk. A mezőket nevükkel lehet azonosítani Egy speciális mezőtípus a memo mező, amely szöveges információ tárolására szolgál. A memo mezők tartalma nem az adat-file-ban, hanem egy külön file-ban kerül tárolásra, melynek kiterjesztése .DBT Az adat-file rekordjában egy pointer (mutató) található, amely a DBT file megfelelő rekordjára mutat. A tábla leírását, vagyis a file-struktúrát szintén az adat-file

tartalmazza. A file elején található a mezők leírása (név, típus, méret, tizedesjegyek száma) , ezt követik az adatrekordok. Az új rekordok mindig a file végére kerülnek. Egy adat-file-hoz index-file-okat hozhatunk létre. Az index-file segítségével az adatállományban szereplő rekordokat a fizikai sorrendtől eltérő logikai sorrendben lehet elérni. Az index-file tartalmazza rekordonként a kulcskifejezés értékét, amely szerint az adatállomány rekordjait logikailag - növekvő sorrendbe rendezni kívánjuk, valamint egy mutatót (pointert), amely a megfelelő kulcshoz tartozó adatrekordra mutat. A kulcskifejezés lehet egyetlen mező, de lehet bonyolult kifejezés is. A kulcsnak nem kell egyedinek lennie Az egyforma kulcsértékek közül a fizikailag előbb levő kerül az index-file-ban is előbbre. Lehetőség van arra is, hogy UNIQUE indexállományt hozzunk létre. Ekkor az azonos kulcsok közül csak egy (a fizikailag első) szerepel az

indexállományban, így a logikai sorrend szerinti feldolgozásban is. I ndextábla Adattábla kulcs mutató 12 3 13 20 24 2 . . . . . . 31 51 1 19 kulcs 31 XYZ 24 ABC 12 VWZ mezők FGHJK NMOPQ SZTUV 225 360 455 . . . . . . 51 13 EFG GHJ ABCDE ZWVTS 500 333 A dBASE adatbáziskezelő rendszer 48 Az adatbáziskezelés alapjai Az index-file-ok rekordjaik rövidsége és speciálisan kialakított struktúrájuk miatt lehetővé teszik az adatrekordok kulcs szerinti gyors elérését. A kulcs szerinti keresés az index-file-ban történik Ha a keresett kulcsot megtalálta a program, akkor az ott levő mutató segítségével éri el az adatállományban levő adatrekordot. Egy adatállományhoz tetszőlegesen sok index-file-t hozhatunk létre. Az index-file-ok felépítése a dBASE III és a más dBASE alapú adatbáziskezelőkkel megvalósított adatbázisok esetén eltérő. Erre utal az eltérő kiterjesztés is, a dBASE III esetén az index-file-ok kiterjesztése

.NDX, a CLIPPER esetén például NTX Az adat-file-ok feldolgozása munkaterületeken történik. A munkaterület tulajdonképpen egy memóriaterület, ahol az adatállomány azon rekordjai, amelyek a memóriában vannak - tárolásra kerülnek. Egy munkaterületen egy adatállományt nyithatunk meg a hozzá tartozó index-file-okkal együtt. Egy adatállomány rekordjaihoz csak azután férhetünk hozzá, ha előbb az állományt megnyitottuk. Egy időben több munkaterület is lehet a memóriában, erre akkor van szükség, ha egyszerre több adatállománnyal kívánunk dolgozni. Egy munkaterületen egy időben csak egy adatállomány lehet megnyitva. Egy adatállomány megnyitható egyszerre több munkaterületen is, ez azonban nem tanácsos, mert adathibához vezethet. A munkaterületek közül mindig van egy aktuális munkaterület. Minden munkaterületen van egy aktuális rekord Ez akkor is így van, ha a munkaterület nem aktuális munkaterület. Ha egy adatállományt

indexállományok nélkül nyitunk meg, akkor a megnyitás után az aktuális rekord az adatállomány első rekordja lesz. Ha az adatállományt index-állománnyal együtt nyitjuk meg, akkor az aktuális rekord az index-állomány által meghatározott logikai sorrend szerinti első rekord lesz. A megnyitás után utasítások segítségével megváltoztathatjuk azt, hogy melyik rekord legyen az aktuális rekord. Amennyiben az adatállomány karbantartásakor a hozzá tartozó index-file-ok is meg vannak nyitva, akkor az index-file-ok is automatikusan módosulnak az adatállomány változásaival együtt. Például egy új rekord felvitele esetén az index-file-ba a megfelelő helyre kerül a rekordra mutató sor. Az adatállomány feldolgozásakor pedig, ha egy index-file is meg van nyitva a munkaterületen, akkor az adatrekordok elérési sorrendje automatikusan az index-file szerinti lesz. Több megnyitott index-file esetén pedig az első szerinti. Ez azonban utasítással

megváltoztatható Ha egy adatállomány feldolgozása index-file alapján történik, akkor a program az index-file rekordjait olvassa sorban egymás után. Minden index-rekordhoz a rekordban található mutató segítségével kiolvassa az adatállományból a megfelelő rekordot és ezt adja mint következő adatrekordot. A felhasználó számára csak az látszik ebből, hogy az adatrekordok egy meghatározott rendezettség szerint következnek a feldolgozásban. Ha befejeztük az adatbázis feldolgozását, akkor az adatbázist le kell zárni. A lezárás hatására íródik ki az adatbázisba a memóriában található pufferterületek tartalma is. Az egyes adatállományok rekordpozíció, vagy index-file-ok alapján - relációba kapcsolhatók. Ez a relációalgebrai összekapcsolás műveletének felel meg. A dBASE adatbáziskezelő rendszer nagy adatbázis-állományok esetén is biztosítja az adatok gyors felvitelét akkor is, ha az adatállományhoz több index-állomány

is meg van nyitva, valamint az adatok index-file-ok segítségével történő gyors visszakeresését. Az adatbáziskezelés alapjai 14. 49 A CLIPPER adatbáziskezelő nyelv A CLIPPER relációs adatbáziskezelő nyelv A dBASE III gyorsan népszerűvé vált, számos alkalmazás készült ezen a nyelven, azonban ez a nyelv alapvetően felhasználó-orientált. Ezért a Nantucket Corporation kifejlesztette a dBASE III adatbáziskezelő rendszeren alapuló CLIPPER programozási nyelvet, amely alapvetően fejlesztőorientált nyelv. A CLIPPER tartalmazza a dBASE III utasításainak nagy részét, de néhány fontos fejlesztői eszközzel bővült, többek között a függvénydefiniálási lehetőséggel és az alacsony szintű nyelveken - C, assembly - készíthető eljárások lehetőségével. A CLIPPER 87 SUMMER változat gyorsan népszerűvé vált a programozók körében. Későbbiekben újabb verziói jelentek meg a CLIPPER nyelvnek, a legújabb a CLIPPER 5.3 -as

változat 14.1 Adatállományok leírása, létrehozása Egy adatállomány leírásán struktúrájának a definiálását értjük. Ennek során meg kell adni a táblázat mezőinek nevét, típusát és méretét. Magát az adatállományt a mezők leírását tartalmazó struktúraállományból lehet létrehozni. Bár a CLIPPER nyelv lehetőséget biztosít arra, hogy program segítségével hozzunk létre egy adatállományt, sokkal kényelmesebben tehetjük ezt meg a DBU program segítségével. Ezért ezeket a CLIPPER utasításokat nem is tárgyaljuk könyvünkben. 14.2 A DBU segédprogram használata A DBU egy CLIPPER segédprogram, melynek segítségével közvetlenül végezhetünk műveleteket az adatállományokkal, illetve a bennük található adatokkal. Ezt a programot szoktuk használni adatállományok létrehozására, továbbá az adatállományok tartalmának közvetlen tanulmányozására, módosítására. A CLIPPER adatbáziskezelő nyelv 50 Az

adatbáziskezelés alapjai A DBU program főképernyője A DBU program funkcióit az F1-F8 billentyűkhöz rendelt legördülő menük tartalmazzák. Az egyes menüpontokat az ENTER billentyű segítségével választhatjuk ki. F1 a HELP funkció F2 az adatállományok, indexállományok vagy egy beállítás megnyitása Csak azon adatállományok adataihoz tudunk hozzáférni, melyeket előzőleg megnyitottunk. A megnyitott adatállományok neve a képernyőn a Files kulcsszó alatt jelenik meg, az indexállományoké pedig az Indexes szó alatt. Az egyes adatállományok mezőinek felsorolása pedig a Fields szó alatt látható. Az aktuális adatállomány neve téglalapba van foglalva Az aktuális adatállomány a nyílbillentyűk segítségével megváltoztatható. Az aktuális állományt lezárni a DELETE billentyű leütésével lehet. Egyidőben legfeljebb hat munkaterület lehet aktív. F3 adatállomány struktúrájának létrehozása, illetve módosítása,

indexállományok létrehozása Ha egy új adatstruktúrát szeretnénk létrehozni, akkor a DBU program indítása után ne nyissunk meg semmilyen állományt, hanem nyomjuk le az F3 billentyűt és válasszuk a Database menüpontot. Ekkor a képernyőn megjelenik egy Fields feliratú táblázat, melynek minden sora az adatstruktúra egy-egy mezőjének leírását fogja tartalmazni. Az első oszlopba az adatmező nevét kell beírni, a másodikba a típusát, a harmadikba a mező hosszát, a negyedikbe pedig a tizedesjegyek számát - ha van. Az így létrehozott struktúrát az F4 billentyű leütésére megjelenő menü Structure menüpontjának kiválasztásával lehet elmenteni. Itt kell megadni, hogy milyen néven szeretnénk létrehozni az új adatállományt. Az adatbáziskezelés alapjai 51 A CLIPPER adatbáziskezelő nyelv Új adatstruktúrát létrehozhatunk egy régi adatstruktúrából is. Ekkor nyissuk meg azt az adatállományt, amelynek struktúráját

szeretnénk felhasználni. Ezután nyomjuk le az F3 billentyűt és válasszuk a Database menüpontot. Ekkor a képernyőn megjelenik a Fields feliratú táblázat, amely az aktuális adatállomány struktúrájának leírását tartalmazza. Most lehetőségünk van a struktúra módosítására. Az új struktúrát mentsük el az előbbiekben ismertetett módon, a kívánt névvel, melyet a felkínált név helyére kell beírni. Ha egy adatállomány struktúráját módosítani kívánjuk, akkor ugyanígy járunk el, csak a mentésnél ugyanazzal a névvel mentjük el az új struktúrát, ami a kiinduló adatállomány neve volt. Az adatállományban már bentlevő adatok az új struktúrának megfelelően lesznek tárolva. F4 egy új, vagy módosított adatstruktúra mentése, beállítás mentése Az adatstruktúrák mentését már az előbbiekben ismertettük. A DBU program aktuális beállításai a megnyitott állományok, definiált szűrők, relációk, stb. Ennek

mentésére akkor lehet szükség, ha egy későbbi időpontban ugyanabban a környezetben szeretnénk adatainkat vizsgálni. Ekkor csak a megfelelő beállítást kell megnyitnunk. F5 az aktuális adatállomány adatainak kezelése (browse) Az F5 billentyű leütése után válasszuk a Database menüpontot. Ekkor megjelenik az aktuális adatállomány táblázatos formában. Az oszlopok az egyes mezőket, a sorok az egyes rekordokat jelentik. Ha nincs nyitott indexállomány, akkor a rekordok a fizikai sorrendben jelennek meg, egyébként pedig az elsődleges indexállománynak megfelelően. A táblázatban való mozgásra használhatjuk a nyíl-billentyűket, valamint a Page Up, Page Down billentyűket. A táblázatban található adatokat módosíthatjuk is. Álljunk a kívánt mezőre a kurzorral és üssük le az ENTER billentyűt. Ezután lehetőségünk van a mező tartalmának módosítására Ha az F5 billentyűhöz tartozó menüpontok közül a View-t választjuk, akkor egy

előzőleg elmentett beállításban szereplő adatállományokat tudunk kezelni. Az adatállomány szerkesztése során az F7 billentyű leütésére megjelenő menü segítségével lehetőségünk van valamely konkrét adatrekordra ugrani (GOTO, SKIP), vagy egy adott rekordot megkeresni (LOCATE, SEEK). A CLIPPER adatbáziskezelő nyelv 52 Az adatbáziskezelés alapjai Browse képernyő F6 file-kezelő műveletek Copy Append Pack Zap Run az aktuális adatállományt, vagy annak egy részét egy új file-ba másolja rekordokat fűz az aktuális adatállományhoz egy másik állományból a törlésre jelölt rekordok eltávolítása az aktuális adatállományból az összes adatrekord törlése az aktuális adatállományból DOS parancs kiadása a DBU elhagyása nélkül F7 egy adatállományon belüli mozgásra szolgál, ezért csak az adatállomány szerkesztése során használható F8 beállítások Relation Filter Fields két nyitott adatállomány relációba

kapcsolására szolgál szűrőfeltétel megadása az aktuális adatállományra mezők hozzáadása az aktuális beállításhoz A DBU használata során, ha a képernyőn valamely mező tartalmát szerkeszteni szeretnénk (például file-név, vagy feltétel), akkor az ENTER billentyű leütése után nyílik erre lehetőségünk. Egy kiválasztott művelet végrehajtása előtt a DBU megkérdezi, hogy a műveletet végre kívánjuk-e hajtani. Ekkor az Ok kiválasztására a művelet végrehajtódik, a Cancel hatására pedig törlődik A browse módból és a DBU-ból való kilépésre egyaránt az ESC billentyű szolgál. Az adatbáziskezelés alapjai 53 A CLIPPER adatbáziskezelő nyelv 14.3 A CLIPPER programozási nyelv Először tekintsük át a CLIPPER nyelvben használható legfontosabb adat- és művelettípusokat. Adattípusok Numerikus adatok A numerikus adatok különböző típusú számértékek. Logikai érték A logikai adattípus értéke igaz, vagy hamis

lehet. Tárolására egy byte-ot tartanak fenn A logikai értékekkel logikai műveleteket lehet végrehajtani. Karakter A karaktereket kódolt formában tárolják, a személyi számítógépeken általában ASCII kódban, nagygépeken előfordul az EBCDIC kód is. Egy karaktert egy byte-on ábrázolnak A karakteres adatokon a leggyakrabban végzett művelet a láncolás és a szövegrész kiemelése. Dátum A dátum típusú adatokkal speciális műveleteket lehet végezni, például két dátum különbsége a két időpont között eltelt napok száma. Egy dátum 8 byte-ot foglal le Konstansok A CLIPPER-ben többféle konstans lehet. A karakteres konstans egy karaktersorozat, amely idézőjelek (" vagy ) közé van téve. Két, egymásnak megfelelő határoló jel között használható a másik határoló is. Például: A CLIPPER adatbáziskezelő nyelv 54 Az adatbáziskezelés alapjai " Feri bá, hány óra van? " Az üres karakterlánc egy 0

hosszúságú lánc, jelölése: "" . A numerikus konstansok pozitív,vagy negatív egész számok, vagy lebegőpontos számok. Ezeket nem kell határolókkal ellátni. A logikai konstansok az igaz - jelölése .T - és a hamis - jelölése F - értékek Változók Egy változó neve legfejjebb 10 karakter hosszú lehet, betűkből, számokból és az aláhúzás-jelből állhat. Betűvel kell kezdődnie A változókat nem kell deklarálni, automatikusan létrejönnek amikor értéket kapnak. A változók típusa numerikus, karakteres, logikai, vagy dátum lehet A dátum formája alapértelmezés szerint hónap/nap/év alakú. Az évnél az évszázad nem jelenik meg A SET DATE ANSI utasítással a dátum formátuma megváltoztatható a nálunk megszokottabb év.hónap alakúra. Az évnél az évszázad itt sem jelenik meg Amennyiben a négyjegyű évszámot szeretnénk megjeleníteni, a SET CENTURY ON utasítással állíthatjuk ezt be. A változók típusa olyan lesz,

amilyen értéket éppen tárolunk bennük. Ez bármikor megváltoztatható A CLIPPER 87-es változatban csak egydimenziós tömbök használata megengedett. Ezeket deklarálni kell, nevük és méretük megadásával: Declare tömbnév[méret] Egy-egy tömbelemre a név és az index megadásával hivatkozhatunk: tömbnév[index] Műveletek Előjelek + - pozitív előjel negatív előjel A pozitív előjelet nem kötelező kiírni. 55 Az adatbáziskezelés alapjai A CLIPPER adatbáziskezelő nyelv Matematikai műveletek + * / * % () összeadás kivonás szorzás osztás hatványozás maradékképzés a műveletek csoportosítása Relációs műveletek < > = <> , != , # <= >= == $ () kisebb, mint nagyobb, mint egyenlő nem egyenlő kisebb, vagy egyenlő nagyobb, vagy egyenlő azonos karakter előfordulása szövegben a műveletek sorrendjének megváltoztatása Az azonosság a karakter típusú kifejezéseket azonos karakterekre és azonos hosszúságra

vizsgálja meg, ha a kifejezés numerikus, akkor az összehasonlításnál csak a 12 legnagyobb helyiértékű jegyet vizsgálja meg. A $ művelet értelmezése: a$b igaz, ha az a változóban levő karaktersorozat megtalálható a b változóban levő karaktersorozatban. Példák: "abc "="abc" "abc "=="abc" igaz hamis a=890123456789.01234 b=890123456789.04321 a=b a==b hamis igaz A CLIPPER adatbáziskezelő nyelv 56 Az adatbáziskezelés alapjai "K"$b értéke igaz, ha a b változóban levő karaktersorozatban van K betű. Logikai műveletek .AND .OR .NOT, ! () és művelet vagy művelet negálás a műveletek sorrendjének megváltoztatása Karakteres műveletek + - két, vagy több karaktersorozat összeláncolása két, vagy több karaktersorozat összeláncolása úgy, hogy a - jel előtti karaktersorozat végéről a szóközök a - jel utáni karaktersorozat végére kerülnek. Példa: a="ABC " b="DEF

" a-b értéke "ABCDEF " lesz. c="GHI " a-b-c értéke "ABCDEFGHI " lesz. A műveletek végrehajtási sorrendjére azok a szabályok vonatkoznak, melyeket a Programozási alapismeretek című fejezetben ismertettünk. A CLIPPER program írása A CLIPPER program szövegét valamilyen szövegszerkesztővel készíthetjük el. (Például a Norton Editorral.) A CLIPPER forrásprogram-file-ok kiterjesztése PRG Minden utasítást külön sorba kell írni. Amennyiben egy utasítás nem fér ki egy sorba, a sor végén pontosvesszővel kell jelezni, hogy az utasítás a következő sorban folytatódik. Bárhová írhatók üres sorok. Ezek a program szövegét áttekinthetőbbé teszik A programsoron belül bármely elem közé tetszőleges számú szóközt írhatunk. A programba tehetünk megjegyzéseket. A megjegyzés sor * karakterrel kezdődik. Ha egy utasítás végén szeretnénk megjegyzést elhelyezni, akkor ennek kezdetét a &&

karakterek jelzik. Az adatbáziskezelés alapjai 57 A CLIPPER adatbáziskezelő nyelv Példa: * Két szám átlagának kiszámítása c=(a+b)/2 && a-ban van az egyik, b-ben a másik szám A CLIPPER program tagolása A nagyobb programokat célszerű részekre bontani. A feladat végrehajtása a főprogrammal indul, majd ez különböző alprogramokat, eljárásokat hív meg. Az eljárás végrehajtása után visszatérünk a főprogramba, ahonnan újabb eljárások hívhatók meg. Egy-egy eljárás is hívhat meg másik eljárásokat. A CLIPPER-ben az eljárásokat írhatjuk külön-külön PRG állományokba, de bármelyik programállományban is elhelyezhetünk eljárás-definíciót. A CLIPPER-ben speciális eljárástípus a függvény-eljárás. Fordítás szerkesztés A programot modulokra bonthatjuk, az egyes modulok külön programfile-ba kerülhetnek. Az egyes modulokat külön fordíthatjuk le, majd egy szerkesztőprogrammal szerkesztjük futtatható

programmá. Fordítás A CLIPPER fordítóprogramot az operációs rendszerből a CLIPPER [<állománynév> ł @<CLP-állománynév> [opciók]] paranccsal hívható meg. Ha nem adunk meg állománynevet, akkor csak a szerzőkre vonatkozó információ, valamint a különböző meghívási lehetőségek rövid ismertetése jelenik meg. Az állomány-név a lefordítandó forrásprogram neve a kiterjesztés nélkül. Szükség esetén megadható a meghajtó és az útvonal is. A tárgymodulok mindig az aktuális meghajtó aktuális könyvtárába kerülnek. Ha a fordítót így hívjuk meg, akkor automatikusan lefordítja az állományból hívott modulokat is. A CLIPPER @<vezérlőállomány> alakban történő hívás esetén csak a vezérlőállományban felsorolt modulok fordítása történik meg. A vezérlőállomány egy CLP kiterjesztésű szöveg-file, A CLIPPER adatbáziskezelő nyelv 58 Az adatbáziskezelés alapjai melyet szövegszerkesztővel

hozhatunk létre. Minden sora egy-egy modul nevét tartalmazza a kiterjesztés nélkül. Ekkor a létrejövő tárgymodul a CLP állomány nevét kapja A fordítóprogram opciói: Az opciókat egy kötőjellel és egy kisbetűvel kell megadni. -m egyetlen programmodul fordítása, a hívott modulok nélkül -l sorszámozás kiiktatása Ha nem adjuk meg, akkor a CLIPPER információkat tárol a forrásprogram soraira vonatkozóan mind a tárgymodulban, mind a végrehajtható programban. Ez hasznos a programok tesztelése során, mert így a futás közbeni hibaüzenetekben megjelenik a hibás sor száma. Azonban a kész programoknak csak fölöslegesen növelné a méretét. -s csak szintaxis-vizsgálat Ebben az esetben nem készül tárgymodul. Egyidejűleg több opciót is megadhatunk. Szerkesztés A CLIPPER szerkesztőprogramja a PLINK86, ez azonban nagyon lassú, használatát csak overlayezett programok esetén javasoljuk, mert az overlay-t a többi szerkesztőprogram nem

támogatja. Egyébként a DOS LINK programját használjuk. A LINK programot a DOS-ból a következő módon indíthatjuk: LINK [tárgymodulok],[futtatható program],[map-file],[könyvtár-file-ok] A tárgymodulok nevét + jellel kell összekapcsolni. Ha nem adjuk meg a futtatható program nevét, akkor automatikusan az első tárgymodul nevét kapja. A map-file a program térképe, csak információs szerepe van. Tartalmazza az egyes szegmensek relatív címeit, méretét, a változók táblázatát. A könyvtár-file-t akkor kell megadni, ha a programunkhoz hozzá szeretnénk szerkeszteni valamely programkönyvtárban tárolt programmodult. Több könyvtár is megadható, ezeket vesszővel, vagy szóközzel kell elválasztani. A CLIPPER nyelv függvényei külön könyvtárakban vannak elhelyezve, Az adatbáziskezelés alapjai 59 A CLIPPER adatbáziskezelő nyelv a CLIPPER.LIB, valamint az EXTENDLIB-ben Ezért, ha a programunk tartalmaz CLIPPERfüggvényhívást, akkor ezeket

a könyvtárneveket a szerkesztéskor meg kell adni A LINK parancsban a file-ok kiterjesztését nem szükséges kiírni. Ha a szerkesztőt csak a LINK kulcsszóval hívjuk meg, akkor párbeszédes módban kéri be a fileneveket. A file-neveket elhelyezhetjük egy vezérlőállományban is, ezt szövegszerkesztővel hozhatjuk létre. Minden file-típust külön sorba kell írni. Ha valamelyik típusú file-t nem akarunk megadni, akkor a megfelelő sort üresen kell hagyni. A LINK indítása vezérlőállomány használatával: LINK @<vezérlőállomány-név> Fordítás és szerkesztés parancs-file segítségével Ismertetünk egy parancs-file-t, amely tartalmazza a CLIPPER-fordító és a LINK szerkesztőprogram hívását, paraméterként a fordítandó forrásprogram nevét várja, kiterjesztés nélkül. A létrejövő végrehajtható program neve megegyezik a forrásprograméval A szerkesztéshez a CLIPPER.LIB és az EXTENDLIB könyvtárak nevei meg vannak adva A

szerkesztést csak akkor hajtja végre, ha a fordítási menet hibátlan volt. CLIPFOR.BAT CLS CLIPPER %1 IF NOT ERRORLEVEL 1 LINK %1,,,CLIPPER+EXTEND Konkrét parancs-file készítésekor a CLIPPER és EXTEND könyvtárak nevét az elérési útvonallal együtt kell beírni a LINK paraméterei közé. A parancs-file-t a DOS-ból a következő módon indíthatjuk: CLIPFOR forrásprogramnév A CLIPPER adatbáziskezelő nyelv 60 Az adatbáziskezelés alapjai A CLIPPER programozási nyelv szűkített parancskészlete Jelölések A parancsok ismertetésénél a kulcsszavakat nagybetűvel írjuk. Ezeket betűről betűre pontosan le kell írni. A számítógépen tetszőlegesen írhatjuk őket kis-, vagy nagybetűkkel A kulcsszavakat négy karakter hosszúságúra rövidíthetjük, de ha kiírjuk őket, akkor a negyedik karakter utáni részben sem lehet hiba. A csúcsos zárójelek < > közötti szöveg szimbólum. Ide változóneveket, vagy állandókat lehet írni A

szögletes zárójelek [ ] közötti paraméterek megadása nem kötelező. A kapcsos zárójel { } azt jelenti, hogy a kifejezés tetszés szerint ismételhető. A csúcsos, szögletes és kapcsos zárójeleket a program szövegébe nem szabad beírni. Minden egyéb jelölt vesszőt, pontot és kerek zárójelet kötelezően le kell írni. Parancsok Deklarációs utasítások A CLIPPER-ben csak a tömböket és a változók alapértelmezéstől eltérő hatáskörét kell deklarálni. DECLARE <váltnév>[<numkif>]{,<váltnév>[numkif]} váltnév numkif a tömb neve a tömbben levő elemek száma A fenti utasítás segítségével PRIVATE tömböket deklarálhatunk. Az elemszám megadásakor a szögletes zárójeleket [] ki kell tenni! Az egyes tömbelemekre a tömb nevével és a szögletes zárójelek közé tett elemszámmal hivatkozhatunk. Ha értéket adunk egy olyan változónak, melynek a neve megegyezik egy tömb nevével, akkor a tömbben szereplő összes

elem értékét elrontjuk. Példa: DECLARE tömb[10] tömb[3]=15 Az adatbáziskezelés alapjai 61 A CLIPPER adatbáziskezelő nyelv Ezekkel az utasításokkal létrehoztunk egy 10 elemű tömböt és a harmadik elem értékét 15-re állítottuk. PRIVATE <váltnév> {,<váltnév>} váltnév a változó neve Ezzel az utasítással a felsorolt változók érvényességi körét az aktuális és az alacsonyabb szintekre korlátozzuk. Ha egy felsőbb szinten szerepel ugyanilyen nevű változó, arra ez a programrész nem gyakorolhat hatást. PUBLIC <váltnév> {,<váltnév>} váltnév a változó neve Ezzel az utasítással a felsorolt változók érvényességi körét kiterjesztjük az egész programra. ěgy ezek a közönséges változóktól eltérően egyik programszinten sem veszítik el az értéküket. Egy újonnan létrehozott változó érvényes az aktuális és az alatta levő programszinteken, ha csak ebben a körben akarjuk használni, nem

kell PUBLIC-nak deklarálni. Ki- és beviteli utasítások Beviteli eszközként a billentyűzetet, kiviteli eszközként a képernyőt és a nyomtatót fogjuk használni. A be- illetve kivitel lehet formázott, vagy formázatlan Formázás esetén rendelkezhetünk arról, hogy a képernyő, vagy a papír mely pozíciójára történjen az írás és milyen legyen a megjelenő adatok formátuma. Formázatlan be- illetve kivitel esetén az adatok a képernyőn az aktuális kurzorpozíciótól kezdve, vagy a következő sorban jelennek meg, szabványos alakban. Ezeket az utasításokat csak saját használatú programokban, vagy programteszteléshez szoktuk alkalmazni. Egy 25x80 karakteres képernyő esetén a sorkoordináta 0 és 24, az oszlopkoordináta 0 és 79 között lehet. A képernyő bal felső sarkának koordinátái: 0,0 A kiíró utasítások alapértelmezés szerint a képernyőre írnak, azonban a SET DEVICE TO PRINTER utasítás segítségével az outputot át lehet

irányítani a nyomtatóra az írás parancsok kiadása előtt. Ha újra képernyőre szeretnénk írni, akkor a SET DEVICE TO SCREEN utasítással lehet az outputot visszarendelni a képernyőre. A CLIPPER adatbáziskezelő nyelv 62 Az adatbáziskezelés alapjai Képernyő törlés és keretrajzolás a képernyőre CLEAR Ez az utasítás a teljes képernyőt törli. @<numkif1>,<numkif2> [CLEAR] Ezzel a paranccsal a képernyő egy téglalap alakú része törölhető. A törlendő terület bal felső sarkának koordinátáit a numkif1 és numkif2 adják meg. Ha a CLEAR kulcsszót megadjuk, akkor a képernyő jobb alsó sarkáig törlődik a terület, egyébként csak a numkif1, numkif2-től a sor végéig. @<numkif1>,<numkif2> [CLEAR] TO <numkif3>,<numkif4> [DOUBLE] numkif1 numkif2 numkif3 numkif4 a bal felső sarok sorszáma a bal felső sarok oszlopszáma a jobb alsó sarok sorszáma a jobb alsó sarok oszlopszáma Ha az utasítást a

CLEAR kulcsszóval adjuk meg, akkor hatására a megadott téglalap alakú terület törlődik a képernyőn. Ha a CLEAR kulcsszót nem adjuk meg, akkor megadott koordinátájú keretet rajzol a program a képernyőre. Ha DOUBLE kulcsszót megadjuk, akkor a keretet dupla vonallal rajzolja meg a program. Ha a numkif1 és a numkif3, illetve ha a numkif2 és a numkif4 azonos, akkor egy vizszintes illetve egy függőleges vonal rajzolódik ki a képernyőn. A képernyő tartalmának elmentése és visszaállítása Szükségünk lehet rá, például egymásba ágyazott menük esetén, hogy a képernyő tartalmát elmentsük, hogy egy későbbi időpontban vissza tudjuk állítani. Erre szolgálnak a következő parancsok. SAVE SCREEN [TO <váltnév>] váltnév egy változó neve Ezzel a paranccsal el tudjuk menteni a képernyő tartalmát egy változóba. Ha nem adunk meg változót, akkor a képernyőtartalom egy meghatározott helyre kerül elmentésre, azonban ezt egy Az

adatbáziskezelés alapjai 63 A CLIPPER adatbáziskezelő nyelv következő SAVE SCREEN utasítás felülírja. ěgy, ha több képernyőtartalmat akarunk tárolni egyszerre, akkor célszerű külön-külön változóba menteni őket. RESTORE SCREEN [FROM <váltnév>] váltnév egy változó neve Ezzel az utasítással visszaállíthatunk egy elmentett képernyőtartalmat. Amennyiben a képernyőt egy adott változóba mentettük el, akkor a visszaállításnál is meg kell adni ennek a változónak a nevét. Lapdobás EJECT Ennek a parancsnak a hatására lapdobás történik a nyomtatón, a nyomtatás az új lap tetején folytatódik. Formázatlan adatbeviteli utasítások ACCEPT [<strkif>] TO <váltnév> strkif karakteres kifejezés váltnév egy karakteres változó neve Ezzel az utasítással formázás nélkül írhatunk be egy karakteres változóba. A megadott szöveges kifejezés értéke megjelenik a képernyőn, majd a program várja a beírást. A

bevitelt az <ENTER> billentyűvel kell lezárni. INPUT [<kif>] TO <váltnév> kif karakteres kifejezés váltnév beviteli változó Az INPUT parancs a felhasználót egy adat bevitelére szólítja fel. Beírható numerikus, logikai, vagy határoló jelek közé helyezve karakter típusú adat. Szöveg bekéréséhez célszerűbb az ACCEPT parancs használata, mert itt a szöveget nem kell határoló jelek közé tenni. A szöveges kifejezés a parancs végrehajtásakor megjelenik a képernyőn. A CLIPPER adatbáziskezelő nyelv 64 Az adatbáziskezelés alapjai Formázatlan adatkiírást a következő utasítással lehet megvalósítani. ?[<kif>{,<kif>}] vagy ??[<kif>{,<kif>}] Hatására a felsorolt kifejezések értéke kiíródik a képernyőre, vagy a nyomtatóra. (Lsd SET DEVICE parancs) Ha a ? karaktert nem követi kifejezés, akkor üres sort ír ki. A ?? forma esetén a kiírást nem előzi meg soremelés. A vesszővel

elválasztott kifejezések értéke szóközzel elválasztva fog megjelenni. Formázott ki- és beviteli utasítások @<numkif1>,<numkif2> SAY <kif> [PICTURE<strkif>] numkif1 numkif2 kif strkif sor száma oszlop száma a kiírandó szöveg, vagy változó PICTURE-leírás A SAY utasítás segítségével formázottan írhatunk a képernyőre. A PICTURE opcióval megadható, hogy az adat milyen formátumban kerüljön kiírásra. A legfontosabb PICTURE szimbólumok a következők: 9 ! . számjegyek és előjel csak nagybetűk (automatikus) tizedespont helye A formátum megadásánál a kiírandó adat minden pozíciójáról rendelkezni kell. Ha a teljes mezőre ugyanazt a formátumot akarjuk megadni, akkor elég a szimbólumot egy @ jel után egyszer leírni. A szimbólumokat idézőjelek közé kell tenni. Példa: @5,1 SAY "Jó reggelt kívánok!" név="Kiss Anna" @7,1 SAY név PICTURE"@!" Az adatbáziskezelés alapjai

65 A CLIPPER adatbáziskezelő nyelv Ezen utasítás hatására a képernyőn a név csupa nagybetűvel fog megjelenni. Amennyiben a kiírandó számokat tagolni szeretnénk vesszővel, szóközzel, vagy kötőjellel, ezeket is a PICTURE szimbólumok között kell feltüntetni. Példa: @5,1 SAY szam PICTURE"9 999 999" Az így megjelenített szám szóközökkel lesz tagolva. A kiviteli eszközt a nyomtatóhoz rendelhetjük, ekkor a SAY utasítás a nyomtatóra fog írni. Példa: SET DEVICE TO PRINTER @1,1 SAY "Ez a szöveg a nyomtatón fog megjelenni." SET DEVICE TO SCREEN CLEAR @1,1 SAY "Ez a szöveg a képernyőn jelenik meg." @<numkif1>,<numkif2> [SAY<kif1> [PICTURE<strkif>]] GET <váltnév> [PICTURE <strkif>] [RANGE <kif2>,<kif3>] [VALID <logkif>ł<függvnév>([<param>{,<param>}])] numkif1 sorszám numkif2 oszlopszám kif1 szöveg, ami után a bevitel következik strkif

PICTURE-leírás váltnév változó neve, amibe a bevitel történik kif2 tartomány alsó határa (numerikus, vagy dátum típusú bevitelnél) kif3 tartomány felső határa (numerikus, vagy dátum típusú bevitelnél) logkif logikai kifejezés függvnév függvény-név param paraméter A CLIPPER adatbáziskezelő nyelv 66 Az adatbáziskezelés alapjai A GET parancs az adatok bevitelére és módosítására szolgál. A numkif1, numkif2-ben megadott sor és oszlopkoordinátáktól megjelenik a SAY után megadott kifejezés, ezután pedig a változó értéke. Ha nem adtunk meg SAY kulcsszót, akkor a változó értéke a numkif1, numkif2 ponttól kezdődően jelenik meg. Mivel a változó értékét a GET megjeleníti, ezért a GET kiadásakor a változónak értékkel kell rendelkeznie. Az adatok beolvasása illetve módosítása csak egy READ parancs segítségével lehetséges. Egy READ paranccsal az összes addig kiadott és READ-del még be nem olvasott GET utasítás

végrehajtásra kerül. A RANGE opcióval numerikus, vagy dátum típusú változókra megadhatók a megengedett legkisebb és legnagyobb értékek. Az adott tartományon kívüli értékeket a program nem fogadja el A VALID opcióval a változókra érvényességi kritériumok adhatók meg. A kritérium lehet egy logikai kifejezés, vagy egy függvény. Az illető GET-mezőből csak akkor lehet kilépni, ha a megadott feltétel teljesül, vagy a függvény értéke igaz. A VALID opció segítségével az adatok bevitelénél széleskörű ellenőrzést lehet megvalósítani. A GET utasítás hibaüzenetei a képernyő 0. sorában a jobboldalon jelennek meg A PICTURE opcióban megadható legfontosabb szimbólumok megegyeznek a @.SAY utasításnál felsoroltakkal, továbbá: A L N X csak betű csak logikai érték betűk és karakterek bármely karakter Példák: @20,1 SAY "NÉV:" GET név READ Az utasítás hatására a 20. sor 1 oszlopában megjelenik a NÉV: kiírás és

a név nevű változó tartalma. A READ hatására a kurzor a mező elejére áll és várja a bevitelt @20,1 SAY "NÉV:" GET név PICTURE "@!" READ Ha az utasítást ebben a formában adjuk meg, akkor a név karakterei automatikusan nagybetűk lesznek. @10,5 GET szám PICTURE "9999.99" Az adatbáziskezelés alapjai 67 A CLIPPER adatbáziskezelő nyelv A szám nevű változó maximum négy egészjegyből állhat, a tizedesjegyek száma pedig kettő. n=0 @1,1 SAY "N=" GET n VALID n>0 READ Az n változó értéke csak pozitív szám lehet. n=0 @1,1 GET n RANGE 10,20 READ Itt az n változó értékének a 10 n 20 feltételt kell teljesítenie. READ A READ parancs az utoljára kiadott READ, CLEAR vagy CLEAR GET parancsok után kiadott összes aktív @.GET parancsot beolvassa Ez a parancs az adatok képernyőorientált gyüjtésére és szerkesztésére szolgál. Az egy READ paranccsal kezelt GET mezők között a kurzormozgató

billentyűkkel közlekedhetünk, akár vissza is léphetünk az előző mezőre. A READ parancs a szerkesztés befejezése után az összes GET-et törli. Példa: CLEAR @5,5 SAY "Név :" GET név @7,5 SAY "Lakcím :" GET cím @9,5 SAY "Munkahely :" GET mhely @11,5 SAY "Foglalkozás:" GET fogl READ A fenti utasítások hatására a képernyőn megjelennek a mezők megnevezései és tartalma. Ezek után a mezők tartalmát módosíthatjuk. CLEAR GETS Ez az utasítás törli az összes aktív @.GET parancsot A CLIPPER adatbáziskezelő nyelv 68 Az adatbáziskezelés alapjai Menü-szervezés @<numkif1>,<numkif2> PROMPT <strkif> numkif1 numkif2 strkif sor száma oszlop száma menüsor Ez az utasítás egy menü felépítésére szolgál. Az egyes menüsorokat a PROMPT parancs segítségével lehet elhelyezni a képernyőn. A menüpont kiválasztása a MENU TO utasítással történik. MENU TO <váltnév> váltnév a

menüváltozó neve Ez az utasítás lehetővé teszi, hogy a kiválasztott menüpont száma bekerüljön a menüváltozóba. A kurzor mozgatásával rápozícionálhatunk a megfelelő menüsorra, majd az <ENTER> billentyű leütésével kiválasztjuk azt. Az a menüsor, ahol a kurzor áll, más színnel jelenik meg a képernyőn A pozícionáláshoz használhatjuk a <HOME> - első menüsor - és az <END> - utolsó menüsor billentyűket is. A kiválasztás a megfelelő menüpont első karakterének leütésével is elvégezhető Több menü egymásba ágyazható, de mindegyik almenühöz más és más menüváltozót kell választani. Példa: vált=0 @5,1 PROMPT "1. menüpont" @7,1 PROMPT "2. menüpont" @9,1 PROMPT "3. menüpont" @11,1 PROMPT "4. menüpont" MENU TO vált Az utasítások hatására a képernyőn megjelenik a menü és a vált nevű változóba fog kerülni a kiválasztott menüpont sorszáma. Feltételes

utasítások A feltételes utasítások két, vagy többirányú elágazást tesznek lehetővé a programban. Az adatbáziskezelés alapjai 69 A CLIPPER adatbáziskezelő nyelv IF <logkif> <parancsok> [ELSE <parancsok>] ENDIF logkif parancsok feltétel CLIPPER-utasítások Ez az utasítás egy feltételtől függő programelágazást hoz létre. Ha a feltétel teljesül, akkor a program a feltétel utáni utasításokat hajtja végre, majd az ENDIF utáni utasítás következik. Ha nem teljesül, akkor amennyiben van ELSE ág, akkor ennek az utasításai kerülnek végrehajtásra, ha nincs, akkor a program az ENDIF utáni utasítással folytatódik. Az IF utasítások egymásba ágyazhatók DO CASE CASE <logkif> <parancsok> {CASE <logkif> <parancsok>} [OTHERWISE <parancsok>] ENDCASE logkif parancsok feltétel CLIPPER-parancsok Ez az utasítás többirányú programelágazást tesz lehetővé. Az első sorban csak a DO CASE

kulcsszavak állhatnak. A CLIPPER sorra vizsgálja a CASE kulcsszavak után megadott feltételeket mindaddig, amíg nem talál olyat, amelyik teljesül. Ekkor végrehajtja az itt következő parancsokat, majd a program az ENDCASE utáni utasításon folytatódik. Ha egyik feltétel sem teljesül, akkor az OTHERWISE utáni parancsok kerülnek végrehajtásra. Ha ez a kulcsszó nincs megadva, akkor a program az ENDCASE utáni utasítással folytatódik. A CLIPPER adatbáziskezelő nyelv 70 Az adatbáziskezelés alapjai Példa: DO CASE CASE menüvált=1 DO elsőpont CASE menüvált=2 DO másodikpont CASE menüvált=3 DO harmadikpont ENDCASE A menüvált értékétől függően az elsőpont, másodikpont, vagy a harmadikpont nevű eljárások valamelyike kerül végrehajtásra. Ciklusszervezés A CLIPPER-ben kétféle ciklus szervezhető, feltételtől függő lefutású és számlálásos ciklus. DO WHILE <logkif> <parancsok> ENDDO logkif feltétel parancsok CLIPPER

utasítások Ezzel az utasítással egy feltételtől függő lefutású ciklust lehet szervezni. A ciklus magját alkotó parancsok addig kerülnek végrehajtásra, míg a ciklus-feltétel igaz. Ha a feltétel hamis, akkor a program az ENDDO utáni utasítással folytatódik. A ciklusok egymásba ágyazhatók A ciklusmagban elhelyezhetünk LOOP és EXIT utasításokat, melyek a ciklus lefutásának menetét befolyásolják. LOOP Ezen utasítást hatására a vezérlés visszakerül a közvetlenül megelőző DO WHILE utasításra és a feltétel újra kiértékelődik. Ettől függően a program vagy ismét végrehajtja a ciklust, vagy az ENDDO utáni utasításra lép. Az adatbáziskezelés alapjai 71 A CLIPPER adatbáziskezelő nyelv EXIT Ez az utasítás a DO WHILE ciklusból történő kilépésre szolgál. A program a következő ENDDO utáni utasítással folytatódik. FOR <váltnév>=<numkif1> TO <numkif2> [STEP <numkif3>] <parancsok> NEXT

váltnév numkif1 numkif2 numkif3 parancsok a ciklusváltozó neve kezdőérték végérték lépésköz Clipper utasítások Ezzel az utasítással egy számlálásos ciklus szervezhető. A parancsok alkotják a ciklus magját A ciklus addig fut le, míg a ciklusváltozó értéke a kezdő értéktől indulva, lépésközzel növelve a végértéket el nem éri. A lépésköz negatív is lehet, ha nincs megadva, akkor alapértelmezés szerint 1. Eljárások definiálása, hívása PROCEDURE <procnév> procnév az eljárás neve Közös állományban levő, egymástól független eljárások elé egy, az eljárás nevét tartalmazó PROCEDURE sort kell írni, hogy az egyes eljárásokat meg lehessen különböztetni egymástól. Az eljárásokat a DO utasítás segítségével lehet aktivizálni. Ha az eljárásban paramétereket akarunk átvenni a hívó programból, akkor ezeket a paramétereket a PARAMETERS parancsban definiálni kell. Egy eljárás az utolsó

végrehajtható utasítással fejeződik be, de az eljárásban elhelyezhetünk RETURN utasítást, melynek hatására befejeződik az eljárás végrehajtása és a vezérlés visszakerül a hívó programba. A CLIPPER adatbáziskezelő nyelv 72 Az adatbáziskezelés alapjai DO <prgnév>ł<procnév> [WITH<param> {,<param>}] prgnév procnév param egy .PRG állomány neve egy eljárás neve paraméter A DO utasítással egy CLIPPER programot, vagy eljárást lehet meghívni. Az eljárás lehet egy másik .PRG állományban is, de lehet ugyanazon a PRG állományon belül is Egy program önmagát nem hívhatja meg. A WITH kulcsszó segítségével paramétereket adhatunk át a hívott eljárásnak Az eljárás befejeződése után a program a DO utasítás után folytatódik. Az eljárások egy speciális típusa a függvényeljárás. Ezek definiálására a FUNCTION utasítás szolgál. FUNCTION <függnév> [PARAMETERS

<váltnév>{,<váltnév>}] <parancsok> RETURN(<kif>) függnév váltnév parancsok kif a függvény neve paraméter CLIPPER-utasítások a függvény eredménye A FUNCTION paranccsal egy felhasználó által definiált függvényt lehet létrehozni. Ennek a függvénynek paramétereket lehet átadni, a RETURN utasításban szereplő kifejezés pedig a függvény értéke. Egy függvényben több RETURN utasítás is lehet A függvények bármely megfelelő típusú kifejezésben szerepelhetnek. Egy függvényeljárás önmagát is meghívhatja (rekurzió). PARAMETERS <váltnév> {,<váltnév>} váltnév a változó neve Ez az utasítás azokat a változókat határozza meg, amelyek értéküket egy DO.WITH parancsból, vagy egy függvény-hívásból paraméterként kapják. A parancsban annyi, egymástól vesszővel elválasztott változót kell felsorolni, ahány paraméter átadásra kerül. Ezeknek a változóknak a neve a meghívástól

független. A paraméterek sorrendben veszik át a hívási értékeket Az adatbáziskezelés alapjai 73 A CLIPPER adatbáziskezelő nyelv Ha az átadandó paraméterek konstansok, akkor ezek az eljárás végrehajtása után nem kerülnek visszaadásra, ha pedig változók, akkor az eljárás végén a PARAMETERS-ben felsorolt változók értéke átkerül a meghívó változókba. Az eljárás befejeződésekor a paraméterváltozók törlődnek Egy eljárásban, vagy függvényben csak egy PARAMETERS utasítás állhat. RETURN [<kif>] kif a függvény eredménye Ez a parancs befejez egy programot, eljárást, vagy függvényt. A további végrehajtás ahhoz a programhoz kerül vissza, amelyik a most befejezett programot, eljárást, vagy függvényt hívta. A legmagasabb szintről a vezérlés az operációs rendszerhez kerül. Egy program, eljárás, vagy függvény több RETURN utasítást is tartalmazhat. Egy függvénynek befejeződésekor vissza kell adnia egy

értéket, míg egy program, vagy eljárás nem adhat vissza értéket. Példa: FUNCTION min PARAMETERS v1,v2 IF v1<=v2 RETURN(v1) ELSE RETURN(v2) ENDIF A fenti függvény hívása: a=a+min(b,c) Az a változó értékéhez a b és c változók közül a kisebbiket adja hozzá. A program futásának felfüggesztése és befejezése WAIT [<strkif>] [TO <váltnév>] strkif szöveg váltnév változónév A CLIPPER adatbáziskezelő nyelv 74 Az adatbáziskezelés alapjai Enek az utasításnak a hatására a kurzor a következő sor elejére áll és megjelenik az utasításban megadott szöveg. Ha nem adtunk meg szöveget, akkor a "Press any key to continue" üzenet jelenik meg. Majd megszakad a program futása és addig vár, míg le nem ütünk egy billentyűt Ha megadunk egy változót az utasításban, akkor a leütött karakter beíródik ebbe a változóba. Példa: WAIT "M)egszakítás T)örlés B)efejezés " TO válasz Az utasítás kiírja

a "M)egszakítás T)örlés B)efejezés " üzenetet és vár egy billentyű leütésére. A leütött karakter továbbfeldolgozás céljára a válasz nevű változóba kerül. QUIT Ez az utasítás befejezi a program végrehajtását és a vezérlést visszaadja az operációs rendszernek. Használata nem kötelező, hiszen a program az utolsó végrehajtható utasítással úgyis befejeződik. A QUIT helyett írhatjuk a RETURN utasítást is. Az adatbáziskezelés alapjai 75 A CLIPPER adatbáziskezelő nyelv CLIPPER-függvények A CLIPPER-hez tartozó CLIPPER.LIB és EXTENDLIB könyvtárakban számos függvény található. Ezek közül néhányat ismertetünk a következőkben Matematikai függvények ABS(<numkif>) numkif numerikus kifejezés Az ABS függvény a numerikus kifejezés abszolut értékét képzi. INT(<numkif>) numkif numerikus kifejezés Az INT függvény a numerikus kifejezés egész részét képzi. LOG(<numkif>) numkif

numerikus kifejezés A LOG függvény a numerikus kifejezés természetes logaritmusát képzi. MAX(<numkif1>,<numkif2>) numkif1 numkif2 numerikus kifejezés numerikus kifejezés A MAX függvény két numerikus kifejezés közül a nagyobbik értékét adja vissza. A CLIPPER adatbáziskezelő nyelv 76 Az adatbáziskezelés alapjai MIN(<numkif1>,<numkif2>) numkif1 numkif2 numerikus kifejezés numerikus kifejezés A MIN függvény két numerikus kifejezés közül a kisebbik értékét adja vissza. SQRT(<numkif>) numkif numerikus kifejezés Az SQRT függvény a numerikus kifejezés négyzetgyökét számítja ki. Karakterműveleteklet végző függvények ALLTRIM(<strkif>) strkif karakteres kifejezés A függvény eltávolítja a karakteres kifejezés vezető és követő szóközeit. LEN(<strkif>) strkif karakteres kifejezés Ez a függvény a karakteres kifejezés hosszát adja meg, vagyis megszámolja hány darab

karakterből áll a kifejezés és ezt a számot adja vissza eredményként. LEFT(<strkif>,<numkif>) strkif karakteres kifejezés numkif hossz Az adatbáziskezelés alapjai 77 A CLIPPER adatbáziskezelő nyelv A függvény a karakteres kifejezés a hosszban megadott számú baloldali karakterét adja eredményül. A hosszba a szóközök is beleszámítanak. LTRIM(<strkif>) strkif karakteres kifejezés A függvény levágja a karakteres kifejezés vezető szóközeit. RIGHT(<strkif>,<numkif>) strkif karakteres kifejezés numkif hossz A függvény a karakteres kifejezés a hosszban megadott számú jobbboldali karakterét adja eredményül. RTRIM(<strkif>) strkif karakteres kifejezés A függvény levágja a karakteres kifejezés követő szóközeit. SPACE(<numkif>) numkif numerikus kifejezés A függvény a numerikus kifejezésben megadott számú szóközt állít elő. SUBSTR(<strkif>,<numkif1>,<numkif2>)

strkif numkif1 numkif2 karakteres kifejezés kezdő pozíció a karakterek száma A CLIPPER adatbáziskezelő nyelv 78 Az adatbáziskezelés alapjai Ez a függvény egy karakterláncból egy részkarakterláncot képez. A numkif1 adja meg, hogy a részlánc az eredeti karakterlánc hányadik karakterétől kezdődik, a numkif2 pedig, hogy hány karakterből fog állni. Ha a numkif2-t nem adjuk meg, akkor a részkarakterláncot a megadott pozíciótól a karakterlánc végéig képzi a függvény. Ez történik akkor is, ha numkif2 értéke nagyobb, mint a kezdő pozíciótól hátralevő karakterek száma. Ha a kezdő pozíció nagyobb, mint a kiinduló karakterlánc hossza, akkor az eredmény egy üres karakterlánc lesz. Konverziós függvények A konverziós függvényekkel az adatokat egyik típusról egy másikra alakíthatjuk át. CTOD(<strkif>) strkif karakteres kifejezés Ez a függvény egy karakteres kifejezést dátummá alakít át. A karakteres

kifejezésnek a megfelelő dátum formátumban kell lennie és érvényes dátumot kell tartalmaznia. A dátum formája alapértelmezés szerint: hónap/nap/év , az év az évszázadot nem tartalmazza. DTOC(<datkif>) datkif dátum kifejezés Ez a függvény egy dátum típusú adatot karakterlánccá alakít. ěgy már karakteres műveleteket tudunk végezni a dátummal, például összeláncolhatjuk egy szöveggel. STR(<numkif1>[,<numkif2>[,<numkif3>]]) numkif1 numkif2 numkif3 numerikus kifejezés hossz tizedes jegyek száma A függvény egy numerikus kifejezést karakterlánccá alakít át. A hossz paraméter azt adja meg, hogy a karakterlánc hány karakter hosszú legyen, ebbe a tizedespontot is bele kell számítani. Ha a szám ennnél rövidebb, akkor szóközök fogják megelőzni. Ha a hosszra és a tizedes jegyekre nem adunk meg értéket, akkor 10 karakter hosszúságú lesz az eredmény. Ha a numerikus kifejezésben több Az

adatbáziskezelés alapjai 79 A CLIPPER adatbáziskezelő nyelv tizedes jegy van a megadottnál, akkor kerekít a függvény az átalakításkor, ha pedig a szám túl nagy és nem fér el a megadott hosszon, akkor az eredmény a megadott hosszúságú * sorozat lesz. VAL(<strkif>) strkif karakteres kifejezés A függvény egy karaktersorozatot számmá alakít át. A karaktersorozatot addig értelmezi, amíg számnak tekinthető. A vezető szóközöket figyelmen kívül hagyja Egyéb függvények COL() A függvény eredménye a kurzor aktuális oszloppozíciója. ROW() A függvény eredménye a kurzor aktuális sorpozíciója. PCOL() A függvény eredménye a nyomtató aktuális oszloppozíciója. PROW() A függvény eredménye a nyomtató aktuális sorpozíciója. A CLIPPER adatbáziskezelő nyelv 80 Az adatbáziskezelés alapjai DATE() A függvény a rendszerdátumot adja meg, eredménye dátum típusú. Alapértelmezés szerint a dátum hónap/nap/év

alakú, de a SET DATE ANSI utasítással a megszokottabb év.hónap alakra változtatható. Alapértelmezés szerint az évszázad nem jelenik meg TIME() A függvény a rendszeridőt adja meg óó:pp:ss formában. Az eredmény típusa karakteres EMPTY(<kif>) kif karakteres kifejezés numerikus kifejezés dátumkifejezés logikai kifejezés A függvény egy adott kifejezésről eldönti, hogy üres-e. A függvény eredménye a kifejezés típusától függően logikai igaz (.T), ha - egy karakteres változó üres (hossza=0), vagy ha csak szóközöket tartalmaz - egy numerikus kifejezés értéke 0 - egy dátumkifejezés üres dátumot tartalmaz - egy logikai kifejezés értéke hamis (.F) 81 Az adatbáziskezelés alapjai A CLIPPER adatbáziskezelő nyelv Adatbáziskezelő utasítások Adatbázisok megnyitása, lezárása Ha egy adatbázissal dolgozni szeretnénk, akkor ezt előzőleg meg kell nyitnunk, ezáltal válnak hozzáférhetővé az adatbázisban tárolt

adatok a programjaink számára. Ha befejeztük az adatbázis feldolgozását, akkor az adatbázist le kell zárni. A lezárás hatására íródik ki az adatbázisba a memóriában található pufferterületek tartalma is. (Megjegyezzük, hogy a CLIPPER-ben van egy COMMIT utasítás, melynek hatására az összes munkaterület tartalma visszaíródik a lemezre. Ez a programban bármikor kiadható.) Egy adatbázist egy munkaterületen lehet megnyitni. A munkaterület kiválasztására szolgál a SELECT utasítás. SELECT <numkif> | <aliasnév> | <munkaterület száma> numkif aliasnév numerikus kifejezés, melynek értéke 0 és 254 között van egy létező munkaterület neve, ha ott már van nyitott adatállomány (lásd USE parancs). Az első tíz munkaterületre az A és J közötti betűkkel is hivatkozhatunk munkaterület száma 0 és 254 közötti szám A munkaterületet számmal, vagy az ABC nagybetűivel, vagy az ott megnyitott állomány aliasnevével

azonosíthatjuk. Minden munkaterületen megnyitható egy adatállomány a hozzá tartozó indexállományokkal együtt. Egyszerre csak egy munkaterület lehet aktív, mégpedig az, amelyiket a legutolsó SELECT utasítással kiválasztottunk. Minden munkaterületnek megvan a saját aktuális rekordja. Az aktuális rekord tartalmát megváltoztathatjuk akkor is, ha a munkaterület nem aktív Példák egy munkaterület kiválasztására: SELECT 1 SELECT B SELECT <alias-név> A SELECT 0 parancs a következő szabad munkaterületre kapcsol. USE [<file-név1>] [INDEX <file-név2>{,<file-név2>} [EXCLUSIVE] [ALIAS <alias-név>] A CLIPPER adatbáziskezelő nyelv file-név1 file-név2 alias-név 82 Az adatbáziskezelés alapjai adatállomány indexállományok alias-név A USE paranccsal egy munkaterületen megnyitható egy adatállomány. Az adatállomány alapértelmezés szerint .DBF kiterjesztésű Ha a munkaterületen már van aktív állomány,

akkor a USE parancs hatására először lezárásra kerül ez az állomány a hozzá tartozó indexállományokkal együtt és csak ezután kerül sor az új állomány megnyitására. Egy munkaterületen legfeljebb 15 indexállomány nyitható meg egyszerre. Ezeknek létezniük kell, kiterjesztésüknek .NTX-nek kell lennie Amennyiben másként nem rendelkezünk (lásd SET ORDER utasítás) az első indexállomány lesz az elsődleges index. Az alias-név legfeljebb 10 karakter hosszúságú lehet, tartalmazhat betűket, számjegyeket és a " " karaktert. Betűvel kell kezdődnie Az alias-név segítségével lehet más munkaterületről az állományhoz fordulni. Amennyiben az alias-név nincs külön megadva, akkor az alias-név az adatállomány neve lesz. Két munkaterületen nem lehet azonos alias-név Egy másik munkaterület aktuális rekordjának egy mezőjére hivatkozni a következőképpen lehet: <alias-név> -> mezőnév Nem indexelt állományok

megnyitása után az aktuális rekord az első rekord lesz, indexelt állományok esetén pedig az a rekord, amelyik az indexállomány szerint az első. Az EXCLUSIVE opció hatására az állomány kizárólagos hozzáférésre kerül megnyitásra. Ekkor a hálózatba kapcsolt többi felhasználó nem férhet hozzá. (Csak SET EXCLUSIVE OFF esetén van jelentősége.) Az önmagában kiadott USE parancs lezárja az aktuális munkaterületen megnyitott állományokat. Példák: USE raktar INDEX cikksz A fenti utasítás az aktuális munkaterületen megnyitja a raktar.dbf állományt és a cikkszntx indexállományt. Az alias-név raktar lesz SELECT 3 USE raktar62 ALIAS R62 Ez az utasítás a hármas munkaterületen megnyitja a raktar62.dbf állományt R62 alias-névvel Az adatbáziskezelés alapjai 83 A CLIPPER adatbáziskezelő nyelv SELECT 5 USE Ez az utasítás lezárja az ötös munkaterületen található nyitott állományokat. Az állományok lezárása a CLOSE

utasítással is történhet: CLOSE [ INDEX | DATABASES ] A kulcsszó nélküli CLOSE utasítás az aktuális munkaterületen megnyitott állományokat zárja le. A CLOSE INDEX az aktuális munkaterületen megnyitott indexállományokat zárja le. A CLOSE DATABASES hatására valamennyi állomány lezárásra kerül az összes munkaterületen. Adatbázisok karbantartása Rekord tartalmának módosítása REPLACE [ALL | NEXT <numkif> | RECORD <numkif>] [<alias-név> ->] <mező-név> WITH <kif> {[,<alias-név> ->] <mező-név> WITH <kif>} [FOR <logkif>] [WHILE <logkif>] numkif alias-név kif logkif numerikus kifejezés alias-név megfelelő kifejezés feltétel A REPLACE utasítás kicseréli egy, vagy több mező tartalmát a WITH után megadott kifejezéssel. Az alias-név megadása esetén a módosítás nem az aktuális munkaterületen levő adatállomány mezőire vonatkozik. Ha sem ALL, NEXT, RECORD sem FOR/WHILE

feltétel nincs megadva, akkor a csere csak az aktuális rekordra vonatkozik. Egy mezőbe csak megfelelő típusú kifejezés kerülhet. Numerikus mezők esetén, ha az új érték nagyobb, mint a mezőhossz, akkor a mezőbe csillagok kerülnek. Az ALL kulcsszó hatására a cserére az állomány minden rekordjában sor kerül. A NEXT kulcsszó hatására a következő a kifejezésben megadott darab rekordban történik meg a csere, míg a RECORD kulcsszó hatására a kifejezésben megadott sorszámú rekordban. A CLIPPER adatbáziskezelő nyelv 84 Az adatbáziskezelés alapjai Ha megadjuk a FOR kulcsszót, akkor mindazokban a rekordokban megtörténik a csere, amelyekre az adott feltétel igaz. A WHILE kulcsszó esetén addig történik a csere a soronkövetkező rekordokban, amíg a feltétel igaz. Példák: REPLACE cikksz WITH "54321" Ezen utasítás hatására az aktuális munkaterület aktuális rekordjában a cikkszám mezőbe az "54321" érték

kerül. REPLACE ALL ar WITH ar*1.1 A fenti utasítás hatására az állomány minden rekordjában az ar mező értéke 10%-kal nagyobb lesz. REPLACE raktar -> menny WITH 998.6 Hatására a raktar alias-nevű munkaterületen az aktuális rekordban a menny mező értéke 998.6 lesz REPLACE NEXT 60 ar WITH ar*1.05 FOR term csop="4" Ezen utasítás hatására a következő 60 rekord közül azokban emelkedik az ár, amelyekben a termékcsoport értéke 4. SELECT 1 USE raktar INDEX cikk REPLACE menny WITH 2*menny WHILE cikksz="8787" Hatására a raktár adatállományban a mennyiség értéke a kétszeresére változik a következő rekordokban addig, míg a cikkszám értéke 8787. Az adatállomány a cikkszám szerint van indexelve. Rekord törlésre jelölése, törlése A CLIPPER-ben a rekordokat nem lehet közvetlenül törölni az adatállományokból. Először a törölni kivánt rekordokat törlésre jelöljük. Ez a jelölés lekérdezhető, így ezen

rekordok a további feldolgozásból kihagyhatók. A törlésre jelölést meg is lehet szüntetni A törlésre jelölt rekordokat egy külön utasítással lehet eltávolítani az adatállományból. DELETE [ALL | NEXT <numkif> | RECORD <numkif>] Az adatbáziskezelés alapjai 85 A CLIPPER adatbáziskezelő nyelv [FOR <logkif>] [WHILE <logkif>] numkif logkif numerikus kifejezés feltétel Ez az utasítás az adatrekordok törlésre jelölésére szolgál. A DELETE további adatok megadása nélkül az aktuális rekordot jelöli törlésre. A kulcsszavak jelentése és használata megegyezik a REPLACE utasításnál leírtakkal. Példák: DELETE Az aktuális rekordot jelöli törlésre. DELETE RECORD 32 A 32-es sorszámú rekordot jelöli törlésre. RECALL [ALL | NEXT <numkif> | RECORD <numkif>] [FOR <logkif>] [WHILE <logkif>] numkif logkif numerikus kifejezés feltétel Ezen utasítás megszünteti a rekordok törlésre

jelölését. A RECALL utasítás egyéb kulcsszavak nélkül az aktuális rekordra vonatkozik. A kulcsszavak használata megegyezik a REPLACE utasításnál leírtakkal. PACK A PACK utasítás hatására az aktuális munkaterületen levő állományból véglegesen törlődnek a törlésre jelölt rekordok. Ekkor az állomány fizikailag is átszerveződik, ezért a fizikai rekordszámok A CLIPPER adatbáziskezelő nyelv 86 Az adatbáziskezelés alapjai megváltozhatnak. A PACK utasítás végrehajtása során az aktív indexállományok is újraszerveződnek. A nem aktív indexállományokat célszerű a REINDEX utasítással újraszervezni ZAP Ha az állomány minden rekordját törölni kívánjuk, akkor a ZAP utasítást kell kiadni. Hatására az aktuális munkaterületen levő adatállomány minden adatrekordja visszavonhatatlanul törlődik. Csak a mezőleírásokat tartalmazó rekord marad meg. ERASE <file-név> Ezzel az utasítással egy teljes állományt

törölhetünk. A file-névnek tartalmaznia kell a kiterjesztést is. Ha az állomány nem az aktuális meghajtón található, akkor a meghajtóegységet is meg kell adni Nyitott állományt nem lehet törölni. SET DELETED ON | OFF Amennyiben ez a kapcsoló ON-ra van állítva, a törlésre jelölt rekordok kimaradnak a feldolgozásból. A kapcsoló alapértelmezése OFF Rekord hozzáfűzése egy adatállományhoz APPEND BLANK Ez az utasítás egy üres rekordot fűz az állomány végére. Ezután a rekord mezőit a REPLACE utasítás segítségével tölthetjük fel a kívánt értékekkel. Indexállományok létrehozása, használata INDEX ON <kif> TO <file-név> kif file-név kulcskifejezés az index-file neve kiterjesztés nélkül Az adatbáziskezelés alapjai 87 A CLIPPER adatbáziskezelő nyelv Az INDEX ON utasítás az aktuális munkaterületen található adatállományhoz létrehoz egy indexállományt a megadott névvel és a kulcskifejezésben

megadott kulcs szerinti rendezettségben. A kulcskifejezés a kulcsmezőket tartalmazza. A kulcskifejezés hossza legfeljebb 250 karakter lehet Az index-file létrhozása során az adatállomány minden rekordjára kiértékelésre kerül a kulcskifejezés és ez az érték kerül tárolásra az index-file-ban. A kulcskifejezés értékének minden rekord esetén azonos típusúnak kell lennie, karakteres típusú érték esetén pedig fontos, hogy minden rekordban azonos hosszúságú karaktersorozat legyen a kulcskifejezés értéke. Egy adott rekord esetén - amennyiben a rekord nem változik - a kulcskifejezés értékének mindig azonosnak kell lennie. Ha valamely mező szerint csökkenő sorrendben szeretnénk indexelni, akkor a kulcskifejezésben erre a mezőre alkalmazzuk a DESCEND() függvényt. Ekkor a SEEK utasításban (lásd később) a kulcskifejezés megfelelő részére szintén alkalmazni kell a DESCEND() függvényt. Az INDEX ON utasítással létrejövő

indexállomány nyitva van. Példák: USE hallgato INDEX ON nev TO hallgato Ebben a példában a hallgato.dbf adatállományhoz létrehoztunk egy hallgatontx indexállományt, melynek kulcsa a nev mező, így ennek segítségével a hallgato adatállományt névsor szerinti rendezettségben tudjuk feldolgozni. USE hallgato INDEX ON STR(evf,1)+nev TO evfolyam Ezen INDEX utasítás hatására létrejön az evfolyam.ntx indexállomány, melynek segítségével a hallgato adatállományt évfolyam, ezen belül pedig névsor szerinti rendezettségben tudjuk feldolgozni. Mivel az evf numerikus mező, a nev viszont karakteres, ezért volt szükség az STR függvény segítségével végrehajtott konverzióra. USE hallgato INDEX ON DESCEND(ered) TO eredmeny Ezen INDEX utasítás hatására létrejön az eredmeny.ntx indexállomány, melynek segítségével a hallgatók adatait a tanulmányi eredmény szerint csökkenő sorrendben tudjuk feldolgozni. REINDEX A CLIPPER adatbáziskezelő

nyelv 88 Az adatbáziskezelés alapjai A REINDEX utasítás újraszervezi az aktuális munkaterületen az aktív indexállományokat. Használatára akkor lehet szükség, ha az indexállományok megsérültek, vagy az indexállományok az adatállomány módosításakor nem voltak megnyitva. SET INDEX TO <file-név>{,<file-név>} file-név indexállomány neve A SET INDEX utasítás az aktív munkaterületen megnyitja a felsorolt indexállományokat. Az adatállomány rekordjainak elérése az első indexállomány szerint fog történni. A SET INDEX TO önmagában való megadása lezárja a munkaterületen megnyitott index-fileokat. SET ORDER TO <numkif> numkif indexállomány sorszáma Ezen utasítás megváltoztatja a megnyitott indexállományok sorrendjét. Az elsődleges index az az állomány lesz, amelyik az indexek felsorolásában - USE utasítás, vagy SET INDEX - a numkif sorszámú. A SET ORDER TO 0 paranccsal az elsődleges indexet ki lehet

kapcsolni úgy, hogy az adatállomány módosítása továbbra is átvezetődik az indexállományokba. Példa: USE hallgato INDEX hallgato,eredmeny,evfolyam * * A feldolgozás névsor szerit történik * SET ORDER TO 3 GO TOP * * A feldolgozás az evfolyam indexállomány szerint történik * SET UNIQUE ON | OFF Az adatbáziskezelés alapjai 89 A CLIPPER adatbáziskezelő nyelv Amennyiben ezen kapcsoló értéke ON-ra van állítva, akkor a végrehajtott indexelés során az azonos kulcsok közül csak az első kerül bele az indexállományba. A kapcsoló alapértelmezése OFF Adatállományok relációba kapcsolása SET RELATION TO [<kif> | RECNO() | <numkif> INTO <aliasnév> {,<kif> | RECNO() | <numkif> INTO <aliasnév>}] kif numkif aliasnév kulcskifejezés numerikus kifejezés alias-név Ez az utasítás az aktuális munkaterületen levő állományt összekapcsolja egy vagy több más munkaterületen megnyitott állománnyal. A

kapcsolat létrehozásához vagy egy kulcskifejezést, vagy egy numerikus kifejezést használhatunk. Kulcskifejezés alkalmazása esetén a második állománynak a kifejezés szerint indexeltnek kell lennie. Ha az első állományban mozgunk, akkor a második és az esetleges további állományokban végbemegy egy keresés. Ha ez sikeres, akkor a többi állományban az lesz az aktuális rekord, amely elsőként felel meg az első állomány szerinti kulcskifejezésnek. Ha valamelyik állományban nincs ilyen rekord, akkor ott a rekordmutató a file végére áll. Ha a kapcsolat létrehozásához numerikus kifejezést használunk, akkor a második állományban az aktuális rekord mindig az a rekord, amelynek a fizikai rekordsorszáma megegyezik a kifejezés értékével. Ekkor a második állománynak nem kell indexeltnek lennie A RECNO() használatakor a rekordmutató párhuzamosan mozog az összekapcsolt állományokban. A SET RELATION TO utasítás megszünteti az

összekapcsolást. Példák: SELECT 2 USE raktar INDEX cikksz SELECT 3 USE vevo INDEX vevsz SELECT 1 USE eladas SET RELATION TO cikksz INTO raktar, TO vevsz INTO vevo A CLIPPER adatbáziskezelő nyelv 90 Az adatbáziskezelés alapjai Példánkban az eladas adatállományt relációba kapcsoltuk a raktar adatállománnyal, amely cikkszám szerint indexelt, és a vevo adatállománnyal, amely vevőszám szerint indexelt. Az összekapcsolás eredményeként a raktar adatállományban mindig az lesz az aktuális rekord, amelynek cikkszáma megegyezik az eladas adatállomány aktuális rekordjában levő cikkszámmal, a vevo adatállományban pedig az a rekord lesz az aktuális, amelynek vevőszáma megegyezik az eladas adatállomány aktuális rekordjában található vevőszámmal. Így az eladas adatállomány feldolgozása során automatikusan - külön keresések nélkül - rendelkezésünkre áll a megfelelő cikkszámú raktar-rekord és a megfelelő vevőszámú vevo-rekord.

SELECT 2 USE dupla SELECT 1 USE raktar SET RELATION TO RECNO()*2 INTO dupla Ebben a példában a raktar és a dupla adatállományokat rekordszámuk szerint kapcsoltuk össze. Ha a raktar állományban az 5. rekord az aktuális rekord, akkor a dupla állományban a 10 rekord az aktuális rekord. Pozícionálás, keresés egy adatbázisban GO BOTTOM | TOP | <numkif> numkif a rekord fizikai sorszáma Ezen utasítás segítségével az aktuális munkaterületen megnyitott adatállományban egy megadott sorszámú rekordra ugorhatunk, vagyis az adott rekord lesz ezen a munkaterületen az aktuális rekord. GO BOTTOM GO TOP GO <numkif> az utolsó rekordra ugrik az első rekordra ugrik a megadott sorszámú rekordra ugrik A meghatározott rekordszámra történő közvetlen ugrás mindig végrehajtódik, még akkor is, ha a SET FILTER TO , vagy a SET DELETED ON parancs következtében a rekord a feldolgozásból ki lenne zárva. A GO TOP és a GO BOTTOM utasítás indexelt

állományok esetén a logikailag első, illetve utolsó rekordra ugrik. Az adatbáziskezelés alapjai 91 A CLIPPER adatbáziskezelő nyelv Példa: GO 245 Ezen utasítás hatására az aktuális rekord a 245. rekord lesz SKIP [<numkif>] [ALIAS <alias-név>] numkif alias-név numerikus kifejezés alias-név A SKIP utasítás segítségével egy állományon belül az aktuális rekordról egy másik rekordra léphetünk. Az alias-név megadásával az ugrást egy nem aktuális állományban is elvégezhetjük Ha a numerikus kifejezés értéke pozitív, akkor előre ugrunk az állományban a megadott számmal, ha negatív, akkor visszafelé. A SKIP - paraméterek nélkül - a következő rekordra lép Indexelt állományok esetén az ugrás az indexkifejezés szerinti rendezettségnek megfelelően történik. Példa: USE hallgato SKIP 10 * A 10. rekord lesz az aktuális SKIP -3 * A 7. rekord lesz az aktuális LOCATE [NEXT <numkif>] FOR <logkif> [WHILE

<logkif>] logkif numkif feltétel tartományadat Ezzel az utasítással az aktuális állomány elejéről indulva megkereshető az első olyan rekord, amely a FOR feltételnek eleget tesz. A feltételben legalább egy mezőnévnek szerepelnie kell A feltételnek megfelelő további rekordok keresésére a CONTINUE utasítás szolgál. Ha nincs a feltételnek megfelelő rekord az állományban, akkor a rekordmutató a file végére áll és teljesül az EOF() feltétel. A WHILE feltétellel a keresést leszűkíthetjük az állomány egy részére Példák: A CLIPPER adatbáziskezelő nyelv 92 Az adatbáziskezelés alapjai USE hallgato LOCATE FOR nev="KEREK" Ebben a példában a rendezetlen hallgato állományban keressük a KEREK nevű hallgató adatait. USE hallgato INDEX ON evf TO evfoly LOCATE FOR nev="KEREK" WHILE evf=1 Ebben a példában az évfolyam szerinti rendezettségben feldolgozott hallgato állományban csak az 1. évfolyamon keressük a

KEREK nevű hallgatót SEEK <kif> kif tetszőleges kifejezés A SEEK utasítás indexelt állományban kulcskifejezés konkrét értéke alapján történő keresésre szolgál. A parancs mindig a keresési kifejezésnek megfelelő első rekordot találja meg Ugyanezzel az indexkifejezéssel további rekordok nem kereshetők meg. A keresés eredményessége a FOUND() függvénnyel lekérdezhető. Ha a keresett kulcsú rekord nincs az állományban, akkor a FOUND() függvény értéke hamis, a rekordmutató a file végére áll és teljesül az EOF() feltétel. Amennyiben a SOFTSEEK kapcsoló be van kapcsolva (SET SOFTSEEK ON), akkor a rekordmutató sikertelen keresés esetén az első a keresett kulcsértéknél nagyobb kulcsú rekordra mutat. A FOUND() függvény csak pontos találat esetén ad igaz értéket Példák: USE hallgato INDEX nevsor SEEK "KEREK" Ebben a példában a névsor szerinti rendezettségű hallgato állományban keressük a KEREK nevű

hallgatót. USE hallgato INDEX nevsor neve="KEREK" SEEK neve Az adatbáziskezelés alapjai 93 A CLIPPER adatbáziskezelő nyelv Ez a példa megegyezik az előzővel, csak itt a SEEK utasítás paramétereként változót használunk. Megjegyzés: Az indexelt állományban történő kulcs szerinti keresés nagy állományok esetén lényegesen gyorsabb, mint a szekvenciális keresés (LOCATE FOR). SET FILTER TO [<logkif>] logkif feltétel Ez az utasítás egy adatállomány szűrésére szolgál. Hatására az aktuális munkaterületen megnyitott adatállományból a feldolgozásban csak a feltételnek megfelelő rekordok vesznek részt, úgy tűnik, mintha az adatállomány csak azokból a rekordokból állna, amelyek a feltételnek megfelelnek. Egy szűrőfeltétel bekapcsolását követően az adatállományban valamerre el kell mozdulni (pl. GO BOTTOM), hogy az aktuális rekord a feltételnek megfelelő valamely rekord legyen. A szűrőt a SET FILTER TO

utasítással lehet kikapcsolni. Példa: USE hallgato SET FILTER TO evf=2 GO TOP A SET FILTER utasítás hatására a további feldolgozásban csak a 2. évfolyam hallgatóinak rekordjai vesznek részt. Az adatbázisbeli aktuális pozícióról, illetve a keresés eredményességéről informáló függvények BOF() Ez a függvény annak lekérdezésére szolgál, hogy történt-e kisérlet az aktuális állomány kezdetének átlépésére. Eredménye T , ha az utolsó pozícionáló parancs az állomány első logikai rekordja elé kivánt lépni, egyébként pedig .F Ha az állományban nincs adatrekord, a BOF függvény értéke T A CLIPPER adatbáziskezelő nyelv 94 Az adatbáziskezelés alapjai EOF() Ez a függvény annak lekérdezésére szolgál, hogy történt-e kisérlet az aktuális állomány végének átlépésére. Eredménye T ,ha az utolsó pozícionáló parancs az állomány utolsó logikai rekordja mögé kivánt lépni, egyébként pedig .F Ha az

állományban nincs adatrekord, az EOF függvény értéke .T LASTREC() Ez a függvény az aktuális adatállomány fizikai rekordjainak számát adja meg. RECNO() Ez a függvény az aktuális adatállomány aktuális rekordjának fizikai sorszámát adja eredményül. DELETED() Ez a függvény az aktuális rekordról megadja, hogy törlésre jelölt-e, vagy sem. Eredménye T amennyiben a rekord törlésre jelölt, egyébként pedig .F FOUND() Ez a függvény egy keresési művelet (SEEK, LOCATE, CONTINUE) eredményének lekérdezésére szolgál. Eredménye T amennyiben sikerült a feltételnek megfelelő rekordot találni, egyébként pedig .F Egyéb függvények A teljesképernyős adatbevitel megvalósításához szükségünk lehet az alábbi két függvényre: LASTKEY() Ez a függvény az utoljára lenyomott billentyű - beleértve a vezérlőbillentyűket is - ASCII kódját adja eredményül. Az adatbáziskezelés alapjai 95 A CLIPPER adatbáziskezelő nyelv

INKEY(<numkif>) numkif várakozási idő másodpercekben Ez a függvény paraméter nélkül az éppen lenyomott billentyű - beleértve a vezérlőbillentyűket is ASCII kódját adja eredményül. A függvényt egy numerikus kifejezéssel hívva a program annyi ideig várakozik, amennyit a numerikus kifejezésben megadtunk. Ezt a várakozási időt egy billentyű lenyomásával félbe lehet szakítani. Ekkor a függvény értéke a lenyomott billentyű ASCII kódja Ha nem szakítottuk meg a várakozást, akkor a függvény értéke 0. Ha paraméternek 0-t adunk, akkor a program korlátlan ideig várakozik, vagyis addig, míg egy billentyűt le nem ütünk. Osztott adatkezelés, rekordok és állományok zárolása (lockolása) Ha egy adatbázisban tárolt adatokhoz egyszerre több felhasználó szeretne hozzáférni - általában közös hálózatba kapcsolt munkahelyekről - , szükség van a megfelelő adatvédelem biztosítására, melyről a Konkurens műveletek című

fejezetben már szó esett. A CLIPPER programozási nyelv a hálózati adatkezelés biztosítására a következő lehetőségeket kínálja: - Az alkalmazásban felhasznált állományokhoz való hozzáférés általános érvényű meghatározása, mely lehet osztott, vagy kizárólagos. - Egy teljes adatállomány zárolása (lock). - Egy állomány egy rekordjának zárolása (lock). - Lekérdezési lehetőség arra vonatkozóan, hogy a hálózati parancsok sikeresen végrehajtódtak-e. A fenti funkciókat a következő parancsok segítségével lehet megvalósítani: SET EXCLUSIVE ON | OFF Kizárólagos, vagy közös állományhozzáférés lehetővé tétele. A CLIPPER adatbáziskezelő nyelv 96 Az adatbáziskezelés alapjai A kapcsoló ON állása esetén az adatállományokhoz a feldolgozás ideje alatt csak egyetlen felhasználó férhet hozzá, OFF állás esetén pedig több felhasználó is hozzáférhet (osztott módú feldolgozás). A kapcsoló alapértelmezés

szerint ON állásban van NETERR() Ez a függvény a hálózati parancsok (APPEND BLANK, USE EXCLUSIVE) sikeres végrehajtásának lekérdezésére szolgál. Eredménye T ha a végrehajtás során hiba lépett fel, sikeres végrehajtás esetén pedig .F LOCK() Ez a függvény az aktuális adatállományban megkisérli zárolni az aktuális rekordot. Ha ezt a rekordot, vagy a teljes állományt egy másik felhasználó már zárolta, akkor a zárolás nem sikerült és a függvény .F értéket ad eredményül Sikeres zárolás esetén a függvény értéke T Ha ugyanaz a felhasználó ebben az állományban korábban zárolt egy rekordot, akkor ez a zárolás most érvényét veszti. FLOCK() Ez a függvény megkisérli az aktuális adatterületen megnyitott adatállomány zárolását. Ha sikerült, akkor a függvény eredménye .T , ha nem, akkor F A zárolás nemcsak akkor sikertelen, ha egy másik felhasználó zárolta az állományt, hanem akkor is, ha csak az állomány

valamely rekordja van zárolva. UNLOCK [ALL] Az UNLOCK utasítás megszünteti az aktuális munkaterületen az állomány, vagy a rekord zárolását. Az UNLOCK ALL minden munkaterületen megszünteti a zárolásokat. Most tekintsük át, hogy melyek azok a műveletek, amelyek az állomány teljes zárolását igénylik, s melyek azok, amelyek végrehajtásához a rekordot kell zárolni. Csak kizárólagos hozzáférésre megnyitott állományokon használhatók a következő utasítások: Az adatbáziskezelés alapjai 97 A CLIPPER adatbáziskezelő nyelv - PACK - REINDEX - ZAP Állományzárolást igényelnek az alábbi utasítások, amennyiben az állomány osztott módra van megnyitva: - DELETE <tartomány> - RECALL <tartomány> - REPLACE <tartomány> A fenti utasítások esetén azért szükséges a teljes állomány zárolása, mert az állomány több rekordjára vonatkoznak. Rekordzárolást igényelnek az alábbi utasítások, amennyiben az

állomány osztott módra van megnyitva: - DELETE - RECALL - REPLACE A fenti utasítások csak egyetlen rekordra vonatkoznak, ezért elegendő a rekord szintű zárolás. A hálózati utasítások használatára a Programozási példák című fejezetben találhatók példaprogramok. 98 Programozási példák Az adatbáziskezelés alapjai 14.4 Programozási példák A következő példákban az alábbi adatállományokat fogjuk használni: HALLGATO (HALLGATÓ) mező neve típusa mérete tizedes tartalma hkod N 5 hallgató kódja nev C 20 név kar C 3 kar azonosítója szak C 25 szak neve evf N 1 évfolyam ered N 4 2 eredmény A tábla kulcsa a hallgatókód. A HALLGATO tábla a HALLGATO.DBF állományban HALLGATO.NTX indexállomány, melynek kulcsmezője a hkod található. Hozzátartozik a TANTARGY (TANTÁRGY) mező neve típusa mérete tizedes tartalma tkod N 3 tantárgykód tnev C 20 tantárgynév A tábla kulcsa a tantárgykód.

A TANTARGY tábla a TANTARGY.DBF állományban található Az állományhoz tartozik a TANTARGY.NTX indexállomány, melynek kulcsmezője a tkod 99 Az adatbáziskezelés alapjai Programozási példák VIZSGA mező neve típusa mérete tizedes tartalma hkod N 5 hallgató kódja tkod N 3 tantárgykód jegy N 1 vizsgajegy A tábla kulcsa a hallgatókód és a tantárgykód. A VIZSGA tábla a VIZSGA.DBF állományban található Az állományhoz tartozik a VIZSGANTX indexállomány, melynek kulcsmezője a hkod, és a VIZSTAN.NTX, melynek kulcsmezője a tkod Adatbázisok listázása, indexelés 1. feladat Készítsünk programot, amely kilistázza a hallgatók adatait a képrnyőre a hallgato adatállományból névsor szerinti rendezettségben. Megoldás: CLEAR USE hallgato INDEX ON nev TO wind DO WHILE !EOF() sor=1 DO WHILE !EOF().andsor<=23 ? nev, ,hkod, ,kar, ,evf, ered sor=sor+1 SKIP ENDDO WAIT A továbblépéshez üss le egy billentyűt. CLEAR ENDDO ERASE

wind.ntx CLOSE Programozási példák 100 Az adatbáziskezelés alapjai Mivel a hallgato adatállománynak nincs név szerinti indexállománya, ezért először készítenünk kellett egyet, melyet a program végén ki is törlünk. A listázás során az indexállománynak megfelelő sorrendben haladunk végig az adatokon, míg az állomány végére nem érünk, melyet a file-vége feltétel (EOF) teljesülése jelez. Ezt biztosítja a külső ciklus A belső ciklus pedig arra szolgál, hogy egy képernyőnyi adatot kiírjunk a képernyőre. Ha a képernyő betelt, akkor a WAIT utasítás segítségével várakozik a program addig, míg a felhasználó le nem üt egy billentyűt. Csak ezután kerül sor az újabb adatok kiírására. Erre azért van szükség, hogy a felhasználó tetszőleges ideig tanulmányozhassa a megjelenő adatokat. A belső ciklus feltételében is szerepel a file-vége feltétel, hiszen a listázást akkor is abba kell hagyni, ha elfogytak az adatok,

pedig a képernyő még nem telt meg. 2. feladat Készítsünk programot, amely kilistázza a hallgatók adatait a képrnyőre a hallgato adatállományból kar, évfolyam, azon belül pedig névsor szerinti rendezettségben. Megoldás: CLEAR USE hallgato INDEX ON kar+STR(evf)+nev TO wind DO WHILE !EOF() sor=1 DO WHILE !EOF().andsor<=23 ? nev, ,hkod, ,kar, ,evf, ered sor=sor+1 SKIP ENDDO WAIT A továbblépéshez üss le egy billentyűt. CLEAR ENDDO CLEAR ERASE wind.ntx CLOSE A program menete megegyezik az előzőével, különbség csak az index kulcsmezőjében van. Mivel most több mező szerint szeretnénk rendezni az adatokat, a kulcsokat a + jellel kell összekapcsolni Az adatbáziskezelés alapjai 101 Programozási példák az INDEX ON utasításban. Az evf mező numerikus tipusú, ezért az STR függvény segítségével karakteressé kell konvertálni, hogy a másik két karakteres mezővel összekapcsolhassuk a kulcskifejezésben. 3. feladat Készítsünk

programot, amely kilistázza a hallgatók adatait a képernyőre a hallgato adatállományból kar, évfolyam, azon belül pedig névsor szerinti rendezettségben. A lista végén pedig kiírja az egyetem tanulmányi átlagát. Megoldás: CLEAR USE hallgato INDEX ON kar+STR(evf)+nev TO wind sor=1 egyeter=0 egyetdb=0 DO WHILE !EOF() sor=1 DO WHILE !EOF().andsor<=23 ? nev, ,hkod, ,kar, ,evf, ered egyeter=egyeter+ered egyetdb=egyetdb+1 sor=sor+1 SKIP ENDDO WAIT A továbblépéshez üss le egy billentyűt. CLEAR ENDDO ? Egyetem átlaga:, egyeter/egyetdb ERASE wind.ntx CLOSE Ez a program az előző programon alapul, azt egészítettük ki az átlagszámítással. Ehhez bevezettünk két gyűjtőváltozót. Az egyeter változóban az eredményeket összegezzük, az egyetdb változóban pedig a hallgatókat számoljuk. Programozási példák 102 Az adatbáziskezelés alapjai 4. feladat Készítsünk programot, amely kilistázza a hallgatók adatait a képernyőre a hallgato

adatállományból kar, évfolyam, azon belül pedig névsor szerinti rendezettségben. Egy-egy évfolyam, illetve kar utolsó hallgatója után kiírja az évfolyam, illetve a kar tanulmányi átlagát. A lista végén pedig kiírja az egyetem tanulmányi átlagát. Megoldás: CLEAR USE hallgato INDEX ON kar+STR(evf)+nev TO wind sor=1 egyeter=0 egyetdb=0 DO WHILE !EOF() aktkar=kar karer=0 kardb=0 DO WHILE !EOF().andaktkar=kar aktevf=evf evfer=0 evfdb=0 DO WHILE !EOF().andaktkar=kar and aktevf=evf IF sor>23 sor=1 WAIT A továbblépéshez üss le egy billentyűt. CLEAR ENDIF ? nev, ,hkod, ,kar, ,evf, ered evfer=evfer+ered evfdb=evfdb+1 sor=sor+1 SKIP ENDDO sor=sor+1 IF sor>23 sor=1 WAIT A továbblépéshez üss le egy billentyűt. CLEAR Az adatbáziskezelés alapjai 103 Programozási példák ENDIF ? aktevf, . évfolyam átlaga:, evfer/evfdb ? sor=sor+2 karer=karer+evfer kardb=kardb+evfdb ENDDO sor=sor+1 IF sor>23 sor=3 WAIT A továbblépéshez üss le egy billentyűt.

CLEAR ENDIF ? aktkar, kar átlaga:, karer/kardb ? sor=sor+2 egyeter=egyeter+karer egyetdb=egyetdb+kardb ENDDO sor=sor+1 IF sor>23 WAIT A továbblépéshez üss le egy billentyűt. CLEAR ENDIF IF egyetdb>0 ? Egyetem átlaga:, egyeter/egyetdb ENDIF WAIT A továbblépéshez üss le egy billentyűt. CLEAR ERASE wind.ntx CLOSE Ez a program az előző program továbbfejlesztése. A különböző szintű átlagszámítást egymásba ágyazott ciklusok segítségével valósítottuk meg. A legbelső ciklus gondoskodik a tételsorok kiírásáról és az évfolyam szintű átlagszámításhoz az eredmények és a hallgatók számának gyűjtéséről. A következő ciklus a kari szintű gyűjtést valósítja meg, ami az évfolyam-átlagok kiírásából és az évfolyamgyűjtőknek a kari gyűjtőkhöz való hozzáadásából áll. Az évfolyamgyűjtőket minden újabb évfolyam előtt nullázni kell. A legkülső ciklus biztosítja az egyetemi szintű gyűjtést. Programozási

példák 104 Az adatbáziskezelés alapjai Figyeljük meg, hogy a belső ciklusok feltételében a külső ciklusok feltételeit is be kellett írnunk. Hiszen a legbelső ciklust akkor is be kell fejezni, ha elfogytak a tételek, vagy ha másik kar tételei következnek, bár az évfolyam azonos. Ugyanígy a középső ciklusban is figyelni kell, hogy nem értünk-e már az állomány végére. Keresés egy adatállományban 4. feladat Készítsünk programot, amely a billentyűzetről bekér egy nevet, majd megkeresi a hallgato adatállományban az adott nevű hallgató adatait. Ha megtalálta, írja ki a képernyőre az adatokat és folytassa a keresést további ilyen nevű hallgató után. Ha nem talált ilyen nevű hallgatót, akkor pedig azt írja ki, hogy "Nincs ilyen nevű hallgató!". Megoldás: CLEAR USE hallgato INPUT Név: TO kertnev van=.F LOCATE FOR nev=kertnev DO WHILE !EOF() van=.T ? nev, ,hkod, ,kar, ,evf, ered CONTINUE ENDDO IF !van ? Nincs ilyen nevű

hallgató! ENDIF CLOSE Mivel rendezetlen adatállományban keresünk, ezért a LOCATE FOR utasítással keressük meg az első megfelelő hallgatót. A többi azonos nevű hallgató rekordjának megkeresésére a CONTINUE utasítást használjuk, melyet addig ismétlünk, amig a file-vége feltétel (EOF) nem teljesül. A van logikai változó segítségével jelezzük, hogy van-e ilyen nevű hallgató. A van változó értéke csak akkor lesz igaz, ha a LOCATE FOR utasítás eredményesen végrehajtódott és a program belépett a Az adatbáziskezelés alapjai 105 Programozási példák ciklusba. Ha a keresés eredménytelen volt, akkor a ciklusba be sem lép a program, az IF utasításban a van változó értéke hamis lesz. Ha a LOCATE FOR utasítás feltételében az RTRIM függvényt alkalmazzuk, ennek segítségével az egyezőséget csak olyan hosszan vizsgálja a program, amilyen hosszan a nevet beütöttük. Például, ha csak az első három karakterét ütjük le a

névnek, akkor mindazon hallgatókat megtalálja a program, akiknek a neve ezzel a három karakterrel kezdődik.: CLEAR USE hallgato INPUT Név: TO kertnev van=.F LOCATE FOR nev=RTRIM(kertnev) DO WHILE !EOF() van=.T ? nev, ,hkod, ,kar, ,evf, ered CONTINUE ENDDO IF !van @ 9,0 SAY Nincs ilyen nevü hallgató! ENDIF CLOSE 5. feladat Készítsünk programot, amely megnyitja a hallgato adatállományt a hallgato indexállománnyal együtt, majd a billentyűzetről bekér egy hallgatókódot és az indexállomány segítségével megkeresi az adott kódú hallgató adatait és kiírja a képernyőre. Ha nem talál ilyen kódú hallgatót, akkor azt írja ki, hogy "Nincs ilyen kódú hallgató!". Megoldás: CLEAR USE hallgato INDEX hallgato INPUT KOD: TO kertkod SEEK kertkod IF !FOUND() ? Nincs ilyen kódú hallgató! Programozási példák 106 Az adatbáziskezelés alapjai ELSE ? nev, ,hkod, ,kar, ,evf, ered ENDIF CLOSE Ebben a programban az adatállományunkhoz

megnyitottuk a hallgato indexállományt is, melynek kulcsa a hallgatókód. Ezért most a SEEK utasítás segítségével tudjuk megkeresni a megadott kódú hallgató adatait. Adatállományok karbantartása 6. feladat Készítsünk programot a hallgato adatállomány karbantartására. A program az adatállománnyal együtt nyissa meg a hallgato indexállománnyt is. A billentyűzetről kérjen be egy hallgatókódot és az indexállomány segítségével keresse meg az adott kódú hallgató adatait és írja ki a képernyőre. Ha nem talál ilyen kódú hallgatót, akkor új hallgatóról van szó, fűzzön hozzá egy rekordot az adatállományhoz, majd töltse fel a mezőket a megfelelő értékekkel. Megoldás: CLEAR USE hallgato INDEX hallgato INPUT KOD: TO kertkod SEEK kertkod IF EOF() ? Uj hallgató felvitele! ? APPEND BLANK REPLACE hkod WITH kertkod ELSE ? nev, ,hkod, ,kar, ,evf, ered ? Hallgató módosítása! ? ENDIF INPUT NÉV: TO unev INPUT KAR: TO ukar INPUT ÉVFOLYAM:

TO uevf Az adatbáziskezelés alapjai 107 Programozási példák INPUT EREDMÉNY: TO uered REPLACE nev WITH unev REPLACE kar WITH ukar REPLACE evf WITH uevf REPLACE ered WITH uered CLOSE Az állomány karbantartásához megnyitottuk a hallgato indexállományt is. Ez egyrészt biztosítja a kód szerinti keresést, másrészt a karbantartás során az indexállomány párhuzamosan módosul az adatállománnyal. 7. feladat Készítsünk programot amely a hallgato adatállományban törlésre jelöli egy adott hallgató adatait. A hallgató kódját billentyűzetről kérje be a program. Megoldás: CLEAR USE hallgato INDEX hallgato INPUT Kňd: TO kertkod SEEK kertkod IF !FOUND() ? Ilyen kódú hallgató nincs! ELSE ? nev, ,hkod, ,kar, ,evf, ered IF DELETED() ? ? Ez a hallgató már töröl! ELSE DELETE ? ? A hallgató törlése megtörtént! ENDIF ENDIF CLOSE Programozási példák 108 Az adatbáziskezelés alapjai 8. feladat Készítsünk programot amely a vizsga

adatállományban törlésre jelöli egy adott hallgató rekordjait. A hallgató kódját billentyűzetről kérje be a program. Megoldás: CLEAR USE vizsga INDEX vizsga INPUT KňD: TO kertkod SEEK kertkod IF !FOUND() ? ? Ilyen kódú hallgatónak nincsenek vizsgái! ELSE DELETE WHILE hkod=kertkod ? ? A törlés megtörtént! ENDIF CLOSE Adatállományok relációba kapcsolása 9. feladat Készítsünk programot amely minden hallgatónak kiszámítja a féléves eredményét a vizsgajegyekből, és ezt beírja az ered adatmezőbe. A vizsga állományban a hallgatóknak minden tantárgyból csak az utolsó vizsgajegye szerepel. Megoldás: USE vizsga INDEX vizsga SELECT 2 USE hallgato INDEX hallgato SET RELATION TO hkod INTO vizsga GO TOP DO WHILE !EOF() SELECT vizsga atlag=0 Az adatbáziskezelés alapjai 109 Programozási példák jegydb=0 DO WHILE !EOF().andHALLGATO->hkod=VIZSGA->hkod atlag=atlag+VIZSGA->jegy jegydb=jegydb+1 SKIP ENDDO IF jegydb>0 atlag=atlag/jegydb

ENDIF SELECT hallgato REPLACE ered WITH atlag SKIP ENDDO CLOSE ALL A programban a hallgato-állományt relációba kapcsoltuk a vizsga-állománnyal, így ha egy új hallgató rekordra állunk, a vizsga-állományban az adott hallgató első rekordja lesz az aktuális rekord. Mivel a hallgatókód szerint kapcsoltuk relációba a két állományt, ezért a vizsgaállománynak a hallgatókód szerinti indexállományát kell használnunk A relációba kapcsolás után ki kell adni egy GO TOP utasítást, hogy a vizsga-állomány aktuális rekordja a relációnak megfelelő legyen. Az átlagszámításnál az egyszerűség kedvéért az elégtelen vizsgajegyeket nem különböztettük meg. 10. feladat Készítsünk programot amely kilistázza a képernyőre minden tantárgyból a jelesre vizsgázók nevét. Megoldás: CLEAR USE hallgato INDEX hallgato SELECT 2 USE tantargy INDEX tantargy SELECT 3 USE vizsga INDEX vizstan SET FILTER TO VIZSGA->jegy=5 SET RELATION TO hkod INTO

hallgato,; TO tkod INTO tantargy GO TOP Programozási példák 110 Az adatbáziskezelés alapjai DO WHILE !EOF() ? TANTARGY->tnev, tantárgyból 5-ösre vizsgáztak: akttant=VIZSGA->tkod sor=1 DO WHILE !EOF().andakttant=VIZSGA->tkodandsor<=21 ? HALLGATO->nev sor=sor+1 SKIP ENDDO WAIT A továbblépéshez üss le egy billentyűt. CLEAR ENDDO CLOSE ALL A vizsga-állományt relációba kapcsoltuk a hallgató adatállománnyal a hallgatókódon keresztül, a tantargy adatállománnyal pedig a tantárgykódon keresztül. Beállítottunk egy szűrőt is, amely azt biztosítja, hogy a feldolgozásban csak a jeles vizsgajegyeket tartalmazó rekordok vegyenek részt. Ezek után a vizsga-állományt sorban olvasva listázhatjuk a rekordokat. A relációba kapcsolás biztosítja, hogy a hallgato-állományban mindig a megfelelő kódú hallgató rekordja az aktuális, így a nevet kereső utasítás kiadása nélkül vehetjük innen, a tantargy-állományban pedig mindig a

megfelelő tantárgykódú rekord az aktuális, így a tantárgy nevét is megkapjuk. 11. feladat Készítsünk programot amely kilistázza minden hallgatónak az egyes tantárgyakból elért vizsgajegyeit a tantárgyak megnevezésével együtt. A lista kar, évfolyam, ezen belül pedig névsor szerinti rendezettségben készüljön. Megoldás: USE tantargy INDEX tantargy SELECT 2 USE vizsga INDEX vizsga SET RELATION TO tkod INTO tantargy SELECT 3 USE hallgato INDEX ON kar+STR(evf)+nev TO wind SET RELATION TO hkod INTO vizsga GO TOP Az adatbáziskezelés alapjai 111 Programozási példák sor=1 DO WHILE !EOF() ujhallg=.t SELECT vizsga DO WHILE !EOF().andHALLGATO->hkod=VIZSGA->hkod IF sor>22 ujhallg=.t WAIT A továbblépéshez üss le egy billentyűt. sor=1 ENDIF IF ujhallg ? ? kar, evf, nev, vizsgaeredményei: ujhallg=.f sor=sor+2 ENDIF ? TANTARGY->tnev,VIZSGA->jegy sor=sor+1 SKIP ENDDO SELECT hallgato SKIP ENDDO CLOSE DATABASES ERASE wind.ntx CLOSE ALL A

programban a hallgato-állományt a hallgatókódon keresztül relációba kapcsoltuk a vizsgaállománnyal, a vizsga-állományt pedig a tantárgykódon keresztül relációba kapcsoltuk a tantargyállománnyal. Így amikor egy újabb hallgatórekord kerül listázásra, a vizsga-állomány aktuális rekordja a hallgató első vizsga-rekordja, a tantargy-állomány aktuális rekordja pedig az adott vizsgarekordban található tantárgykódhoz tartozó rekord lesz. Adatbáziskezelés hálózati környezetben 12. feladat Készítsünk menüvezérelt programot a hallgatók adatainak kezelésére. A menüpontok a következők legyenek: Programozási példák 112 Az adatbáziskezelés alapjai 1. Hallgatói adatok karbantartása 2. Hallgatók törlése 3. A törlésre jelölt rekordok végleges eltávolítása 4. Az adatállományok újraindexelése 5. A hallgatók vizsgajegyeinek listázása A program hálózati környezetben működjön és a képernyőt sor, oszlop szinten

kezelje. Megoldás: SET EXCLUSIVE OFF tev=1 DO WHILE tev>0 CLEAR @ 4,15 PROMPT 1. Hallgatói adatok karbantartása @ 6,15 PROMPT 2. Hallgatók törlése @ 8,15 PROMPT 3. A törlésre jelölt rekordok végleges; + eltávolítása @ 10,15 PROMPT 4. Az adatállományok újraindexelése @ 12,15 PROMPT 5. A hallgatók vizsgajegyeinek +; listázása MENU TO tev DO CASE * Karbantartás CASE tev=1 CLEAR USE hallgato INDEX hallgato IF NETERR() @ 23,0 SAY WAIT A HALLGATO állomány megnyitása nem sikerült! ELSE @ 1,0 SAY N é v Kód ; + Kar Évfolyam Eredmény DO WHILE .t @ 3,0 kertkod=0 Az adatbáziskezelés alapjai 113 @ 3,32 GET kertkod PICTURE 99999 READ IF LASTKEY()=27 EXIT ENDIF SEEK kertkod IF EOF() unev =SPACE(20) ukar =SPACE(3) uevf =0 uered=0 @ 5,0 SAY Uj hallgató felvitele! ELSE unev =HALLGATO->nev ukar =HALLGATO->kar uevf =HALLGATO->evf uered=HALLGATO->ered @ 5,0 SAY Hallgató módosítása! ENDIF DO WHILE .t @ 3, 6 GET unev @ 3,43 GET ukar @ 3,52 GET

uevf PICTURE 9 ; VALID uevf>0.anduevf<=5 @ 3,59 GET uered PICTURE 9.99 READ IF LASTKEY()#27 ik= @ 24,0 SAY Helyes a kitöltés (I/N)? GET ik READ IF ik$iI IF EOF() DO WHILE .t APPEND BLANK IF NETERR() INKEY(.5) ELSE EXIT ENDIF ENDDO Programozási példák Programozási példák 114 REPLACE hkod WITH kertkod ENDIF DO WHILE .t IF LOCK() EXIT ELSE INKEY(.5) ENDIF ENDDO REPLACE nev WITH unev REPLACE kar WITH ukar REPLACE evf WITH uevf REPLACE ered WITH uered UNLOCK ALL @ 24,0 EXIT ENDIF @ 24,0 ELSE EXIT ENDIF ENDDO @ 5,0 ENDDO ENDIF USE * Törlésre jelölés CASE tev=2 CLEAR USE hallgato INDEX hallgato IF NETERR() @ 23,0 SAY WAIT A HALLGATO állomány megnyitása nem sikerült! ELSE @ 1,0 SAY N é v Kód ; + Kar Évfolyam Eredmény DO WHILE .t @ 3,0 Az adatbáziskezelés alapjai Az adatbáziskezelés alapjai kertkod=0 @ 3,32 GET kertkod PICTURE 99999 READ IF LASTKEY()=27 EXIT ENDIF SEEK kertkod IF EOF() @ 5,0 SAY Ilyen kódú hallgató nincs! ELSE @ 3, 6 SAY

HALLGATO->nev @ 3,43 SAY HALLGATO->kar @ 3,52 SAY HALLGATO->evf @ 3,59 SAY HALLGATO->ered IF DELETED() DO WHILE .t IF LOCK() EXIT ELSE INKEY(.5) ENDIF ENDDO RECALL UNLOCK ALL @ 5,0 SAY A hallgató törlésének + ; megszüntetése megtörtént! ELSE DO WHILE .t IF LOCK() EXIT ELSE INKEY(.5) ENDIF ENDDO DELETE UNLOCK ALL @ 5,0 SAY A hallgató törlése megtörtént! ENDIF ENDIF @ 23,0 SAY 115 Programozási példák Programozási példák 116 WAIT A továbblépéshez üss le egy billentyűt. @ 3,0 @ 5,0 @ 24,0 ENDDO ENDIF USE * Végleges törlés CASE tev=3 USE hallgato INDEX hallgato EXCLUSIVE IF NETERR() @ 23,0 SAY WAIT A HALLGATO állomány megnyitása nem sikerült! ELSE PACK ENDIF USE * Újraindexelés CASE tev=4 @ 22,0 SAY Az állományok indexelése megkezdődött! USE hallgato INDEX hallgato EXCLUSIVE IF NETERR() @ 23,0 SAY WAIT A HALLGATO állomány megnyitása nem sikerült! @ 24,0 ELSE INDEX ON hkod TO hallgato ENDIF USE vizsga INDEX vizsga,vizstan

EXCLUSIVE IF NETERR() @ 23,0 SAY WAIT A VIZSGA állomány megnyitása nem sikerült! @ 24,0 ELSE INDEX ON hkod TO vizsga INDEX ON tkod TO vizstan Az adatbáziskezelés alapjai Az adatbáziskezelés alapjai 117 ENDIF USE tantargy INDEX tantargy EXCLUSIVE IF NETERR() @ 23,0 SAY WAIT A TANTARGY állomány megnyitása nem sikerült! ELSE INDEX ON tkod TO tantargy ENDIF USE * Listázás CASE tev=5 SET DATE ANSI SET CENTURY ON SET DEVICE TO PRINT SET DELETED ON SET PRINTER TO a.lst USE tantargy INDEX tantargy IF NETERR() @ 23,0 SAY WAIT A TANTARGY állomány megnyitása nem sikerült! ELSE SELECT 2 USE vizsga INDEX vizsga IF NETERR() @ 23,0 SAY WAIT A VIZSGA állomány megnyitása nem sikerült! ELSE SET RELATION TO tkod INTO tantargy SELECT 3 USE hallgato IF NETERR() @ 23,0 SAY WAIT A HALLGATO állomány megnyitása nem sikerült! ELSE INDEX ON kar+STR(evf)+nev TO wind SET RELATION TO hkod INTO vizsga Programozási példák Programozási példák 118 GO TOP lapsor=66

lap=0 DO WHILE !EOF() ujhallg=.t SELECT vizsga DO WHILE !EOF().andHALLGATO->hkod=VIZSGA->hkod IF lapsor>65 ujhallg=.t IF lap>0 EJECT ENDIF lap=lap+1 @ PROW(),35 SAY -+STR(lap,4)+ - @ PROW()+2,11 SAY Vizsga eredmények kar,+; évfolyam és hallgató név sorrendben @ PROW()+2,24 SAY A listázás időpontja: +DTOC(DATE()) @ PROW()+4, 0 SAY lapsor=8 ENDIF IF ujhallg @ PROW()+2,0 SAY HALLGATO->kar+; STR(HALLGATO->evf,2)+ +RTRIM(HALLGATO->nev)+; vizsgaeredményei: ujhallg=.f lapsor=lapsor+2 @ PROW(),50 SAY TANTARGY->tnev+STR(VIZSGA->jegy,5) ELSE @ PROW()+1,50 SAY TANTARGY->tnev+; STR(VIZSGA->jegy,5) lapsor=lapsor+1 ENDIF SKIP ENDDO SELECT hallgato SKIP ENDDO EJECT SET DEVICE TO SCREEN SET DELETED OFF Az adatbáziskezelés alapjai Az adatbáziskezelés alapjai 119 Programozási példák CLOSE DATABASES ERASE wind.ntx ENDIF ENDIF ENDIF USE ENDCASE ENDDO Programunkat az előző feladatok megoldása során készített programok felhasználásával

írtuk meg. Kiegészítettük a hálózati környezetben való működéshez szükséges zárolásokkal és hálózati hibavizsgálatokkal. A "Hallgatók törlése" menüpontban lehetővé tettük, hogy a törlésre jelölést megszüntethesse a felhasználó úgy, hogy a törlésre jelölt rekord kódját adja meg. A program ennek megfelelően tájékoztat arról, hogy törlésre jelölés, vagy a jelölés megszüntetése történt-e. Az újraindexelésnél használhattuk volna a REINDEX utasítást is, azért választottuk mégis az INDEX ON utasítást, mert a program így akkor is fel tudja építeni az indexállományt ha az annyira megsérül, hogy a kulcsok sem azonosíthatók. Az ORACLE adatbáziskezelő rendszer 15. 120 Az adatbáziskezelés alapjai Az ORACLE adatbáziskezelő rendszer Az ORACLE az egyik vezető relációs adatbáziskezelő rendszer, amely nagy méretű adatbázisok biztonságos kezelését tűzte ki célul. Számos olyan helyen

használják, ahol fontos az adatok gyors elérése és az adatbiztonság (pl. banki rendszerek) Eredetileg középgépekre fejlesztették ki, majd később létrehozták a személyi számítógépeken futtatható változatát és nagygépes változatát is. Az ORACLE adatbáziskezelőnek egyre újabb verziói készülnek el. Mi a továbbiakban az ORACLE 7es verziójával ismerkedünk meg Az adatbáziskezelő rendszer részletes bemutatásának az a célja, hogy egy konkrét példán vizsgáljuk meg az adatbáziskezelő rendszer komplex feladatainak megvalósítását. Az ORACLE adatbázis egy egységet alkotó adatok összessége. Az adatbázis file-okból áll, fizikailag ezek az adat-file-ok, a REDO LOG file-ok és a CONTROL file. Logikailag az adatbázis tablespace-ekre bomlik. A tablespace-k a logikai kapcsolatban levő objektumok csoportosítására szolgálnak. Például az egy alkalmazáshoz tartozó objektumokat egy tablespace-ben helyezik el. Adatbázis-objektumok az

adattáblák, indexek, clusterek, nézettáblák, tárolt eljárások stb. Az adattáblákban találhatók a felhasználók által elérhető adatok. A nézettáblák az adattáblákon alapulnak. A nézettáblák tulajdonképpen tárolt lekérdezések Nem tartalmaznak adatokat, az adatokat azokból a táblákból emelik ki, amelyeken alapulnak. Sorokból és oszlopokból állnak, mint a táblák, ugyanúgy használhatjuk őket. A nézettáblák segítségével az adatokat úgy csoportosíthatjuk, ahogy az egyes felhasználók számára a legmegfelelőbb. A nézettáblák módosíthatók, de csak akkor, ha egyetlen adattáblán alapulnak. Ekkor a módosítás az adattáblában történik meg. Nézettáblákból is hozhatunk létre újabb nézettáblákat Az egyes táblázatokhoz készíthetünk indexeket. Az indexek az adatok visszakeresésének gyorsítására szolgának. Az index kulcsa az adattábla egy vagy több oszlopa lehet Bármikor létrehozhatunk és megszüntethetünk

indexeket. Az index az adattábla módosítása esetén automatikusan módosul. A clusterezés egy adattárolási módszer. A cluster egy vagy több táblából álló csoport, melyek fizikailag együtt kerülnek tárolásra. Azokat a táblákat célszerű egy clusterben elhelyezni, amelyeket gyakran használunk együtt. Ezzel a tárolással jelentősen gyorsítani lehet az adatok visszakeresését A tablespace-k között kitüntetett szerepe van a SYSTEM tablespace-nek. Ebben található az adatszótár. A SYSTEM tablespace automatikusan létrejön, amikor az adatbázist létrehozzuk A tablespace-k segítségével az adatbázis-adminisztrátor vezérelni tudja az adatbázis elhelyezkedését a lemezeken, részleges adatmentést tud végezni úgy, hogy csak bizonyos tablespace-ket ment. Egy tablespace lehet online, vagy offline. A felhasználók számára csak az online tablespace-k érhetők el Így az adatbázis-adminisztrátor egyes tablespace-ket időlegesen elzárhat a

felhasználók elől. Az ORACLE adatbáziskezelő rendszer 121 Az adatbáziskezelés alapjai Az adatszótár egy táblagyűjtemény, amely az adatbázis leírását tartalmazza. Ezek a táblák közvetlenül nem módosíthatók, csak lekérdezhető a tartalmuk. Itt találhatók többek között az adatbázis felhasználóinak leírása (név, jogosultság), az adatbázis objektumainak leírása (táblák, indexek, clusterek stb.) A REDO LOG file-ok információkat gyűjtenek az adatbázis legutóbbi mentése óta történt változásokról egy esetleges sérülés miatt szükséges helyreállításhoz (on-line mentés). Az adatbázishoz szükség van még egy vezérlő-file-ra (CONTROL file), ez az adatbázis fizikai struktúrájáról tartalmaz információkat. Például az adatbázis nevét, az adat- és a redo log file-ok nevét, létrehozásuk idejét. Az adatbázis megnyitásakor a vezérlő file segítségével nyitja meg az adatbáziskezelő rendszer az adatbázishoz

szükséges fizikai file-okat. PELDA A DA TOK Adatbázis TERULET1 Tablespace-k Táblák, indexek, clusterek SY STEM HA LLGA TÓ V IZSGA HA LLGIND . adatok adatok index . Tranzakciók A tranzakció egy felhasználó által végzett műveletek logikai egysége. Az első tranzakció a felhasználó legelső utasításával kezdődik. A tranzakció egy commit, vagy rollback utasításig tart Ezután újabb tranzakció kezdődik. A COMMIT utasítás megerősíti a tranzakció során elvégzett műveleteket, véglegesíti az adatokon történt változtatásokat. Hatására feloldódnak a tranzakció során létrejött lockolások A ROLLBACK utasítás hatására törlődnek a tranzakció során végrehajtott adatváltoztatások és feloldódnak a tranzakció során létrejött lockolások. Ha egy tranzakció során a munka valamilyen oknál fogva megszakad, akkor az utolsó COMMIT utasítás utáni változtatások törlődnek. Az ORACLE adatbáziskezelő rendszer 122 Az

adatbáziskezelés alapjai Amíg egy felhasználó nem erősítette meg a commit utasítás segítségével az adatokon végzett változtatásokat, a többi felhasználó az adatok eredeti állapotát látja. Adatmentés és helyreállítás az ORACLE adatbáziskezelő rendszerben Az ORACLE adatbáziskezelő fejlett mentési és helyreállítási eszközökkel rendelkezik. Az adatbáziskezelő két mentés között a REDO LOG file-okban tárolja az adatbázisban történt változtatásokat. A REDO LOG file-ok ciklikusan kerülnek felhasználásra Amikor az utolsó is megtelik, az első file tartalma törlődik és újra ez lesz az aktuális REDO LOG file. Lehetőség van arra, hogy a megtelt REDO LOG file-ok tartalmát egy archív REDO LOG file-ba helyezzük el, így a ciklus újraindulása esetén sem veszik el információ. A REDO LOG file-okat általában több példányban tárolják különböző lemezeken, hogy az esetleges lemezhibák, vagy adatsérülések után is legyen

legalább egy helyes példány. Ugyanezen megfontolásból a CONTROL file-ból is legalább két példányt használnak, ezek a file-ok egymás tükörképei (pontosan megegyeznek egymással). Meghibásodás esetén az adatbázis legutolsó mentéséből a CONTROL file segítségével az adatbázis helyreállítható. A REDO LOG file-ok tartalmazzák a mentés óta történt változásokat Ezeket az adatbázison átvezetve helyreállítható az adatbázisnak az az állapota, ami a meghibásodás bekövetkezése előtt volt. Az utolsó meg nem erősített tranzakciók módosításai elvesznek Mivel a tranzakciók állandó könyvelése időigényes és lassítja a rendszer működését, a felhasználó döntheti el, hogy igénybe veszi-e az adatbáziskezelő ezen szolgáltatását. Az adatvédelem további területei az ORACLE adatbáziskezelő rendszerben Az adatok integritását alapvetően a táblák leírásánál az oszlopokra megadott követelmények (constraint)

teljesülésének figyelésével biztosítja az adatbáziskezelő rendszer. Követelmények lehetnek: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHEK az oszlopban nem lehet kitöltetlen cella az oszlopban szereplő minden értéknek különbözőnek kell lennie az oszlop elsődleges kulcs az oszlop idegen kulcs az oszlopba kerülő értékre vonatkozó feltétel Az adatbáziskezelés alapjai 123 Az ORACLE adatbáziskezelő rendszer Az adatintegritás biztosítására szolgálnak az adatbázis-triggerek is. Ezek tárolt eljárások, amelyek a megfelelő adattábla minden módosításakor (módosítás, törlés, új sor felvitele) végrehajtódnak. Az illetéktelen felhasználások kizárását rendszer és adat szinten valósítja meg az ORACLE. Rendszer szintű védelem, hogy az adatbázist csak azok a felhasználók használhatják, akik érvényes felhasználói névvel (username) rendelkeznek és ismerik a névhez tartozó jelszót (password). Szabályozható, hogy az egyes

felhasználók mikor férhetnek hozzá az adatbázishoz és milyen rendszerműveleteket (pl. tablespace létrehozása) hajthatnak végre Az adatszintű védelem során meghatározható, hogy az egyes felhasználók mely adatobjektumokhoz férhetnek hozzá, és azokon milyen műveleteket hajthatnak végre. Lehet, hogy egy felhasználónak egy táblával kapcsolatban csak lekérdezési joga van, míg egy másik felhasználó adatokat is vihet fel a táblába, de nem törölhet belőle stb. A rendszerműveletek többségét általában csak az adatbázis-adminisztrátorok számára engedélyezik. Szinkronizáció az ORACLE adatbáziskezelő rendszerben Az ORACLE adatbáziskezelő a konkurens műveletek szinkronizálását - speciális eseteket kivéve automatikusan végzi. Az automatikus zárolás sor szinten történik, vagyis csak azt a sort zárolja az adatbáziskezelő rendszer a többi felhasználó elől, amelyre a művelet vonatkozik. A zárolt sorok továbbra is lekérdezhetők a

többi felhasználó számára, azonban egyéb műveleteket (pl. módosítás, törlés) nem végezhetnek rajtuk. Az ORACLE adatbáziskezelő rendszerben lehetőség van tábla szintű zárolás megvalósítására is. Bizonyos esetekben szükség lehet az automatikus zárolás felülbírálására. Ezért lehetőség van zároló utasítások használatára is. Az adatbáziskezelő figyeli az esetleges patthelyzetet, ennek észlelésekor az ezt okozó tranzakciókat megszünteti és visszaállítja a tranzakciók előtti állapotot. Osztott adatbázisok kezelése az ORACLE adatbáziskezelő rendszerben Az ORACLE adatbáziskezelő rendszer felkészült az osztott adatbázisok kezelésére is. A fizikailag különböző helyeken található adatokat a felhasználók logikailag összekapcsolhatják a különböző lekérdezések során, akár egy nézettáblában is szerepelhetnek fizikailag különböző adatbázisokban levő adatok. Az ORACLE adatbáziskezelő rendszer 124 Az

adatbáziskezelés alapjai Az osztott adatbázisok kezelésének egyik legnagyobb problémája a tranzakciók kezelése - a commit és a roll back megvalósítása. Ugyanis lehetséges, hogy egy tranzakció fizikailag különböző adatbázisokban található adatokra vonatkozik. A commit és a roll back esetén biztosítani kell, hogy az mindegyik adatbázisban megtörténjen. Előfordulhat, hogy a commit sikeresen lezajlik az első adatbázisban, azonban hiba történik a második adatbázisbeli commit esetén. Ekkor az első adatbázisba a tranzakció által végrehajtott módosítások véglegesen belekerültek, míg a másodikba nem. Így az adatok integritása már nem áll fenn Ezért olyan commit és roll back megoldásra van szükség, amely garantálja, hogy az minden adatbázisban megtörténjen. Erre szolgál a két fázisú commit (two-phase commit) eljárás, melyet az ORACLE adatbáziskezelő rendszer is alkalmaz. Az első fázisban a commit művelet nem kerül

ténylegesen végrehajtásra, csak az előkészítése történik meg, melynek során az adatbáziskezelő meggyőződik arról, hogy nincs akadálya a commit végrehajtásának. Ha a tranzakcióban résztvevő minden adatbázisban sikeres volt az előkészítés, akkor a második fázisban megtörténik a tényleges commit végrehajtása. Ha az előkészítés során valamelyik adatbázis hibát jelez, akkor a második fázisban a tranzakcióban résztvevő összes adatbázisban megtörténik a tranzakció visszagörgetése. Így az adatok konzisztensek maradnak Az ORACLE adatbáziskezelő rendszerben az SQL*NET hálózatkezelő software biztosítja az osztott adatbázisok kezelését. Ennek segítségével különböző verziójú ORACLE adatbázisok is összekapcsolhatók, sőt a hálózatban olyan nem ORACLE adatbázisok is lehetnek, amelyek kezelését az ORACLE támogatja. Az ORACLE adatbázis indítása és lezárása Ahhoz, hogy az ORACLE adatbázissal dolgozni lehessen, az

adatbázist el kell indítani (startup). Ennek során a memóriában egy terület lefoglalásra kerül az adatbázisra vonatkozó információk tárolására (system global area - SGA) és megtörténik az adatbázishoz tartozó file-ok megnyitása. Az adatbázis lezárása során először lezárásra kerülnek az adatbázist alkotó file-ok. Ekkor a memóriában található információk visszaírása is megtörténik. Utoljára kerül sor a CONTROL file lezárása. Ezután a lefoglalt memóriaterület felszabadul Az adatbázis indítása és lezárása az adatbázis-adminisztrátor feladata (egyfelhasználós rendszerben a felhasználóé). Az adatbáziskezelés alapjai 16. 125 Az SQL adatbáziskezelő nyelv Az SQL adatbáziskezelő nyelv Az SQL (Structured Query Language) alapvetően lekérdező nyelv, vagyis az adatbázisban tárolt információk visszanyerésére szolgál, de rendelkezik néhány adatbeviteli és módosítási lehetőséggel is. Nem algoritmikus nyelv,

így nem tartalmaz vezérlőszerkezeteket sem (elágazás, ciklus) Az SQL nyelvet sokszor valamilyen más programnyelvbe ágyazva alkalmazzák (embedded SQL). Számos adatbáziskezelő rendszer, így az ORACLE is az SQL nyelvet használja az adatok elérésére és módosítására. Az utasítások formája egyszerű, a parancsok angol mondatok formájában fogalmazhatók meg. Egyaránt használják a felhasználók, fejlesztők és az adatbázis-adminisztrátorok feladataik végrehajtásához. A következőkben az SQL nyelv alapjaival ismerkedünk meg. Jelölések A parancsok ismertetésénél a kulcsszavakat nagybetűvel írjuk. Ezeket betűről betűre pontosan le kell írni. A számítógépen tetszőlegesen írhatjuk őket kis-, vagy nagybetűkkel A csúcsos zárójelek < > közötti szöveg szimbólum. Ide változóneveket, vagy állandókat lehet írni A szögletes zárójelek [ ] közötti paraméterek megadása nem kötelező. A | jel egymást helyettesítő

szimbólumok ,vagy kulcsszavak elválasztására szolgál. A kapcsos zárójel { } azt jelenti, hogy a kifejezés tetszés szerint ismételhető. A csúcsos, szögletes és kapcsos zárójeleket a program szövegébe nem szabad beírni. Minden egyéb jelölt vesszőt, pontot és kerek zárójelet kötelezően le kell írni. Az utasításokban tetszőlegesen elhelyezhetünk szóközöket, egy utasítást több sorban is leírhatunk. Az utasítást pontosvesszővel kell lezárni. Az adatbázisok, táblák, mezők és más objektumok neveinek betűvel kell kezdődnie, betűket, számokat, az aláhúzásjelet és a $, vagy a # jelet tartalmazhatják. Az adatbázis-név legfeljebb 8 karakter hosszú lehet, a többi név pedig legfeljebb 30 karakterből állhat. A táblák, vagy nézettáblák nevét minősíthetjük a tulajdonosa nevével, megkülönböztetve ezzel más felhasználó ugyanilyen nevű táblájától. Ennek jelölése: <tulajdonosnév><táblanév> Az SQL

adatbáziskezelő nyelv 126 Az adatbáziskezelés alapjai A legfontosabb adattípusok CHAR karakteres adatok tárolására szolgál, az adatok maximális hossza 255 karakter. LONG változó hosszúságú szövegek tárolására szolgál, a szöveg mérete 2 Gbyte-ig terjedhet. NUMBER numerikus adatok tárolására szolgál, a számokat maximum 38 jegy pontosságig tudja ábrázolni. Az adatok lehetnek fixpontosak, vagy lebegőpontosak A legkisebb ábrázolható szám a 10-129, a legnagyobb pedig 9.99*10124. Más adatbáziskezelő rendszerekkel való kompatibilitás miatt az SQL nyelv megenged más numerikus adattípusok deklarálását is (pl. INTEGER, FLOAT, DECIMAL, REAL) de ezek belső ábrázolása megfelel a NUMBER adattípusnak. A numerikus adatok méretének definiálásánál az összes jegyek számát és a tizedesjegyek számát kell megadni vesszővel elválasztva. DATE dátum- és időadatok tárolására szolgál. Egy dátum típusú adat a következőket

tartalmazza: évszázad, év, hónap, nap, óra, perc, másodperc A dátumrész szokásos formája NN-HHH-ÉÉ, például 12-NOV-93. A rendszerdátumot és -időt a SYSDATE függvény segítségével kaphatjuk meg. Egy dátum típusú adatnak leggyakrabban a dátum részét szoktuk használni, az évszázad nélkül. A további dátum és időinformációkat a dátum típusú adatból függvények segítségével tudjuk megjeleníteni. Konstansok Az SQL nyelvben karakteres, numerikus, logikai és dátum típusú konstansok használhatók. A karakteres és a dátum típusú konstansokat aposztrófok közé kell tenni. Példák: BUDAPEST 123.495 12E2 (=1200) Az adatbáziskezelés alapjai 127 Az SQL adatbáziskezelő nyelv 9.85E-3 (=000985) 356e23 09-MAR-92 A NULL érték Egy sorban egy adott oszlop értéke NULL, ha az adott oszlop értéke ismeretlen, vagy lényegtelen. A NULL érték nem azonos a nullával. A NULL értékkel műveletek is végezhetők, például 10*NULL=NULL.

Változók Az SQL nyelvben a változók a konstans értékek tárolására szolgálnak. Adatkonverzió A kifejezések különböző adattípusokat tartalmazhatnak. Kiértékelésükhöz esetenként adatkonverzióra lehet szükség. Az ORACLE adatbáziskezelő a következő esetekben automatikusan elvégzi a konverziót: - konstans konvertálása egy oszlop adattípusára - egy oszlop értékének konvertálása egy konstans adattípusára - egy oszlop értékének konvertálása egy másik oszlop adattípusára Egyéb esetekben konverziós függvények segítségével lehet az adatkonverziót elvégezni. Műveletek Matematikai műveletek + * / összeadás kivonás szorzás osztás Az SQL adatbáziskezelő nyelv 128 Az adatbáziskezelés alapjai Karakteres műveletek || láncolás Példa: A FEHÉR || VÁR eredménye FEHÉRVÁR . Relációs műveletek = !=,^=,<> >= <= [NOT] IN [NOT] BETWEEN x AND y IS [NOT] NULL [NOT] LIKE egyenlő nem egyenlő nagyobb, vagy

egyenlő kisebb, vagy egyenlő tartalmazás (listában) igaz, ha a vizsgált érték nagyobb, vagy egyenlő x-nél és kisebb, vagy egyenlő y-nál. igaz, ha a vizsgált érték NULL karaktersorozat mintával történő összehasonlítása Ha a NOT kulcsszót is megadjuk, akkor a művelet eredménye az eredeti művelet eredményének ellentéte lesz. A LIKE operátor segítségével egy szöveget lehet összehasonlítani egy mintával. Ha pontos egyezést akarunk vizsgálni, akkor az = operátort kell alkalmazni. A LIKE operátornál a mintában helyettesítő karaktereket alkalmazhatunk. A % karakter tetszőleges számú karaktert helyettesíthet, az (aláhúzás) karakter pedig pontosan egyet. A vizsgálandó szöveget a LIKE előtt, a mintát a LIKE kulcsszó után kell megadni. A karakterek összehasonlításánál a kis- és a nagybetű különböző karakternek számít! 129 Az adatbáziskezelés alapjai Az SQL adatbáziskezelő nyelv Példák: A val IN(10,20,40)

kifejezés értéke igaz, ha a val változó értéke megegyezik a zárójelben felsorolt értékek valamelyikével. A val BETWEEN 100 AND 200 van, vagy egyenlő valamelyikkel. A szoveg LIKE B% kezdődik. értéke igaz, ha a val változó értéke a 100-200 értékek között értéke igaz, ha a szoveg változóban található karaktersorozat B betűvel A szoveg LIKE LO értéke igaz, ha a szoveg változóban található karaktersorozat 3 betűből áll, és a 2., 3 karaktere LO Logikai műveletek NOT OR AND negálás logikai vagy logikai és A logikai műveletek ismertetése a CLIPPER nyelv leírásánál található. Kifejezések Egy kifejezés lehet - oszlopnév, konstans, vagy speciális érték (pl. SYSDATE, NULL) - függvényhívás - kifejezések műveleti jelekkel és zárójelekkel összekapcsolva Az SQL adatbáziskezelő nyelv 16.1 130 Az adatbáziskezelés alapjai SQL utasítások Az SQL utasítások típusai Adatdefiníciós utasítások (Data Definition

Language - DDL) Ezek szolgálnak az adatbázis objektumainak (táblák, indexek, nézettáblák, stb.) definiálására, létrehozására, megszüntetésére. Adatmanipulációs utasítások (Data Manipulation Language - DML) Ezekkel az utasításokkal tudjuk a táblák tartalmát megváltoztatni (új sor felvitele, sorok törlése, mezők módosítása). Egyes csoportosítások ide sorolják a lekérdező utasítást is Lekérdező utasítások (Data Query Language - DQL) Más csoportosítások megkülönböztetik a lekérdező utasítást az adatmanipulációs utasításoktól és külön csoportba sorolják. Tranzakció vezérlő utasítások (Transaction Control Language - TCL) A műveletek logikai csoportokba, tranzakciókba történő csoportosítását teszik lehetővé. Két legfontosabb utasítása a COMMIT és a ROLLBACK. Adatvezérlő utasítások (Data Control Language - DCL) Az adatok tárolását vezérlő utasítások, ezek közé tartozik az adatbázisok

létrehozására szolgáló parancs is. Táblák létrehozása, karbantartása, törlése Egy táblát a következő utasítással hozhatunk létre: CREATE TABLE táblanév (<oszlopnév> <adatleírás> [,<oszlopnév> <adatleírás>].) táblanév oszlopnév adatleírás a létrehozandó tábla neve egy oszlop neve az oszlopban tárolandó adatok típusának és méretének megadása 131 Az adatbáziskezelés alapjai Az SQL adatbáziskezelő nyelv Az adatok méretét a típus után zárójelben lehet megadni. Karakteres oszlopoknál a karakterek számát adhatjuk meg, numerikus oszlopoknál pedig az összes jegyek, valamint a tizedesjegyek számát, vesszővel elválasztva. Az oszlopok megadásánál a következő opciókat alkalmazhatjuk még: NOT NULL UNIQUE DEFAULT <kifejezés> PRIMARY KEY az adott oszlopban nem lehet üres mező az adott oszlopban minden sorban különböző értéknek kell szerepelnie alapértelmezés szerint ebbe az oszlopba

a megadott kifejezés értéke kerül, ha nem adunk meg mást az adatfeltöltéskor az oszlop a táblában elsődleges kulcs Az elsődleges kulcs egyedi kulcs, ezért a UNIQUE opciót nem szabad a PRIMARY KEY opcióval együtt megadni. Példák: CREATE TABLE hallgato (hkod NUMBER(5) PRIMARY KEY, nev CHAR(20), szak CHAR(10), evf NUMBER(1) NOT NULL, csop NUMBER(1), eredm NUMBER(3,2), szuld DATE) CREATE TABLE anyag (akod NUMBER(4) UNIQUE, anev CHAR(20), meny e CHAR(3) DEFAULT KG ) Ha egy táblát meg akarunk szüntetni, ezt a következő utasítással tehetjük meg: DROP TABLE <táblanév> Az SQL adatbáziskezelő nyelv 132 Az adatbáziskezelés alapjai Egy táblába egy sort felvinni a következő utasítással lehet: INSERT INTO <táblanév> [(<oszlopnév>[,<oszlopnév>.)] {VALUES (<érték>[,<érték>].)} táblanév oszlopnév érték egy létező tábla neve a tábla egy oszlopának neve az adott oszlopnak megfelelő típusú érték Ha

nem adunk meg oszlopneveket, akkor az új sorban a tábla minden oszlopának adunk értéket. Ha megadjuk az oszlopneveket, akkor csak azok az oszlopok kapnak értéket, amelyek a felsorolásban szerepelnek. A többi oszlop értéke - ha nem adtunk meg default értéket - NULL lesz Ezek az oszlopok nem lehetnek NOT NULL opcióval definiálva. Példák: INSERT INTO hallgato (hkod,nev,szak,evf) VALUES (10001,KEREK ERVIN,KONYVTAR,2) INSERT INTO anyag VALUES(2233,AGYAG,T) Adatmódosításokat egy táblában a következő utasítással lehet végrehajtani: UPDATE <táblanév> SET <oszlopnév> = <kif> [,<oszlopnév> = <kif>.] [WHERE <feltétel>] táblanév oszlopnév kif feltétel egy létező tábla neve a tábla egy oszlopának neve az adott oszlopnak megfelelő típusú értéket eredményező kifejezés logikai kifejezés, értéke igaz, vagy hamis Az adatok módosítása abban a sorban, vagy sorokban történik meg, melyekre a feltétel igaz. A

megadott oszlopokba az adott értékek kerülnek beírásra. Példák: UPDATE hallgato SET eredm=3.85 WHERE nev=KIS KATALIN Az adatbáziskezelés alapjai 133 Az SQL adatbáziskezelő nyelv UPDATE hallgato SET eredm=0 WHERE evf=2 Egy táblából a következő utasítás segítségével törölhetünk sorokat: DELETE [FROM] <táblanév> [WHERE <feltétel>] táblanév feltétel egy létező tábla neve logikai kifejezés, értéke igaz, vagy hamis A táblából azon sor, vagy sorok törlődnek, melyekre a megadott feltétel igaz. Ha nem adunk meg feltételt, akkor minden sor törlődik. Példák: DELETE FROM hallgato WHERE hkod=11234 DELETE FROM anyag Egy táblához hozzáadhatunk új oszlopokat, vagy módosíthatjuk a meglevő oszlopok definícióját a következő utasítással: ALTER TABLE <táblanév> [ADD (<oszlopnév> <adatleírás> [,<oszlopnév> <adatleírás>].)] [MODIFY (<oszlopnév> <adatleírás>

[,<oszlopnév> <adatleírás>].)] táblanév oszlopnév adatleírás egy létező tábla neve egy oszlop neve az oszlopban tárolandó adatok típusának és méretének megadása Az ADD opcióval új oszlopot tudunk hozzávenni a táblázathoz. A MODIFY opcióval egy meglevő oszlop típusát, méretét és a NOT NULL opciót tudjuk megváltoztatni. Példa: Az SQL adatbáziskezelő nyelv 134 Az adatbáziskezelés alapjai ALTER TABLE hallgato ADD (szhely CHAR(20)) MODIFY (nev char(30)) COMMIT és ROLLBACK Az ORACLE egy tranzakciónak tekinti az SQL utasítások egy sorozatát. A tranzakció egy COMMIT, vagy ROLLBACK utasítás utáni első SQL utasítással - illetve a legelső SQL utasítással kezdődik és a következő COMMIT, vagy ROLLBACK utasításig - illetve a munka befejezéséig tart. A COMMIT utasítás megerősíti a tranzakció során elvégzett műveleteket, véglegesíti az adatokon történt változtatásokat. Hatására feloldódnak a tranzakció

során létrejött lockolások A ROLLBACK utasítás hatására törlődnek a tranzakció során végrehajtott adatváltoztatások és feloldódnak a tranzakció során létrejött lockolások. Ha egy tranzakció során a munka valamilyen oknál fogva megszakad, akkor az utolsó COMMIT utasítás utáni változtatások törlődnek. Lekérdezések Az SQL nyelv legfontosabb utasítása a SELECT utasítás, melynek segítségével egy vagy több adattáblából nyerhetünk információkat. A lekérdezés eredménye egy táblázat, amely megjeleníthető a képernyőn, vagy kinyomtatható, de lehetőség van a további feldolgozására is. Az utasítás formája: SELECT [ ALL | DISTINCT ] { * | <táblanév>.* | <kif>} [, {<táblanév>.* | <kif>}]. FROM <táblanév> [, <táblanév>]. [ WHERE <feltétel> ] [ GROUP BY <kif> [, <kif>]. [HAVING <feltétel>] ] [ {UNION | INTERSECT | MINUS} SELECT . ] [ ORDER BY {<kif>} [ASC |

DESC] [, {<kif>} [ASC | DESC]] ]. táblanév kif feltétel egy létező tábla neve lehet oszlopnév, vagy konstans, vagy ezekből különböző műveletekkel, függvényekkel alkotott kifejezés logikai kifejezés, értéke igaz, vagy hamis Az adatbáziskezelés alapjai 135 Az SQL adatbáziskezelő nyelv A SELECT utasítással a FROM opcióban felsorolt táblák direkt szorzatából a FROM előtt felsorolt oszlopokat választjuk ki. Az erdménytábla sorait pedig a WHERE feltétellel definiálhatjuk Ha nem adunk meg feltételt, akkor minden sort kiválasztunk a direkt szorzatból. A különböző opciók jelentése: ALL a lekérdezés eredményében a feltételnek megfelelő minden sor szerepel ez az alapértelmezés DISTINCT a lekérdezés eredményében az azonos sorok csak egyszer szerepelnek * a FROM opcióban megadott minden tábla minden oszlopa szerepeljen az eredménytáblában <táblanév>.* az adott tábla minden oszlopa szerepeljen az

eredménytáblában A SELECT utasításban rendelkezhetünk a kiválasztott sorok csoportosításáról, rendezéséről is, erre szolgál a GROUP BY és az ORDER BY opció. A GROUP BY opcióban megadhatunk egy, vagy több oszlopot, amelyben azonos értéket tartalmazó sorokat csoportosítani szeretnénk, általában valamilyen összesítés céljára. Az ORDER BY opcióban azokat az oszlopokat definiálhatjuk, melyek szerint az eredménytábla rendezett lesz. Az ASC opció növekvő sorrendet jelent - ez az alapértelmezés - a DESC pedig csökkenőt. A SELECT utasítás segítségével különböző relációalgebrai műveleteket valósíthatunk meg. Az oszlopok megadásával projekciót végzünk, a WHERE opcióban megadott feltétellel pedig szelekciót. Ha az utasítás több táblára vonatkozik, akkor ezen táblák direkt szorzatát készítjük el, amely részhalmazait a WHERE opcióban megadott feltételekkel választhatjuk ki (összekapcsolás, vagy join). A SELECT

utasításban definiálhatunk allekérdezést is, és képezhetjük lekérdezések egyesítését (UNION) , metszetét (INTERSECT) , vagy különbségét (MINUS). Az SQL adatbáziskezelő nyelv 136 Az adatbáziskezelés alapjai A létezik (EXISTS) és minden (ALL) operátorok segítségével pedig a relációanalízist alkalmazhatjuk. Példák SELECT utasításra Példáinkban a következő táblákat fogjuk felhasználni: Az SQL adatbáziskezelő nyelv 137 Az adatbáziskezelés alapjai VIZSGA H K OD TA N TÁ RGY K ÓD (TK OD ) JEGY 10001 101 4 10004 103 3 10001 105 5 10054 102 2 10103 104 4 10004 104 1 10276 101 3 10012 103 4 10342 101 2 10103 102 5 10276 105 4 10342 102 3 GYAKJEGY H K OD TA N TÁ RGY K ÓD (TK OD ) JEGY 10001 101 5 10004 103 4 10001 105 3 10054 102 2 10103 104 5 10004 104 2 10276 101 1 10012 103 4 10342 101 3 10103 102 5 10276 105 4 10342 102 4 Az SQL adatbáziskezelő

nyelv 138 Az adatbáziskezelés alapjai Példák: SELECT * FROM hallgato Ezzel az utasítással minden sort és oszlopot kiválasztunk a hallgato táblából. Oszlopok kiválasztása SELECT nev,eredm FROM hallgato Ezzel az utasítással a hallgato táblából a nev és a jegy oszlopokat választjuk ki. Eredménye a következő tábla: NEV EREDM -----------------------------------------KOVÁCS JÓZSEF 4.33 KEREK ANNA 3.96 SOMOGYI ERVIN 4.88 ANGYAL RÓZSA 2.56 SÓS ENDRE 3.76 SZABÓ TAMÁS 2.12 KISS TÜNDE 4.87 Sorok kiválasztása, rendezés SELECT DISTINCT szak,evf,csop FROM hallgato A fenti utasítás eredménytáblájának három oszlopa lesz, a szak, az evf, és a csop, és az ezen oszlopokban azonos értékeket tartalmazó sorok közül csak egy kerül át az eredménytáblába: SZAK EVF CSOP ---------------------------------------------GÉPÉSZ 5 4 KÖNYVTÁR 1 2 KÖNYVTÁR 1 3 KÖNYVTÁR 2 2 MEZŐGAZDÁSZ 3 1 Az adatbáziskezelés alapjai 139 Az SQL adatbáziskezelő

nyelv SELECT * FROM hallgato WHERE szak=KÖNYVTÁR Ezzel az utasítással a hallgato táblából kiválasztunk minden oszlopot, de csak azok a hallgatók fognak szerepelni az eredménytáblában, akik a KÖNYVTÁR szakra járnak. SELECT * FROM hallgato WHERE szak=KÖNYVTÁR ORDER BY evf,csop Az eredménytábla tartalma megegyezik az előzővel, csak a hallgatók évfolyam, azon belül pedig csoport szerinti rendezettségben szerepelnek benne: HKOD NEV SZAK EVF CSOP EREDM -------------------------------------------------------------------------------- 10012 SZABÓ KÖNYVTÁR 1 2 2.12 10001 KOVÁCS JÓZSEF KÖNYVTÁR 1 3 4.33 10342 KISS TÜNDE KÖNYVTÁR 1 3 4.87 10054 SOMOGYI ERVIN KÖNYVTÁR 2 2 4.88 -----------TAMÁS SELECT * FROM hallgato WHERE szak=KÖNYVTÁR ORDER BY evf,eredm DESC Az eredménytábla ugyanazokat a sorokat tartalmazza, mint az előző, de a rendezettsége évfolyam szerint növekvő, eredmény szerint pedig csökkenő. Vagyis az azonos évfolyamra járó

hallgatók eredmény szerint csökkenő sorrendben követik egymást: HKOD NEV SZAK EVF CSOP EREDM -------------------------------------------------------------------------------------------10342 KISS TÜNDE KÖNYVTÁR 1 3 4.87 10001 KOVÁCS JÓZSEF KÖNYVTÁR 1 3 4.33 10012 SZABÓ TAMÁS KÖNYVTÁR 1 2 2.12 10054 SOMOGYI ERVIN KÖNYVTÁR 2 2 4.88 SELECT nev,eredm FROM hallgato WHERE eredm>3.5 Ezen utasítás hatására létrejövő eredménytábla csak azokat a sorokat fogja tartalmazni a hallgato táblából, ahol az ered oszlopban található érték 3.5-nél nagyobb: Az SQL adatbáziskezelő nyelv 140 Az adatbáziskezelés alapjai NEV EREDM -------------------------------------KOVÁCS JÓZSEF 4.33 KEREK ANNA 3.96 SOMOGYI ERVIN 4.88 SÓS ENDRE 3.76 KISS TÜNDE 4.87 SELECT nev FROM hallgato WHERE szak IN(KÖNYVTÁR,GÉPÉSZ) Az eredménytábla azon hallgatók nevét fogja tartalmazni, akik a KÖNYVTÁR, vagy a GÉPÉSZ szakra járnak: NEV -----------------------KOVÁCS

JÓZSEF SOMOGYI ERVIN SÓS ENDRE SZABÓ TAMÁS KISS TÜNDE SELECT nev,eredm FROM hallgato WHERE eredm BETWEEN 3 AND 4.5 Az eredménytábla azon hallgatók nevét és eredményét fogja tartalmazni, akik eredménye 3.00 és 4.50 közé esik, illetve egyenlő valamelyikkel: NEV EREDM ----------------------------------------KOVÁCS JÓZSEF 4.33 KEREK ANNA 3.96 SÓS ENDRE 3.76 Összetett feltételt is megadhatunk logikai műveletek segítségével: SELECT nev,eredm FROM hallgato WHERE eredm>3.5 AND szak=KÖNYVTÁR Az adatbáziskezelés alapjai 141 Az SQL adatbáziskezelő nyelv Az eredménytábla a következő lesz: NEV EREDM -------------------------------------KOVÁCS JÓZSEF 4.33 SOMOGYI ERVIN 4.88 KISS TÜNDE 4.87 SELECT nev,eredm FROM hallgato WHERE eredm>4 OR eredm<3 Az eredménytábla ez lesz: NEV EREDM ---------------------------------------KOVÁCS JÓZSEF 4.33 SOMOGYI ERVIN 4.88 ANGYAL RÓZSA 2.56 SZABÓ TAMÁS 2.12 KISS TÜNDE 4.87 Ezt a kiválasztást a

következőképpen is felírhatjuk: SELECT nev,eredm FROM hallgato WHERE eredm NOT (BETWEEN 3 AND 4) Táblázatok összekapcsolása SELECT tnev,vizsga.* FROM tantargy,vizsga WHERE tantargy.tkod=vizsgatkod ORDER BY jegy DESC Ezzel az utasítással elkészítjük a tantárgy és a vizsga tábla direkt szorzatát, majd ebből azokat a sorokat választjuk ki a WHERE opcióban megadott feltétel segítségével, amelyekben a két tantárgykód értéke megegyezik. Vagyis a tantárgy és a vizsga tábla természetes összekapcsolását készítjük el. A vizsga tábla egy sorához a tantárgy táblának az a sora fog kapcsolódni, amelyik az adott sorban szereplő tantárgyra vonatkozik. Az eredménytábla sorainak száma megegyezik a vizsga Az SQL adatbáziskezelő nyelv 142 Az adatbáziskezelés alapjai tábla sorainak számával. Az oszlopok közül a tantárgynév oszlopot és a vizsga táblában szereplő minden oszlopot kiválasztunk. Az eredménytábla a jegyek szerinti

csökkenő rendezettségű lesz: TNEV HKOD TKOD JEGY -------------------------------------------------------------------------------------------INFORMATIKA 10103 102 5 SZOCIOLÓGIA 10001 105 5 KÖNYVTÁRI ISMERETEK 10001 101 4 SZOCIOLÓGIA 10276 105 4 ETIKA 10012 103 4 STATISZTIKA 10103 104 4 KÖNYVTÁRI ISMERETEK 10276 101 3 INFORMATIKA 10342 102 3 ETIKA 10004 103 3 KÖNYVTÁRI ISMERETEK 10342 101 2 INFORMATIKA 10054 102 2 STATISZTIKA 10004 104 1 SELECT nev,tnev,jegy FROM hallgato,tantargy,gyakjegy WHERE hallgato.hkod=gyakjegyhkod AND gyakjegy.tkod=tantargytkod Ezzel az utasítással három tábla direkt szorzatát készítjük el. Ebből azokat a sorokat választjuk ki, amelyekben a hallgatóhoz tartozó gyakorlati jegy és az adott tantárgyhoz tartozó leírás szerepel (természetes összekapcsolás). A létrejövő tábla minden sora egy hallgató nevét, egy tantárgy nevét és a hallgató abból elért eredményét tartalmazza. Egy hallgató annyi sorban szerepel, ahány

tárgyból gyakorlati jegyet szerzett: NEV TNEV JEGY ----------------------------------------------------------------------------------KOVÁCS JÓZSEF KÖNYVTÁRI ISMERETEK 5 KOVÁCS JÓZSEF SZOCIOLÓGIA 3 SÓS ENDRE ETIKA 4 SÓS ENDRE STATISZTIKA 2 SZABÓ TAMÁS ETIKA 4 SOMOGYI ERVIN INFORMATIKA 2 KEREK ANNA INFORMATIKA 5 KEREK ANNA STATISZTIKA 5 ANGYAL RÓZSA ANGYAL RÓZSA KISS TÜNDE KISS TÜNDE Az SQL adatbáziskezelő nyelv 143 Az adatbáziskezelés alapjai KÖNYVTÁRI ISMERETEK SZOCIOLÓGIA KÖNYVTÁRI ISMERETEK INFORMATIKA 1 4 3 4 SELECT DISTINCT nev FROM hallgato,vizsga WHERE hallgato.hkod=vizsgahkod AND jegy=1 Ezzel az utasítással azoknak a hallgatóknak a nevét kapjuk meg, akiknek van elégtelen vizsgajegye. Ha egy hallgatónak több elégtelen vizsgajegye van, akkor is csak egyszer fog a neve szerepelni az eredménytáblában a DISTINCT opció miatt. Esetünkben csak egyetlen hallgatónak van elégtelen vizsgajegye, így az eredménytáblában csak egy név fog

szerepelni: SÓS ENDRE. SELECT DISTINCT tnev FROM tantargy,vizsga WHERE tantargy.tkod=vizsgatkod AND jegy<3 Ezzel az utasítással azon tantárgyneveket választottuk ki, amelyekből volt hármasnál rosszabb vizsgajegy. Az eredménytábla: TNEV --------------------------------------INFORMATIKA KÖNYVTÁRI ISMERETEK STATISZTIKA Egy táblát önmagával is össze lehet kapcsolni: SELECT x.nev FROM hallgato x,hallgato y WHERE x.eredm>yeredm AND ynev=KEREK ANNA Ezzel az utasítással azokat a hallgatókat választjuk ki a hallgato táblából, akiknek eredménye jobb, mint a KEREK ANNA nevű hallgatóé. Hogy meg tudjuk különböztetni a tábla kétféle felhasználását egymástól, helyettesítő neveket kellett bevezetnünk. Az x a hallgato tábla egyik neve, y pedig a másik. Az oszlopnevek megadásakor ezeket a helyettesítő neveket kell használni Két, vagy több eredménytábla egyesítése, metszete, különbsége Az SQL adatbáziskezelő nyelv 144 Az

adatbáziskezelés alapjai Két SELECT utasítás eredményének akkor lehet az egyesítését, metszetét, vagy különbségét képezni, ha az eredménytáblák azonos oszlopszámúak és a megfelelő oszlopok kompatibilis típusúak. Az oszlopneveknek nem kell azonosnak lenniük Az eredménytáblába csak a különböző sorok kerülnek be. SELECT hkod FROM vizsga WHERE jegy=1 UNION SELECT hkod FROM gyakjegy WHERE jegy=1 Ezzel az utasítással azokat a hallgatókat választottuk ki, akiknek valamely tárgyból van elégtelen vizsga- , vagy gyakorlati jegye. Az eredménytábla: HKOD ----------10004 10276 SELECT hkod FROM vizsga WHERE jegy=5 INTERSECT SELECT hkod FROM gyakjegy WHERE jegy=5 Ezzel az utasítással azoknak a hallgatóknak a kódját kapjuk eredményül, akiknek volt jeles vizsgajegyük és gyakorlati jegyük is. Az eredménytábla: HKOD ----------10001 10103 SELECT hkod FROM vizsga WHERE jegy=5 MINUS SELECT hkod FROM gyakjegy WHERE jegy!=5 Ezzel az utasítással azon

hallgatók kódját választottuk ki, akiknek csak jeles gyakorlati jegyük van és volt jeles vizsgajegyük is. 145 Az adatbáziskezelés alapjai Az SQL adatbáziskezelő nyelv Az eredménytábla: HKOD ----------10103 Ha azokat a hallgatókat szeretnénk kiválasztani, akiknek csak jeles vizsga- és gyakorlati jegyük van, ezt a következő utasítással érhetjük el: SELECT hkod FROM vizsga WHERE jegy=5 MINUS SELECT hkod FROM vizsga WHERE jegy!=5 MINUS SELECT hkod FROM gyakjegy WHERE jegy!=5 Láthatjuk, hogy azonos táblára vonatkozó SELECT-ek eredményét is összekapcsolhatjuk egymással. Esetünkben a fenti utasítás eredménye üres tábla lesz, mert nincs ilyen hallgató a táblákban. Csoportképzés, oszlopfüggvények Gyakran szükségünk van arra, hogy a kiválasztott adatokról valamilyen összesített információt kapjunk, esetleg valamilyen csoportosítás szerint. Az oszlopfüggvények arra szolgálnak, hogy egyegy oszlop adatain végezzenek műveletet A

leggyakrabban használt oszlopfüggvények a következők: SUM(<oszlopnév>) összegzi az oszlopban szereplő értékeket MIN(<oszlopnév>) az oszlopban szereplő legkisebb értéket adja eredményül MAX(<oszlopnév>) az oszlopban szereplő legnagyobb értéket adja eredményül AVG(<oszlopnév>) az oszlopban szereplő értékek átlagát számítja ki COUNT(*) megadja a kiválasztott sorok számát Az SQL adatbáziskezelő nyelv COUNT(<oszlopnév>) 146 Az adatbáziskezelés alapjai megadja azon kiválasztott sorok számát, ahol az adott oszlop értéke nem NULL Az oszlopfüggvények - a COUNT(*) kivételével - azokat a sorokat figyelmen kívül hagyják, ahol az adott oszlopban NULL érték található. Az oszlopfüggvények paraméterezésénél - a COUNT(*) kivételével - megadható a DISTINCT opció, melynek hatására a kiválasztott értékek közül csak a különbözőeket veszi figyelembe a függvény. Példák: SELECT

COUNT(*) FROM hallgato A fenti utasítás segítségével azt kapjuk meg, hogy hány hallgató van a hallgato táblában. SELECT COUNT(*) FROM hallgato WHERE szak=KÖNYVTÁR Ezen utasítás eredménye az, hogy hány KÖNYVTÁR szakos hallgató van a hallgato táblában. SELECT COUNT(DISTINCT evf) FROM hallgato Ezen utasítás eredményeként azt kapjuk meg, hogy hány féle évfolyamra járnak a hallgatók. SELECT AVG(eredm) FROM hallgato WHERE evf=1 Ezen utasítás eredményeként megkapjuk az elsős hallgatók átlagos tanulmányi eredményét. SELECT MAX(eredm) FROM hallgato Ezzel az utasítással a legjobb tanulmányi eredmény értékét kapjuk meg. A sorokat a GROUP BY opció segítségével csoportosíthatjuk. Az opcióban megadott oszlopban azonos értékkel rendelkező sorok egy csoportot alkotnak. Az opcióban több oszlopot is megadhatunk. Ekkor bármelyik oszlop megváltozása új csoportot képez Példák: SELECT szak,MAX(eredm) FROM hallgato GROUP BY szak Az

adatbáziskezelés alapjai 147 Az SQL adatbáziskezelő nyelv Az SQL adatbáziskezelő nyelv 148 Az adatbáziskezelés alapjai Az eredménytábla a következő lesz: SZAK MAX(EREDM) -----------------------------------------------GÉPÉSZ 3.76 KÖNYVTÁR 4.88 MEZŐGAZDÁSZ 3.96 SELECT szak,evf,MAX(eredm) FROM hallgato GROUP BY szak,evf Az eredménytábla a következő lesz: SZAK EVF MAX(EREDM) --------------------------------------------------------------GÉPÉSZ 5 3.76 KÖNYVTÁR 1 4.87 KÖNYVTÁR 2 4.88 MEZŐGAZDÁSZ 3 3.96 Ha a csoportképzést valamilyen feltételhez akarjuk kötni, ezt a HAVING opcióban adhatjuk meg. Példa: SELECT evf,MIN(eredm) FROM hallgato GROUP BY evf HAVING evf<3 Hatására az első két évfolyam legrosszabb tanulmányi eredményét kapjuk meg: EVF MIN(EREDM) ------------------------------1 2.12 2 4.88 Belső SELECT-ek (subqueries) Egy SELECT utasítás WHERE feltételében állhat egy újabb SELECT utasítás (allekérdezés). Erre

általában akkor van szükség, ha a sorok kiválasztása valamely más táblázatban található Az adatbáziskezelés alapjai 149 Az SQL adatbáziskezelő nyelv információn alapul. A belső SELECT hivatkozhat ugyanarra a táblázatra is, mint a külső Ez akkor fordul elő, ha nem tudjuk egyetlen kifejezésben megfogalmazni a leválogatási feltételt. A belső SELECT-ben szerepelhet oszlopfüggvény is. A belső SELECT-ek használata több szintű is lehet, vagyis egy belső SELECT-nek is lehet belső SELECT-je. A lekérdezések végrehajtása belűről kezdődik és kifelé halad A legbelső SELECT hajtódik végre legelőször, majd sorban a fölötte levő szintek. Példák: SELECT nev FROM hallgato WHERE evf=(SELECT evf FROM hallgato WHERE nev=KOVÁCS JÓZSEF) Ezzel az utasítással azoknak a hallgatóknak a nevét kapjuk meg, akik Kovács Józseffel egy évfolyamra járnak. A belső SELECT-ben meghatározzuk , hogy melyik évfolyamra jár Kovács József, a külső

SELECT segítségével pedig azoknak a hallgatóknak a nevét választjuk ki, akiknél az évfolyam értéke megegyezik a belső SELECT eredményével. SELECT nev,eredm FROM hallgato WHERE eredm=(SELECT MAX(eredm) FROM hallgato) Ezzel az utasítással megkapjuk a hallgato táblázatból a legjobb eredményt elért hallgató nevét és eredményét. A belső SELECT kiválasztja az eredményoszlopból a legnagyobb értéket, a külső SELECT segítségével meghatározzuk azokat a hallgatókat, akiknek az eredménye megegyezik ezzel az értékkel. Az egyenlőségként megfogalmazott belső SELECT-nek mindig egyetlen értéket kell eredményeznie. Az előző belső SELECT csak egyetlen értéket ad eredményül, hiszen a legjobb eredmény értéke egyetlen érték akkor is, ha több hallgató is elérte azt. A külső SELECT eredményezhet több sort is: SELECT tkod FROM gyakjegy WHERE jegy=(SELECT max(jegy) FROM gyakjegy) A belső SELECT eredménye egyetlen érték (5), a külső SELECT

azonban azoknak a tantárgyaknak a kódját fogja kiválasztani a gyakjegy táblából, amelyekből volt 5-ös gyakorlati jegy. Így a következő eredményt kapjuk: Az SQL adatbáziskezelő nyelv 150 Az adatbáziskezelés alapjai TKOD ----------101 104 102 Ha a belső SELECT több értéket eredményez, akkor a külső SELECT-ben az IN operátort alkalmazhatjuk: SELECT nev FROM hallgato WHERE hkod IN (SELECT hkod FROM vizsga WHERE jegy=1) Ezzel az utasítással azoknak a hallgatóknak a nevét kapjuk eredményül, akiknek elégtelen vizsgajegye van. A belső select a vizsga táblából leválogatja azokat a hallgatókódokat, amelyekhez elégtelen vizsgajegy tartozik. A külső SELECT segítségével a hallgató táblából leválogatjuk a hallgatókódokhoz tartozó neveket. Láthattuk az előzőekben, hogy ezt az információt a hallgato és a vizsga táblák összekapcsolásával is megkaphatjuk. A SELECT utasításban alkalmazható további operátorok ALL (lista)

relációs operátorral együtt alkalmazható. Akkor ad igaz értéket eredményül, ha a reláció a lista minden elemére teljesül. A lista helyett belső SELECT is állhat. Példa: SELECT nev FROM hallgato WHERE eredm > All (SELECT eredm FROM hallgato WHERE evf=1) Ezzel az utasítással azoknak a hallgatóknak a nevét kapjuk eredményül, akiknek minden első éves hallgatónál jobb a tanulmányi eredményük. Esetünkben egy ilyen hallgató van: SOMOGYI ERVIN Ezt a lekérdezést az ALL kulcsszó helyett a MAX függvény segítségével is felírhattuk volna: SELECT nev FROM hallgato WHERE evf>1 AND eredm > (SELECT MAX(eredm) FROM hallgato WHERE evf=1) ANY (lista) relációs operátorral együtt alkalmazható. Az adatbáziskezelés alapjai 151 Az SQL adatbáziskezelő nyelv Akkor ad igaz értéket eredményül, ha a reláció a lista valamelyik elemére teljesül. A lista helyett belső SELECT is állhat. Példa: SELECT nev FROM hallgato WHERE evf>1 AND eredm

> ANY (SELECT eredm FROM hallgato WHERE evf=1) Ezzel az utasítással azoknak a nem elsős hallgatóknak a nevét kapjuk meg, akik eredménye jobb valamely első éves hallgató eredményénél: NEV -------------------------KEREK ANNA SOMOGYI ERVIN ANGYAL RÓZSA SÓS ENDRE Ezt a lekérdezést az ANY kulcsszó helyett a MIN függvény segítségével is felírhattuk volna: SELECT nev FROM hallgato WHERE evf>1 AND eredm > (SELECT MIN(eredm) FROM hallgato WHERE evf=1) EXISTS belső SELECT-tel együtt alkalmazható. Akkor ad igaz eredményt, ha a belső SELECT legalább egy sort eredményezett. Példa: SELECT nev FROM hallgato WHERE EXISTS (SELECT * FROM vizsga WHERE vizsga.hkod=hallgatohkod AND tkod=104) Ezzel az utasítással azon hallgatók nevét kapjuk eredményül, akiknek van vizsgajegyük a 104-es kódú tantárgyból. A belső SELECT segítségével azt vizsgáljuk meg a hallgató tábla minden sorára, hogy a vizsga táblában van-e olyan sor az adott hallgatókóddal,

amelyben a tantárgykód értéke 104. Ha van ilyen sor, akkor a hallgató neve bekerül az eredménytáblába, egyébként pedig nem. A példában egy speciális típusú belső SELECT-et alkalmaztunk (correlated query). Itt a belső SELECT a külső SELECT-ben szereplő tábla minden sorára kiértékelődik. Ez azért történik így, Az SQL adatbáziskezelő nyelv 152 Az adatbáziskezelés alapjai mert a belső SELECT WHERE opciójában kapcsolatot határoztunk meg a külső SELECT-ben szereplő tábla és a belső SELECT-ben szereplő tábla között. Más típusú belső SELECT-ek esetén a belső SELECT csak egyszer értékelődik ki. Ezt a lekérdezést másképpen is megfogalmazhatjuk: SELECT nev FROM hallgato WHERE hkod IN (SELECT hkod FROM vizsga WHERE tkod=104) A következő lekérdezéssel azon hallgatók nevét kapjuk meg, akiknek van vizsgajegyük statisztikából. SELECT nev FROM hallgato WHERE hkod IN (SELECT hkod FROM vizsga WHERE tkod=(SELECT tkod FROM

tantargy WHERE tnev=STATISZTIKA)) Ebben a megfogalmazásban két egymásba ágyazott belső SELECT-et alkalmaztunk. A második belső SELECT a tantárgy táblából meghatározza a statisztika nevű tantárgy kódját. Az első belső SELECT pedig azon hallgatókódokat választja ki a vizsga táblából, akiknek van jegyük a második belső SELECT-tel meghatározott tantárgykódú tantárgyból. A külső SELECT azon hallgatók nevét eredményezi, akiknek a kódja szerepel az első belső SELECT eredménylistájában. Az ALL, ANY és EXISTS operátorok mindegyike előtt használható a NOT kulcsszó. Ekkor a művelet eredményének negált értékét kapjuk. Példa: SELECT nev FROM hallgato WHERE NOT EXISTS (SELECT * FROM vizsga WHERE vizsga.hkod=hallgatohkod AND jegy=1) Ezzel a SELECT utasítással azoknak a hallgatóknak a nevét válogatjuk le, akiknek nincs elégtelen vizsgajegye. A SELECT utasítás segítségével egy-egy lekérdezést többféleképpen is megfogalmazhatunk.

Célszerű azt a megfogalmazást választani, amely az adott szempontokat a legáttekinthetőbben, a legolvashatóbban írja le. Nagy adatállományok esetén azonban az elsődleges szempont az, hogy melyik megfogalmazás biztosítja az adatok leggyorsabb megkeresését. (Ez pedig függ az SQL nyelv konkrét megvalósításától.) Az adatbáziskezelés alapjai 153 Az SQL adatbáziskezelő nyelv Nézettáblák Az SQL nyelvben lehetőségünk van arra, hogy egy vagy több táblából nézettáblát hozzunk létre, melynek segítségével az adatokat a számunkra könnyebben kezelhető formában láthatjuk. A nézettábla csak logikai tábla, fizikailag nem létezik. Az adatbázisban a nézettábla kialakítására szolgáló lekérdezés kerül tárolásra. Nézettáblát az alábbi utasítással lehet létrehozni: CREATE VIEW <név> AS <lekérdezés> név lekérdezés a nézettábla neve azon táblák oszlopainak és sorainak megadása, amelyeken a nézettábla

alapul. Általában ez egy SELECT utasítás, amely nem tartalmazhat ORDER BY opciót. Nézettáblákat bármelyik SQL utasításban használhatunk, ahol táblák használata megengedett, azzal a megszorítással, hogy amennyiben a nézettábla nem egyetlen tábla adatain alapul, vagy a nézettáblát definiáló lekérdezésben a GROUP BY opció szerepel, akkor csak lekérdezhetünk adatokat a nézettáblából. Egyébként módosításokat is végezhetünk a nézettáblában szereplő adatokon. Példák: CREATE VIEW atlag AS SELECT hkod,nev,eredm FROM hallgato Ezen utasítás hatására létrejön az atlag nézettábla, amely a hallgato táblából a hkod, nev, eredm oszlopokat tartalmazza. CREATE VIEW statjegy AS SELECT nev,evf,csop,jegy FROM hallgato,vizsga WHERE hallgato.hkod=vizsgahkod AND tkod=(SELECT tkod FROM tantargy WHERE tnev=STATISZTIKA) A statjegy nézettábla a hallgato és a vizsga táblákon alapul. Az belső SELECT a vizsga táblából csak azokat a sorokat

választja ki, ahol a tantárgy a statisztika. Az SQL adatbáziskezelő nyelv 154 A nézettáblákat a következő utasítással szüntethetjük meg: DROP VIEW <név> név a nézettábla neve Az adatbáziskezelés alapjai Az adatbázis-kezelés alapjai 155 Procedurális SQL 16.2 Procedurális SQL Az SQL nyelvhez kifejlesztették annak procedurális változatát, a PL/SQL nyelvet. A PL/SQL tartalmazza az SQL utasításokat, továbbá vezérlő utasításokat - elágazást, kilépést, ciklusszervező utasításokat és értékadó utasítást. Ezt a nyelvet a fejlesztők használják, hatékony és fontos eszköze az alkalmazások készítésének. Az SQL nyelv használata az ORACLE-ben 17. 156 Az adatbázis-kezelés alapjai Az SQL nyelv használata az ORACLE adatbáziskezelő rendszerben Az ORACLE adatbáziskezelő rendszerhez kapcsolódó eszköz az SQL*PLUS interpreter, amelynek segítségével interaktív módon használhatjuk az SQL utasításokat. Az

SQL*PLUS csak akkor használható, ha az ORACLE adatbáziskezelő működik. Az SQL*PLUS indulása után ahhoz, hogy az adatbázisban található adatokhoz hozzáférhessünk, meg kell adni a felhasználói nevet (user name) és a jelszót (password). A begépelt jelszó nem jelenik meg a képernyőn. Sikeres bejelentkezés esetén megjelenik az SQL> prompt A prompt után lehet begépelni az SQL parancsokat. A kulcsszavakat tetszőlegesen írhatjuk kisbetűvel, vagy nagybetűvel. A parancsok több sorba is írhatók, a parancsot pontosvesszővel (;) kell lezárni, ez jelzi a végét. ENTER billentyű leütésére történik meg a parancs értelmezése és végrehajtása Az aktuális parancs egy pufferben tárolódik, ezt újra végrehajthatjuk, listázhatjuk, vagy módosíthatjuk. A pufferben található utasítás szerkesztésére az EDIT utasítás szolgál. Hatására az operációs rendszer editora indul el, hacsak a LOGIN.SQL file-ban nem definiáltunk másik editort A puffer

tartalmát az L utasítással listázhatjuk ki, az utasítást az R paranccsal lehet végrehajtatni. A pufferben található utasítást elmenthetjük egy file-ba a következő utasítás segítségével: SAVE file-név [.kit ] Ha nem adjuk meg a file kiterjesztését, akkor az .SQL lesz Egy SQL parancsfile-t végrehajtani a @file-név [.kit ] utasítással lehet. Ha a parancsfile kiterjesztése SQL, akkor ezt nem kell megadni Ha valamelyik SQL parancs formájával, vagy működésével nem vagyunk tisztában, akkor a HELP parancs neve parancs neve a keresett SQL parancs kulcsszava utasítás segítségével kérhetünk róla tájékoztatást. Az SQL*PLUS programból való kilépésre az EXIT utasítás szolgál. Az adatbázis-kezelés alapjai 157 Az ORACLE adatbázis-kezelõ eszköztára 18. Az ORACLE adatbáziskezelő eszköztára Az ORACLE adatbázisok kezelésére az SQL nyelven kívül rendelkezésünkre áll még számos software-eszköz, melyek kiküszöbölik a rutin

programozói munkát, programgenerátorként működnek, segítségükkel gyorsan és kényelmesen készíthetünk egyszerű alkalmazásokat. Az SQL*FORMS képernyőformátumon alapuló interaktív alkalmazások készítésére és futtatására szolgál. Segítségével az adatbázisokhoz adatbeviteli, illetve módosító programokat, továbbá interaktív lekérdező programokat lehet létrehozni és végrehajtani. Az SQL*REPORT segítségével jelentéseket, kimutatásokat, listákat készíthetünk. A GUPTA adatbáziskezelő rendszer 158 Az adatbáziskezelés alapjai 19. A GUPTA adatbáziskezelő rendszer A GUPTA cég az 1980-as évek közepén jelent meg az adatbáziskezelő rendszerek piacán az első kliens-server architektúrájú, SQL alapú relációs adatbáziskezelő rendszerével. A cég célkitűzése az volt, hogy kisebb adatbázisok kezelésére fejlesszen ki olyan eszközt, amelyik kisebb számítógépeken működtethető. Alapvetően a PC gépekre, illetve PC

hálózatokra fejlesztették ki ezt az adatbázis-kezelő rendszert. A DOS operációs rendszer alatt mind a fejlesztőeszközök, mind pedig maga az adatbáziskezelő Windows alatt működnek, grafikus felhasználói felületet biztosítva. Az adatbáziskezelő software az SQLBASE, amelynek az 5.0-s változatával ismerkedünk meg Az SQLBASE több adatbázist is kezelhet. Az adatbázis-állományok az SQLBASE nevű home könyvtárban helyezkednek el, úgy, hogy minden adatbázis egy-egy saját könyvtárral rendelkezik, amelynek a neve meg kell hogy egyezzen az adatbázis nevével. sqlbase hallgato hallgato.dbs * .log konyvtar * .his konyvtar.dbs * .log * .his Egy adatbázis az adatfile-ból, a log file-okból és a history file-ból áll. A log file-ok az adatok módosítás előtti állapotát, illetve a módosításokat tárolják a tranzakciók visszagörgethetőségének biztosításához, illetve az on-line mentéshez. A history file az adatok módosítás előtti

állapotát őrzi meg (before image). Az SQLBASE két history file-t használ felváltva. A history file használata opcionális A GUPTA adatbáziskezelő rendszer 159 Az adatbáziskezelés alapjai Database file * .dbs Aktuális 5.log 4.log 3.log 2.log 1.log * .his Read-only history file Az adatbázisban tárolt adatokhoz csak felhasználói névvel és jelszóval lehet hozzáférni. A felhasználók az SQL alapú adatbáziskezelő eszközökben szokásos CONNECT, RESOURCE, vagy DBA jogosultságot kaphatnak a rendszeradminisztrátortól. A CONNECT privilégiummal rendelkező felhasználó csak lekérdezheti a táblák adatait, illetve módosíthatja azokat, de például nem hozhat létre táblát, indexet, vagy clustert. Magasabb szint a RESOURCE privilégium. Ekkor a felhasználó rendelkezik az előbbi jogokkal, továbbá a saját tábláinak felépítését módosíthatja, létrehozhat táblát, indexelhet stb. A legmagasabb szint a DBA privilégium, ez az

adatbázis-adminisztrátor szintje, aki tetszőleges műveleteket végezhet az adatbázisban, hozzáférhet a rendszertáblák tartalmához is. A táblákhoz és a nézettáblákhoz szintén rendelhetők különböző privilégiumok, így ALL, SELECT, INSERT, DELETE, INDEX, ALTER és UPDATE jogosultságok. Hogy egy felhasználónak egy objektumon milyen műveleteket végezhet, azt a felhasználó saját jogosultsága és az objektumhoz rendelt jogok együttesen határozzák meg. A GUPTA adatbáziskezelő rendszer rendelkezik SQL interpreterrel, továbbá az SQLWindows nevű fejlesztőeszközzel, melynek segítségével gyorsan és kényelmesen készíthetők grafikus alkalmazások. A GUPTA adatbáziskezelő rendszer 160 Az adatbáziskezelés alapjai 19.1 SQL interpreter a GUPTA adatbáziskezelő rendszerben Az SQL interpretert az SQLTalk nevű software valósítja meg. Kétféle formában is használható A karakteres forma parancssoros módban működik, hasonlóan az ORACLE

adatbáziskezelő rendszer SQL*PLUS interpreteréhez. DOS alól indítható az SQLTALK névvel A másik változat Windows alatt működik, grafikus interfésszel rendelkezik. WinTalk néven is szokták nevezni Ennek használatát nézzük meg részletesebben. A program indítása után megjelenő képernyő felső sorában egy menüsor található, amely segítségével számos funkció könnyen megvalósítható. Mielőtt egy adatbázis adataival dolgozni kezdenénk, hozzá kell kapcsolódnunk az adatbázishoz. Ehhez a Session menü Connect menüpontját kell elindítanunk. Ekkor megjelenik a képernyőn egy ablak, amelyben meg kell adni az adatbázis nevét, a felhasználói nevet és a jelszót. Segítségképpen megjelennek az elérhető adatbázisok nevei. Minden adatbázisnév kétszer szerepel, a kettő közül mindegy, hogy melyiket választjuk ki. A begépelt jelszó nem látszik a képernyőn, helyette csillagok jelennek meg. Sikeres bejelentkezés esetén a menüsor alatt

megjelenik az adatbázis neve és a felhasználói név. A menüsor alatti képernyő két részre tagolódik. Felül helyezkedik el az input ablak (Input Window). Ide írhatjuk be az SQL parancsokat A parancsnak mindig sor elején kell kezdődnie, tetszőleges számú sorba írható, a parancs végét a pontosvessző jelzi. Az input ablakban található bármelyik parancs végrehajtható. Az aktuális parancsot (vagyis amin a kurzor áll) a Session menü alatti Current command pont kiválasztásával, vagy a <SHIFT><F2> billentyűkombináció leütésével lehet végrehajtani. Az inputablakban található összes parancs is végrehajtható a Session menü Current script menüpontjának kiválasztásával. Az adatbáziskezelés alapjai 161 A GUPTA adatbáziskezelő rendszer Az input ablak tartalma elmenthető és egy későbbi időpontban újra visszatölthető, így a parancsok ismételten végrehajthatók. A mentés és a visszatöltés a File menü alatti Save,

illetve Open menüpontok segítségével történik. A betöltést a Connect menü alatti Script menüpont segítségével is megtehetjük. Az elmentett parancsok alapértelmezés szerint wts kiterjesztésű file-ba kerülnek A képernyő alsó része az output ablak (Output Window) területe. Itt jelenik meg a végrehajtott SQL parancs eredménye. Mindig csak az utoljára végrehajtott parancs eredménye látható Mind az input, mind az output ablak görgetőlécekkel rendelkezik, így kényelmesen áttekinthető hosszabb parancssorozat is, vagy egy nagyobb leválogatás eredménye. A képernyő alján található a státuszsor. Ide íródnak az interpreter üzenetei, így az estleges hibaüzenetek is. Az SQLTalkból a File menüpont alatti Exit kiválasztásával lehet kilépni. Kilépés előtt a software megkérdezi, hogy kívánjuk-e elmenteni az input ablak tartalmát, majd pedig, hogy lekapcsolhat-e az adatbázisról (disconnect). Csak akkor tudunk kilépni, ha a lekapcsolás

megtörtént (SQL TALK képernyő) 10 Szöveges adatbázisok 162 Az adatbáziskezelés alapjai 20. Szöveges adatbázisok Az eddig látott adatbázisokban az adatok szigorú szabályok szerint kerültek tárolásra, az adatok között meglévő összefüggések szerint. A szöveges adatbázisok ezzel szemben folyamatos, vagy bizonyos szempontok szerint tagolt szövegek összessége. A szöveges adatbázisok tipikus példái a könyvtári rendszerek. Egy könyvtári rendszerben nemcsak a könyvek, cikkek íróját és címét kell tárolni, hanem a könyv tartalmának rövid ismertetését is, ezzel lehetőséget biztosítva a téma szerinti keresésre. A téma szerinti keresés során egy, vagy több tárgyszót adunk meg, és keressük azokat a dokumentumokat, amelyekben ezek a tárgyszavak előfordulnak. A legegyszerűbb szöveges információ-visszakereső rendszerek a kért szövegrészt a tárolt szövegek egyszerű végigolvasásával sorosan keresik meg. Ez nagy

adatmennyiségnél igen lassú A visszakeresést lényegesen gyorsítja az indextáblák alkalmazása. Az indextábla a szövegekben előforduló kulcsszavakat tartalmazza, minden kulcsszóval együtt tárolva azon dokumentum, vagy dokumentumok azonosítóját, amelyben szerepel. Az indextábla felépítése történhet automatikusan, ekkor a felvitt szöveg minden szava kulcsszó lesz, kivéve a tiltott szavakat, melyeknek listáját egy külön file tartalmazza. Ezek általában a kötőszavak, névutók. Az indextábla felépítése történhet úgy is, hogy a szöveg felvitelekor meg kell jelölni, hogy mely szavak legyenek kulcsszavak, vagy meg kell adni a kulcsszavak listáját. Ekkor csak a megjelölt szavak kerülnek az indextáblába. Az indextáblák használata lényegesen megnöveli az adatbázis méretét, az adatok felvitele is lelassul, azonban a visszakeresés gyorsasága jelentősen megnő. Példa indextáblára: Kulcsszó ---------kritikus szakasz kulcs kulcsszó

kurzor külső adat külső hivatkozás külső megszakítás Dokumentumazonosító, előfordulás -----------------------------------10987(023),20345(345),30124(456) 34098(112),45098(876) 56789(154) 34098(054),56798(178) 56789(543) 20345(402),56798(254) 10987(433),20345(186) Az indextáblába célszerű a dokumentum azonosítója mellett az előfordulási helyet is tárolni, hogy az egyes találatok közötti távolság gyorsan meghatározható legyen. Az adatbáziskezelés alapjai 163 Szöveges adatbázisok A keresés hatékonyságát tovább növeli az a lehetőség, hogy nem követeli meg a kulcsszavakkal a teljes hosszban való egyezést, így a különböző ragozott alakokra nem kell külön keresést kérni. További segítséget nyújt a szinonimaszótár. Ebben a tárgyszavak szinonimái (vele egyenértékű szavak) találhatók meg. Segítségével a keresést kiterjeszthetjük a keresett szó szinonimáira is Ha a keresési feltétel megfogalmazásában ezt

kérjük, akkor a rendszer a szinonimaszótár alapján automatikusan elvégzi a keresést a szinonimákra is. A keresési szempontok összetettek is lehetnek. Keresési feltétel lehet több kulcsszó együttes előfordulása, vagy több kulcsszó közül valamelyik előfordulása a szövegben. A kulcsszavak együttes előfordulásánál kiköthető, hogy legfeljebb milyen távolságra lehetnek egymástól a szövegben, így csak azokat az előfordulásokat kapjuk meg, amelyekben a keresett kulcsszavak egymással összefüggésben szerepelnek. A rövid leírás mellett tárolhatók még egyéb információk is a dokumentumokról. Például egy könyvtári rendszerben a könyvek megjelenésének dátuma, a kiadó, stb. A keresési feltételben ezen adatokat is felvehetjük a szempontok közé. Így megfogalmazhatunk kombinált kereséseket, ahol a feltételek egy része a strukturált adatokra vonatkozik, a másik része pedig a szöveges adatokra. Például azon dokumentumokat

keressük, amelyeket 1992 után adtak ki és az adatbáziskezelés szerepel bennük. Léteznek teljes szövegű adatbázisok is. Ezekbe a tárolt dokumentumok teljes szövegét felviszik Például rögzítették Goethe összes művének szövegét és a Bibliát is. Ezeket az adatbázisokat főként a kutatók használják. Meghatározható például, hogy Goethe mely szavakat használta a leggyakrabban, vagy a Bibliában milyen gyakorisággal van szó húsételekről, és milyen gyakran növényi ételekről. Nagyobb könyvtárakban már többnyire számítógépes nyilvántartást használnak. Ezek általában a könyvek rövid tartalmi kivonatát is tárolják, ezzel segítve a téma szerinti keresést. Számos számítógépes könyvtári rendszert alkalmaznak, ezek közül a TINLIB és az ALEPH könyvtárkezelő rendszert említjük meg. Nemzetközi hálózatokon elérhető adatbázisok 164 Az adatbáziskezelés alapjai 21. Nemzetközi számítógépes hálózatokon

elérhető adatbázisok A nemzetközi számítógépes hálózatokon több ezer adatbázis érhető el. Változatos témákban találhatunk adatbázisokat, például vannak bibliográfiai adatbázisok, könyvtári katalógusok, de vannak olyanok is, amelyek menetrendeket tartalmaznak, vagy ösztöndíjak katalógusát. A számítógépes adatbázisokban sokféle szempont szerint lehet keresni, elég hatékonyan. Ezek az adatbázisok általában aktuálisabbak, mint a nyomtatott anyagok, hiszen folyamatosan karbantartják, frissítik őket. Ezeket az adatbázisokat többnyire egyetemek, kutatóintézetek, vagy vállalatok állítják össze. Ezután vagy ők maguk szolgáltatják a számítógépes hálózaton, vagy valamely szolgáltató központra bízzák ezt. Az adatbázisok egy része nyilvános és ingyenes, - ide tartoznak többnyire a könyvtári katalógusok - másrészük használatáért pedig fizetni kell. Ezek általában a gazdasági adatokat, valamint a legfrissebb

tudományos eredményeket tartalmazó adatbázisok. A számítógépes adatbázisok felépítése eltérő, de valamennyire jellemző, hogy a keresést indexekkel segítik. A keresési feltételek vagy menürendszer segítségével fogalmazhatjuk meg, vagy az adatbázis saját lekérdező nyelvét használjuk. A találatokat kiírathatjuk a képernyőre, vagy kinyomtathatjuk, további feltételek megadásával szűkíthetjük a találati halmazt. Az adatbázisok tartalmuk szerint a következő csoportokba sorolhatók: Bibliográfiai adatbázisok Ezek egy-egy könyvtár teljes katalógusát tartalmazzák, általában a dokumentumok rövid szöveges ismertetésével kiegészítve, vagy egy-egy témakör bibliográfiáját, vagyis az adott témában megjelent dokumentumok (könyvek, cikkek, konferenciaanyagok) adatait. ezekben az adatbázisokban a dokumentumok adataira (szerző, cím, megjelenési év) és tárgyszavakra és kulcsszavakra lehet keresni. A tárgyszó a thesaurusban

található szavak valamelyike, a kulcsszó az indextáblában szereplő szó. A legismertebb számítógépes hálózaton keresztül elérhető könyvtári adatbázisok: MELVYL HOLLIS LIBRARY OF CONGRESS University of California és egyéb kaliforniai könyvtárak közös adatbázisa a HARWARD egyetem könyvtári adatbázisa az amerikai Kongresszusi Könyvtár (csak egy része használható ingyenesen) Az adatbáziskezelés alapjai 165 Nemzetközi hálózatokon elérhető adatbázisok A magyar egyetemek közül több szintén rendelkezik számítógépes adatbázissal, amely hálózaton keresztül elérhető. (JATE, BME, BKE) Katalógus jellegű adatbázisok Számos katalógus jellegű adatbázis található a hálózatokon, például Ki-kicsoda adatbázis, múzeumi katalógusok, vállalati katalógusok. Faktografikus adatbázisok Általában valamilyen adatgyűjteményt tartalmaznak táblázatos formában (például menetrendek, statisztikák). Teljes szövegű

adatbázisok A teljes szövegű adatbázisok a dokumentumok bibliográfiai adatai mellett azok teljes szövegét is tartalmazzák. Így a keresett dokumentumot rögtön el is lehet olvasni Leggyakrabban hírügynökségi anyagok, újságok jelennek meg ebben a formában, de már bizonyos adatbázisokban könyvek teljes szövege is szerepel. A hálózaton keresztül a képek, ábrák továbbítása jóval lassabb, mint a szövegeké, így az ábrákat tartalmazó dokumentumok kezelése még kicsit nehézkes. Az adatbáziskezelő rendszerek üzemeltetése 166 Az adatbáziskezelés alapjai 22. Az adatbáziskezelő rendszerek üzemeltetése Az adatbázisokhoz általában több felhasználó hozzáférését kell biztosítani, ezért többnyire valamilyen hálózaton történik az adatbázis elhelyezése. Sőt előfordulhat, hogy az adatbázisban tárolt adatok nem is egy gépen helyezkednek el, hanem fizikailag egymástól távol levő gépeken (osztott adatbázisok). Ezért az

adatbázis kezelését nem lehet csak a felhasználókra bízni, szükség van egy olyan személyre - nagyobb adatbázisoknál csoportra - aki az adatbázisért és annak kezeléséért felelős. Ezt a munkát látja el az adatbázis-felügyelő, vagy más néven adatbázisadminisztrátor (Data Base Administrator) Az adatbázis-felügyelő fő feladatai: - Az adatbázis megszervezése Ez magában foglalja az adatmodell kialakítását, az adatbázis leírását, az adatok elnevezését, a hozzáférési jogok meghatározását és az adatbázis betöltését. - Az adatbázis struktúrájának igény szerinti módosítása - A felhasználók segítése - Az adatok védelme Ebbe beletartozik az adatok rendszeres mentése és az esetleges hibák esetén történő helyreállítás. - Az adatbázis használatának figyelése, a hatásfok csökkenése esetén az adatbázis újraszervezése. A feladatok sokrétűsége miatt az adatbázis-felügyelet két tevékenységi körre bontható: - Az

adatadminisztrátor az adatbázis tervezésével és alkalmazásával kapcsolatos feladatokat látja el, valamint konzultál a felhasználókkal. - A rendszeradminisztrátor pedig a számítógéppel kapcsolatos feladatokkal foglalkozik. Ebbe beletartozik az adatbázis működésének optimalizálása, a mentés, az esetleges helyreállítás és az újraszervezés. Az adatbázis-felügyelő különleges hozzáférési jogokkal rendelkezik. Munkáját általában speciális programok támogatják, melyek segítségével beállíthatja az adatbázis paramétereit, elvégezheti a mentéseket, vagy ellenőrizheti az adatbázis működését. Az adatbáziskezelés alapjai 167 Az adatbázis-kezelő rendszerek üzemeltetése 22.1 Az ORACLE adatbáziskezelő rendszer üzemeltetése Az ORACLE adatbáziskezelő rendszerben a SYSTEM és a SYS felhasználói nevek különleges jogokkal rendelkeznek. Ezek a felhasználók automatikusan létrejönnek az adatbázis létrehozásakor Ezekhez a

felhasználókhoz kapcsolódnak az adatbáziskezelő rendszer üzemeltetésének feladatai. Az adatbázis-adminisztrátort az adatbázis-serveren futó SQL*DBA program segíti munkájában. Ez egy menüvezérelt segédprogram, amely SQL parancsokon alapul. Főbb funkciói a következők: - adatbázis létrehozása - adatbázis megnyitása, lezárása - az adatbázis működésének felügyelete - SQL parancsok végrehajtása - felhasználói jogok adása és visszavonása - az adatbázis működési paramétereinek állítása a hatékonyság növelésének érdekében - hiba esetén az adatbázis helyreállítása Az adatbázis mentésére és visszatöltésére, valamint adatok más adatbázisból való betöltésére az EXPORT/IMPORT segédprogram (utility) szolgál. Az adatbázis és az adatbáziskezelő rendszer paramétereit az INIT.ORA file tartalmazza, melyek beállítását az adatbázis-adminisztrátor megváltoztathatja, így javíthatja az adatbáziskezelő működését.

168 Feladatok - CLIPPER Az adatbáziskezelés alapjai 23. Feladatok 23.1 CLIPPER 23.11 DBU program 1. Állapítsa meg egy adatállomány struktúráját tartalmát a DBU program segítségével! 2. Hozza létre az alábbi adatbázis-állományt: ARU.DBF mező neve típusa akod N 5 áru kódja megnev C 20 áru neve rsz N 3 raktárszám menny N 1 mennyiség mérete tizedes tartalma 3. A DBU program segítségével készítsen indexállományt az ARU adatállományhoz, amelynek kulcsmezője az áru kódja! 4. A DBU program segítségével vigyen fel 5 adatrekordot az ARU állományba! 5. A DBU program segítségével jelölje törlésre az ARU állomány 1 és 4 rekordját! 6. A DBU program segítségével távolítsa el az ARU állományból a törlésre jelölt rekordokat! 7. A DBU program segítségével törölje az ARU állományból az összes adatrekordot! 169 Az adatbáziskezelés alapjai 23.2 SQL 23.21 feladatsor A táblák felépítése a

következő: ETEL tábla (ÉTEL) mező neve típusa mérete tizedes tartalma ekod N 5 étel kódja enev C 40 neve etelf C 25 fajtája pl. LEVES kaloria N 7 2 tápértéke (kcal) ar N 6 2 ára (Ft) keszido N 5 elkészítési idő (perc) skod N 3 szakácskód A táblában az ekod oszlop az elsődleges kulcs. ETREND tábla (ÉTREND) mező neve típusa mérete tizedes tartalma ho N 2 hónap nap N 2 nap etszam N 1 étkezés száma ekod N 5 ételkód A ho, nap és etszam mezők nem lehetnek üresek. Feladatok - SQL 170 Feladatok - SQL 7 Az adatbáziskezelés alapjai SZAKACS tábla (SZAKÁCS) mező neve típusa mérete tizedes tartalma skod N 3 szakács kódja snev C 40 neve szev N 4 születési éve fokozat C 10 pl. MESTER A táblában az skod oszlop az elsődleges kulcs. Táblák létrehozása, feltöltése 8. Hozza létre a fenti táblákat! 9. Készítsen indexállományokat az előző táblákhoz

ETIND és SZAKIND névvel! 10. Vigye fel az ETEL táblába a következő sort: Kód: 34231 Név: DERELYE Fajta: TESZTA Tápérték: 350 kcal Ár: 80 Ft Elkészítési idő: 140 perc Szakács kódja: 123 11. Töltse fel a táblákat a CLIPPER I feladatsornál táblázatos formában megadott adatokkal! Táblák tartalmának módosítása 12. Módosítsa a 54321 kódú étel árát 120 Ft-ra, tápértékét pedig 210 kcal-ra! 13. Minden étel árát növelje meg 20 Ft-tal! Az adatbáziskezelés alapjai 171 Feladatok - SQL 14. A 300 kcal-nál táplálóbb ételek elkészítési idejét csökkentse 20 perccel! Lekérdezési feladatok (SELECT) 15. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL tábla teljes tartalmát! 16. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a LEVES ételféleségek adatait! 17. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a LEVES, HUS, GYUMOLCS ételféleségek nevét és árát! 18. Adja meg azt

az SQL utasítást, amely lekérdezi az ETEL táblából a 200 kcal-nál táplálóbb ételek nevét, fajtáját és tápértékét! 19. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a 150 Ft-nál olcsóbb ételek nevét, árát és tápértékét, ár szerint növekvő sorrendben! 20. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a fél óra alatt elkészíthető ételek nevét, fajtáját és elkészítési idejét, elkészítési idő szerint csökkenő sorrendben! 21. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a különböző ételfajtákat! 22. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a 100 és 300 kcal közötti tápértékű ételek nevét, tápértékét és elkészítési idejét, tápérték szerint csökkenő sorrendben, az azonos tápértékű ételeket pedig névsor szerinti sorrendben! 23. Adja meg azt az SQL utasítást, amely lekérdezi az ETEL táblából a 200 és

500 Ft közötti árú HUS ételek nevét, árát és elkészítési idejét, ár szerint csökkenő, azon belül elkészítési idő szerint csökkenő sorrendben! 24. Adja meg azt az SQL utasítást, amely lekérdezi a SZAKACS táblából az összes szakács adatait, a) születési idő szerint növekvő b) csökkenő sorrendben! 25. Adja meg azt az SQL utasítást, amely lekérdezi az összes szakács adatait fokozat szerinti, azon belül pedig születési év szerint csökkenő rendezettségben! 26. Adja meg azt az SQL utasítást, amely lekérdezi a SZAKACS táblából a különböző fokozatokat! Feladatok - SQL 172 Az adatbáziskezelés alapjai 27. Adja meg azt az SQL utasítást, amely lekérdezi a SZAKACS táblából a MESTER fokozatú szakácsok nevét és születési évét, névsor szerinti sorrendben! 28. Adja meg azt az SQL utasítást, amely lekérdezi a SZAKACS táblából az 1960 előtt született szakácsok nevét és fokozatát, fokozat, azon belül pedig

névsor szerinti sorrendben! 29. Adja meg azt az SQL utasítást, amely lekérdezi a június 21-i étrendet az ETREND táblából! 30. Adja meg azt az SQL utasítást, amely lekérdezi a ETREND táblából a főétkezések (étkezés száma 3) adatait hónap, nap szerinti rendezettségben! 31. Adja meg azt az SQL utasítást, amely lekérdezi a ETREND táblából a február 1-jei 5 étkezésre készített étel kódját! 32. Adja meg azt az SQL utasítást, amely lekérdezi a B betűvel kezdődő nevű ételek adatait! 33. Adja meg azt az SQL utasítást, amely lekérdezi azoknak az ételeknek a nevét és árát, amelyek nevének 2. betűje O 34. Adja meg azt az SQL utasítást, amely lekérdezi azoknak a szakácsoknak a nevét és fokozatát, akiknek a neve K betűvel kezdődik, 3. betűje R Oszlopfüggvények, belső SELECT-ek 35. Adja meg azt az SQL utasítást, amely lekérdezi a legdrágább étel árát! 36. Adja meg azt az SQL utasítást, amely lekérdezi a legidősebb

szakács születési évét! 37. Adja meg azt az SQL utasítást, amely lekérdezi a legtáplálóbb étel tápértékét! 38. Adja meg azt az SQL utasítást, amely lekérdezi a legolcsóbb étel árát! 39. Adja meg azt az SQL utasítást, amely lekérdezi a legdrágább és a legolcsóbb étel árának különbségét! 40. Adja meg azt az SQL utasítást, amely lekérdezi a legidősebb és a legfiatalabb szakács korkülönbségét! 41. Adja meg azt az SQL utasítást, amely lekérdezi az ételek számát! Az adatbáziskezelés alapjai 173 Feladatok - SQL 42. Adja meg azt az SQL utasítást, amely lekérdezi a HUS fajtájú ételek számát! 43. Adja meg azt az SQL utasítást, amely lekérdezi a KUKTA fokozatú szakácsok számát! 44. Adja meg azt az SQL utasítást, amely lekérdezi a március 15-i étkezések számát! 45. Adja meg azt az SQL utasítást, amely lekérdezi, hogy a 20345 kódú étel a) hányszor szerepel az étrendben! b) hányszor szerepel reggelire (1.

étkezés) az étrendben! 46. Adja meg azt az SQL utasítást, amely lekérdezi az EDESSEG ételek átlagos tápértékét! 47. Adja meg azt az SQL utasítást, amely lekérdezi a GYUMOLCS ételek árának összegét! 48. Adja meg azt az SQL utasítást, amely lekérdezi a 200 kcal-nál kevesebb tápértékű ételek átlagárát! 49. Adja meg azt az SQL utasítást, amely lekérdezi a 1 óránál tovább készülő ételek számát! 50. Adja meg azt az SQL utasítást, amely lekérdezi a 80 Ft-nál olcsóbb LEVES ételek elkészítési idejének összegét! 51. Adja meg azt az SQL utasítást, amely lekérdezi a legolcsóbb EDESSEG árát! 52. Adja meg azt az SQL utasítást, amely lekérdezi a legidősebb KUKTA születési évét! 53. Adja meg azt az SQL utasítást, amely lekérdezi a 200 és 300 kcal közötti tápértékű ételek közül a legdrágább árát! 54. Adja meg azt az SQL utasítást, amely lekérdezi a legfiatalabb szakács nevét és születési évét! 55. Adja meg

azt az SQL utasítást, amely lekérdezi a legolcsóbb étel árát és nevét! 56. Adja meg azt az SQL utasítást, amely lekérdezi az átlagosnál olcsóbb ételek nevét és fajtáját! 57. Adja meg azt az SQL utasítást, amely lekérdezi az átlagosnál idősebb szakácsok nevét, születési évét és fokozatát, születési év szerint csökkenő sorrendben! Feladatok - SQL 174 Az adatbáziskezelés alapjai 58. Adja meg azt az SQL utasítást, amely lekérdezi fokozatonként a legidősebb szakács születési évét! 59. Adja meg azt az SQL utasítást, amely lekérdezi ételfajtánként az ételek átlagárát! 60. Adja meg azt az SQL utasítást, amely lekérdezi minden hónap utolsó napját, amelyre étrend készült! 61. Adja meg azt az SQL utasítást, amely lekérdezi ételfajtánként az 1 óránál hamarabb elkészíthető ételek tápértékének összegét! 62. Adja meg azt az SQL utasítást, amely lekérdezi, hogy a 12345 kódú étel havonta a) hányszor

szerepel az étrendben! b) hányszor szerepel vacsorára (5. étkezés) az étrendben! 63. Adja meg azt az SQL utasítást, amely lekérdezi március, április és május hónapra havonként az étkezések számát! 64. Adja meg azt az SQL utasítást, amely lekérdezi a TESZTA és az EDESSEG ételfélékre az átlagos tápértéket! 65. Adja meg azt az SQL utasítást, amely lekérdezi a legolcsóbb LEVES étel nevét és árát! 66. Adja meg azt az SQL utasítást, amely lekérdezi a legidősebb MESTER szakács nevét! Táblázatok összekapcsolása, belső SELECT-ek 67. Adja meg azt az SQL utasítást, amely lekérdezi az ételek nevét, fajtáját, árát, a készítő szakács nevét és fokozatát, ételfajta szerinti, azon belül pedig ételnév szerinti rendezettségben! 68. Adja meg azt az SQL utasítást, amely lekérdezi a HUS ételek nevét, árát és a készítő szakács nevét! 69. Adja meg azt az SQL utasítást, amely lekérdezi a május havi étrendet úgy, hogy az

ételek kódja helyett az ételek neve szerepeljen benne. Az étrend nap, azon belül pedig étkezésszám szerinti rendezettségben legyen kilistázva! 70. Adja meg azt az SQL utasítást, amely lekérdezi a július 23-i étrendet, szerepeljen az étkezés száma, az étel neve és a szakács neve! Az adatbáziskezelés alapjai 175 Feladatok - SQL 71. Adja meg azt az SQL utasítást, amely lekérdezi a FALANK EDE által készített ételek nevét és fajtáját! 72. Adja meg azt az SQL utasítást, amely lekérdezi, hogy mely napokon főz FALANK EDE! 73. Adja meg azt az SQL utasítást, amely lekérdezi a május 25-én főző szakácsok nevét és fokozatát! 74. Adja meg azt az SQL utasítást, amely lekérdezi azon ételek nevét és árát, amelyek drágábbak, mint a RANTOTT SZELET! 75. Adja meg azt az SQL utasítást, amely lekérdezi az étrendben szereplő minden napra a napi költség értékét! Egyesítés, metszet, különbség 76. Adja meg azt az SQL utasítást,

amely lekérdezi azon ételek nevét, árát és tápértékét, amelyek a) az átlagosnál olcsóbbak, vagy az átlagosnál hamarabb elkészíthetők! b) az átlagosnál olcsóbbak és az átlagosnál hamarabb elkészíthetők! 77. Adja meg azt az SQL utasítást, amely lekérdezi azon ételek nevét, amelyek reggelire (1 étkezés) és vacsorára (5. étkezés) is szerepelnek az étrendben! 78. Adja meg azt az SQL utasítást, amely lekérdezi azoknak a szakácsoknak a nevét, akik csak EDESSEG ételféleséget készítenek! 79. Adja meg azt az SQL utasítást, amely lekérdezi azokat a dátumokat, amikor a) van 5. étkezés b) nincs 5. étkezés c) az utolsó étkezés a 3. étkezés! 80. Adja meg azt az SQL utasítást, amely lekérdezi azoknak a szakácsoknak a nevét, akik nem főznek levest! Nézettáblák készítése, megszüntetése Feladatok - SQL 176 Az adatbáziskezelés alapjai 81. Készítsen nézettáblát OLCSO névvel, amely a 100 Ft-nál olcsóbb ételek

nevét, tápértékét és árát tartalmazza! 82. Készítsen nézettáblát HUSOK névvel, amely a HUS ételek nevét, árát elkészítési idejét, valamint a szakács nevét és fokozatát tartalmazza! 83. Készítsen nézettáblát ETLAP névvel, amely a július 1-jei étrendet tartalmazza, a táblában szerepeljen az étkezés száma, az étel neve, ára és a szakács neve! 84. Adja meg azt az SQL utasítást, amely az ETLAP táblából lekérdezi a július 1-jei 3 étkezésen terítékre kerülő étel nevét, árát és a szakács nevét! 85. Szüntesse meg az ETLAP nevű nézettáblát! Sorok törlése, táblák megszüntetése 86. Törölje az ETREND táblából a február 1-jei étkezéseket! 87. Törölje az ETEL táblából a 300 kcal-nál táplálóbb ételeket! 88. Törölje a SZAKACS táblából az 1960 előtt született KUTA fokozatú szakácsokat! 89. Törölje az ETREND tábla minden sorát! 90. Szüntesse meg az ETREND táblát! 177 Az adatbáziskezelés

alapjai Feladatok - SQL 23.22 II feladatsor ORSZAG tábla (ORSZÁG) mező neve típusa mérete tizedes tartalma okod N 5 ország kódja onev C 25 neve foldresz C 10 földrész terulet N 7 nepesseg N 6 népesség (ezer fő) legmag N 5 legmagasabb pontja (m) területe (ezer km2) 2 A táblában az okod oszlop elsődleges kulcs, az fszel és az fhossz oszlopokban pedig nem lehet üres mező. Ez a tábla a Föld országainak adatait tartalmazza. ALLAT tábla (ÁLLAT) mező neve típusa mérete tizedes tartalma akod N 5 állat kódja anev C 30 neve faj C 30 fajta neve suly N 7 2 súlya kg hossz N 7 2 hossza cm szdatum D okod N születési dátum 5 A táblában az akod oszlop elsődleges kulcs. Ez a tábla egy állatkert állatainak adatait tartalmazza. származási ország kódja Feladatok - SQL 178 Az adatbáziskezelés alapjai Táblák létrehozása, feltöltése 91. Írja le azokat az SQL utasításokat, melyekkel a

fenti táblák létrehozhatók! 92. Készítsen indexállományokat az előző táblákhoz ORIND és ALIND névvel! 93. Írja le azt az SQL utasítást, amely az ORSZAG táblába felviszi a következő sort: 12345,MAGYARORSZAG,EUROPA,93,10679,1014 94. Adja meg azt az SQL utasítást, amely az ALLAT táblába felvisz egy sort, melynek tartalma akod : 23232 anev : TATU hossz : 120 Lekérdezési feladatok (SELECT) 95. Adja meg azt az SQL utasítást, amely lekérdezi az ALLAT tábla teljes tartalmát! 96. Adja meg azt az SQL utasítást, amely az ALLAT táblából lekérdezi az összes állatnevet! 97. Adja meg azt az SQL utasítást, amely az ORSZAG táblából lekérdezi a különböző földrészek nevét! 98. Adja meg azt az SQL utasítást, amely betűrendben kiírja az országok nevét! 99. Adja meg azt az SQL utasítást, amely súly szerint csökkenő sorrendben kiírja az állatok nevét, hosszát és súlyát! 100. Adja meg azt az SQL utasítást, amely kiírja az országok

nevét, és hogy melyik földrészen találhatók, a földrészek neve szerinti betűrendben, az egyes földrészeken belül pedig az országok neve szerinti betűrendben! 101. Adja meg azt az SQL utasítást, amely kiírja az állatok nevét és születési dátumát, születési dátum szerint csökkenő sorrendben! 102. Adja meg azt az SQL utasítást, amely kiírja az országok nevét és területét a terület szerint csökkenő sorrendben. Az azonos területű országok betűrendben kövessék egymást! 103. Adja meg azt az SQL utasítást, amely kiírja az Európában található országok nevét és területét! Az adatbáziskezelés alapjai 179 Feladatok - SQL 104. Adja meg azt az SQL utasítást, amely kiírja a CSIKOS nevű állat hosszát, súlyát és születési dátumát! 105. Adja meg azt az SQL utasítást, amely kiírja Franciaország adatait! 106. Adja meg azt az SQL utasítást, amely kiírja a 30 ezer km2-nél nagyobb területű országok nevét, területét

és a földrész nevét, ahol találhatók! 107. Adja meg azt az SQL utasítást, amely kiírja azon országok nevét, melyek népessége 20 és 50 millió fő közötti! 108. Adja meg azt az SQL utasítást, amely kiírja az Európában, Afrikában, vagy Ázsiában fekvő, 8 ezer km2-nél kisebb területű országok nevét! 109. Adja meg azt az SQL utasítást, amely kiírja azon 1992 után született állatok nevét, súlyát és születési dátumát, melyek súlya több, mint 100 kg! 110. Adja meg azt az SQL utasítást, amely kiírja az 5 és 10 kg közötti súlyú állatok nevét, súlyát és születési dátumát, születési dátum szerint növekvő sorrendben! 111. Adja meg azt az SQL utasítást, amely kiírja azoknak az állatoknak az adatait az állatok neve szerint betűrendben, amelyek vagy 50 kg-nál súlyosabbak, vagy 1950 előtt születtek! 112. Adja meg azt az SQL utasítást, amely lekérdezi a V betűvel kezdődő nevű állatok adatait, születési dátum

szerinti sorrendben! 113. Adja meg azt az SQL utasítást, amely lekérdezi azoknak az állatoknak a nevét és fajtáját, amelyeknek a neve 7 betűből áll, és a 4. betű A! 114. Adja meg azt az SQL utasítást, amely lekérdezi azon országok adatait, amelyek nevének a 3 betűje E! 115. Adja meg azt az SQL utasítást, amely lekérdezi azon állatok nevét, fajtáját és születési idejét, amelyeknek nem ismerjük a származási helyét! Oszlopfüggvények, belső SELECT-ek Feladatok - SQL 180 Az adatbáziskezelés alapjai 116. Adja meg azt az SQL utasítást, amely kiírja, hogy hány ország szerepel az ORSZAG táblában! 117. Adja meg azt az SQL utasítást, amely kiírja, hogy mekkora a legnagyobb ország területe! 118. Adja meg azt az SQL utasítást, amely kiírja, hogy melyik a legnagyobb ország, és mekkora a területe! 119. Adja meg azt az SQL utasítást, amely kiírja a legkisebb népességű ország nevét és a népesség számát! 120. Adja meg azt az

SQL utasítást, amely kiírja az európai országok a) területének összegét b) területének átlagát! 121. Adja meg azt az SQL utasítást, amely kiírja a) földrészenként az országok területének összegét! b) földrészenként az 5 millió lakosnál nagyobb országok területének összegét! 122. Adja meg azt az SQL utasítást, amely kiírja, hogy a) hány 2 q-nál súlyosabb állat van az állatkertben! b) Hány olyan állat van, amelynek ismert a származási helye! c) Hány olyan állat van, amelynek nem ismert a származási helye! 123. Adja meg azt az SQL utasítást, amely kiírja a legnagyobb és a legkisebb állat súlyát! 124. Adja meg azt az SQL utasítást, amely kiírja a a) a 2 méternél hosszabb b) a 2 cm-nél rövidebb állatok átlagsúlyát! 125. Adja meg azt az SQL utasítást, amely kiírja, hogy hány 5 méternél hosszabb állat él az állatkertben! 126. Adja meg azt az SQL utasítást, amely kiírja, hogy hány 1 cm-nél kisebb állat él az

állatkertben! Táblázatok összekapcsolása, belső SELECT-ek 127. Adja meg azt az SQL utasítást, amely kiírja, hogy hány olyan állat él az állatkertben, amely Magyarországról származik! Az adatbáziskezelés alapjai 181 Feladatok - SQL 128. Adja meg azt az SQL utasítást, amely kiírja a Magyarországról származó állatok nevét betűrendben! 129. Adja meg azt az SQL utasítást, amely kiírja származási helyük szerint földrészenként és országonként az állatkertben élő állatokat. A képernyőn a következő adatok szerepeljenek: földrész, ország neve, állat neve, fajtája. Az adatok földrész, azon belül országnév és állatnév szerinti rendezettségben jelenjenek meg! 130. Adja meg azt az SQL utasítást, amely kiírja azon országok nevét, amelyekből GORILLA fajtájú állat származik! 131. Adja meg azt az SQL utasítást, amely kiírja az Amerikából (földrész) származó, 2 méternél hosszabb állatok nevét, hosszát, hossz

szerint csökkenő sorrendben! Egyesítés, metszet, különbség 132. Adja meg azt az SQL utasítást, amely kiírja azon állatfajtákat, amelyeknek Magyarországról és Olaszországból is származnak egyedei! 133. Adja meg azt az SQL utasítást, amely kiírja azon állatok nevét, amelyek Európából, vagy Ázsiából származnak! 134. Adja meg azt az SQL utasítást, amely kiírja a legnagyobb és a legkisebb súlyú állat nevét! 135. Adja meg azt az SQL utasítást, amely kiírja azon állatfajtákat, amelyeknek vannak Magyarországról származó egyedei, de nincsenek Németországból származók! Nézettáblák készítése, megszüntetése 136. Készítsen nézettáblát EUROALLAT névvel, amelyben az európai állatok neve, fajtája, születési éve és az ország neve szerepel! 137. Adja meg azt az SQL utasítást, amely az EUROALLAT nézettáblából kiírja az európai állatok adatait országnév, azon belül faj, azon belül pedig név szerinti sorrendben! 138.

Adja meg azt az SQL utasítást, amely az EUROALLAT nézettáblából kiírja az 1996-ban született európai állatok nevét, születési évét névsor szerinti sorrendben! Feladatok - SQL 182 Az adatbáziskezelés alapjai 139. Adja meg azt az SQL utasítást, amely megszünteti az EUROALLAT nézettáblát! Táblák tartalmának módosítása, sorok törlése, táblák megszüntetése 140. Adja meg azt az SQL utasítást, amely az ORSZAG táblában módosítja KANADA adatait! A területét változtassa 9976-ra, a földrész pedig legyen AMERIKA ! 141. Adja meg azt az SQL utasítást, amely az ORSZAG táblában minden AFRIKA-i ország népességét megnöveli 2000-rel! 142. Adja meg azt az SQL utasítást, amely az ALLAT táblában az UHU fajtájú állatok súlyát 10 dkg-mal csökkenti! 143. Adja meg azt az SQL utasítást, amely az ORSZAG táblából kitörli a 10 000 km2-nél kisebb területű országokat! 144. Adja meg azt az SQL utasítást, amely az ALLAT táblából

kitörli az 1920 előtt született állatokat! 145. Adja meg azt az SQL utasítást, amely kitörli az ORSZAG tábla minden sorát! 146. Adja meg azt az SQL utasítást, amely megszünteti az ORSZAG táblát! Az adatbáziskezelés alapjai 183 Megoldások - CLIPPER 24. Megoldások 24.1 CLIPPER 24.11 A DBU segédprogram használata 1. A DBU program elindítása után meg kell nyitni az adatállományt ( F2 és a Database kiválasztása, majd a megjelenő ablakból az adatállomány nevét kell kiválasztani, OK ). Ezután az F3 billentyű leütésével, majd a Database kiválasztásával megkapjuk az adatállomány struktúráját. Ezután az F5 billentyű leütésével és a Database kiválasztásával megjelenik a képernyőn az adatállomány tartalma, melyben a nyíl-billentyűk segítségével tudunk közlekedni. 2. A DBU program elindítása után az F3 billentyűt kell leütni és kiválasztani a Database menüpontot. A megjelenő táblázatot ki kell tölteni a

feladatban megadottaknak megfelelően Az egyes értékek beütése után ENTER-t kell ütni. A következő sorba a lefelé nyíllal léphetünk A táblázat kitöltése után az F4 billentyű leütésével kérjük a struktúra elmentését. Ekkor kell megadni az állomány nevét. A név beütése után az OK -ra kell ENTER-t ütni 3. A DBU program elindítása után nyissuk meg a kívánt adatállományt (ARU.DBF) az 1 feladatban leírtaknak megfelelően. Az F3 billentyű (Create) leütése után válasszuk az index menüpontot. A megjelenő ablakba be kell írni az indexállomány nevét (amelyet létre szeretnénk hozni, pl. ARIND), majd a kulcsmező nevét (akod) Az OK-ra üssünk ENTER-t A bal felső sarokban megjelenő üzenet jelzi, hogy az indexállomány létre jött. 4. Az 1. feladat b) pontjában ismertetett módon nyissuk meg az adatállományt, majd jelenítsük meg a tartalmát a képernyőn. Mivel az adatállományunk üres, így csak az üres táblázatot fogjuk

látni. A táblázatban töltsünk ki 5 sort Egy-egy mezőbe belépni, illetve kilépni belőle az ENTER billentyűvel lehet. ůj sorba a lefelé nyíllal léphetünk 5. Az 1. feladat b) pontjában ismertetett módon nyissuk meg az adatállományt, majd jelenítsük meg a tartalmát a képernyőn. A DELETE billentyű leütésével az 1 rekordot törlésre állítjuk A táblázat fejlécében megjelenik a <DELETED> felirat. Ezután a lefelé nyíl segítségével pozícionáljunk a 4. rekordra, majd üssük le a DELETE billentyűt Megoldások - CLIPPER 184 Az adatbáziskezelés alapjai 6. Az 1. feladatban ismertetett módon nyissuk meg az adatállományt Az F6 billentyű leütésére megjelenő menüből válasszuk ki a PACK menüpontot. A bal felső sarokban megjelenő kérdésre válaszoljunk az Y leütésével. A megjelenő üzenet jelzi a művelet végrehajtását 7. Az 1. feladat b) pontjában ismertetett módon nyissuk meg az adatállományt Az F6 billentyű

leütésére megjelenő menüből válasszuk ki a ZAP menüpontot. A bal felső sarokban megjelenő kérdésre válaszoljunk az Y leütésével. A megjelenő üzenet jelzi a művelet végrehajtását A DBU programból az ESC billentyűvel lehet kilépni! Az adatbáziskezelés alapjai 185 Megoldások - SQL 24.2 SQL 24.21 I feladatsor 8. CREATE TABLE etel (ekod NUMBER(5) PRIMARY KEY, enev CHAR(40), etelf CHAR(25), kaloria NUMBER(7,2), ar NUMBER(6,2), keszido NUMBER(5), skod NUMBER(3)) CREATE TABLE etrend (ho NUMBER(2) NOT NULL, nap NUMBER(2) NOT NULL, etszam NUMBER(1) NOT NULL, ekod NUMBER(5)) CREATE TABLE szakacs (skod NUMBER(3) PRIMARY KEY, snev CHAR(40), szev NUMBER(4), fokozat CHAR(10)) A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreternél a NUMBER adattípusnak nem adható meg a hossza, ezért célszerűbb a DECIMAL adattípust használata. Az elsődleges kulcs definíciója pedig az oszlopmegadások után következik: CREATE TABLE etel (ekod

DECIMAL(5), enev CHAR(40), etelf CHAR(25), kaloria DECIMAL(7,2), ar DECIMAL(6,2), keszido DECIMAL(5), skod DECIMAL(3), PRIMARY KEY (ekod)) Megoldások - SQL 186 Az adatbáziskezelés alapjai CREATE TABLE etrend (ho DECIMAL(2) NOT NULL, nap DECIMAL(2) NOT NULL, etszam DECIMAL(1) NOT NULL, ekod DECIMAL(5)) CREATE TABLE szakacs (skod DECIMAL(3), snev CHAR(40), szev DECIMAL(4), fokozat CHAR(10) PRIMARY KEY (skod)) 9. CREATE INDEX etind ON etel(ekod) CREATE INDEX szakind ON szakacs(skod) A GUPTA adatbáziskezelő rendszer megköveteli, hogy az elsődleges kulcsra UNIQUE indexet hozzunk létre. Addig a tábla nem használható: CREATE UNIQUE INDEX etind ON etel(ekod) CREATE UNIQUE INDEX szakind ON szakacs(skod) 10. INSERT INTO etel (ekod,enev,etelf,kaloria,ar,keszido,skod) VALUES (34231,DERELYE,TESZTA,350,80,140,123) Mivel a sor minden mezője kitöltésre kerül és ismerjük a táblában az oszlopok sorrendjét, az oszlopok felsorolása kimaradhat az utasításból: 11. INSERT

INTO etel VALUES (34231,DERELYE,TESZTA,350,80,140,123) A megadott adatokat az INSERT utasítás segítségével lehet felvinni a táblákba az előző feladatban ismertetett módon. 12. UPDATE etel SET ar=120, kaloria=210 WHERE ekod=54321 13. UPDATE etel SET ar=ar+20 14. UPDATE etel SET keszido=keszido-20 WHERE kaloria>300 Az adatbáziskezelés alapjai 187 Megoldások - SQL 15. SELECT * FROM etel 16. SELECT * FROM etel WHERE etelf=LEVES 17. SELECT enev,ar FROM etel WHERE etelf IN(LEVES,HUS,GYUMOLCS) 18. SELECT enev,etelf,kaloria FROM etel WHERE kaloria>200 19. SELECT enev,ar,kaloria FROM etel WHERE ar<150 ORDER BY ar 20. SELECT env,etelf,keszido FROM etel WHERE keszido<=30 ORDER BY keszido DESC 21. SELECT DISTINCT etelf FROM etel 22. SELECT enev,kaloria,keszido FROM etel WHERE kaloria BETWEEN 100 AND 300 ORDER BY kaloria DESC, enev 23. SELECT enev,ar,keszido FROM etel WHERE etelf=HUS AND ar BETWEEN 200 AND 500 ORDER BY ar DESC, keszido DESC 24. a) SELECT * FROM

szakacs ORDER BY szev b) SELECT * FROM szakacs ORDER BY szev DESC 25. SELECT * FROM szakacs ORDER BY fokozat, szev DESC 26. SELECT DISTINCT fokozat FROM szakacs 27. SELECT snev,szev FROM szakacs WHERE fokozat=MESTER ORDER BY snev 28. SELECT snev,fokozat FROM szakacs WHERE szev<1960 ORDER BY fokozat,snev 29. SELECT * FROM etrend WHERE ho=6 AND nap=21 Megoldások - SQL 188 Az adatbáziskezelés alapjai 30. SELECT * FROM etrend WHERE etszam=3 ORDER BY ho,nap 31. SELECT ekod FROM etrend WHERE ho=2 AND nap=1 AND etszam=5 32. SELECT * FROM etel WHERE enev LIKE B% 33. SELECT enev,ar FROM etel WHERE enev LIKE O% 34. SELECT snev,fokozat FROM szakacs WHERE snev LIKE K R% 35. SELECT MAX(ar) FROM etel 36. SELECT MIN(szev) FROM szakacs 37. SELECT MAX(kaloria) FROM etel 38. SELECT MIN(ar) FROM etel 39. SELECT MAX(ar)-MIN(ar) FROM etel 40. SELECT MAX(szev)-MIN(szev) FROM szakacs 41. SELECT COUNT(*) FROM etel 42. SELECT COUNT(*) FROM etel WHERE etelf=HUS 43. SELECT COUNT(*) FROM szakacs

WHERE fokozat=KUKTA 44. SELECT COUNT(*) FROM etrend WHERE ho=3 AND nap=15 45. a) SELECT COUNT(*) FROM etrend WHERE ekod=20345 b) SELECT COUNT(*) FROM etrend WHERE ekod=20345 AND etszam=1 46. SELECT AVG(kaloria) FROM etel WHERE etelf=EDESSEG 47. SELECT SUM(ar) FROM etel WHERE etelf=GYUMOLCS Az adatbáziskezelés alapjai 189 Megoldások - SQL 48. SELECT AVG(ar) FROM etel WHERE kaloria<200 49. SELECT COUNT(*) FROM etel WHERE keszido>60 A táblázatban az elkészítési idő percben van megadva! 50. SELECT SUM(keszido) FROM etel WHERE etelf=LEVES AND ar<80 51. SELECT MIN(ar) FROM etel WHERE etelf=EDESSEG 52. SELECT MIN(szev) FROM szakacs WHERE fokozat=KUKTA 53. SELECT MAX(ar) FROM etel WHERE kaloria BETWEEN 200 AND 300 54. SELECT snev,szev FROM szakacs WHERE szev=(SELECT MAX(szev) FROM szakacs) 55. SELECT ar,enev, FROM etel WHERE ar=(SELECT MIN(ar) FROM etel) 56. SELECT enev,etelf FROM etel WHERE ar<(SELECT AVG(ar) FROM etel) 57. SELECT snev,szev,fokozat FROM szakacs

WHERE szev<(SELECT AVG(szev) FROM szakacs) ORDER BY szev DESC 58. SELECT fokozat, MIN(szev) FROM szakacs GROUP BY fokozat Az oszlopok megadásánál célszerű a fokozatot is felsorolni, mert egyébként csak a születési éveket kapnánk eredményül, és nem tudnánk, hogy melyik melyik fokozathoz tartozik. Az oszlopok megadásánál az oszlopfüggvénnyel együtt csak az az oszlopnév szerepelhet, amelyre a csoportosítást végezzük. 59. SELECT etelf, AVG(ar) FROM etel GROUP BY etelf 60. SELECT ho, MAX(nap) FROM etrend GROUP BY ho Megoldások - SQL 190 Az adatbáziskezelés alapjai 61. SELECT etelf, SUM(kaloria) FROM etel WHERE keszido<60 GROUP BY etelf 62. a) SELECT ho, COUNT(*) FROM etrend WHERE ekod=12345 GROUP BY ho b) SELECT ho, COUNT(*) FROM etrend WHERE ekod=12345 AND etszam=5 GROUP BY ho 63. SELECT ho, COUNT(*) FROM etrend GROUP BY ho HAVING ho IN(3,4,5) A feltételt WHERE opcióban is megadhatjuk: SELECT ho, COUNT(*) FROM etrend WHERE ho IN(3,4,5) GROUP BY

ho 64. SELECT etelf, AVG(kaloria) FROM etel GROUP BY etelf HAVING etelf IN(TESZTA,EDESSEG) A feltételt WHERE opcióban is megadhatjuk: SELECT etelf, AVG(kaloria) FROM etel WHERE etelf IN(TESZTA,EDESSEG) GROUP BY etelf 65. SELECT enev,ar FROM etel WHERE etelf=LEVES AND ar=(SELECT MIN(ar) FROM etel WHERE etelf=LEVES) A belső SELECT segítségével meghatározzuk a legolcsóbb leves árát. A külső SELECT utasításban leválogatjuk azokat az ételeket, amelyek ára megegyezik a belső SELECT által meghatározott értékkel. Azonban itt is meg kell adni azt a feltételt, hogy a leválogatást csak a levesek közül végezze, hiszen előfordulhat, hogy más ételféleségek között is van olyan étel, amelynek ára megegyezik azzal az árral, amelyet a belső SELECT meghatározott. Ekkor azokat az ételeket is leválogatnánk, pedig mi csak a levesekre vagyunk kíváncsiak. Így tehát a feltételt kétszer kell megadnunk, mind a belső, mind a külső SELECT-ben szerepelnie kell.

Az adatbáziskezelés alapjai 191 Megoldások - SQL 66. SELECT snev FROM szakacs WHERE fokozat=MESTER AND szev=(SELECT MIN(szev) FROM szakacs WHERE fokozat=MESTER) A fokozatra vonatkozó feltételt mind a belső, mind a külső SELECT-ben meg kellett adni, hasonlóan az előző feladat megoldásához. 67. SELECT enev,etelf,ar,snev,fokozat FROM etel,szakacs WHERE etel.skod=szakacsskod ORDER BY etelf,enev 68. SELECT enev,ar,snev FROM etel,szakacs WHERE etelf=HUS AND etel.skod=szakacsskod 69. SELECT nap,etszam,enev FROM etrend,etel WHERE ho=5 AND etel.ekod=etrendekod ORDER BY nap,etszam 70. SELECT etszam,enev,szakacs FROM etrend,etel,szakacs WHERE ho=7 AND nap=23 AND etrend.ekod=etelekod AND etel.skod=szakacsskod 71. SELECT enev,etelf FROM etel WHERE skod= (SELECT skod FROM szakacs WHERE snev=FALANK EDE) Ahhoz, hogy meghatározzuk a Falánk Ede által készített ételeket, meg kell tudnunk, hogy mi a kódja ennek a szakácsnak, hiszen a az ETEL táblában csak a szakácsok kódja

szerepel, a nevük nem. A név alapján a kódot a SZAKACS táblából tudjuk kikeresni Erre szolgál a belső SELECT. A külső SELECT segítségével válogatjuk le a keresett ételeket A feladatot a két tábla összekapcsolásával is meg lehet oldani: SELECT enev,etelf FROM etel,szakacs WHERE etel.skod=szakacsskod AND snev=FALANK EDE 72. SELECT DISTINCT ho,nap FROM etrend WHERE ekod=(SELECT ekod FROM etel WHERE skod= (SELECT skod FROM szakacs WHERE snev=FALANK EDE)) Megoldások - SQL 192 Az adatbáziskezelés alapjai Ez az utasítás három egymásba ágyazott SELECT utasításból áll. A legbelső meghatározza a Falánk Ede nevű szakács kódját, a következő pedig azon ételek kódját, amelyeket ő készít el. A külső SELECT az étrendből kiválasztja azokat a napokat, amikor az előbb meghatározott ételek lesznek terítéken. Mivel egy nap több ételt is készíthet Falánk Ede, csak a különböző napokat íratjuk ki. A leválogatást a három tábla

összekapcsolásával is megfogalmazhatjuk: SELECT DISTINCT ho,nap FROM etrend,etel,szakacs WHERE snev=FALANK EDE AND etrend.ekod=etelekod AND etelskod=szakacsskod 73. SELECT snev,fokozat FROM szakacs WHERE skod= (SELECT skod FROM etel WHERE ekod= (SELECT ekod FROM etrend WHERE ho=5 AND nap=25)) Ez az utasítás három egymásba ágyazott SELECT utasításból áll. A legbelső meghatározza a május 25-i ételek kódját, a következő az ezeket elkészítő szakácsok kódját, a külső SELECT pedig ezen szakácsok nevét és fokozatát. A leválogatást a három tábla összekapcsolásával is megfogalmazhatjuk: SELECT snev,fokozat FROM etrend,etel,szakacs WHERE ho=5 AND nap=25 AND etrend.ekod=etelekod AND etelskod=szakacsskod 74. SELECT enev,ar FROM etel WHERE ar> (SELECT ar FROM etel WHERE enev=RANTOTT SZELET) vagy: SELECT x.enev,xar FROM etel x ,etel y WHERE x.ar>yar AND yenev=RANTOTT SZELET Ebben a megfogalmazásban a lekérdezést két tábla összekapcsolásával

oldottuk meg. Mind a két tábla az ETEL tábla. Elkészítettük az ETEL tábla önmagával vett direkt szorzatát, és azokat a sorokat választottuk ki belőle, ahol a második ételnév a rántott szelet és az első ár nagyobb, mint a második ár. A SELECT utasításban a két ETEL táblát meg kell különböztetni egymástól, ezért az egyiket x-nek, a másikat y-nak hívjuk. Az oszlopnevek megadásakor mindig jelezni kell, hogy melyik tábla oszlopáról van szó. Az adatbáziskezelés alapjai 193 Megoldások - SQL 75. SELECT ho,nap,SUM(ar) FROM etel,etrend WHERE etel.ekod=etrendekod GROUP BY ho,nap 76. a) SELECT enev,ar,kaloria FROM etel WHERE ar<(SELECT AVG(ar) FROM etel) UNION SELECT enev,ar,kaloria FROM etel WHERE keszido<(SELECT AVG(keszido) FROM etel) b) SELECT enev,ar,kaloria FROM etel WHERE ar<(SELECT AVG(ar) FROM etel) INTERSECT SELECT enev,ar,kaloria FROM etel WHERE keszido<(SELECT AVG(keszido) FROM etel) A feladat első részében a két

feltétel valamelyikének teljesülését követeltük meg, ezért a két leválogatás eredménytáblájának unióját képeztük. A második részben a két feltételnek együttesen kell teljesülnie, ezért a két eredménytábla metszetét kell képeznünk. 77. SELECT enev FROM etel WHERE ekod IN (SELECT ekod FROM etrend WHERE eszam=1 INTERSECT SELECT ekod FROM etrend WHERE eszam=5) A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza az INTERSECT műveletet. 78. SELECT snev FROM szakacs WHERE skod IN (SELECT skod FROM etel WHERE etelf=EDESSEG MINUS SELECT skod FROM etel WHERE etelf<>EDESSEG) A belső SELECT első része kiválasztja azoknak a szakácsoknak a kódját, akik készítenek édességet, a második rész pedig azokét választja ki, akik más ételeket főznek. Az édességet készítő szakácsok halamzából kivonjuk azoknak a szakácsoknak a halmazát, akik más ételféleséget készítenek. Az így kapott halmaz azoknak a

szakácsoknak a kódját fogja tartalmazni, akik csak édességet készítenek. A külső SELECT-ben a szakacs táblából meghatározzuk a szakácsok nevét. Megoldások - SQL 194 Az adatbáziskezelés alapjai A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza a MINUS műveletet. 79. a) SELECT ho,nap FROM etrend WHERE etszam=5 b) SELECT ho,nap FROM etrend MINUS SELECT ho,nap FROM etrend WHERE etszam=5 Az étrend táblából kiválasztjuk a különböző dátumokat, majd kivonjuk belőle azokat a dátumokat, amelyeken van 5. étkezés Ez a parancs nem helyettesíthető egy olyan leválogatással, amelynek feltétele az, hogy etszam<>5 . Ez ugyanis minden olyan hónapot és napot leválogatna, amelyen van 5-től különböző számú étkezés. Azonban ezeken a napokon lehet 5 étkezés is c) SELECT ho,nap FROM etrend WHERE etszam=3 MINUS SELECT ho,nap FROM etrend WHERE etszam>3 Az étrend táblából kiválasztjuk azokat a napokat,

amelyeken van 3. étkezés, majd kivonjuk belőle azokat a napokat, amelyeken van 3-nál nagyobb számú étkezés. A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza a MINUS műveletet. 80. SELECT snev FROM szakacs WHERE skod NOT IN (SELECT skod FROM etel WHERE etelf=LEVES) vagy: SELECT snev FROM szakacs WHERE NOT EXISTS (SELECT * FROM etel WHERE etelf=LEVES AND szakacs.skod=etelskod) 81. CREATE VIEW olcso AS SELECT enev,kaloria,ar FROM etel WHERE ar<100 82. CREATE VIEW husok AS SELECT enev,ar,keszido,snev,fokozat FROM etel,szakacs WHERE etelf=HUS AND etel.skod=szakacsskod Az adatbáziskezelés alapjai 195 Megoldások - SQL 83. CREATE VIEW etlap AS SELECT etszam,enev,ar,snev FROM etel,etrend,szakacs WHERE ho=7 AND nap=1 AND etel.ekod=etrendekod AND etelskod=szakacsskod 84. SELECT enev,ar,snev FROM etlap WHERE etszam=3 85. DROP VIEW etlap 86. DELETE FROM etrend WHERE ho=2 AND nap=1 87. DELETE FROM etel WHERE kaloria >300 88. DELETE FROM

szakacs WHERE szev<1960 AND fokozat=KUKTA 89. DELETE etrend Az ETREND tábla minden sora törlődik, de maga a tábla megmarad, így bármikor vihetünk fel újabb sorokat a táblába. 90. DROP TABLE etrend Megoldások - SQL 196 Az adatbáziskezelés alapjai 24.22 II feladatsor 91. CREATE TABLE orszag (okod NUMBER (5) PRIMARY KEY, onev CHAR(25), foldresz CHAR(10), terulet NUMBER(7,2), ed fszel fhossz CHAR(1), NUMBER(3) NOT NULL, NUMBER(3) NOT NULL) CREATE TABLE allat (akod NUMBER(5) PRIMARY KEY, anev CHAR(30), faj CHAR(30), suly NUMBER(7,2), hossz NUMBER(7,2), szdatum DATE) A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreternél a NUMBER adattípusnak nem adható meg a hossza, ezért célszerűbb a DECIMAL adattípust használata. Az elsődleges kulcs definíciója pedig az oszlopmegadások után következik: CREATE TABLE orszag (okod NUMBER (5), onev CHAR(25), foldresz CHAR(10), terulet NUMBER(7,2), ed CHAR(1), fszel NUMBER(3) NOT NULL, fhossz NUMBER(3)

NOT NULL PRIMARY KEY (okod)) Az adatbáziskezelés alapjai 197 Megoldások - SQL CREATE TABLE allat (akod NUMBER(5), anev CHAR(30), faj CHAR(30), suly NUMBER(7,2), hossz NUMBER(7,2), szdatum DATE PRIMARY KEY (akod)) 92. CREATE INDEX orind ON orszag(okod) CREATE INDEX alind ON allat(akod) A GUPTA adatbáziskezelő rendszer megköveteli, hogy az elsődleges kulcsra UNIQUE indexet hozzunk létre. Addig a tábla nem használható: CREATE UNIQUE INDEX orind ON orszag(okod) CREATE UNIQUE INDEX alind ON allat(akod) 93. INSERT INTO orszag (okod,onev,foldresz,terulet,nepesseg,legmag) VALUES (12345,MAGYARORSZAG,EUROPA,93,10000,1014) Mivel a rekord minden mezője értéket kap, a mezőneveket nem kell felsorolni, az utasítás így is megadható: INSERT INTO orszag VALUES (12345,MAGYARORSZAG,EUROPA,93,10000,1014) 94. INSERT INTO allat (akod,anev,hossz) VALUES (23232,TATU,120) Ebben az utasításban a rekordnak csak néhány mezője kap értéket, ezért itt fel kell sorolni azokat a

mezőneveket, amelyekre az értékadás vonatkozik. 95. SELECT * FROM allat 96. SELECT anev FROM allat 97. SELECT DISTINCT foldresz FROM orszag Megoldások - SQL 198 Az adatbáziskezelés alapjai Az ORSZAG állományban előforduló földrésznevek közül mindegyiket csak egyszer szeretnénk kiírni, ezért szükséges a DISTINCT opció. 98. SELECT onev FROM orszag ORDER BY onev 99. SELECT anev,hossz,suly FROM allat ORDER BY suly DESC 100. SELECT onev,foldresz FROM orszag ORDER BY foldresz,onev 101. SELECT anev,szdatum FROM allat ORDER BY szdatum DESC 102. SELECT onev,terulet FROM orszag ORDER BY terulet DESC, onev Figyeljünk arra, hogy a rendezésnél a DESC opciót mindig azután a mezőnév után kell írni, amelyik szerint csökkenő sorrendben szeretnénk rendezni. Ha több mező szerint is csökkenő rendezettséget szeretnénk elérni, a DESC opciót minden egyes mezőnév után ki kell írni. 103. SELECT onev,terulet FROM orszag WHERE foldresz=EUROPA 104. SELECT

hossz,suly,szdatum FROM allat WHERE anev=CSIKOS 105. SELECT * FROM orszag WHERE onev=FRANCIAORSZAG 106. SELECT onev,terulet,foldresz FROM orszag WHERE terulet>30 107. SELECT onev FROM orszag WHERE nepesseg BETWEEN 20 AND 50 108. SELECT onev FROM orszag WHERE foldresz IN(EUROPA,AFRIKA,AZSIA) AND terulet<8 vagy: SELECT onev FROM orszag WHERE (foldresz=EUROPA OR foldresz=AFRIKA OR foldresz=AZSIA) AND terulet<8 109. SELECT anev,suly,szdatum FROM allat WHERE suly>100 AND szdatum>1992DEC-31 110. SELECT anev,suly,szdatum FROM allat WHERE suly BETWEEN 5 AND 10 ORDER BY szdatum 199 Az adatbáziskezelés alapjai Megoldások - SQL 111. SELECT * FROM allat WHERE suly>50 OR szdatum<1950-JAN-01 ORDER BY anev 112. SELECT * FROM allat WHERE anev LIKE V% ORDER BY szdatum 113. SELECT anev,faj FROM allat WHERE anev LIKE A Az A betű előtt és után 3 aláhúzás karakter van, amely a név első, illetve utolsó 3 ismeretlen betűjét helyettesíti. 114. SELECT * FROM

orszag WHERE onev LIKE E% Az E betű előtt két aláhúzás karakter van. 115. SELECT anev,faj,szdatum FROM allat WHERE okod IS NULL 116. SELECT COUNT(*) FROM orszag 117. SELECT MAX(terulet) FROM orszag 118. SELECT onev,terultet FROM orszag) FROM orszag WHERE terulet=(SELECT MAX(terulet) Azt a sort, amelyben a legnagyobb területérték szerepel, csak belső SELECT segítségével tudjuk kiválasztani. A belső SELECT eredménye a területértékek maximuma A külső SELECT feltétele pedig az, hogy olyan sort (sorokat) keresünk, amelyben a területérték megegyezik a belső SELECT által adott maximális értékkel. 119. SELECT onev,nepesseg FROM orszag WHERE nepesseg=(SELECT MIN(nepesseg) FROM orszag) 120. a) SELECT SUM(terulet) FROM orszag WHERE foldresz=EUROPA b) SELECT AVG(terulet) FROM orszag WHERE foldresz=EUROPA 121. a) SELECT foldresz, SUM(terulet) FROM orszag GROUP BY foldresz b) SELECT foldresz, SUM(terulet) FROM orszag WHERE nepesseg>5000 GROUP BY foldresz

Megoldások - SQL 200 Az adatbáziskezelés alapjai Azt, hogy az összegzésben csak azon országok vegyenek részt, amelyek lakossága 5 millió fölött van, a WHERE feltételben tudjuk megfogalmazni. Vigyázat, ezt nem írhatjuk HAVING opcióként, mert a feltétel nem arra a mezőre vonatkozik, amelyik szerint a csoportképzés történik. 122. a) SELECT COUNT(*) FROM allat WHERE suly>200 b) SELECT COUNT(okod) FROM allat c) SELECT COUNT(*)-COUNT(okod) FROM allat 123. SELECT MAX(suly), MIN(suly) FROM allat 124. a) SELECT AVG(suly) FROM allat WHERE hossz>200 b) SELECT AVG(suly) FROM allat WHERE hossz<2 125. SELECT COUNT(*) FROM allat WHERE hossz>500 126. SELECT COUNT(*) FROM allat WHERE hossz<1 127. SELECT COUNT(*) FROM allat WHERE okod=(SELECT okod FROM orszag WHERE onev=MAGYARORSZAG) Ahhoz, hogy megállapítsuk, hogy hány állat származik Magyarországról, meg kell keresnünk Magyarország kódját az ORSZAG táblában. Ezért szükséges a belső SELECT A

feladatot megoldhatjuk az ALLAT és az ORSZAG tábla összekapcsolásával is: SELECT COUNT(*) FROM allat,orszag WHERE onev=MAGYARORSZAG AND allat.okod=orszagokod 128. SELECT anev FROM allat WHERE okod= (SELECT okod FROM orszag WHERE onev=MAGYARORSZAG) ORDER BY anev A feladatot megoldhatjuk a két tábla összekapcsolásával is. Ebből a táblából azon sorokat kell kiválasztani, amelyekben az országnév MAGYARORSZAG. Az oszlopok közül pedig csak az Az adatbáziskezelés alapjai 201 Megoldások - SQL anev oszlopot kell megjeleníteni: SELECT anev FROM allat,orszag WHERE allat.okod=orszagokod AND onev=MAGYARORSZAG ORDER BY anev 129. SELECT foldresz,onev,anev,faj FROM orszag,allat WHERE orszagokod=allatokod ORDER BY foldresz,onev,anev A feladatot a két tábla összekapcsolásával oldhatjuk meg. Az eredménytábla minden sorát meg kell jeleníteni, ezért a WHERE opcióban csak az összeekapcsolási feltétel szerepel. Az oszlopok közül csak a feladatban megadott

oszlopokat kell kiírni, ezek felsorolása szerepel a SELECT kulcsszó után. A rendezési feltételeket az ORDER BY opcióban adtuk meg 130. SELECT onev FROM orszag WHERE okod IN (SELECT okod FROM allat WHERE faj=GORILLA) A belső SELECT több országkódot is eredményezhet, ezért szükséges az egyenlőségjel helyett az IN operátor használata. vagy: SELECT onev FROM orszag,allat WHERE orszag.okod=allatokod AND anev=GORILLA 131. SELECT anev,hossz FROM allat WHERE okod IN (SELECT okod FROM orszag WHERE foldresz=AMERIKA) AND hossz>200 ORDER BY hossz DESC A belső SELECT több országkódot ad eredményül, ezért szükséges az egyenlőségjel helyett az IN operátor használata. vagy: SELECT anev,hossz FROM allat,orszag WHERE allat.okod=orszagokod AND hossz>200 AND foldresz=AMERIKA ORDER BY hossz DESC 132. SELECT faj FROM allat WHERE okod= (SELECT okod FROM orszag WHERE onev=MAGYARORSZAG) INTERSECT SELECT faj FROM allat WHERE okod= Megoldások - SQL 202 Az

adatbáziskezelés alapjai (SELECT okod FROM orszag WHERE onev=OLASZORSZAG) Egy SELECT utasítással kiválasztjuk azon állatfajtákat, amelyeknek származnak egyedei Magyarországról, a másik SELECT utasítással pedig azon állatfajtákat, amelyeknek származnak egyedei Olaszországból. A két eredménytábla metszete adja azon állatfajtákat, amelyek mindkét országból származnak egyedei. A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza az INTERSECT műveletet. 133. SELECT (SELECT UNION SELECT (SELECT anev FROM allat WHERE okod IN okod FROM orszag WHERE foldresz=EUROPA) anev FROM allat WHERE okod IN okod FROM orszag WHERE foldresz=AZSIA) Az első SELECT utasítással kiválasztjuk az európai állatokat (olyan országokból származó állatok, amelyek Európábnan vannak), a második SELECT utasítással az ázsiai állatokat választjuk ki. Mindkét SELECT tartalmaz egy belső SELECT-et A két eredménytábla azonos felépítésű,

egyesítésük adja az Európából és Ázsiából származó állatok nevét. Egyesítés nélkül, egyetlen SELECT utasítással - és belső SELECT-ekkel - is megkaphatjuk a kívánt eredményt: SELECT anev FROM allat WHERE okod IN (SELECT okod FROM orszag WHERE foldresz IN(EUROPA,AZSIA)) vagy: SELECT anev FROM allat,orszag WHERE allat.okod=orszagokod AND foldresz IN(EUROPA,AZSIA) 134. SELECT anev FROM allat WHERE suly=(SELECT MAX(suly) FROM allat) UNION SELECT anev FROM allat WHERE suly=(SELECT MIN(suly) FROM allat) Az adatbáziskezelés alapjai 135. SELECT (SELECT MINUS SELECT (SELECT 203 Megoldások - SQL faj FROM allat WHERE okod= okod FROM orszag WHERE onev=MAGYARORSZAG) faj FROM allat WHERE okod= okod FROM orszag WHERE onev=NEMETORSZAG) Az első SELECT utasítással azon állatfajtákat határozzuk meg, amelyek Magyarországról származnak. A második SELECT utasítással pedig a Németországból származó fajtákat választjuk ki. Az első erdménytáblából ki

kell vonni a második eredménytáblát Így az első eredménytáblának csak azon sorai maradnak meg, amelyek a második eredménytáblában nem szerepelnek, vagyis azon állatfajták, amelyeknek vannak Magyarországról származó egyedei, de nincsenek Németországból származó egyedei. A GUPTA adatbáziskezelő rendszerben megvalósított SQL interpreter nem tartalmazza a MINUS műveletet. 136. CREATE VIEW EUROALLAT AS SELECT anev,faj,szev,onev FROM allat,orszag WHERE foldresz=EUROPA AND allat.okod=orszagokod 137. SELECT * FROM euroallat ORDER BY onev,faj,anev 138. SELECT anev,szev FROM euroallat WHERE szev=1996 ORDER BY szev 139. DROP VIEW euroallat 140. UPDATE orszag SET terulet=9976, foldresz=AMERIKA WHERE onev=KANADA 141. UPDATE orszag SET nepesseg=nepesseg+2 WHERE foldresz=AFRIKA 142. UPDATE allat SET suly=suly-01 WHERE faj=UHU 143. DELETE FROM orszag WHERE terulet<10 144. DELETE FROM allat WHERE szdatum<1920-JAN-01 145. DELETE FROM orszag Mivel az utasításban

feltételt nem adtunk meg, a tábla minden sora törlődik. Ez azonban nem Megoldások - SQL 204 Az adatbáziskezelés alapjai jelenti a tábla megszünését. A tábla továbbra is létezik, csak nincs egyetlen sora sem Bármikor vihetünk fel a táblába adatokat, a mezők leírását továbbra is nyilvántartja a rendszer. 146. DROP TABLE orszag 205 Az adatbáziskezelés alapjai 25. Irodalom Irodalom Könyvek: Ullman, J.D: Principles of DATABASE SYSTEMS, Computer Science Press, Inc, 11 TAft Ct, Rockville, Maryland 20850, 1982 Ullman, J.D - Widom, J: Adatbázisrendszerek - Alapvetés, Panem Kft, 1998 Martin, James : Számítógépes adatbázis-szervezés, Műszaki Könyvkiadó, 1981 Demetrovics - Denev - Pavlov: A számítástudomány matematikai alapjai, Tankönyvkiadó, Budapest, 1985 Horváth Katalin - Szelezsán János: Adatbázisok, Számítástechnika-Alkalmazási Vállalat, Oktatási iroda Sályi János - Szelezsán János: Adatbázisok, SZÁMALK Kiadó, 1991

Halassy Béla: Adatmodellezés, adatbázis-tervezés, Központi Statisztikai Hivatal Nemzetközi Számítástechnikai Oktató és Tájékoztató Központ, Budapest, 1980 Halassy Béla: Adatbázisok kezelésének alapvető kérdései, Számítástechnika-Alkalmazási Vállalat, Budapest, 1982 Quittner Pál - Kotsis Domokos: Számítástechnika rendszerszervezőknek, Akadémiai Kiadó, Budapest, 1989 Detrik Péter: Az SQL nyelvről, Cédrus Kiadó, 1992 Schimdth, J., W - Brodie, M, L: Relational Database Systems (Analisys and Comparison), Springer-Verlag Berlin, Heidelberg, New York, 1983 Kruglinski, David: Database Management Systems, Osborne McGraw - Hill, Berkeley, California Bakonyi Géza - Drótos László - Kokas Károly: Információforrások a hálózaton, Miskolc-Szeged, 1992 Nantucket Clipper, Nantucket Corporation, Los Angeles, California, 1988 Irodalom 206 Az adatbáziskezelés alapjai CA-Clipper Programming and Utilities Guide, Computer Associates International, USA,

1995 ORACLE Server Concepts Manual, Oracle Corporation, USA, 1992 ORACLE Server Administrators Guide, Oracle Corporation, USA, 1992 SQL Language Reference Manual, Oracle Corporation, USA, 1992 SQL*PLUS Users Guide and Reference, Oracle Corporation, USA, 1992 Oracle Text Developers Workbench Forms 4 Guide, Oracle Corporation, USA, 1995 Oracle Text Developers Workbench C Guide, Oracle Corporation, USA, 1995 GUPTA SQLBase Version 5.0 Database Administrators Guide, Gupta Technologies, 1994 GUPTA SQLTalk/Windows UsersGuide, GUPTA Technologies, 1994 GUPTA SQLBASE, SQL Reference, GUPTA Technologies, 1994 Folyóiratok: ORACLE Magazin , Oracle corporation U.SA, 1992-1997 Hálózati információforrások: WEB server, oracle.com Az adatbáziskezelés alapjai 207 Tartalomjegyzék Tartalomjegyzék 1. ELÕSZÓ 1 2. AZ ADATKEZELÉS HAGYOMÁNYOS MÓDJAI 2 3. ADATSZERVEZÉSI ALAPFOGALMAK 4 4. AZ ADATBÁZISOK KIALAKULÁSA 7 5. ADATMODELLEZÉS 11 6. ADATBÁZIS-TÍPUSOK 14 6.1 HIERARCHIKUS

ADATBÁZISOK 14 6.2 HÁLÓS ADATBÁZISOK 15 6.3 RELÁCIÓS ADATBÁZISOK 18 6.31 Normál formák, normalizálási eljárás 20 6.32 Mûveletek relációkon 28 7. INTERAKTÍV ADATBÁZISKEZELÕ RENDSZEREK 34 7.1 KONKURENS MÛVELETEK 34 8. ADATVÉDELEM 38 9. RELÁCIÓS ADATBÁZISKEZELÕ NYELVEK 40 10. A FILE-SERVER ÉS A KLIENS-SERVER ARCHITEKTÚRÁJÚ ADATBÁZISKEZELÕ RENDSZEREK 41 11. OSZTOTT ADATBÁZISOK 43 12. KÉPEK TÁROLÁSA AZ ADATBÁZISBAN 45 13. A DBASE ADATBÁZISKEZELÕ RENDSZER 47 14. A CLIPPER RELÁCIÓS ADATBÁZISKEZELÕ NYELV 49 14.1 ADATÁLLOMÁNYOK LEÍRÁSA, LÉTREHOZÁSA 49 14.2 A DBU SEGÉDPROGRAM HASZNÁLATA 49 14.3 A CLIPPER PROGRAMOZÁSI NYELV 53 14.4 PROGRAMOZÁSI PÉLDÁK 98 15. AZ ORACLE ADATBÁZISKEZELÕ RENDSZER 120 16. AZ SQL ADATBÁZISKEZELÕ NYELV 125 16.1 SQL UTASÍTÁSOK 130 16.2 PROCEDURÁLIS SQL 155 17. AZ SQL NYELV HASZNÁLATA AZ ORACLE ADATBÁZISKEZELÕ RENDSZERBEN 156 18. AZ ORACLE ADATBÁZISKEZELÕ ESZKÖZTÁRA 157 19. A GUPTA

ADATBÁZISKEZELÕ RENDSZER 158 19.1 SQL INTERPRETER A GUPTA ADATBÁZISKEZELÕ RENDSZERBEN 160 20. SZÖVEGES ADATBÁZISOK 162 21. NEMZETKÖZI SZÁMÍTÓGÉPES HÁLÓZATOKON ELÉRHETÕ ADATBÁZISOK 164 Tartalomjegyzék 208 Az adatbáziskezelés alapjai 22. AZ ADATBÁZISKEZELÕ RENDSZEREK ÜZEMELTETÉSE 166 22.1 AZ ORACLE ADATBÁZISKEZELÕ RENDSZER ÜZEMELTETÉSE 167 23. FELADATOK 168 23.1 CLIPPER 168 23.11 DBU program 168 23.2 SQL 169 23.21 feladatsor 169 23.22 feladatsor 177 24. MEGOLDÁSOK 183 24.1 CLIPPER 183 24.11 A DBU segédprogram használata 183 24.2 SQL 185 24.21 feladatsor 185 24.22 II feladatsor 196 25. IRODALOM 205