Content extract
SZAKDOLGOZAT Kovács Róbert 1999. Miskolci Egyetem Dunaújvárosi Főiskolai Kar Modulfejlesztés Relációs rendszerek oktatása Készítette: Kovács Róbert Tankör : TI – 41 Készült : Dunaújváros 1999. Június 2 Tartalomjegyzék 1. Feladatkiírás 2. Bevezetés, célkitűzés . 5 3. Óraterv kidolgozása . 6 4. A tanulást elősegítő nyomtatott anyag (modulfüzet) kidolgozása . 8 4.1 Bevezetés . 8 4.2 Kezdeti követelmények, előfeltételek . 8 4.3 Előismeretek felmérése . 8 4.4 A tanulmányi munka ütemezése 8 4.5 Irodalomjegyzék 9 4.6 A tananyag részletes tartalma . 9 4.7 Konzultációs lehetőségek . 10 4.8 Számonkérés . 10 4.9 Ellenőrző kérdések, gyakorlati feladatok . 10 5. Tanulási segédlet kidolgozása 11 5.1 Az SQL lekérdező nyelv . 11 5.2 Az SQL szerepe, tulajdonságai 5.3 Az SQL elemei 5.31 Jelkészlet . 12 . 12 5.32 Szintaktikai elemek 5.33 Objektumok . 13 . 14 5.34 Tárolt eljárások
5.35 Triggerek . 11 . 15 . 16 5.36 Jelkészletek definíciói 16 5.37 Oszloptípusok definíciói . 18 3 5.4 Adattáblák definíciói 5.41 Létrehozás . 19 . 19 5.42 Egyedi avagy elsődleges kulcsok 5.43 Idegen és közös kulcsok 5.44 Indexek 5.5 . 22 . 23 . 26 Adatok bevitele, módosítása, törlése . 29 5.51 Az INSERT utasítás 30 5.52 Az UPDATE utasítás 31 5.53 A DELETE utasítás . 33 5.6 A lekérdezések . 35 5.7 Az oszlopok egyszerű felsorolása . 35 5.8 Mező kifejezések a SELECT záradékban . 36 5.81 Típus átalakítás . 37 5.82 Számtani műveletek 37 5.83 Karakteres műveletek 37 5.84 Oszlopfüggvények a SELECT záradékban . 38 5.85 Ismétlések elnyomása: a DISTINCT záradék 39 5.86 A WHERE záradék . 39 5.87 A talált sorok rendezése: az ORDER BY záradék . 40 5.88 A talált sorok csoportosítása: a GROUP BY záradék 41 5.89 Csoportosítás feltétellel: a HAVING záradék 42 5.810 Táblák egyesítése: UNION
. 42 5.811 Táblák metszete: INTERSECT . 43 5.812 Táblák különbsége: EXCEPT vagy MINUS 44 5.9 Vezérlő nyelv . 45 6. Elért eredmények kiértékelése és a következtetések levonása . 46 7. Felhasznált irodalom 47 8. Melléklet 48 8.1 A lemezmelléklet tartalma . 48 4 2. Bevezetés, célkitűzés A világ fejlődésével, az információ robbanással olyan hatalmas információs áradatban élünk, amelyet már csak számítógépek segítségével tudunk feldolgozni, ezért elengedhetetlen, hogy megismerkedjünk, másokat is megismertessünk az adatfeldolgozás ezen formájával. Az évek folyamán sokféle adatbázis kezelési formák jelentek meg. A hálós, fa struktúra és a relációs adatbázis kezelés A felhasználás során kikristályosodott egy gyakorlati nyelv, ez az SQL amely létezik mint önálló nyelv is, és valamilyen 3., 4 generációs nyelv adatbáziskezelő kiegészítőnyelveként szerepel Ez egy igazi kihívást jelentett,
célul kitűzni ennek a nyelvnek az elsajátítását, mivel szinte mindenki aki informatikai szakon végez és ezen a területen fog dolgozni elkerülhetetlen hogy ne találkozzon ezekkel a fogalmakkal, ezzel a nyelvel. Így feltétlenül fontosnak tartom a nyelv teljes mélységű elsajátítását. Az óravázlat csak a tájékozódást szolgálja, mivel nagyon nagymértékben függ a hallgatóságtól, a csoport összetételétől. A tanulási folyamathoz elengedhetetlen segítséget nyújt a mellékletben található távoktatási segédlet. A gyakorlati órákhoz teljes mértékben lehet használni, mivel rengeteg példát tartalmaz és végig vezeti a hallgatót a tanulási folyamaton. A segédlet nagyobb részei után önellenőrző kérdéseket is tartalmaz, így ebben a folyamatban is ellenőrizhetjük saját tudásunk színvonalát. A főiskolán is létezik ez a modul, én egy másik gyakorlatiasabb oldalról szerettem volna megközelíteni, és egy logikus felépítéssel,
az adatbázis sajátkezű készítésétől kezdve, az adatok feltöltésén keresztül és végül a lekérdezések megtervezéséig. 5 3. Óraterv kidolgozása 1-2. Elméleti óra Az SQL lekérdező nyelv Az SQL szerepe, tulajdonságai Az SQL elemei Jelkészlet Szintaktikai elemek Objektumok Tárolt eljárások Triggerek 1-2. Gyakorlati óra Ismerkedés a gyakorlaton használt interaktív SQL programmal 3-4. Elméleti óra Jelkészletek definíciói Oszloptípusok definíciói 3-4. Gyakorlati óra Jelkészlet, oszloptípus definiálása, gyakorlat gép mellett 5-6. Elméleti óra Adattáblák definíciói Létrehozás Egyedi avagy elsődleges kulcsok Idegen és közös kulcsok Indexek 5-6. Gyakorlati óra Adatbázis létrehozása, indexek készítése, gyakorlat gép előtt 7-8. Elméleti óra Adatok bevitele, módosítása, törlése Az INSERT utasítás Az UPDATE utasítás A DELETE utasítás 7-8. Gyakorlati óra 6 Az elkészített adatbázis feltöltése, törlése és
módosítása 9-10. Elméleti óra Zárt helyi dolgozat A lekérdezések Az oszlopok egyszerű felsorolása Mező kifejezések a SELECT záradékban Típusátalakítás Számtani műveletek Karakteres műveletek Oszlopfüggvények a SELECT záradékban Ismétlések elnyomása: a DISTINCT záradék 9-10. Gyakorlati óra Lékérdezések begyakorlása gép előtt 11-12. Elméleti óra A WHERE záradék A talált sorok rendezése: az ORDER BY záradék A talált sorok csoportosítása: a GROUP BY záradék Csoportosítás feltétellel: a HAVING záradék 11-12. Gyakorlati óra Feltételes lekérdezések, rendezések a gyakorlatban 13-14. Elméleti óra Táblák egyesítése: UNION Táblák metszete: INTERSECT Táblák különbsége: EXCEPT vagy MINUS 13-14. Gyakorlati óra Táblák egyesítése, metszete, külömbsége a gyakorlatban 15-16. Elméleti óra Zárt helyi dolgozat A vezérlő nyelv 15-16. Gyakorlati óra Feladat beadási határideje A vezérlő utasítások gyakorlati
áttekintése 7 4. A tanulást elősegítő nyomtatott anyag (modulfüzet) kidolgozása 4.1 Bevezetés A modul célja és követelményrendszere A modul célja a relációs adatbázis rendszerek egy napjainkban elterjedt adatbázis kezelő programmal való megismerkedés, ez a nyelv az SQL. Az utasításokkal való ismerkedés, lekérdezések, tranzakció kezelése. A modul célja : - SQL elemeinek ismerete - általános utasítások ismerete - adatdefiníciós utasítások ismerete - adatok bevitelére, módosítására és törlésére szolgáló utasítások ismerete - lekérdezések a Select utasítások segítségével - az SQL lekérdezőnyelvet támogató programokkal való ismerkedés 4.2 Kezdeti követelmények, előfeltételek A modul előfeltétele az adatszerkezetek, adatbáziskezelés ismerete, ezenkívül a dBase relációs rendszerbeni jártasság. 4.3 Előismeretek felmérése Ebben a modulban az előismeretek felmérése nem szerepel. 4.4 A
tanulmányi munka ütemezése A modul tananyaga heti 4 óra, ebből 2 előadás amely az elméleti ismeretek elsajátítására szolgál. A részvétel nem kötelező, de ajánlott mivel a tankönyv mellé kiegészítő 8 információkat is kap a jobb megértés végett, és 2 óra gyakorlat a már elsajátított anyagrészek gyakorlatba való átültetésére szolgál. A részvétel kötelező mivel az órákon gyakorlati feladatokat kell megoldani. A modul 90/32 ami azt jelenti hogy 90 órából 32 a kontaktóra amely egyrészt előadásból, gyakorlatból és konzultációból áll. Időbeoszási táblázat: Tanulmányi tevékenység Előadás Gyakorlat Jegyzet tanulmányozás Kiadott feladat megoldása Konzultáció Önértékelés Felmérés Helye Tanterem Tanterem Otthon Otthon Tanterem Otthon Tanterem Módja Csoportos Csoportos Egyéni Egyéni Csoportos Egyéni Csoportos Időtartama 14 óra 12 óra 32 óra 16 óra 4 óra 2 óra 2 óra Tanári közreműködés Van Van
Nincs Nincs Van Nincs Van 4.5 Irodalomjegyék [K1] Kovács Róbert Relációs Rendszerek (Előadásvázlatok) [K2] Kovács Róbert Relációs Rendszerek Távoktatási segédlet. [K3] Stolnicki Gyula SQL Kézikönyv (ComputerBooks, 1998) [Sz1] Borland InterBase User’s Guide (Borland, 1996) 4.6 A tananyag részletes tartalma - A gyakorlaton használt adatbázis kezelő rendszer használata [Sz1] - Az SQL elemei [K1],[K2] - Adattáblák létrehozása, adatdefiníciós utasítások elsajátítása, kulcsok, indexek készítése és használata. [K1],[K2] - Adatok bevitelére, módosítására és törlésére szolgáló utasítások használata [K1],[K2] - Lekérdezések (Select), talált sorok csoportosítása, rendezése [K1],[K2], [K3] - Táblák egyesítése, metszete, különbsége [K1],[K2] 9 - Vezérlő utasítások ismertetése [K1],[K2] 4.7 Konzultációs lehetőségek Az elméleti anyaggal az előadásokon foglalkozunk, a konzultációs órákat csoportosan érdemes
látogatni és az esetleges nem érthető anyagrészeket világítjuk meg. A konzultáción a tesztet megelőző héten tartjuk. 4.8 Számonkérés A számonkérés két részletben történik: 1. A modulperiódus 4 és 8 hetedik hetén az addig elhangzott anyagból egy egy felmérő tesztet kell kitölteni mindenkinek. A tesztek javítására nincs lehetőség 2. A gyakorlaton az 5 héten írt zárthelyi és egy gyakorlati házi feladat megoldása, amelyet a 8. hétre kell leadni Ezek 50-50% -ban vesznek részt a gyakorlati jegy végeredményében. A végleges eredmény két részből tevődik össze egyszer: az elméleti, másrészt a gyakorlati értékelés 50-50%-a. 4.9 Ellenőrző kérdések, gyakorlati feladatok Mi az adatbázis trigger és mire való ? Hogyan definiálunk jelkészletet ? Melyi utasítás használatával tudunk az eredménytáblában osztályközöket képezni ? Melyik utasítással hozunk létre egy új táblát ? Mik a kulcsok (egyedi, közös) ? Lekérdezést
végző utasítás ? Írja le hogyan lehet adatokat bevinni az adattáblába ? További kérdések a távoktatási segédletben találhatóak. 10 5. Tanulási segédlet kidolgozása 5.1 Az SQL lekérdező nyelv Az SQL a struktúrált lekérdező nyelv (Structured Query Language) rövidítése, melyet az IBM dolgozott ki a DB2 relációs adatbáziskezelőjéhez. Ma már a relációs adatbáziskezelők szabványosított nyelve, bár több bővítése alakult ki. 5.2 Az SQL szerepe, tulajdonságai Az SQL egy szabványosított lekérdező nyelv, melyet több relációs adatbáziskezelő ismer, különböző operációs rendszeri környezetben. Ennek óriási jelentősége van az adatbázis alkalmazások fejlesztőinek körében, mert így az alkalmazások a különböző operációs rendszerek és adatbáziskezelők között módosítás nélkül vagy csekély módosítással átvihetők. Az SQL nem algoritmikus nyelv, nem tartalmaz algoritmus szerkezeteket (elágazás, ciklus stb.)
Az SQL halmaz orientált nyelv, mely a relációkon dolgozik A halmaz orientáltság azt jelenti, hogy nem kell definiálni a művelet végrehajtásának lépéseit, hanem a feladat nem eljárás szerű megfogalmazását kell megadni, melyek a reláció vagy relációk kiválasztott sorain hajtódnak végre. A művelet végrehajtásához optimális megoldás megtalálása a nyelvi processzor feladata, nem a programozóé. Például annak eldöntése, hogy egy adott visszakeresésben alkalmazhatóak-e indexek, vannak-e indexek vagy építsen-e fel új indexet, a nyelvi processzor feladata. Az SQL nem rekurzív nyelv. Az SQL nyelvnek két felhasználási lehetősége van: önálló SQL, vagy 4. generációs eszközbe építve beágyazott SQL Az SQL nyelv önálló felhasználása esetén csak a nyelv utasításai állnak rendelkezésre. Ennek alkalmazására főként akkor kerülhet sor, ha nincs megfelelő alkalmazás az adott 11 feladat elvégzésére, illetve az alkalmazások
fejlesztői használják a negyedik generációs nyelvekbe építve. Ilyen eszközök a jelentés készítő, az űrlap készítő vagy menü készítő lehetnek. A beágyazott SQL esetén egy harmadik generációs algoritmikus nyelvbe (C, PL/SQL, Pascal, Delphi, FORTRAN stb.) ágyazva alkalmazzuk az SQL nyelv elemeit Ebben az esetben az algoritmikus feladatokat a harmadik generációs nyelvre, az adatbázissal kapcsolatos műveleteket pedig az SQL-re bízhatjuk. Az SQL a következő elemekre osztható : - adatdefiníciós nyelv - adatmanipulációs nyelv - lekérdező nyelv - adatvezérlő nyelv A továbbiakban ezekkel a részekkel és utasításaikkal ismerkedünk meg. Az utasítások ismertetésénél használt példákban az előzőekben tervezett iskolai adatbázist használjuk. A minta adatbázis tartalma a következő relációkat és adatokat tartalmazza. Az attributumok neveiben szándékosan nem szerepelnek az ékezetes karakterek, mert ezeket általában nem
fogadják el a rendszerek. A könnyebb érthetőség kedvéért a mintapéldában az órarend relációt használjuk az egyszerűbb SQL műveletek érdekében. 5.3 Az SQL elemei 5.31 Jelkészlet A legfontosabb karakterkészletek: az ASCII és az EBCDIC, valamint ezek nemzeti nyelvi változatai. Általános szabálynak tekinthetjük, hogy mindig a befogadó operációs rendszerre jellemző karakterkészletet alkalmazzák az SQL-változatok. Az SQL92 óta definiálhatunk, majd a használatban kiválaszthatunk karakterkészletet (character set). A karakterkészleteken belül a sorrend is fontos, hiszen pl. a magyar nyelvben az "ü" megelőzi a "v"-t rendezések során, viszont e két betű kódértéke sem ASCII, sem 12 EBCDIC kódok alapján nem ezt támasztja alá. Ennek feloldására jelsorrendeket definiálhatunk, munka közben mindig egyet-egyet kiválaszthatunk. Minden karakterkészlethez több sorrendet is definiálhatunk. A rendszer a
pillanatnyilag érvényes sorrend szerint fogja rendezni a szöveges adatokat. Nem kell okvetlenül külön jelkészlet, elegendő többféle jelsorrendi szabályt definiálni, és dolgozhatunk váltogatva magyar, német stb. betűsorrend és rendezési szabály szerint A rendezési szabály deklarálása az SQL92-ben nyelvi elem, de a szabály fizikai tárolását a szabvány nem köti meg. A rendszerek célszerűen rövid adatállományokban tárolják e szabályokat Az SQL támogatja tetszőleges karakterkészlet kódértékeinek egy másikra való leképezését szigorúan 1:1 értelemben. A leképezés neve: translation Két tetszőleges kódkészletet ily módon többféleképpen is leképezhetünk egymásra. A leképezések lehetővé teszik olyan kódkészletek használatát, amelyek az adott SQL-változat alapértelmezése szerint nincsenek jelen. Másik lehetőség, hogy meglévő adatbázist újabb kódértékek megjelenése után ne kelljen eldobni, vagy ami ráfordítás
szempontjából majdnem egyenértékű, teljesen átalakítani. Várható, hogy a betű és szótagalapú írások összes írásjelét egy nagy kódhalmazba: az arab, cirill, görög, héber, japán, latin és latin-alapú ábécék összességébe fogja össze az ISO. Nyilvánvaló, hogy ilyen kódok csak 8 bitnél szélesebb mezőkben valósíthatók meg, és ebből beláthatjuk a 8 bitre való leképezés jelentőségét. A korábbi megvalósításokat és az azok alatt fejlesztett alkalmazásokat továbbra is használhatjuk változtatás nélkül, ugyanis a jelkészletre, jelsorrendre és leképezésre alapértelmezéseket adhatunk meg. Egyes megvalósítások (pl IBM DB2, Sybase, MS SQL Server) támogatják a kettő, sőt három bájton ábrázolt karaktereket is. Három bájtos karakterekre már a kínai ABC is elfér. Most már összefoglalhatjuk az SQL jelkészletét: kis- és nagybetűk, számok, műveleti jelek, írásjelek, elválasztó jelek, egyes különleges jelek: $ %
& # ^ @ és ESCAPE. 5.32 Szintaktikai elemek Az SQL a beszélt nyelvekre emlékeztető többi programozási nyelvhez hasonlóan alapegységeket (tokens) épít fel, és azokat elválasztó jelek határolják. Az elválasztó jelek: szóköz, tabulátor jobbra vagy balra, kocsivissza, soremelés, továbbá ", , ; és zárójelek. A jel szerepe szövegkörnyezetétől függhet: vagy egyszerű jel, vagy a 13 következő jel különleges szerepét feloldja, és azt a jelet is csupán egyszerű jelként fogja értelmezni a rendszer. Az SQL92 megengedi, hogy az ilyen maszkoló jelnek másik érvényes karaktert válasszunk. Az alapegységeket (tokens) tovább csoportosíthatjuk: - kulcsszók (SQL names, keywords), - azonosítók, - műveleti jelek, - literálok (számszerű, dátumjellegű, szöveges konstansok). A kulcsszókban nem tesz különbséget az SQL kis, és nagybetűk között. A felsorolt alapegységekből és elválasztó jelekből kifejezéseket
alkothatunk. A felsorolt alapegységekből és esetleg kifejezésekből építhetjük fel az SQL utasításokat. Az utasításokban használt azonosítókban az SQL nem különbözteti meg a kis- és nagybetűket. Tehát az utasításokat írhatjuk tetszőlegesen kis- és nagybetűkkel mindenütt; viszont az adatértékeknél (literáloknál, változóknál, mezőknél) ügyelni kell a betűtípusra. A rendszer az elhatárolt utasításokat egyenként értelmezi, ha nem észlel hibát, végrehajtja, ha hibát észlel, szabályos módon tudtul adja. Minden SQL utasítást megállapodás szerinti elválasztó jel zár le: - leggyakrabban pontosvessző; - kocsivissza és/vagy soremelés, ekkor a rendszernek figyelnie kell a szövegkörnyezetet szintén (kontextuális határolás); - valamilyen kitüntetett kulcsszó, pl.: go 5.33 Objektumok Egy általánosan elfogadható definíció: a számítástechnikai objektumok olyan tárolóterületek, amelyeket típusokba
sorolunk, szimbólikus nevekkel látunk el, és csak adott szabályok betartása mellett kezelhetünk. Az SQL92 által engedélyezett objektumtípusok: 14 - adatséma (information schema), - adattípus (data type), - jelkészlet (character set), - jelsorrend (collation), - jelkészlet leképezése (translation), - oszloptípus (domain), - adattábla (table), - nézettábla (view), - index, - adatértékszabály (rulc), - hivatkozási függőségi szabály (referential integrity level). Az SQL alapvetően ötféle adattípust ismer: - számszerű, - szöveges, - dátumjellegű, - bináris vagy logikai, - nyers, szerkezet nélküli. 5.34 Tárolt eljárások A tárolt eljárásokat rendszerint az SQL eljárásjellegű elemekkel bővített valamely változatában írjuk meg. E nyelvek lehetővé teszik a paraméterátadást alkalmazói programok és SQL eljárások között, továbbá elágazások, ciklusok programozását, helyi adatok
definiálását. A kész eljárásokat a programozó elhelyezheti az adatbázis felügyelete alá. A hozzáférési jogokat szintén lehet szabályozni Alkalmazások hívhatják ezen eljárásokat, és azok mindig az adatbázis felügyelete alatt, annak környezetében futnak le, nem az alkalmazáséban. Tehát más és más gépen működő alkalmazás és adatbázis esetén ezen eljárások az adatbázisgépen futnak. Az előnyöket ebből már láthatjuk: 15 - egységes eljárásaink lesznek; - sok ismételt programozást megtakarítunk; - a nagy adattömegeket feldolgozó eljárások a feltehetően arra képes kiszolgáló gépen futnak; - a kisebb vagy más célra alkalmassá tett gépeken futhatnak az alkalmazások; - mindezeken túl a hálózatok terhelését csökkenthetjük, hiszen sokszor a keresés, feldolgozás végén csak rövid információkra vagyunk kíváncsiak. 5.35 Triggerek A triggerek az SQL szemlélete szerint különleges eljárások, amelyeket
nem az alkalmazások hívnak explicit módon, hanem az adatbázisban véghezviendő vagy véghezvitt változtatások automatikusan és elkerülhetetlenül végrehajtatják a meghatározott triggereket. A már megismert tárolt eljárások elé oda kell írni egy feltételt vagy feltételek sorozatát, amelyek bekövetkezését a rendszernek figyelnie kell, és akkor a triggert indítani (pl.: adatbevitel, módosítás, törlés előtt vagy után) Az eddigiek alapján elfogadhatjuk, miért nem paraméterezhető eljárások a triggerek. A kész triggert a programozó a rendszer felügyelete alá helyezi, attól kezdve a rendszer azt működtetni fogja. A triggerek alkalmasak adathibák, hivatkozási függőségek megsértésének kiszűrésére. A megkezdett - és az ellenőrzés során hibásnak minősített változtatásokat vissza tudják állítani 5.36 Jelkészletek definíciói Minden SQL adatbázisnak van előre beállított jelkészlete, így a felhasználó nem mindig
kényszerül a következő utasítások igénybe vételére. Jelkészlet definiálása: CREATE CHARACTER SET név [AS] GET bázis név [COLLATE jelsorrend neve | COLLATION FROM jelsorrend forrása]; 16 Értelmezés: A jelkészlet neve saját adatbázisában egyedi. Minden jelkészletet valamilyen szabványos alapjelkészletből (pl. ISO Latin 2) vezetünk le, erre hivatkozunk a bázisnév révén. Nem kötelező, de megadhatunk sorrendi szabályt is Ha sem a COLLATE, sem a COLLATION záradékot nem írjuk fel, akkor a rendszer a kódértékeket veszi alapul a lexikografikus összehasonlításhoz; tehát a nagy C előbb van, mint a kis b, és még folytathatnánk a kifogásokat. A jelsorrendek (collations) maguk is az adatbázis objektumai, és a COLLATE záradékban hivatkozhatunk egy létező jelsorrendre. Másik lehetőség, hogy valamilyen "forrásból" tudatjuk a rendszerrel, hogyan hasonlítsa össze a karaktereket. Ezt a záradékot a CREATE COLLATION utasítás
FROM záradékával együtt ismertetjük, mert szerepük azonos. Jelsorrend definiálása: CREATE COLLATION jelsorrend neve FOR jelkészlet neve FROM jelsorrend forrása [NO PAD | PAD SPACE]; A jelsorrend forrásának megadása: {DEFAULT | jelsorrend neve | DESC ( jelsorrend neve ) | EXTERNAL ( külső jelsorrend neve ) | TRANSLATION leképezés neve [THEN COLLATION jelsorrend neve]; Mindegyik jelsorrend egyedi nevet kapjon saját adatbázisában! Bármely alapjelkészletet többféle jelsorrenddel párosíthatjuk, az alapjelkészletre a FOR záradékban hivatkozunk. A FROM záradék a jelsorrend forrását nevezi meg. Az alapvető, előre beállított jelsorrendet a DEFAULT kulcsszóval választjuk ki. A külső (EXTERNAL) jelsorrend valamilyen átalakítási táblázat vagy hasonló adatállomány lehet, de részletekről az SQL92 nem rendelkezik, tehát a fejlesztő cég keze szabad. Kiválasztott jelsorrendet kölcsönvéve, megfordíthatjuk a sorrendet a DESC záradékkal. A
karakterkészletek leképezése (translation) két jelkészlet elemeit rendeli egymáshoz, és a TRANSLATION 17 záradékban megadjuk egy már létező leképezés nevét, a rendszer pedig minden karaktert a leképezés szabálya szerint a másik jelekre fog alakítani. A leképezett (azaz átalakított) jelek sorrendje még mindig eldöntetlen lehet, így a THEN COLLATION záradékban hivatkozhatunk egy jelsorrendre is. A PAD SPACE záradék előírja, hogy nem egyenlő hosszúságú karakterláncok összehasonlításakor a rendszer a rövidebbiket egészítse ki szóközökkel. NO PAD elnyomja e kiegészítést Leképezés definíciója: CREATE TRANSLATION leképezés neve FOR bázis név TO cél név FROM { IDENTITY | leképezés neve | EXTERNAL (külső leképezés neve ) } A karakterkészletek leképezése (translation) két jelkészlet elemeit rendeli egymáshoz, és a rendszer a bázisjelkészlet szerinti összes karaktert helyettesíti a céljelkészlet megfelelő
karakterével. A FROM záradék a leképezési szabály forrását nevezi meg IDENTITY a kódértékek egyenlőségét írja elő. Hivatkozhatunk már létező leképezési szabályra is, és így annak szabályait örökítjük át. Az SQL92 itt sem mond sokat a külső (EXTERNAL) leképezési szabályokról. A megfeleltetés kódtábláját el lehet helyezni pl egy adatállományban, majd az EXTERNAL záradékban erre hivatkozhatunk. 5.37 Oszloptípusok definíciói Az SQL92-t megelőző változatok nem támogatták az oszlopok elkülönített definícióit, hanem az oszlopokat csak a táblák keretében lehetett létrehozni. Ismert, hogy több adattáblának lehetnek azonos jellegű oszlopai. Ha ezen oszlopok valamely tulajdonságát változtatjuk, akkor ezt mindegyik érintett táblában külön el kell végezni. Ezzel szemben a CREATE DOMAIN utasítás lehetővé teszi oszloptípusok egységes definícióit. Az SQL alapvető adattípusaihoz hasonlóan hivatkozhatunk az így
származtatott oszloptípusokra is. Az érintett adattáblák szerkezetének módosításakor az oszlopdefiníciók egységessége így már biztosított. 18 definiálásakor, ill. Szintaxis: CREATE DOMAIN oszloptípus neve AS sql adattípus [DEFAULT állandó] [CONSTRAINT .] Értelmezés: Az oszloptípus neve saját adatbázisában, saját tulajdonosa alatt legyen egyértelmű! Az oszlopok tárolási módját visszavezetjük bármely, már létező SQL adattípusra (CHAR(n), DATE stb.) Az új oszloptípus örökli az alapadattípus jellemzőit A DEFAULT záradékkal megadhatunk egy állandót, amelynek értékét az oszlopba tartozó új mező akkor nyeri el, ha új sor létrehozása során egyéb adatot azon mező explicit módon nem kapna. Oszloptípus tulajdonságainak megváltoztatása: Szintaxis: ALTER DOMAIN oszloptípus neve {SET DOMAIN DEFAULT érték | DROP DOMAIN DEFAULT | ADD CONSTRAINT feltétel neve CHECK (.) | DROP CONSTRAINT feltétel neve}
Értelmezés: A DROP . záradékokkal megszüntethetjük a DEFAULT, ill CONSTRAINT záradékok érvényét. A SET DOMAIN DEFAULT záradékkal újabb alapértelmezés szerinti értéket rendelhetünk az oszlopbeli mezőkhöz. Az ADD CONSTRAINT záradékkal egy újabb vizsgálati feltételt rendelünk az oszlopbeli mezőkhöz. Oszloptípus megszüntetése: DROP DOMAIN oszloptípus neve 5.4 Adattáblák definíciói 5.41 Létrehozás 19 A létrehozás szintaxisa az SQL92 szerint: CREATE [ { GLOBAL | LOCAL} TEMPORARY ] TABLE [ [ adatbázis.] tulajdonos] tábla neve (oszlop 1 adattípus [ DEFAULT érték] [CONSTRAINT .][, CONSTRAINT ] [, oszlop 2 adattípus [ DEFAULT érték] [CONSTRAINT .] [, CONSTRAINT ] ] [ , oszlop 3 . ] [, CONSTRAINT feltétel nevel ] [, CONSTRAINT feltétel neve2 .] ); A leggyakrabban alkalmazott forma az SQL89 alapján: CREATE TABLE [[ adatbázis.]tulajdonos] tábla neve ( oszlop 1 adattípus 1 [NOT NULL | NULL], oszlop 2 adattípus 2 [NOT NULL | NULL],.
); Az adatbázis, valamint a tulajdonos neve csak akkor adandó meg kötelezően, ha máskülönben az egyértelműség sérülne. Az előtagokat olyankor is hasznosíthatjuk, amikor több adatbázis és/vagy tulajdonos azonos nevű tábláival párhuzamosan dolgozunk. A tábla neve saját adatbázisában, saját tulajdonosa alatt legyen egyértelmű! A táblanevek a szabvány szerint legfeljebb 18 karakter hosszúak lehetnek, kötelezően betűvel kezdődnek, tartalmazhatnak ezenkívül kis- és nagybetűket, aláhúzást, #, @, $ jeleket, számjegyeket. Az SQL92 vezette be a GLOBAL, LOCAL, TEMPORARY kulcsszókat. Ideiglenes táblára utal a TEMPORARY kulcsszó Az ilyen táblák az adott alkalmazás végéig léteznek, ha a GLOBAL kulcsszót, de csupán a tranzakció végéig, ha a LOCAL-t adjuk meg. Ha e három kulcsszó elmarad, ugyanolyan, állandó táblát hozunk létre, mint a korábbi szabvány szerint. Ez után következik az oszlopok definiálása, ezt a részt zárójelpár
határolja; az egyes oszlopdefiníciókat pedig vesszők választják el. Legalább egy oszlopot kell definiálni Kötelezően meg kell adni az oszlop nevét és adattípusát. Adattáblán belül minden oszlopnév egyedi Az oszlopnevek a szabvány szerint legfeljebb 30 karakter hosszúak lehetnek, kötelezően betűvel kezdődnek, tartalmazhatnak ezenkívül kis- és nagybetűket, aláhúzást, #, @, $ jeleket, 20 számjegyeket. Az SQL89 értelmezése szerint a NOT NULL záradék előírja, hogy az oszlop mezői érvényes adatot tartalmazzanak mindig, NULL-kifejezés tilos. Ha elhagyjuk e záradékot, akkor a NULL-kifejezés az oszlopban megengedett lesz, és ha új sor létesítésekor a mezőbe nem írunk adatot, akkor annak tartalma NULL kifejezés lesz. A NULL záradék előírja, hogy amennyiben meghatározott értéket nem kapna az oszlopbeli bármely mező, akkor az adott oszloptípushoz illő semleges értéket (pl. üres karakterláncot, számtani nullát stb.) adjon a
rendszer azon mezőnek Az SQL92 a CONSTRAINT záradék révén többféle ellenőrzést végeztet el, amelyek együtt az adott oszlopba, illetve a táblába bevihető értékek szabályait írják le. A választható szabályok, ellenőrzések: - NULL-kifejezések kizárása, - engedélyezett értékek megadása vagy mások kizárása, - egyedi kulcsok, - idegen kulcsok definiálása, - beviendő mezőérték vagy abból származtatott kifejezés előfordulásának vizsgálata más helyeken. A szintaktikai leírás is mutatja, hogy vizsgálati feltételeket előírhatunk oszlopokra és/vagy teljes táblára. Előbbiek az oszlopok definícióinak részei, utóbbiak az oszlopok definícióit követik. Mindkét fajta feltételből többet is előírhatunk A felsorolt feltételeket rendre egy-egy vessző választja el, de oszlopra vonatkozó feltételeknél az első elé nem helyezünk vesszőt, míg táblára vonatkozóknál az első elé is kell. Az adott oszlopra vonatkozó
utolsó feltétel mögé írjunk vesszőt, ha nem a tábla definícióját lezáró jobb oldali, gömbölyű zárójel következik! A feltételeket nem kell megnevezni, ám ha megtesszük, mindegyik név legyen egyedi az adatbázison belül! Csak megnevezett feltételeket szüntethetünk meg a tábla, ill. oszlop többi jellemzőjének változtatása nélkül. Tábla megszüntetése , ill oszlop eltávolítása egyszersmind megszünteti az összes odatartozó feltételt. Felfoghatjuk úgy, hogy a táblák definíciói az SQL92 szerint oszlopok, majd vizsgálati feltételek definícióiból állnak, ami tulajdonságtípusok és szabályok megadásának felel meg. Az SQL92 megengedi, hogy 21 az oszlopok mezőire megfelelő típusú, egyébként tetszőleges, alapértelmezés szerinti értéket adjunk meg a DEFAULT záradékban. Ha egyéb érték bevitelére nem kerülne sor INSERT utasításban, akkor a rendszer a megadott értéket helyezi oda. Ahol származtatott oszloptípusra
hivatkozunk, ott DEFAULT és/vagy CHECK záradékot nem szabad megadni, csupán az oszlop nevét és a származtatott oszloptípus (DOMAIN) nevét. Az SQL92 szerint ideiglenes táblák definícióiban az oszlopok felsorolását követheti az ON COMMIT ROWS záradék. DELETE esetén bármely sor csupán a tranzakció végéig, PRESERVE esetén az alkalmazás végéig - ameddig a tábla is - létezik. Az SQL92 alapvető adattípusai tetszőleges bitsorozat: BIT(n), BIT VARYING(n) (hosszmegadással), egzakt numerikus: egész típusú vagy fixpontos, egész: SMALLINT, INTEGER, LONG, fixpontos: DECIMAL (m [, n]), („m” az összes jegyek, „n” a tizedesponttól jobbra állók száma), lebegőpontos: FLOAT, REAL, DOUBLE PRECISION, dátum és/vagy időpont: TIMESTAMP (dátum és időpont együtt) INETERVAL (időtartam), DATE (dátum, továbbra is engedélyezett), TIME (időpont, továbbra is engedélyezett), karakteres: CHAR(n), CHAR VARYING(n) (hosszmegadással). 5.42
Egyedi avagy elsődleges kulcsok Szintaxis: CREATE TABLE tábla neve ( oszlop 1 adattípus 1 CONSTRAINT [ név] {PRIMARY KEY | UNIQUE } [ , CONSTRAINT egyéb feltételek .] [ , oszlop 2 .]) 22 CONSTRAINT feltétel neve { PRIMARY KEY | UNIQUE} ( oszlop i [ , oszlop j .] ): Értelmezés: Az oszlopok felsorolása után adhatjuk meg az elsődleges kulcs definícióját, amely feltételezi a kulcsok egyediségét is. Amennyiben az egyedi kulcs csak egy elemű, definiálhatjuk az adott oszloppal egyidejűleg, mint oszlopra vonatkozó feltételt. Egyazon táblának lehet több egyedi kulcsa. A szintaktikai leírás egy-egy példát mutat a kétféle módszerre. Több mezőből felépített kulcsok elemeit zárójelek között, vesszőkkel elválasztva soroljuk fel. Egy elemű kulcs esetén elhagyhatjuk a zárójelet PRIMARY és UNIQUE itt szinonímák. Minden kulcsértéknek, ill többelemű kulcsok esetén minden értékkombinációnak egyedinek kell lennie. 5.43 Idegen és közös
kulcsok Szintaxis: CREATE TABLE táblanév 2 ( oszlop 1 adattípus 1, oszlop 2 adattípus 2 CONSTRAINT idegen kulcs neve 1 FOREIGN KEY REFERENCES (táblanév 1) [ match záradék] [ update akció] [ delete akció] , CONSTRAINT idegen kulcs neve 2 FOREIGN KEY (oszlopok listája) REFERENCES (táblanév x) [ match záradék] [ update akció] [ delete akció] , . ); Az oszlopok listája: (oszlopl) vagy (oszlop i, oszlop n [ , .] ) 23 A match-záradék: MATCH [ FULL | PARTIAL } Az akciók szintaxisa: ON { DELETE | UPDATE} { CASCADE | SET NULL | SET DEFAULT | NO ACTION} Értelmezés: A hivatkozó idegen kulcsot képző oszlopok neveit gömbölyű zárójelek között soroljuk fel, vesszőkkel elválasztva; egy elemű kulcs esetén elhagyhatjuk a zárójelet. Idegen kulcs szerkezetének azonosnak kell lennie azon egyedi kulcséval, amelyre hivatkozik, de az oszlopnevek egyezése nincs kikötve. Amely egyedi kulcsra a hivatkozás irányul, annál csak a táblanevet adjuk meg a
REFERENCES kulcsszó után , zárójelben. Bármely táblában lehet több idegen kulcs, és bármely tábla egyedi kulcsára hivatkozhat több idegen kulcs. Ha az idegen kulcs csupán egy elemű, akkor definiálhatjuk az oszlopdefinícióval egybekötve. A szintaktikai leírás ismerteti mindkét módszert: az oszlop 2 mezői idegen kulcsok egymagukban, és e kulcsot az oszloppal együtt definiáltuk; míg az idegen kulcs neve 2 kulcsot az adattábla önálló elemeként definiáltuk. Ez utóbbi kulcs esetén felsoroltuk a kulcsképző mezők oszlopneveit, az előbbi esetben ez nem kellett. A megvalósítások korlátozhatják az egy-egy kulcs képzéséhez igénybe vehető oszlopok számát. Bár a szabvány idegen kulcsot definiál ezen a módon, a közös kulcsokat is tudjuk ezen eszközökkel kezelni, mert bármely oszlop részt vehet több kulcs képzésében, így egyedi és idegen kulcséban egyszerre. Egyedi kulcs képzésében részt vevő oszlopok, amelyek az adott
táblában idegen kulcsok is, míg másutt értelemszerűen egyediek, azok a definícióból eredően közös kulcsok. A MATCH záradékot csak összetett kulcsok vonatkozásában használhatjuk. Lényege, hogy a hivatkozó idegen kulcs mennyire illeszkedik a hivatkozott egyedi kulcsra. MATCH FULL teljes egyezést követel meg, míg MATCH PARTIAL megengedi, hogy az összetett kulcs egyik-másik eleme NULL-kifejezés legyen; ám a valódi mezőértékeknek ilyenkor is egyezniük kell! A MATCH FULL záradék az alapértelmezés, és ez felel meg a hagyományos kulcsegyezésnek. Az ON DELETE 24 záradék arra az eseményre ír elő válaszlépést, hogyha a hivatkozott sort valaki törli. A CASCADE kulcsszóval előírjuk, hogy ha valaki törli a hivatkozott sort, amely egyedi kulcsára az idegen kulcs hivatkozik, akkor a hivatkozó idegen kulcsú sorok szintén töröltessenek. SET NULL esetén a hivatkozó idegen kulcsokat csupán NULLkifejezésre állíthatjuk át, míg SET
DEFAULT esetén a megfelelő idegen kulcsok az alapértelmezés szerinti értéket veszik fel. NO AClTON kifejezéssel letiltjuk a válaszlépéseket. Az ON UPDATE záradékkal azon eseményre írunk elő válaszlépést, amikor valaki a hivatkozott egyedi kulcs értékét megváltoztatja. A válaszok ugyanazok lehetnek, mint ON DELETE esetén. CASCADE most a kulcsértékek egyenlővé tételét jelenti, nem törlést. Egy-egy idegen kulcsnak legfeljebb egy ON DELETE és legfeljebb egy ON UPDATE záradéka lehet. Példa: [1] a következő tábla oszlop 1 mezői egyben közös kulcsok a minta0 tábla egyedi kulcsával. A minta1 tábla egyedi kulcsát két elem képezi: oszlop 1 és oszlop 2 egy-egy mezője. Ha a minta0 táblában kitörölnek egy sort, akkor a minta1 táblában a törölt sor egyedi kulcsával egyező értékű idegen kulcsokat NULL-kifejezésre állítja a rendszer. Ha valaki megváltoztatja a minta0 táblában az egyik sor egyedi kulcsát, akkor a minta1 táblában
az összes, a korábbi értékkel egyező értékű mezőt oszlop 1-ben szintén az új értékre állítja át a rendszer. CREATE TABLE minta1 ( oszlop 1 INTEGER, oszlop 2 CHARACTER(32), oszlop 3 CHARACTER(4096) VARYING, CONSTRAINT k1 minta1 FOREIGN KEY (oszlop 1) REFERENCES (minta0) ON UPDATE CASCADE ON DELETE SET NULL, CONSTRAINT k0 mintal PRIMARY KEY (oszlop 1, oszlop 2) ); 25 5.44 Indexek Az SQL indexei hasonlítanak az egyéb adatbázisoknál és adatállomány-rendszereknél látottakra: külön tárolóterületre kimásoljuk azon kulcsokat, amelyek értékei ismeretében gyakran akarunk az adatrekordokhoz férni, és mindegyik kulcsérték mellé elhelyezzük azon címet, ahol a kulcshoz tartozó rekordot megtaláljuk. Az SQL rendszerek ezen tevékenységeket a szabványos definíció után automatikusan végzik. Az indexek a saját területükön rendezetten helyezkednek el, így adott kulcsérték vagy mintára illeszkedő kulcsok keresése gyorsabb lesz. Az index
alkalmazása során a rendszer az indexben keresi a kívánt kulcsértéket vagy értékeket, majd az azok mellé írt címen megtalálja az alapadattábla sorát (rekordját), ill. sorait Az SQL megengedi összetett kulcsok alkalmazását, sőt azt is, hogy más és más kulcsrészek szerint növekvő és csökkenő sorrendben vegyesen forduljanak elő a bejegyzések adott indexben. Tetszőleges adattáblához sokféle indexet definiálhatunk. Az indexek akkor gyorsítják meg a keresést, ha a kívánt hozzáféréssel összhangban állnak. Különben előfordulhat, hogy a rendszer nem is használ indexet; az indexek pedig foglalják a tárolóhelyet. Tehát index létesítésekor mérlegelendő, milyen adatkezeléseket tudunk azzal gyorsítani. Egyedi (UNIQUE) indexnek nevezzük azokat, amelyekben adott, tetszőleges kulcsérték legfeljebb egyszer fordulhat elő. Célszerű minden táblának definiálni egyedi indexét Ha valamely tábla számára nem tudunk egyedi kulcsot
kijelölni, akkor az adatmodellel baj van. Az egyedi indexek definícióinak összhangban kell állniuk a megfelelő táblák UNIQUE KEY záradékaival. Az SQL92 előtti szabványok nem ismerték e záradékot, és az egyedi kulcsot éppen a megfelelő CREATE UNIQUE INDEX utasítás segítségével jelöltük ki. Egyedi indexet csak olyan táblára definiálhatunk, amelyben a megadott egyedi kulcs értéke sosem ismétlődik. A tábla lehet egyelőre üres is Nem egyedi indexnél hasonló gond nem adódik. Bármely táblához létesíthetünk több indexet, akár több egyedi indexet is. Szintaxis: CREATE [ UNIQUE] INDEX index neve ON tábla(oszlop 1 [ { ASC | DESC} ] [ , oszlop 2 . ] ) : 26 Értelmezés: Az UNIQUE kulcsszó dönti el, hogy egyedi kulcsra definiálunk-e indexet. Minden index nevének egyedinek kell lennie saját adatbázisában, saját tulajdonosa alatt. Az indexnév legnagyobb megengedett hossza az SQL változattól függ, általában 18 karakter. Meg kell
nevezni az adattáblát, majd zárójelek között megadandó azon oszlopnév, amely alapján a kulcsot származtatjuk. Több oszlop is felsorolható, neveiket vesszők választják el. Minden kulcsképző oszlop neve után megjelölhetjük, hogy a kulcselemek növekvő (ASC, ASCENDING) vagy csökkenő (DESC, DESCENDING) sorrendben kövessék egymást az indexben. Az ASC[ENDING] kulcsszó alapfeltevés, használni nem kötelező. A permutáció szabálya: mindig azon kulcselemek változnak, gyorsabban, amelyek az index definíciójában jobbra állnak. A következő példák rámutatnak a sorrendre is: Adott a T1 tábla, amelynek legalább az ábra szerinti két oszlopa létezik: N1 C1 01223 AAAA 12345 X321 91334 AAAA 33556 CCDD 12345 A123 54321 KLMN 29374 BZXA 12345 A987 CREATE UNIQUE INDEX ul ON tl(N1); Csak akkor lenne kivitelezhető, ha nem lennének ismételt adatértékek az N1 oszlopban (12345). CREATE UNIQUE INDEX u2 ON tl(Nl, Cl); Eredmény: 27 Kulcs
. Cím . 12345 A123 (5) 12345 A987 (8) 12345 X321 (2) 29374 BZXA (7) . A két kijelölt kulcsmező értékei együttesen sosem ismétlődnek, tehát az egyedi index létrehozható. Láthatjuk, hogy az adattábla sorait semmi sem változtatja Példánkban a címet mint rekordsorszámot adtuk meg. Azonos N1 értékek mellett a C1 értékek az indexben növekednek. Azonos indexet kaptunk volna, ha az Nl és/vagy C1 oszlopnév mögé odaírjuk az ASC kulcsszót: CREATE UNIQUE INDEX u2 ON tl(N1 ASC, Cl); Ha azt akarjuk, hogy az egyenlő N1 értékek mellett a C1 értékek csökkenjenek az indexben: CREATE UNIQUE INDEX u3 ON tl(Nl ASC, Cl DESC); Az ASC kulcsszót következmény nélkül elhagyhattuk volna. Az újabb index felépítése: [1] . 12345 X321 (2) 12345 A987 (8) 12345 A123 (5) 29374 BZXA (7) . 28 Figyeljük meg az index felépítését az esetben, ha mindkét oszlop neve után DESC kulcsszót írunk: CREATE UNIQUE INDEX u4 ON tl(N1 DESC, Cl DESC); . 29374 BZXA (7)
12345 X321 (2) 12345 A987 (8) 12345 A123 (5) . Természetesen további variációk is engedélyezettek. Indexek módosítása: index szerkezetét nem változtathatjuk, hanem igény esetén megszüntetjük, és új alakban definiáljuk. Az ALTER INDEX utasítással módosíthatjuk a fizikai tárolás egyes körülményeit, de erre a szabvány nem ír elő semmit. A fizikai tárolás körülményei a megvalósításoktól függnek. Indexek megszüntetése: DROP INDEX index neve; Egy utasításban csak egy indexet szüntethetünk meg. 5.5 Adatok bevitele, módosítása, törlése E körbe tartozik az INSERT, UPDATE és DELETE utasítás. Közös vonások: - Bármelyik említett utasítással egyszerre csak egy adott táblában dolgozhatunk; nem számítva ide azon táblákat, amelyek olvasása kifejezetten vagy hallgatólagosan szükséges. 29 - Ha létezik index az adott táblához, a rendszer automatikusan az új állapothoz igazítja azt, ill. azokat minden egyes új
bevitel, módosítás, törlés után - A rendszer ellenőrzi a hivatkozások sértetlenségét az érvényes szabályok szerint, és ha bármely utasítás következtében hivatkozási épségre vonatkozó szabály sérülne, akkor a tranzakciót az eredeti állapot visszaállításával befejezi. - A korszerűbb SQL változatok támogatják triggerek létrehozását, amelyek révén az új bevitelek, változtatások, törlések alatti és utáni szükséges tevékenységeket a programozók maguk is programozni tudják. 5.51 Az INSERT utasítás Az INSERT utasítás új sorok bevitelére szolgál. Szintaxis: INSERT INTO tábla [ (mező 1 [ , mező 2 . ] ) ] { VALUES(konstans 1 [ , konstans 2 .] ) | SELECT . } Értelmezés: A táblanevet megadhatjuk az ismert formában is: [ [ adatbázis.] tulajdonos] táblanév - a mezőkre szintén hivatkozhatunk minősített nevekkel: [[adatbázis.]tulajdonos]táblanévmezőnév - és szabad a táblanév helyett ideiglenes nevet használni:
[[adatbázis.]tulajdonos]táblanév ideiglenes név E három lehetőség szerepe akkor válik fontossá, ha alkérdést is alkalmazunk. Az INTO záradékban meg kell nevezni szigorúan egy adattáblát, amelybe új sort akarunk beírni. E 30 táblának már léteznie kell, nincs automatikus létrehozás. A mezőket (ill oszlopokat) nem kötelező felsorolni. A VALUES záradékban a beviendő értékeket soroljuk fel; ehelyett megadhatunk tetszőleges SELECT utasítást, amely a beviendő adatokat szolgáltatja az INTO záradékkal összhangban. Ha VALUES záradék szerepel, akkor egyazon INSERT-utasítással legfeljebb egy új sort írhatunk be a megfelelő adattáblába. A SELECT alkérdéssel egyszerre több sort is bevihetünk. NOT NULL tulajdonsággal definiált oszlopba értéknek kell kerülnie. Ennek eleget teszünk, ha: - az ilyen oszlop mezőjének explicit értéket adunk, - alárendelt SELECT utasításban kifejezést rendelünk a megfelelő oszlophoz, - az
adott oszlopra előfeltevés szerinti értéket adtunk meg. Minden egyéb eset hibaüzenethez vezet. Ezenfelül a rendszer ellenőrzi, hogy a beviendő új érték adattípusa odaillik-e, nem sért-e valamilyen, az adott oszlop elemeire érvényes értékkorlátozást, továbbá hivatkozási épségi szabályt. Ezen feltételek kielégítése egyszersmind bármely mező helyes kitöltésének elégséges feltétele. Továbbiakban az INSERT utasítás elemeit részletezzük. 5.52 Az UPDATE utasítás Ezen utasítással létező sorok tartalmát megváltoztathatjuk. Szintaxis: UPDATE tábla SET mező i = kifejezés i [, mező j = kifejezés j . ] [ WHERE . ] ; Értelmezés: A táblanevet megadhatjuk az ismert formában is: [[ adatbázis.] tulajdonos] táblanév - a mezőkre szintén hivatkozhatunk minősített nevekkel: 31 [[adatbázis.]tulajdonos]táblanévmezőnév - és szabad a táblanév helyett ideiglenes nevet használni: [[adatbázis.] tulajdonos]táblanév ideiglenes
név E három lehetőség olyankor fontos, amikor alkérdést használunk. Egyazon UPDATE utasítással legfeljebb egy táblában módosíthatunk értékeket. A SET záradékban felsoroljuk a szükséges változtatásokat: - mindegyik érintett mező nevét, - a nevek mögé rendre egyenlőségjelet, - majd adattípus és érték szerint odaillő kifejezést írunk; - ha több mező értékét változtatjuk, akkor az értékek kifejezéseit egymástól rendre vesszővel válasszuk el! Ha nem tudunk határozott értéket adni valamely mezőnek, és NULL az adott mezőben nem tilos, akkor a megfelelő helyre a SET záradékban írhatunk NULL kulcsszót. A WHERE záradék határolja be azon sorokat, amelyekben a SET záradékkal kijelölt változtatásokat el kell végezni. Előfordulhat, hogy a WHERE záradék feltételeinek egyetlen sor sem tesz eleget az adott táblában. A WHERE záradékot elhagyhatjuk, ekkor a változtatások az összes sorra érvényesek a megnevezett
táblában. Mindezek értelmében bármely UPDATE utasítás az adott tábla tartalmától függően változást eredményezhet 0, 1, n, sőt az összes létező sorban. A WHERE záradékot ugyanolyan szabályok és értelmezés szerint írjuk itt fel, mint a SELECT utasításnál tettük. A záradékok között értelemszerűen nem szerepelhet ORDER BY, GROUP BY, HAVING, JOIN, UNION, INTERSECT, MINUS záradék. Viszont alkérdésekben csupán az ORDER BY záradék tiltott. Példa: [1] megtudtuk, hogy Kovács Gergelynek van második keresztneve, és nem a 222. sz házban, hanem a 22. szám alatt lakik 32 UPDATE Vevök törzsadattára SET Vevő neve 3 =Gregor WHERE Vevókód =KOGEO1; UPDATE Vevők törzsadattára SET Vevő címe =2000 Szentendre, Római sétány 22. WHERE Vevőkód =KOGEO1; A két változtatást elvégezhetjük egy utasítással: UPDATE Vevők törzsadattára SET Vevő neve 3 =Gregor, Vevő címe =2000 Szentendre, Római sétány 22. WHERE vevőkód=KOGE01;
Ügyeljünk arra, hogy a változtatásokat egy-egy vessző válassza el, de az utolsó után ne álljon vessző! Adott egy tábla, és egyik oszlopának neve: Időpont, adattípusa: DATE TIME YEAR TO FRACTION(5). Állítsuk egy adott értékre az időpont oszlop azon mezőit, amelyek tartalma pillanatnyilag NULL-kifejezés! UPDATE [(adatbázis.]tulajdonos]tábla neve SET Időpont = EXTEND(1992.0501 :12, YEAR TO FRACTION(5)) WHERE Időpont IS NULL; A tizenkét órát csupa 0 követi, ezt a feltöltést az EXTEND függvény elvégzi. 5.53 A DELETE utasítás Ez az utasítás sort vagy sorokat töröl a megnevezett táblából. Szintaxis: DELETE FROM tábla [ WHERE . ] ; 33 Értelmezés: A táblanevet megadhatjuk az ismeri formában is: [ [ adatbázis.] tulajdonos] táblanév és szabad a táblanév helyett ideiglenes nevet használni: [ [ adatbázis.] tulajdonos] táblanév ideiglenes név E két lehetőség fontossá válik, ha alkérdést alkalmazunk. A rendszer megkeresi
a WHERE záradékban adott feltételnek eleget tevő sorokat a megnevezett táblában, és törli azokat. Így az adott tábla tartalmától függően törölhetünk 0, 1, n, esetleg minden sort. A WHERE záradékot elhagyhatjuk, ekkor a törlés az adott tábla összes sorára vonatkozik. Egy adott sor törlésének igénye esetén annak egyedi kulcsát adjuk meg feltételként. A WHERE záradékot ugyanúgy építhetjük fel, mint a SELECT utasításnál láttuk. A záradékok között értelemszerűen nem szerepelhet ORDER BY, GROUP BY, HAVING, JOIN, UNION, INTERSECT, MINUS záradék; de alkérdések záradékai között csak ORDER BY tiltott. Fontos, hogy az összes sor törlése nem szünteti meg sem az adattáblát, sem a csatolt indexeket, szabályokat: csupán üres halmaz keletkezik. A sok bevitel, módosítás, törlés következtében esetleg felaprózódott tárterületet sem tömöríti a DELETE utasítás. (Viszont a már tárgyalt DROP TABLE utasítás megszünteti az
összes odatartozó objektumot és adattartalmat.) Példák: Töröljük az 1993. előtti keretrendeléseket! DELETE FROM Keretrendelés WHERE Feldolgozás időpontja <1993.0101; Töröljük azon keretrendeléseket, amelyek 1993. előttiek, és nincs rendelt tételük DELETE FROM Keretrendelés t1 WHERE Feldolgozás időpontja < 1993.0101 34 AND NOT EXISTS ( SELECT FROM Rendelt tételek t2 WHERE tl.Rendelésszám = t2Rendelésszám); Ugyanez az IN kulcsszóval: DELETE FROM Keretrendelés t1 WHERE Feldolgozás időpontja < 1993.0101 AND tl.Rendelésszám NOT IN ( SELECT t2.Rendelésszám FROM Rendelt tételek t2 WHERE t1.Rendelésszám = t2Rendelésszám); Ugyanez az ANY kulcsszóval: DELETE FROM Keretrendelés t1 WHERE Feldolgozás idgpontja < 1993.0101 AND t1Rendelésszám = NOT ANY ( SELECT t2.Rendelésszám FROM Rendelt tételek t2 WHERE tl.Rendelésszám = t2Rendelésszám); 5.6 A lekérdezések [1] A lekérdező nyelv egyetlen utasításból áll, mely
számos alparancsot tartalmazhat, és a lekérdező utasítások többszörös mélységben egymásba ágyazhatók. A SELECT utasítás általános alakjának megadása helyett részletesen áttekintjük az egyes tipikus lekérdezési utasításokat, az egyszerűektől a komplikáltakig. Figyelem, a szelekció művelete és a SELECT utasítás csak nevében hasonló, egymásnak nem felelnek meg. 5.7 Az oszlopok egyszerű felsorolása Szintaxis: SELECT oszlop a [ , oszlop b .] FROM [ [ adatbázis.] tulajdonos] tábla; 35 Értelmezés: A SELECT záradékban az oszlopok neveit vesszők választják el. A sorok előfordulási sorrendjében, de csak a megnevezett oszlopok mezőit kapjuk eredményül. Az oszlopok a listában a felsorolás szerint követik egymást . Itt és a későbbiekben is bármikor lehet, sőt az egyértelműség érdekében bizonyos esetekben kötelező megadni az oszlopok nevei előtt a tábla, a tulajdonos és esetleg az adatbázis nevét is a következő
szabály szerint: [[[adatbázis.]tulajdonos]táblanév]oszlopnév A FROM záradékban felsoroljuk a lekérdezésben érintett összes tábla nevét, vesszőkkel elválasztva. Adattábla megjelölésekor szintén szükséges a következő alakú megadás: [[adatbázis.]tulajdonos]táblanév 5.8 Mező kifejezések a SELECT záradékban A lekérdezett oszlopok mezőire vonatkozóan kifejezéseket írhatunk fel. A kifejezések elemei lehetnek: - oszlopok, ill. mezőik, - operátorok, - függvényhívások, - konstansok, - kivételesen, változók egyes SQL változatokban. A kifejezések tartalma lehet: - átalakítás adattípus szerint (konverzió), - számtani művelet, - karakteres művelet, 36 - logikai művelet, - dátumkezelés, - bitsorozatok kezelése, - nem struktúrált adatok (nyers, ill. nagy bináris objektumok stb) kezelése 5.81 Típusátalakítás A legtöbbféle adatot átalakíthatjuk azonos értékű, de más típusú adattá a konverziós
függvényekkel. A megvalósítások e célokra több függvényt is nyújtanak, és csupán egyes átalakításokat tiltanak. Az SQL típusátalakító függvény szintaxisa: CAST (kifejezés AS adattípus) Értelmezés: Az adott kifejezést a megadott adattípus szerint fogja értelmezni a rendszer. 5.82 Számtani műveletek A négy számtani alapműveletet numerikus oszlopokon mindig elvégezhetjük, értelemszerűen kivéve a nullával való osztást. A Sybase pl engedélyezi a hatványozást is, de csak egész kitevőkkel. Egyes megvalósítások ismernek a kerekítéseken túl is matematikai függvényeket (ABS, LOG, EXP, SIN stb.) 5.83 Karakteres műveletek Karakteres mezőkön a legtöbb SQL változatban értelmezett műveletek: - egymáshoz fűzés (concatenation), - részlet kivágása (substring), - helyettesítések, - átalakítások kisbetűről nagyra és viszont (translation). 37 5.84 Oszlopfüggvények a SELECT záradékban Az SQL-ben olyan függvények
is rendelkezésre állnak, amelyek nem a lekérdezett oszlopok elemeire egyenként, hanem a vizsgált oszlop egészére vonatkoznak. Mivel ezek argumentuma egyszerre egy-egy halmaz, szokás ezeket aggregate function(s)-nek vagy set function(s)-nek is nevezni. Itt az oszlopfüggvény kifejezést alkalmazzuk, mert az argumentumok oszlopjellegű halmazok. Mindegyik SQL változatban előfordulnak: MIN az oszlop legkisebb elemét, MAX az oszlop legnagyobb elemét, SUM az oszlop elemeinek összegét, COUNT az oszlop elemeinek számát, AVG az oszlop elemeinek átlagát adja vissza. Szintaxis: SELECT [ .,] függvény neve(kifejezés) [ , ] FROM ; Értelmezés: A "kifejezés" helyén oszlop neve, valamint oszlopok neveiből, operátorokból és/vagy konstansokból felépített kifejezések állhatnak. COUNT esetén megengedett a * is, ezáltal a rendszer a sorokat számlálja meg. AVG, SUM, STDDEV, VARIANCE csak numerikus kifejezésekre értelmezhető. NULL-kifejezést sem
a COUNT, sem az AVG nem vesz figyelembe! Ebből érdekes különbségek adódnak: SELECT COUNT(*) .; és SELECT COUNT(oszlop x) ; csak akkor adnak azonos eredményt, ha oszlop x nem tartalmaz NULL-t. Átlagszámítás során veszélyes a következő kifejezés, ha oszlop x számára a NULL nincs tiltva: SELECT SUM(oszlop x) / COUNT(*) FROM .; 38 5.85 Ismétlések elnyomása: a DISTINCT záradék Eddig az oszlopok kiválasztásával, megjelenítésével foglalkoztunk. Most a sorok következnek. A DISTINCT záradék segítségével elnyomhatjuk adott oszlop vagy oszlopok értékeinek ismételt megjelenítését. Szintaxis: SELECT { [ ALL] | DISTINCT} oszlop neve FROM ., Értelmezés: A DISTINCT kulcsszó ellentettje ebben a szövegkörnyezetben az ALL kulcsszó; hatására az összes előfordulás megjelenik. Tehát az ALL kulcsszó érvényesül automatikusan, ha sem ALL, sem DISTINCT nincs jelen - mint láthattuk az eddigiekben. 5.86 A WHERE záradék A WHERE záradékban
feltételt kell megadni, és a rendszer csak a feltételnek megfelelő sorokat válogatja ki. Szintaxis: SELECT oszlop neve FROM . WHERE feltétel [ ] ; A feltételek legegyszerűbb alakja: kifejezés 1 operátor kifejezés 2 Értelmezés: A kifejezések elemei lehetnek oszlopok nevei, operátorok, mezőkre vonatkozó függvények. Csak azonos típusú kifejezéseket hasonlíthatunk össze (pl numerikust numerikussal stb.) Az összehasonlításra használható operátorok: <, >, <=, >=, =, valamint nem egyenlő: != vagy <>; a felkiáltójellel az összes összehasonlítási operátor értelme megfordítható. 39 A LIKE (és NOT LIKE) operátort mindegyik megvalósítás tartalmazza nagyon régóta. Ezeket csak karakteres kifejezésekhez alkalmazzuk! Rendeltetése: hasonló az egyenlőségjeléhez, de nem feltétlenül összes karakterében egyező kifejezések összehasonlítása. Összehasonlítandó karaktermintában két különleges karaktert
használhatunk azon karakterhelyek jelölésére, ahol egyezést NEM okvetlenül követelünk meg a mintával: az jel egy, és csakis egy tetszőleges karakter, míg a % jel egy vagy több tetszőleges karakter jelenlétét engedi meg. WHERE kifejezés LIKE kifejezés; Az IN operátor után megadunk egy értéklistát, és vizsgáljuk, hogy adott oszlop mely mezőinek értéke egyezik azon lista valamelyik elemével. (Az oszlop lehet származtatott oszlop, kifejezés is.) WHERE oszlop IN (kifejezés 1, kifejezés 2 [,.]) , A BETWEEN kulcsszó segítségével megadunk egy intervallumot, és vizsgáljuk, hogy adott oszlop mely mezőinek értéke esik azon intervallumba. (Az oszlop itt szintén lehet származtatott oszlop, kifejezés.) WHERE oszlop BETWEEN kifejezés 1 AND kifejezés 2 [ .] 5.87 A talált sorok rendezése: az ORDER BY záradék A lekérdezés révén talált sorokat rendezhetjük az ORDER BY záradékkal. Szintaxis: SELECT [ .,] kifejezés i [ , , kifejezés r
] FROM [ egyéb záradék[ok] ] ORDER BY kifejezés i [ { ASC | DESC} ] [ , kifejezés r [ { ASC | DESC} ] ] [ , .] ; 40 Értelmezés: A rendszer az ORDER BY záradékban megadott kifejezések értéke szerinti sorrendben adja át, illetve jeleníti meg a talált sorokat. A rendezési kifejezések (kritériumok) száma mindig pozitív, felső határát a megvalósítások korlátozhatják Csak olyan kifejezéseket szabad rendezési szempontként (kritériumként) megadni, amelyek a SELECT záradékban szintén előfordulnak. 5.88 A talált sorok csoportosítása: a GROUP BY záradék A megismert oszlopfüggvényeket eddig úgy használtuk, hogy az alkalmazó számára láthatatlan részeredménytábla megfelelő teljes oszlopain elvégeztettük a kijelölt műveletet, és a végeredmény a függvényhívás eredménye volt. Azonban előfordulhat, hogy csoportosítani akarjuk a talált sorokat, és az oszlopfüggvényekkel a műveleteket minden egyes csoportban külön-külön
akarjuk végrehajtatni - erre szolgál a GROUP BY záradék. Szintaxis: SELECT mező x, oszlopfüggvény 1(kifejezés 1) [, oszlopfüggvény 2(kifejezés 2)] [ , mező y .] FROM tábla t [ WHERE . ] GROUP BY mező x [, mező y . ] [ ORDER BY . ] ; Értelmezés: Az összes mezőt, ill. mindegyik olyan kifejezést, amely nem valamely oszlopfüggvény révén keletkezik, fel kell sorolni a GROUP BY záradékban. Ezen kifejezések értékeinek változása a csoportosítás feltétele. A rendszer legelőbb kiválogatja a WHERE záradéknak eleget tevő sorokat, majd csoportosítja azokat úgy, hogy a megadott csoportosítási kifejezéseken (GROUP BY x, y .) belül az egyező értékkel bírók, illetve azok teljes sorai kerüljenek egy-egy csoportba. Amennyiben több ilyen szempont is adva van, akkor a "balra" lévők szerint főbb, jobbra haladva 41 alcsoportokat alakít ki a rendszer. Ezt követően végrehajtja az előírt függvényhívásokat, és az eredményeket
átadja az alkalmazásnak, illetve megjeleníti azokat. Az eredménynek annyi sora lesz, ahány csoport képződött. Az eredményül nyert sorokat rendezhetjük a SELECT záradék akármelyik kifejezése szerint, tehát pl. oszlopfüggvényes kifejezés szerint is! 5.89 Csoportosítás feltétellel: a HAVING záradék A csoportosítás révén keletkező eredménysorokra szintén előírhatunk kiválasztási feltételeket - erre szolgál a HAVING záradék. Szintaxis: SELECT mező l, [ .,] kifejezés 1 [ , ] [ , kifejezés 2 ] FROM tábla x [ WHERE . ] GROOP BY mező 1 [, mező 2 .] HAVING kifejezés 1 operátor kifejezés x Értelmezés: A HAVING záradék hatására a rendszer egyszerűen kizárja a csoportosítás során keletkezett azon sorokat a végeredmény sorainak halmazából, amelyek nem felelnek meg a HAVING kulcsszó után megadott feltételnek, ill. feltételeknek 5.810 Táblák egyesítése: UNION Több tábla tartalmát egyesíthetjük egy-egy
lekérdezésben. Szintaxis: SELECT [ tábla 1.] oszlop 1 [ , ] FROM tábla 1 [ ideiglenes név 1] [ WHERE . ] 42 [ GROUP BY .] [ HAVING .] UNION [ ALL ] SELECT [ tábla 2.] oszlop x [ , ] FROM tábla 2 [ideiglenes név 2] [ WHERE .] [ GROUP BY .] [ HAVING .] [ ORDER BY .]; Értelmezés: A UNION művelet megfelel halmazok egyesítésének. Az ideiglenes eredménytábla oszlopaiban rendre az első, majd a második és további SELECT utasításokban megadott kifejezések jelennek meg. Ebből beláthatjuk, hogy az összes SELECT záradék kifejezéseinek sorrendben adattípus szerint, valamint számosságban egyezniük kell. 5.811 Táblák metszete: INTERSECT Az INTERSECT művelet megfelel halmazok metszete képzésének. Szintaxis: SELECT [ tábla 1.] oszlop 1 [ , ] FROM tábla 1 [ideiglenes név 1] [ WHERE . ] [ GROUP BY .] [ HAVING .] INTERSECT SELECT [ tábla 2.] oszlop x [ , ] FROM tábla 2 [ ideiglenes név 2] [ WHERE . ] [ GROUP BY .] 43 [ HAVING .] [ ORDER BY .] ;
Értelmezés: Azon sorokat nyerjük az eredményben, amelyek mindkét SELECT utasítás részeredményében előfordulnak. A felsorolt oszlopok számosságára, adattípusaira ugyanaz vonatkozik, mint UNION esetén. Az ALL kulcsszó itt nem értelmezett, egyebekben a többi záradékra tett kijelentések itt is érvényesek. 5.812 Táblák különbsége: EXCEPT vagy MINUS E művelet halmazok különbsége képzésének felel meg. Szintaxis: SELECT [ tábla 1.] oszlop 1 [ , ] FROM tábla 1 [ ideiglenes név 1] [ WHERE . ] [ GROUP BY . ] [ HAVING . ] MINUS SELECT [ tábla 2.] oszlop x [ , ] FROM tábla 2 [ ideiglenes név 2] [ WHERE .] [ GROUP BY .] [ HAVING .] [ ORDER BY .] ; Értelmezés: A szabvány az EXCEPT, míg egyes változatok a MINUS kulcsszót használják. Azon sorokat nyerjük az eredményben, amelyek az első SELECT utasítás részeredményében előfordulnak, de a másodikéban nem. Vagyis a második SELECT utasítás eredményével egyező részhalmazt eltávolítjuk
az első részhalmazból. A 44 felsorolt oszlopok számosságára, adattípusaira ugyanaz vonatkozik, mint UNION esetén. 5.9 A vezérlő nyelv A SQL vezérlő nyelv több funkciót lát el, ezek közül most csak a tranzakciók kezeléséhez szükséges parancsokat ismertetjük. A logikailag egybe tartozó SQL utasításokat tranzakcióknak nevezzük. Az adatbázis ellentmondás mentes tartalmának megőrzéséhez a tranzakcióknak maradéktalanul végre kell hajtódniuk. Azonban egy tranzakció megszakadása esetén is gondoskodni kell az adatbázis konzisztenciájának megőrzéséről. Erre a COMMIT és ROLLBACK parancs pár szolgál Az ORACLE nem az eredeti relációkon dolgozik. A sikeresen végrehajtott tranzakciók után a COMMIT parancs kiadásával véglegesíthetjük a tranzakció során végrehajtott változtatásokat a relációkban. A ROLLBACK parancs segítségével pedig visszaléphetünk az előző véglegesített eredményeznek állapothoz. (CREATE Bizonyos
TABLE, parancsok QUIT automatikusan stb.) De az COMMIT-ot AUTOCOMMIT rendszerváltozó beállításától függően minden parancs kiválthat egy COMMIT-ot is. 45 6. Elért eredmények kiértékelése és a következtetések levonása A modul kidolgozásánál kitűzött célokat teljes egészében sikerül elérni, így amit a kezdeti céloknál is kihangsúlyoztam a tananyag oktatásánál nagy segítséget nyújtott a távoktatási segédlet, főleg a gyakorlati részeknél, a bőséges példatárával. Az eddigi tapasztalatok alapján a modult sikertelenül teljesítők aránya 20% körül mozgott. A sikertelenség okát vizsgálva elsődlegesen a túl kevés gyakorlati példa és egyéb okok játszottak szerepet. A gyakorlati oktatásban nagy segítséget jelentett a mellékelt távoktatási segédlet. A tanítási tapasztalatok alapján melyet egy csoport gyakorlati oktatásán végeztem, a modult sikertelenül teljesítettek aránya 10% alá csökkent. Ezt is talán
a leginkább azzal lehet magyarázni mivel voltak olyanok is akik az előadásokon és a gyakorlatokon is hiányosan vettek részt, ezenkívül a segédletet sem használták. A modult mindenféleképpen sikeresnek tartom, és bevezetném hogy minden modulból készüljön távoktatási segédlet is, mivel ennek nagy jelentősége van azok számára is akik nem vesznek részt az oktatásban, másrészt viszont a gyakorlati részek kidolgozását amelyre nem fektetnek elég hangsúlyt. És ezenkívül a tanulást ellenőrző folyamatot a tesztkérdéseket minden egyes összetartozó szakasz után. 46 7. Felhasznált irodalom [1] Stolnicki Gyula SQL kézikönyv, ComputerBooks, 1998 [2] Balogh János, Dr. Dedinszki Ferenc Foxpro 2.0, ComputerBooks, 1994 [3] Marco Cantu Delphi 3 mesteri szinten I. kötet, Kiskapu kiadó, 1998 [4] Bana István Az SSADM rendszertszervezési módszertan, LSI Oktatóközpont, 1996 [5] Borland Borland Delphi Database Application Developer’s
Guide, Borland, 1996 [6] Borland InterBase User’s Guide, Borland, 1996 [6] Kertész László Delphi környezet és nyelv, Kertész László, 1995 47 8. Melléklet 8.1 A lemezmelléklet tartalma A lemezmellékleten foglal helyet a tanítási segédlet. Nagyon fontosnak tartom megjegyezni hogy ez az anyag teljes mértékben az önálló tanulásra épít, így elsődlegesen a távoktatást veszi célba. De elengedhetetlennek tartom a gyakorlati oktatás szempontjából is, mivel itt szerepel a teljes elméleti anyag, ezen kívül a gyakorlati alkalmazások hatalmas skálája is, példákon keresztül illusztrálva. A segédlet a napjaink egyik legelterjedtebb formátumában készült, hipertext rendszerben (Html), így pillanatok alatt internetre is átültethető. A dokumentum megtekinthető a legelterjedtebb internet bőngészők bármelyikével, Netscape navigátor 3.0 , Internet Explorer 30 vagy ezek újabb változatával Kezdetben csak az index.html állományt kell
betölteni amely automatikusan kapcsolódik ún Linkeken keresztül a többi anyagrészhez. 48