Közlekedési információs rendszerek I. számítógépes laborgyakorlat jegyzet Szerzők: Dr. Csiszár Csaba, Caesar Bálint, Csonka Bálint és Földes Dávid Kulcsszavak: információ, adat, adatbázis, SQL nyelv, Microsoft Access A tananyag összefoglalja az adatbázis-kezelő rendszerek és a számítógépes adatbázis-kezelés alapjaival kapcsolatos fogalmakat, ismeretanyagot. Az SQL nyelv parancsai és azok alkalmazási szabályai ( szavak + nyelvtan ) minta adatbázison keresztül kerülnek ismertetésre. A képzés során a hallgatók elsajátítják az adatmodellezés és az adatbázisok önálló tervezésének módszereit, és ezek alapján képessé válnak saját adatbázis létrehozására és az adatok több szempont szerinti feldolgozására.
Tartalomjegyzék Előszó 1 1. Az adatbázis-kezelés alapjai 2 Az adatbázis-kezelő rendszerek és szoftverek fejlődése 2 Az SQL nyelv jellemzői 4 A Microsoft Access jellemzői 5 Adattípusok 7 2. Normalizálás 9 Normalizálás lépései 1. példa 9 Normalizálás lépései 2. példa 12 N:M (több-több) kapcsolat felbontása kapcsolótáblával (fogalmi egyedtípussal) 13 Kapcsolatok létrehozása táblák ismételt hozzáadásával 14 Minta adatbázis szerkezete (táblán belüli kapcsolat) 15 3. Minta adatbázis létrehozása 17 A tábla szerkezet létrehozása 17 Minta adatok felvétele 19 4. SQL parancsok csoportosítása, SELECT parancs 20 DDL parancsok 20 DML parancsok 21 SELECT parancs szerkezete 21 SELECT lista elemei, alternatív oszlopnév 22 5. SELECT parancs 23 Rendezés (ORDER BY) 23 Hiányzó adatelem (NULL érték) problematika 23 Adatválaszték megtekintése (DISTINCT) 24 Sorfeltétel (WHERE) 24 Aritmetikai, logikai és összefűző operátorok 26 6. SELECT parancs 27 Függvények 27 Csoportképzés (GROUP BY) 29 Csoportfeltétel (HAVING) 32 7. Összetett lekérdezések 33 Listázás egyszerre több (kapcsolódó) táblából 33 Egymásra épülő lekérdezések 33 Beágyazott lekérdezés (subquery) 34 Kereszttáblás lekérdezések 35
8. DDL parancsok 37 CREATE parancs 37 Érvényességi szabályok (CONSTRAINT-ek) 37 Alapértelmezett érték 38 ALTER parancs 39 DROP parancs 39 9. DML parancsok 40 INSERT INTO parancs 40 UPDATE parancs 41 DELETE FROM parancs (rekord, táblatartalom) törlése 41 Rekordok uniója 42 Táblakészítő lekérdezés 42 10. Gyakorló feladatsorok 43 1. gyakorlati ZH-ra felkészítő feladatok 43 2. gyakorlati ZH-ra felkészítő feladatok 44 Irodalomjegyzék 45 Mellékletek 46
Előszó A közlekedési rendszerek (szervezetek) és folyamatok megszervezése, valamint célorientált működtetése magas színvonalú információellátást kíván. A közlekedési információs rendszerek célja az információigények kielégítése, melynek hatékonysága az erőforrásként kezelt adatbázis-szerkezeteken múlik. Az információnak és az azokat hordozó adatoknak értéke van, és ezért nem közömbös, hogy hogyan bánunk ezzel az értékkel. A közlekedési információs rendszerek legfontosabb soft összetevője az adat. A rendszerelemek és folyamatok között az áramló adatok teremtenek kapcsolatot. Az adatbázisok az adatok strukturált rendszere, amely az adatfelvételi és felhasználási folyamatok közötti időkülönbség áthidalását is lehetővé teszik (tárolás). Emellett az adatbázis fogalom az utóbbi időben kibővült a feldolgozási folyamatokkal is. Ennek megfelelően az adatbázis-kezeléssel összefüggő ismeretanyag elsősorban a tárolási szerkezet és a feldolgozási műveletek megtervezésére fókuszál. Mivel az adatok leképezik a működtetett rendszer összetevőit és folyamatait, ezért a közlekedési rendszerek felépítésének és működésének precíz ismerete és a megfelelő absztrakciós készség az adatmodellezéshez nélkülözhetetlen. A téma jelentőségét a napjainkban megfigyelhető, hosszabb folyamatként tekinthető ún. információrobbanás fokozza. A kezelt információk mennyiségét alapvetően a közlekedésben résztvevő alapfolyamati összetevők száma, az egyes összetevőkről gyűjtött jellemzők köre és a mintavételezési időköz befolyásolja. Az utóbbi két tényező miatt az utóbbi időszakban jelentősen nőtt a kezelendő adatok mennyisége, miközben a felhasználás során továbbra is kis időtartam áll rendelkezésre a lekérdezések lefuttatására. További kihívás a különböző forrásokból származó, eltérő formátumú, jelentéstartalmú, stb. információk összefésülése és közös kezelése, ami a közlekedés egész információs rendszerére kiterjedő integráció alapfeltétele [1]. A közlekedési információs rendszerek elemzésével, tervezésével és azokon belül az adatbázistervezéssel foglalkozó tantárgyak oktatása több évtizedes hagyományokra tekint vissza a Budapesti Műszaki és Gazdaságtudományi Egyetem Közlekedésmérnöki és Járműmérnöki Karának Közlekedésüzemi és Közlekedésgazdasági Tanszékén [2]. A relációs adatmodellezés és adatbázis-tervezés ismeretanyaga viszonylag stabilnak tekinthető. Ezt a tudásbázist adjuk át a hallgatóknak a folyamatosan változó szoftverek kínálta környezetben. Tehát az oktatás során elsősorban az időtálló ismeretekre fókuszálunk, miközben az adott szoftver alkalmazását is elsajátítják a hallgatók. A jegyzet összeállítását a tananyag folyamatos frissítése és didaktikai szempontok szerinti strukturálása, valamint az oktatás eredményei, tapasztalatai tették lehetővé [3]. Az adatbázis-kezelés ismeretköre a kifejlődés előzményeivel, alapjaival kezdődik. A fogalmakat és definícióikat, valamint azok egymásra épülését a hallgatók az előadási órákon sajátítják el, amelyet a gyakorlati foglalkozások példáin keresztül mélyítenek el. Terjedelmi korlátok miatt a jegyzet csak a tananyag vázát tartalmazza, így annak tartalma évről-évre változhat. A parancsok kipróbálása, gyakorlati elsajátítása számítógépes laborban történik, ami megkívánja a hallgatóságnak a laborfoglalkozásokon történő intenzív részvételét. A sokrétű anyag könnyebb elsajátításához a jegyzet fejezetei után gyakorlati feladatok szerepelnek. A tananyag végén a legfontosabbnak tartott irodalmi forrásoknak a megjelölését találjuk, amelyekből elmélyítési szándék esetén a témához tartozó további részletek megismerhetők. 1
1. Az adatbázis-kezelés alapjai Adatbázis: Felesleges átfedés nélkül együtt tárolt és egymással kapcsolatban lévő adatok együttese, összetett logikai szerkezetű adathalmaz. Korábban az adatbázis csupán a strukturált adathalmazt jelentette, ma már azonban a feldolgozási műveletek egy jelentős része is az adatbázis fogalmához tartozik. Az adatbázis szervezettsége lehetővé teszi a tárolt adatokhoz való hozzáférést és ezek módosítását. Az adatbázisok célja adatok megbízható tárolása, és gyors visszakereshetőségének biztosítása. Az adatbázis fogalma nem keverendő össze az adatbáziskezelővel, amely az adatbázis működtetésére, rendszerszintű és felhasználói folyamatainak szervezésére szolgál. Az adatbázisok tervezése adatmodell készítésével kezdődik. Adatmodell: valóság leképezése adatokra, azok kapcsolataira, felhasználásuk körülményeire, szabályaira. Az adatbázis szerkezetének a megtervezése. Az adatbázissal végzett műveleteket adatbázis-kezelésnek nevezzük, melynek célja, hogy a keletkező, rendelkezésre álló adatokból (amelyek volumene a technika fejlődésével folyamatosan nő) a leghatékonyabban felhasználható információkat nyerjük ki rövid lekérdezési idővel. Az adatok tárolása két síkon jelenik meg: logikai sík - mit tárolunk; milyen adatokat milyen összefüggésekben tárolunk; fizikai sík - hogyan tároljuk; hogyan érjük el azokat a fizikai háttértáron. A számítógépes adatfeldolgozás feladatai: 1. az adatbázis-szerkezet megtervezése, elkészítése, (az üres táblák és kapcsolataik definiálása), 2. adatbevitel az üres szerkezetbe (felhasználóbarát legyen), adatok formai és tartalmi ellenőrzése, 3. adatok aktualizálása: - új adat felvétel, - módosítás, - törlés. 4. adatok lekérdezésének megtervezése (ennek a szolgálatába állítjuk az adatmodellt) - egyszerű lekérdezés (pl. keresés, sorba rendezés), - összetett lekérdezés (pl. csoportosítás, feldolgozás). 1.1. Az adatbázis-kezelő rendszerek és szoftverek fejlődése Az adatok gyors, gépesített, tárolásának és visszakeresésének igénye már a múlt század első felében felmerült, amikor az első népesség nyilvántartást végző lyukszalagos számítógépek megjelentek. Az első ún. szekvenciális ( soros hozzáférés az adatokhoz a fizikai elhelyezkedés sorrendjében, sok adat felesleges érintésével ) fájlokat az 1940-es évek végén alkalmazták. Az első nem szekvenciális ( direkt hozzáférés bármelyik adatelemhez címzéssel) hozzáférést biztosító fájlrendszert 1959-ben fejlesztették ki az IBM-nél. Az adatbázisok jelenlegi, korszerűbb formái az 1960-as évek közepén kezdtek el kialakulni, amikor számos új programozási nyelv jelent meg (pl. Fortran, Basic). Nem sokkal ezután megjelentek az első adatbázis-kezelő rendszerek is. Az 1961-es évben dolgozták ki a hálós adatmodell alapjait, 2
majd nem sokkal később kialakult a hierarchikus adatmodell is. A hálós adatmodellben bármely egyed, bármely másik egyedhez kapcsolódhat (többféle kapcsolatban is lehetnek egymással). Például személyek közötti kapcsolatrendszer (N:M kapcsolatok). A kapcsolatrendszer láncolt listákkal (pointerekkel) működik. Felbontják 1:N kapcsolatokra. A hierarchikus adatmodell az egyedek alá-fölérendeltségét veszi alapul, amit szülő - gyerek kapcsolatként ábrázol fa-gráfban (1:N, 1:1 kapcsolatok). Az első hálózatos hozzáférést biztosító adatbank 1965-ben jelent meg az IBM-nél, és a SABRE nevet kapta. A hagyományos adatbázis-kezelő rendszerek a számmal és betűvel leírható (alfanumerikus) adatok gyűjtésével és feldolgozásával foglalkoztak viszonylag szűk területen. A később kialakuló korszerű adatbázis-kezelő rendszerek már lehetővé teszik a képi, hang, stb. adatállományok tárolását is. Az adatmodellezés célja, hogy az egyedekről egy számítógéppel könnyen feldolgozható adatszerkezetet készítsünk. Az adatmodellek legelterjedtebb típusai: hierarchikus, hálós, relációs, objektumorientált, multidimenziós. A hálós és a hierarchikus adatmodelleket az első kereskedelmi adatbázisrendszerekben használták az 1960-as évek végén és az 1970-es években. A relációs adatmodellek később ezeket kiszorították. A relációs adatmodell az 1980-as évektől kezdve a legelterjedtebb adatmodell. Az adatokat táblázatok soraiban ábrázolják. Ebben a modellben nincsenek előre definiált kapcsolatok az egyes adatelemek között. A kapcsolatok létrehozásához szükséges adatokat többszörösen tárolják. Manapság az adatbázis-kezelés területén is teret hódítanak az új megközelítések, mint pl. az objektumorientáltság. A hálózatok elterjedésével az osztott adatbázis-kezelők szerepe is jelentősen növekszik. A legelterjedtebb adatbázis-kezelő szoftvereket az 1.1. táblázat foglalja össze. Nyíltforrású adatbázis-kezelők 1.1. táblázat A legelterjedtebb adatbázis-kezelők Ingyenesen letölthető adatbázis-kezelők Korlátozás nélkül használható adatbázis-kezelők Az egyes adatbázis-kezelők esetén a felhasználás korlátozott, de tanulási célra mindegyik megfelelő MySQL (Linux/Windows) PostgreSQL (Linux/Windows) Ingres Community Edition Microsoft SQL Server 2008 Express Edition Microsoft SQL Server 2008 Management Studio Express Oracle Database 11g Express Edition (Linux/Windows) Microsoft Jet Database Engine 3 Trial: Informix Dynamic Server Enterprise Edition V10.0 SQLite (Linux/Windows) Mini SQL 3
A Közlekedésmérnöki és Járműmérnöki Karon a korábbi évtizedekben a dbase, Clipper, Oracle9.i, Access 2.0 majd az újabb verziójú Access adatbázis-kezelőket és a hozzájuk tartozó alkalmazásfejlesztési gyakorlatot ismerték meg a hallgatók. Jelenleg az Access adatbáziskezelő a legalkalmasabb oktatási célra a széleskörű hozzáférhetősége miatt. A képzésnek mindig fontos része volt az önálló adatbázis-tervezési, fejlesztési munka; ezért a hallgatók az adatmodellt és az alkalmazást egy általuk választott közlekedési témában készítik el (konzultációs támogatással). (Féléves házi feladat témáinak kiválasztása). 1.2. Az SQL nyelv jellemzői A különböző típusú adatbázis-kezelő rendszerek kialakulása szükségessé tette a szabványos lekérdező nyelv kifejlesztését. Így jött létre az általános lekérdező nyelv, az SQL (Structured Query Language), ami a köznapi beszédhez és gondolkodáshoz hasonló jelkészletet használ; 1986-ban szabványosították. SQL= (parancs)szavak + nyelvtan (a szavak használatára vonatkozó szabályok). Az SQL a relációs adatbázis létrehozására és lekérdezésére, a relációkban tárolt információk visszanyerésére szolgál. Nem az adatok elérési módját kell megadni, hanem a kívánt információ tulajdonságait. Az SQL nyelvben a következő elemeket különböztetjük meg: objektumok, NULL érték, kifejezések, műveletek, utasítások, szintaktikai elemek, adatbázisok eljárás jellegű elemei. Az SQL parancsok megadásának formai szabályai: egyezményes jelölésrendszert alkalmaznak (1.2. táblázat). Például: nagybetű: parancsszavak, logikai műveleti jelek, függvények nevei, stb. kisbetű: objektumok, oszlopok nevei, stb. Jelölés NAGYBETŰ Dőlt kisbetű Jelentés 1.2. táblázat SQL parancsok fontosabb formai szabályai Kötelező megadás, nem szabad elhagyni és pontosan kell leírni az ilyen jelöléssel megadott szavakat. Felhasználói megadás, a felhasználó által megadott változókat jelenti. [] Nem kötelező elemek felsorolása. Azonos elemek ismétlődését jelöli. <> Feltétlenül megadott elemeket kell felsorolni. {} Ebben az esetben egy vagy több elem közül egyet kötelező felsorolni. Két vagy több lehetőség közüli választást jelöli. 4
Az egyes adatbázis-kezelők eltérő módon könnyítik meg a felhasználói parancsok bevitelét; azaz felismerik a nem formai szabályok szerinti begépelést és a szintaktikai szabályok szerint módosítják azokat. Az adatbázisok létrehozásának célja, hogy minél több információt nyerjünk ki azokból. Ennek megfelelően a legfontosabb parancs a lekérdező SELECT parancs. Nagyméretű, hálózatos adatbázisok esetében különösen fontos a felhasználók/felhasználó csoportok jogosultságainak beállítása (pl. GRANT, REVOKE parancsok) és az általuk végzett műveletek naplózása. Az alapvető SQL parancsokat az 1.3. táblázat foglalja össze. 1.3. táblázat Alapvető SQL parancsok Adatdefiniáló (DDL) Data Definition Language Adatkezelő (DML) Data Manipulation Language Lekérdező (DQL) Data Query Language objektum létrehozás objektum módosítás objektum megszüntetés rekord felvitel rekord módosítás rekord törlés lekérdezés CREATE ALTER DROP INSERT INTO UPDATE DELETE FROM SELECT Az SQL nem eljárás orientált nem azt tartalmazza, hogy hogyan, hanem azt hogy mit akarunk megkapni. Szigorú a szintaktika. SQL-t befogadó nyelvek: pl. Pascal, C, Cobol, dbase, Access PL/SQL=Procedural Language - eljárások készítését is lehetővé teszi. változók deklarálása, értékadás, feltételes szerkezetek, ciklus, függvények, eljárások definiálása. 1.3. A Microsoft Access jellemzői MS ACCESS= relációs adatbázis-kezelő program, amely felhasználóbarát grafikus felülettel rendelkezik. Az Accessben alkalmazott objektum típusokat és azok kapcsolatait (egymásra épülését) az 1.1. ábra szemlélteti. Az objektumok részletes jellemzése az 1.4. táblázatban található. Számos esetben a felhasználói műveleteket beépített segédalkalmazások, ún. varázslók támogatják. Az Access programnak újabb és újabb verziói jelennek meg (kompatibilitási kérdések), azonban a háttérben lévő tudásanyag (relációs adatmodell) változatlan. Mire alkalmas az Access? És mire nem? 5
Táblák Lekérdezések Űrlapok Adatbázis alkalmazás Jelentések Makrók Modulok Táblák Lekérdezések Űrlapok Jelentések Makrók Modulok 1.1. ábra Az Access objektumtípusok kapcsolatai 1.4. táblázat Az Access adatbázisok objektumainak jellemzői megjelenésükben hasonlítanak a táblázatokra ne legyen benne adat ismétlődés/redundancia (normalizálás) meglévő táblá(k)ra és/vagy lekérdezés(ek)re épülnek többféle feladatot láthatnak el két alaptípus: választó (összegyűjti és elérhetővé teszi a kért adatokat) és módosító lekérdezés (valamilyen feladatot/akciót hajt végre az adatokkal) a különböző táblában tárolt adatokat egy táblában meg tudja jeleníteni gyakran szolgálnak rekordforrásként űrlapok és jelentések számára adatbeviteli és adatmegjelenítő képernyő - az adatokkal végzett munkához felületén az műveleteket végrehajtó parancsgombok is lehetnek (menürendszer építhető) adatmegjelenítés nyomtatásban - az adatok bemutatására/összegzésére szolgál futtatásakor az adatbázis aktuális adatait tükrözi e-mail-en küldhető felület képezhető egy egyszerű programozási nyelv eseményvezérlés automatizálását teszik lehetővé; gyakran ismétlődő műveletek egy parancsba foglalása, a műveletek végrehajtása különböző feltételekhez köthető segítségével új funkciók adhatók az adatbázishoz VBA-Visual Basic nyelven írt saját programok, eljárások, függvények, stb. Új adatbázis létrehozásakor a felkínált mintaadatbázisok használata nem szükséges. Az Accessben egyetlen egy file jön létre, ami hordozható. A jellemző képernyőképet az 1.2. ábra szemlélteti. Az ablak bal oldalán választható ki az objektumtípus. Az adatbázis-objektumok létrehozására általában három lehetőség van: Automatikusan: ekkor az Access automatikusan elkészíti az objektum egy előre definiált változatát (ritkán használjuk). 6
Varázsló segítségével: a varázsló-technikával végigvezet a tervezési folyamaton. Tervező nézetben: teljesen manuális a tervezés, itt a rendszer valamennyi lehetősége elérhető. 1.2. ábra Az Access jellemző képernyőképe A lekérdezések hátterében az SQL nyelv található, hiszen minden lekérdezéshez egy SQL utasítás rendelődik, mely a lekérdezés műveleteit definiálja. Az egyszerűbb lekérdezéseket a tervező nézetben rács segítségével hozzuk létre, míg az összetett lekérdezéseket (bonyolultabb feldolgozási műveleteket) általában az SQL utasítások szerkesztésével (1.3. ábra). Lekérdezések Egyszerű QBE rács és grafikus lekérdezés-tervező eszközök (feltétel összeállítása vizuálisan) Összetett SQL utasítások szerkesztése (feltétel összeállítása programozással ) 1.3. ábra A lekérdezések típusainak létrehozása 1.4. Adattípusok Az Access különböző verziói kb. 10 jellegzetes adattípus tárolását teszik lehetővé (1.5. táblázat). A verzióktól függően lehetnek eltérések. A táblák mezőinek (az egyedek tulajdonságainak) adattípusát a táblatervezésnél (Tervező nézetben) kell beállítani. Az adattípusok beállításával egyúttal az adatérvényesítés legegyszerűbb módját is biztosítjuk, hiszen a felhasználók csak a megfelelő típusú adatokat vihetik be a táblamezőkbe. Keresés varázsló: egy másik táblából választhatunk értéket (idegen kulcs), de mi is megadhatjuk a választható adatok körét. Általában idegen kulcsnál alkalmazzuk, amikor az 1 oldalon lévő táblából választunk értéket. 7
1.5. táblázat Az Access adattípusai Adattípus Amit tárol Korlátok, követelmények Szöveg Feljegyzés Szám Dátum/idő Pénznem Számláló Igen/Nem OLE-objektum Hiperhivatkozás Melléklet Alfanumerikus adatok (szöveg és számok) fix hosszúságú Alfanumerikus adatok (szöveg és számok) változó hosszúságú Numerikus adatok (akkor választjuk, ha műveletet akarunk vele végezni; egyébként szöveg típus) Dátumok és idők megadása (numerikusból származtatott) Pénzösszeg adatok (numerikusból származtatott) Egyedi értékek, amelyeket az Access tölt fel minden új rekord létrehozásakor (numerikusból származtatott) Logikai (Igaz vagy Hamis értékű) adat (numerikusból származtatott) Képek, dokumentumok, rajzok, egyéb objektumok Office és Windows-alapú programokból Webcímek Bármely támogatott típusú fájl Az adattárolási egységek két típusa: egyszerű adattárolási egység: változó, összetett adattárolási egység: rekord. max. 255 karakter beviteli maszk adható meg keresés, szűrés, sorba rendezés NEM LEHETSÉGES Feljegyzés adattípus esetében manuálisan adatbevitelnél max. 65535 karakter mezőméret beállítható 1, 2, 4, 8 és 16 bájtra bájt (0 255), egész (0 65535), hosszú egész (csak egész számok) egyszeres, dupla (tizedesek is lehetnek) 8 bájtos dupla pontosságú egész számként tárolódik beviteli maszk adható meg 8 bájtos számokként, négy tizedes jegy pontossággal tárolódik 4 bájtos értékeken tárolódik általában elsődleges kulcs -1 => Igen 0 => Nem max. 2 GB adatot tárol szükség van egy OLE-kiszolgálóra (olyan programra, amely támogatja az adott fájltípust) max. 1 GB adatot tárol internetes, belső és helyi hálózati vagy a saját számítógépen található webhelyekre és fájlokra mutató hivatkozások tárolhatóak képeket, számolótáblákat, dokumentumokat, grafikonokat és más támogatott típusú fájlokat csatolhat az adatbázis rekordjaihoz A rekordban az adatok logikailag kapcsolódnak egymáshoz. A rendezőelv maga az egyed, aminek a tulajdonságait tárolja el a rekord. Az egyed lehet személy, tárgy, fogalom (pl. megállóhelyi kiszolgálás). Azok az egyedek tartoznak egy egyedtípusba, amelyekről azonos tulajdonságokat tárolunk. 8
2. Normalizálás Az adatbázis készítés a nyilvántartandó adatok körének meghatározásával kezdődik. Ezt követi a normalizálás (táblázat szétbontó műveletek): amikor helyes tárolási szerkezetet alakítunk ki. A normalizálás során a nyilvántartandó adatokat egymással kapcsolatban álló táblákba csoportosítjuk úgy, hogy eredményül egy kisebb tárolási igényű és áttekinthetőbb, a normalizálás szabályrendszerének megfelelő adatbázist kapjunk. A normalizálás több lépésből áll, minden lépés eredményeként az adatbázis szerkezete eggyel magasabb szintű normál formula (NF) feltételeit teljesíti. A NF szintek kumulatívak, tehát a magasabb szint eléréséhez az alacsonyabb szintek összes feltételének is teljesülnie kell (szigorodó szabályrendszer). Példákon keresztül mutatjuk be a normalizálás egymásra épülő lépéseit. 2.1 Normalizálás lépései 1. példa A példában a járművekhez rendelhető kiegészítőket tartjuk nyilván. Egy adatbázis szerkezetének kialakításakor első lépés a szükséges adatigény meghatározása, majd táblázatba rendezése (2.1. táblázat): alvázszám, gyártmány, típus, ajtók száma, kiegészítő neve, kiegészítő (típusának) cikkszáma. 2.1. táblázat 0. NF W0B578547 Opel Astra 5 Légzsák 10125 Klíma 98542 GTH4724782 Fabia Skoda öt Légzsák 10125 Klíma 32545 Riasztó, CD-tár CCP4672134 Lada Samara 3 Féklámpa 00001 CCP4672134 Lada Samara 3 Féklámpa 00001 10254, 65020 1. NF Az 1. NF feltételei nem teljesülnek, mert: az oszlopok száma és sorrendje nem azonos minden sorban, az ajtók száma attribútum nem minden sorban szám típusú értéket vesz fel, egyes attribútumok több értéket is felvesznek, van két egyforma sor (redundancia), így nem lehet elsődleges kulcsot képezni. Az 1. NF feltételeinek megfelelő táblaszerkezetet a 2.2. táblázat mutatja be. Egy egyednek (rekordnak) egy járműbe épített konkrét kiegészítő felel meg. A sorismétlések miatt az egyértelmű azonosítás (elsődleges kulcs) összetett kulccsal valósítható meg. Például jelen esetben az alvázszám és a kiegészítő cikkszáma egyértelműen azonosítja a sort. Az összetett 9
elsődleges kulcsban a kiegészítő neve nem lenne megfelelő, ugyanis a kiegészítő neve nem határozza meg egyértelműen a cikkszámot, hanem fordítva, a kiegészítő cikkszáma határozza meg annak nevét. Az 1. NF-ban ugyanis feltétel, hogy a másodlagos attribútumok funkcionálisan függjenek az elsődleges kulcstól. Abban az esetben, ha nem tudunk összetett kulcsot meghatározni vagy már túl sok mezőből állna az összetétel, akkor egyedi azonosítót veszünk fel (pl. ID elnevezéssel - számláló típussal). 2. NF 2.2. táblázat 1. NF Alvázszám Gyártmány Típus Ajtók Kiegészítő Kiegészítő száma neve cikkszáma W0B578547 Opel Astra 5 Légzsák 10125 W0B578547 Opel Astra 5 Klíma 98542 GTH4724782 Skoda Fabia 5 Légzsák 10125 GTH4724782 Skoda Fabia 5 Klíma 32545 GTH4724782 Skoda Fabia 5 Riasztó 10254 GTH4724782 Skoda Fabia 5 CD-tár 65020 CCP4672134 Lada Samara 3 Féklámpa 00001 A 2. NF feltételei nem teljesülnek, mert: van olyan mező, amely az összetett elsődleges kulcsnak csak egy részétől függ (pl.: alvázszám már egyértelműen meghatározza a gyártmányt). A 2. NF megalkotásához meg kell határozni, hogy az egyes nem-kulcs (másodlagos) attribútumok mely összetevőktől függnek (2.1. ábra). Alvázszám Kiegészítő cikkszáma Gyártmány Típus Ajtók száma Kiegészítő neve 2.1. ábra Attribútumok egymás közötti funkcionális függése Az alvázszám attribútum egyértelműen meghatározza a jármű gyártmányát, típusát és az ajtók számát. A 2. NF táblázatszétbontó szabályának megfelelően (minden mező a teljes összetett kulcstól függ, vagy a kulcs egy mezőből áll) külön választott attribútumokat 3 külön táblába rendezzük (2.2. ábra), ahol már az egyedtípusok is azonosíthatók. A táblák közötti kapcsolattípusok alapján meghatározhatók az elsődleges és az idegen kulcsok. Az Autó és Kiegészítő (típus) táblában egy, míg az Egy autó egy kiegészítő típusa táblában két mezőből áll az elsődleges kulcs (ez utóbbi két mező egy-egy idegen kulcs is). A több (N) oldalon lévő táblában (Egy autó egy kiegészítő típusa) a két mező együttesen alkotja az összetett kulcsot; ez a tábla egy ún. kapcsolótábla. 10
1:N Autó Alvázszám Gyártmány Típus Ajtók száma W0B578547 Opel Astra 5 GTH4724782 Skoda Fabia 5 CCP4672134 Lada Samara 3 1:N Egy autó egy kiegészítő típusa Kiegészítő (típus) Cikkszám Alvázszám Cikkszám Név 10125 W0B578547 10125 Légzsák 98542 W0B578547 98542 Klíma 10125 GTH4724782 32545 Klíma 32545 GTH4724782 10254 Riasztó 10254 GTH4724782 65020 CD-tár 65020 GTH4724782 00001 Féklámpa 00001 CCP4672134 jelmagyarázat: elsődleges kulcs idegen kulcs 2.2. ábra 2. NF Megfigyelhető, hogy az adatelemek száma csökkent: 42 helyett 38, azaz mérsékeltük a redundanciát. (Gyenge logikai redundancia a kapcsolatok felépítéséhez szükséges.) 3. NF A 3. NF feltételei nem teljesülnek, mert: funkcionális függés nem csak az elsődleges kulcsból indul ki, azaz a másodlagos attribútumok között is van funkcionális függőség (tranzitív függőség). A 2. NF Autó táblában az Alvázszámtól valamennyi másodlagos attribútum függ. Azonban a Típus mező is egyértelműen meghatározza a Gyártmányt, azaz két másodlagos attribútum között is van tranzitív függőség. Például, ha több Opel Astra típusú autó szerepelne a táblában, akkor minden egyes alkalommal rögzíteni kell a gyártmányt és a típust is (redundancia). Ezért a 3. NF feltételeit újabb táblázatszétbontással lehet teljesíteni, aminek az eredményét a 2.3. ábra táblaszerkezete szemléltet. A szakirodalomban létezik még 4. és 5. NF is, de rendszerint elég, ha az adatbázis teljesíti a 3. NF feltételeit. 11
1:N Autó típus Autó Típus Gyártmány Alvázszám Típus Ajtók száma Astra Opel W0B578547 Astra 5 Fabia Skoda 1:N GTH4724782 Fabia 5 Samara Lada CCP4672134 Samara 3 jelmagyarázat: 1:N Kiegészítő (típus) Egy autó egy kiegészítő típusa Cikkszám Név Cikkszám Alvázszám 10125 Légzsák 10125 W0B578547 98542 Klíma 98542 W0B578547 32545 Klíma 10125 GTH4724782 10254 Riasztó 32545 GTH4724782 65020 CD-tár 10254 GTH4724782 00001 Féklámpa 65020 GTH4724782 00001 CCP4672134 elsődleges kulcs idegen kulcs 2.3. ábra 3. NF 2.2 Normalizálás lépései 2. példa A példában számlák legfontosabb adatait tartjuk nyilván. A következő adatelemeket (tulajdonságokat) kívánjuk tárolni: SZLASZÁM DÁTUM VEVŐNÉV VEVŐCÍM TERMÉKKÓD TERMÉKNÉV MENNYISÉG EGYSÉGÁR ÖSSZEG (más mezőkből számítható értéket nem tárolunk) ÖSSZESEN A normalizálásnak megfelelő helyes táblaszerkezetet egyszerűsített ábrázolási móddal szemlélteti a 2.4. ábra (táblák és attribútumok nevei, kapcsolatok jelölése a kulcsok megadásával). 12
4. tábla Vevő 1. tábla 2. tábla 1:N 1:N N:1 Szla_törzs Eladás 3. tábla Termék VEVŐNÉV VEVŐCÍM SZLASZÁM DÁTUM VEVŐNÉV ÖSSZESEN SZLASZÁM TERMÉKKÓD MENNYISÉG TERMÉKKÓD TERMÉKNÉV EGYSÉGÁR jelmagyarázat: elsődleges kulcs idegen kulcs 2.4. ábra 3. NF-ban lévő táblaszerkezet (számlás példa) 2.3. N:M kapcsolatok felbontása kapcsolótáblával (fogalmi egyedtípussal) Az adatbázis táblaszerkezetének kialakításakor az N:M típusú, vagyis a több-a-többhöz típusú kapcsolatok kerülendők. Az ilyen kapcsolatok egy közbenső harmadik tábla (kapcsolótábla) bevezetésével bonthatók fel. Az új tábla többnyire egy fogalmi egyedtípushoz tartozik. A felbontás műveletét két példán mutatjuk be. Az eredmény: két darab egymásra szimmetrikus 1:N kapcsolat. 1. Példa: kórházi kezelések (orvosok és betegek) nyilvántartása 2.5. ábra Beteg Orvos N:M BetegAz Név Szül_dátum OrvosAz Név Osztály Beteg Orvos N:1 BetegAz Név Szül_dátum OrvosAz Név Osztály 1:N Kezelés KezelésAz BetegAz OrvosAz Betegség Dátum jelmagyarázat: elsődleges kulcs idegen kulcs 2.5. ábra N:M kapcsolatok felbontása (kórházi kezelés példa) 13
2. Példa: online webshop ügyfeleinek és termékeinek nyilvántartása (egy vásárlás során több, egymástól eltérő terméket is megvehet egy ügyfél) 2.6. ábra Ügyfél Termék (típus) ÜgyfélAz Név Szül_dátum Cím TermékAz Név Ár 1:N N:M Vásárlás VásárlásAz ÜgyfélAz TermékAz Darab Dátum Ügyfél Termék (típus) ÜgyfélAz Név Szül_dátum Cím TermékAz Név Ár 1:N N:1 Vásárlás Egy vásárlás egy terméktípusa VásárlásAz ÜgyfélAz Dátum VásárlásAz TermékAz Darab 1:N jelmagyarázat: elsődleges kulcs idegen kulcs 2.6. ábra N:M kapcsolatok felbontása (online webshop példa) 2.4. Kapcsolatok létrehozása táblák ismételt hozzáadásával A példában foci-mérkőzések legfontosabb adatait tartjuk nyilván. A gólok számával nem végzünk műveleteket. A normalizálásnak megfelelő helyes táblaszerkezetet egyszerűsített ábrázolási móddal szemlélteti a 2.7. ábra (táblák és attribútumok nevei, kapcsolatok jelölése a kulcsok megadásával). A szerkezet érdekessége, hogy a csapat táblát kétszeresen kapcsoljuk a mérkőzés táblához; úgymint hazai csapat (csapat1) és mint vendég csapat (csapat2); miközben ugyanazon adatokat tároljuk a hazai és a vendégcsapatról is, azaz ténylegesen csak egyetlen adattábla létezik. (A csapatok szerepköröket is válthatnak, ugyanis egyszer hazai csapatok, máskor vendégek.) Ez a problémakör ún. virtuális tábla hozzáadásával oldható fel, ami az Accessben a tábla ismételt hozzáadásával végezhető el (pl. a lekérdezés tervező rácsa feletti mezőben). 14
pálya 1:N mérkőzés csapat_1 PÁLYAAZ PÁLYA_MEGNEVEZÉS CÍM PÁLYAAZ CSAPAT1AZ CSAPAT2AZ IDŐPONT EREDMÉNY N:1 CSAPATAZ CSAPAT_MEGNEVEZÉS SZÉKHELY csapat_2 jelmagyarázat: elsődleges kulcs idegen kulcs N:1 CSAPATAZ CSAPAT_MEGNEVEZÉS SZÉKHELY 2.7. ábra Kapcsolatok létrehozása táblák ismételt hozzáadásával (foci-mérkőzéses példa) 2.5. Minta adatbázis szerkezete táblán belüli kapcsolat 1 EMP empno ename job mgr sal comm deptno 1 DEPT deptno dname loc Jelmagyarázat: Elsődleges kulcs Idegen kulcs 2.8. ábra Minta adatbázis szerkezete A minta adatbázisban egy szervezeten belük az alkalmazottak és a telephelyek adatait tartjuk nyilván két táblában. Az EMP táblában szerepelnek az alkalmazottak adatai (pl.: azonosító, név, munkakör, stb.), míg a DEPT táblában a telephelyek adatai (azonosító, név és helyszín). A 15
két tábla között a telephelyi azonosító teremti meg a kapcsolatot. Az adatbázis EMP táblájában az empno az elsődleges kulcs, de mint idegen kulcs is megjelenik a táblában az mgr mezőben. A DEPT táblában az elsődleges kulcs a telephely azonosító, ami az EMP táblában jelenik meg idegen kulcsként. Az egyes mezőnevek rövid leírását a 2.3. táblázat tartalmazza. 2.3. táblázat Minta adatbázis mezőnevek magyarázata Mezőnév Magyar megnevezés Leírás empno Alkalmazott azonosító Minden alkalmazotthoz tartozik egy egyedi azonosító ename Alkalmazott neve Alkalmazott vezetéknevét tartalmazza job Munkakör Alkalmazott munkakörét (pl.: CLERK) tartalmazza mgr Menedzser azonosító Alkalmazott közvetlen felettesének azonosítója hiredate Felvétel dátuma éééé/hh/nn formátumban a felvétel időpontja sal Fizetés Havi fizetés (mindenkinél ki van töltve) comm Jutalék Nem mindenkinél van kitöltve NULL érték (akinél ki van töltve, annak is lehet 0, azaz nulla mértékű jutaléka). deptno Telephely azonosító Minden telephelyhez tartozik egy egyedi azonosító dname Telephely neve Telephely nevét tartalmazza (pl.: SALES) loc Helyszín Telephely helyszínét tartalmazza (pl.: CHICAGO) A szerkezet érdekessége a táblán belüli kapcsolat az empno és mgr mezők között; azaz egy beosztott mgr mezőjében a főnökének az empno értékét tároljuk el. Ez a szerkezet kifejezetten alkalmas hierarchikus felépítésű szervezetek esetén az alkalmazottak közötti viszonyrendszer leképezésére. Ez a megoldás az eredeti és egy új virtuális EMP tábla közötti hagyományos kapcsolatnak tekinthető. A virtuális tábla gondolati alkalmazása hasonlatos, mint az előző példában. Egy alkalmazott ugyanis egyidejűleg lehet beosztott is (van főnöke) és főnök is (azaz van beosztottja). Kivételt csak a vezérigazgató (ename: KING, job: PRESIDENT) képez, ugyanis neki nincs főnöke, azaz nála az mgr mező NULL értékű. A többi alkalmazottnál az mgr mező értéke ki van töltve. Ha valakinek nincs beosztottja, azaz a hierarchia legalsó szintjén helyezkedik el, akkor az ő empno-ja nem jelenik meg más alkalmazott mgr mezőjében. Adatbeviteli sorrend: mivel adatbevitelnél mindig az 1 oldalon lévő tábla rekordjait töltjük ki először, ezért ebben a szerkezetben a hierarchia magasabb szintjén álló alkalmazottat (főnököt) vesszük fel először a nyilvántartásba (vagy esetleg az mgr mező, mint idegen kulcs kitöltésére később térünk vissza). 16
3. Minta adatbázis létrehozása A 2.5. fejezetben bemutatott minta adatbázist a Microsoft Access szoftverrel hozzuk létre, ami támogatja az SQL nyelv használatát. Egyetemi hallgatók számára az MS Access a szoftver.eik.bme.hu oldalról tölthető le a teljes Office csomag részeként. A minta adatbázis létrehozásához nyissuk meg az Access alkalmazást, válasszuk az Üres asztali adatbázis opciót, adjuk meg a fájlnevet valamint az elérési útvonalat. Ezután a program létrehoz egy fájlt, aminek kiterjesztése accdb. Míg az adatbázis meg van nyitva egy laccdb kiterjesztésű fájl is megjelenik azonos névvel, amit a program automatikusan hoz létre. Másolat készítése előtt célszerű bezárni az alkalmazást és csak az accdb kiterjesztésűt átmásolni. Megjegyzendő, hogy a szabványosítás ellenére vannak különbségek az eltérő szoftverek által használt SQL nyelvben. Használat előtt célszerű ellenőrizni, hogy az ANSI 92 szabványnak megfelelő szintaxist használja az alkalmazás. (Fájl -> Beállítások -> Objektumtervezők -> SQL Server-kompatibilis szintaxis (ANSI 92) -> Ebben az adatbázisban: ) Továbbá lehetőség van az Access alkalmazás felületének nyelvét módosítani a Fájl -> Beállítások -> Nyelv menüpontban. 3.1. Táblaszerkezet létrehozása Az üres asztali adatbázis létrehozása után a Létrehozás lapon a Táblatervező ikonra kattintva hozható létre új tábla (3.1. ábra). Egy táblát akkor érdemes létrehozni, ha már a táblában szereplő összes idegenkulcs szerepel más meglévő táblákban, mint elsődleges kulcs. Sorrendi szabály: kapcsolt tábláknál mindig az 1 oldalon lévő táblát hozzuk létre először, majd az ottani elsődleges kulcsot vesszük fel a több oldalon lévő táblában idegen kulcsként. Az idegen kulcsok adattípusának felvételekor kényelmes megoldás a Keresés varázsló (Lookup Wizard) használata, amely egyúttal a táblák közötti kapcsolatot is automatikusan beállítja. Ha nem használjuk a Keresés varázslót, akkor manuálisan kell beállítani a kapcsolatokat az Adatbázis eszközök (Database Tools) Kapcsolatok (Relationships) menüpont alatt. A sorrendi szabályt adatbevitelkor is érdemes alkalmazni; azaz először az 1 oldalon lévő táblába, majd a több oldalon lévő táblába viszünk be adatokat. 3.1. ábra Új tábla létrehozása és megnyitása tervező nézetben 17
3.1. táblázat Minta adatbázisban szereplő mezők adattípusai Tábla Mezőnév Adattípus További beállítások empno Rövid szöveg Beviteli maszk: 0000 ename Rövid szöveg Kötelező, maximum 30 karakter job Rövid szöveg Maximum 30 karakter mgr Rövid szöveg Keresés varázslóval hiredate Dátum/Idő Rövid dátum sal Szám >0 comm Szám deptno Rövid szöveg Keresés varázslóval deptno Rövid szöveg Beviteli maszk: 00 dname Rövid szöveg Kötelező, maximum 30 karakter loc Rövid szöveg Alternatív fejléc: Helyszín EMP DEPT jelmagyarázat: elsődleges kulcs idegen kulcs A minta adatbázisban a 3.1. táblázatban felsorolt táblákat és mezőket hozzuk létre az adattípusok beállításával. Elsődleges kulcs beállítása: tervező nézetben ki kell jelölni a megfelelő mezőt vagy mezőket (attól függően, hogy összetett-e a kulcs), és a tervezés lapon az Eszközök csoportban az Elsődleges kulcs gombra kell kattintani. Ugyanígy lehet törölni az elsődleges kulcs megjelölést egy mező sorában. Minden mezőnek a legfontosabb tulajdonsága az adattípus, ugyanis ez határozza meg, hogy milyen adatokat tárolhatnak. A mezők adattípusa további fontos jellemzőket is meghatároz, például: a mezők kifejezésekben való használatát, a mezőérték maximális méretét, a mező indexelhetőségét, a mezőnél használható formátumokat. Az így létrehozott táblaszerkezet kapcsolati ábrája az Adatbáziseszközök lapon a Kapcsolatok ikonra kattintva tekinthető meg (3.2. ábra). 3.2. ábra Minta adatbázis szerkezete Access-ben Az Access-ben nem kell külön elkészíteni az emp_1 táblát a belső kapcsolat létrehozásához. Az emp_1 mint virtuális tábla jelenik meg az Access programban a kapcsolatok szemléltetéséhez. (Táblák ismételt hozzáadása.) 18
3.2. Minta adatok felvétele Új adatok (rekordok) bevitelét a megfelelő tábla adatlap nézetben való megnyitásával lehet elvégezni. A minta adatbázisban szereplő adatokat a 3.2. és a 3.3. táblázatok tartalmazzák. 3.2. táblázat A DEPT tábla rekordjai DEPT deptno dname loc 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 3.3. táblázat Az EMP tábla rekordjai EMP empno ename job mgr hiredate sal comm deptno 7369 SMITH CLERK 7902 1980. 12. 17. 800 20 7499 ALLEN SALESMAN 7698 1981. 02. 20. 1600 300 30 7521 WARD SALESMAN 7698 1981. 02. 22. 1250 500 30 7566 JONES MANAGER 7839 1981. 04. 02. 2975 20 7654 MARTIN SALESMAN 7698 1981. 09. 28. 1250 1400 30 7698 BLAKE MANAGER 7839 1981. 05. 01. 2850 30 7782 CLARK MANAGER 7839 1981. 06. 09. 2450 10 7788 SCOTT ANALYST 7566 1987. 04. 19. 3000 20 7839 KING PRESIDENT 1981. 11. 17. 5000 10 7844 TURNER SALESMAN 7698 1981. 09. 08. 1500 0 30 Táblanézetben az adatbevitelt megkönnyíti a tabulátor gomb használata, ami mindig a következő mezőre vált, vagy a másolás-beillesztés. Nagy mennyiségű digitalizált adat bevitelére az importálás fájlból opció alkalmas, többek között támogatott forrás fájl az xls is. Ha egy új rekordot táblanézetben veszünk fel, akkor az adatbevitel során megjelenik egy ceruza ikon. Az ikon szerkesztés közben végig ott marad, csak azután tűnik el, hogy a rekordot elmentette az alkalmazás. Az ikon gyakorlati haszna, hogy hálózatos üzemben a felhasználó tudja, hogy mikor válik az új rekord a többi felhasználó számára is elérhetővé (miután a ceruza ikon eltűnt). 19
4. SQL parancsok csoportosítása, SELECT parancs Az SQL nyelvben használható parancsok a következő csoportokba sorolhatók: DDL (Data Definition Language): az adatbázis szerkezetének definiálásához szükséges parancsok. DML (Data Manipulation Language): adatok kezeléséhez szükséges parancsok. DCL (Data Control Language): az adatbázis hozzáférhetőségének definiálásához szükséges parancsok. TCL (Transaction Control Language): a DML parancsok által végrehajtott módosítások kezelésére alkalmas. A gyakorlatok során az első két csoportba tartozó DDL és DML parancsokat ismerjük meg. Az Access-ben egy SQL parancsot a következőképpen lehet végrehajtani (4.1. ábra): begépeljük a kifejezést egy lekérdezés SQL nézetébe, majd lefuttatjuk. Nézet választó Parancs futtatása Adatbázis objektumok SQL parancs helye 4.1. ábra SQL parancsok végrehajtása (futtatása) Access-ben 4.1. DDL parancsok Adat definíciós nyelv, amely tartalmazza az adatbázis struktúra (táblaterületek, táblák, indexek, megszorítások, stb.) létrehozásával és karbantartásával kapcsolatos utasításokat. A legfontosabb DDL parancsok: CREATE: adatbázis objektum (pl.: tábla) létrehozására szolgál. Tábla létrehozásakor itt kell definiálni annak szerkezetét figyelembe véve a kapcsolatokat is. 20
ALTER: meglévő objektum szerkezetének módosítására szolgál. Például új oszlop adható hozzá egy táblához. DROP: meglévő objektum teljes törléséra szolgál (szerkezet és tartalom is törlésre kerül). Más adatbázis kezelő alkalmazásokban további DDL parancsok is elérhetőek, mint például a TRUNCATE (minden rekord törlése reset -elés, azaz ha ezt követően új rekordot viszünk be, akkor a számláló 1-ről indul) vagy a RENAME, de az Access-ben a leggyakrabban használt parancsok az előbb felsoroltak. Mivel az Access különösen felhasználóbarát, ezért számos művelet elvégezhető a DDL parancsok alkalmazása nélkül is egyéb módon. 4.2. DML parancsok A DML parancsok az adatbázisban tárolt és tárolandó adatok kezeléséhez szükségesek. A DDL parancsok segítségével létrehozott adatbázis szerkezetet a DML parancsok töltik fel adatokkal, illetve ezek alkalmasak az adattartalom módosítására is. A legfontosabb DML parancsok: INSERT INTO: új adat (rekord) felvétele. UPDATE: meglévő adat (rekord vagy rekordok) módosítása. DELETE FROM: rekord vagy rekordok törlése. SELECT: adatok kilistázása (lekérdezés nyers vagy feldolgozott formában). 4.3. SELECT parancs szerkezete A SELECT parancs segítségével egy vagy több táblában tárolt rekordokat lehet megjeleníteni vagy csoportokat lehet képezni. A SELECT parancs szerkezete: SELECT [DISTINCT] select-lista [FROM <táblanév, lekérdezés név> WHERE <sorfeltétel> GROUP BY <kifejezés> HAVING <csoportfeltétel> ORDER BY <kifejezés>]; A SELECT parancson belül a parancsszavak sorrendje minden esetben kötött, azonban csak a SELECT elengedhetetlen a parancs sikeres végrehajtásához. A parancsszavak alkalmazásának magyarázata: SELECT: kötelező, meghatározza a select-lista tartalmát (oszlopnevek, kifejezések). FROM: utána szerepelnek az adatforrásként szolgáló táblák, lekérdezések nevei. WHERE: a lekérdezés eredményül azokat a rekordokat adja, amelyek megfelelnek a WHERE után szereplő sorfeltételeknek. Több sorfeltételt logikai operátorral összekötve lehet megadni. GROUP BY: a lekérdezés sorfeltételeinek megfelelő rekordokat (vagy ha nincs feltétel, akkor a tábla összes rekordját) csoportokba rendezi a GROUP BY után szereplő csoportszempontok szerint. Azok az egyedek (rekordok) kerülnek egy csoportba, amelyeknél a csoportképző oszlop tartalma megegyezik. 21
HAVING: csak akkor szerepelhet, ha alkalmazunk GROUP BY kifejezést is. Csak azokat a csoportokat adja eredményül a lekérdezés, amelyek megfelelnek a HAVING után következő csoportfeltételeknek. Több csoportfeltételt logikai operátorral összekötve lehet megadni. ORDER BY: a lekérdezés eredményeit (rekordokat, csoportokat) az ORDER BY után szereplő sorrend-szempontok szerint, a rendezési irány szerinti sorrendben jeleníti meg. 4.4. SELECT lista elemei, alternatív oszlopnév A select-listában szerepelhet: *: minden oszlopot megjelenít. oszloplista: oszlop1, oszlop2, számított kifejezés: 3*oszlop1 (feltéve ha oszlop1 adattípusa szám), 47/3, stb. karakteres konstans: például: Ft. Vigyázat: SQL kódban mindkét idézőjelnek felül kell lennie. konkatenáció: például: oszlop1&oszlop2. A művelet két oszlopot egyesít, összeolvaszt. alternatív oszlopnév: oszlop1 as [alternatív oszlopnév]. Az alternatív oszlopnév csak a lekérdezés eredményében fog megjelenni. Példák: SELECT * FROM EMP; SELECT empno, ename FROM EMP; SELECT 6*30; SELECT 6*sal FROM EMP; SELECT TOM SELLECK ; SELECT empno & Azonosító FROM EMP; SELECT empno as [Azonosító] FROM EMP; 22
5. SELECT parancs SELECT parancs szerkezete: SELECT [DISTINCT] <select-lista> [FROM <táblanév, lekérdezés név> WHERE <sorfeltétel> GROUP BY <kifejezés> HAVING <csoportfeltétel> ORDER BY <kifejezés>]; 5.1. Rendezés (ORDER BY) ORDER BY: a listába kigyűjtött rekordok/csoportok (az eredményhalmaz) a megadott mező, vagy kifejezés szerint növekvő/csökkenő sorrendbe rendezése. Alapértelmezés a növekvő sorrend. növekvő vagy abc szerinti sorrend: ORDER BY oszlop1 [asc]; csökkenő vagy fordított abc szerinti sorrend: ORDER BY oszlop1 desc; vegyes: ORDER BY oszlop1 desc, oszlop2; Egyszerre több szempont is szerepelhet az order by után. Ilyenkor a második és az azt követő szempontok akkor kerülnek figyelembe vételre, ha a megelőző szempont(ok) szerint azonos értékek fordulnak elő. A rendezés alapjául szolgáló kifejezésnek nem muszáj szerepelnie a select-listában. 5.2. Hiányzó adatelem (NULL érték) problematika NULL érték problematika: ha egy mező nincs kitöltve, akkor az a mező null értékű. Információtartalma: bizonytalan (nem ismert). A NULL értékű mezőt tartalmazó műveleteknek az eredménye is lehet NULL értékű, ami problémákat okozhat. Például egy összegnek akkor is NULL az eredménye, ha a tagok között legalább egy NULL értékű elem van. Használható eredmények érdekében a NULL értéket helyettesíteni lehet az Iif beépített függvény segítségével. Az Iif függvény szerkezete: Iif(kifejezés; ha igaz; ha hamis) Például a bizonytalan NULL értéket átalakíthatjuk számításoknál használható biztos 0 értékké. Az átalakítás azonban információtorzulást okoz: Iif(comm is NULL; 0; comm) 23
5.3. Adatválaszték megtekintése (DISTINCT) DISTINCT: az ismétlődő sorokat csak egyszer jeleníti meg. Például: SELECT job FROM emp; CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK SELECT DISTINCT job FROM emp; ANALYST CLERK MANAGER PRESIDENT SALESMAN 5.4. Sorfeltétel (WHERE) Sorfeltétel: a forrásul szolgáló tábla vagy lekérdezés megjelenítendő sorainak szűrésére szolgál. WHERE utáni elemek és sorrendjük (egyszerű feltételnél): I. kifejezés (mit hasonlítunk?) II. összehasonlító operátor (milyen jellegű az összehasonlítás?) III. kifejezés, érték, értéklista, intervallum, séma (mihez hasonlítunk?) A WHERE után következő sorfeltételben használható összehasonlító operátorokat az 5.1. táblázat tartalmazza. Az operátorok mindkét oldalán azonos adattípusú értékeknek kell szerepelniük. 24
5.1. táblázat Összehasonlító operátorok Operátor Leírás = Egyenlő, karakter típusú adattal is használható (a bal és jobb oldalon szereplő kifejezéseknek teljesen meg kell egyezniük - kis és nagybetű fontos!) <> Nem egyenlő, karakter típusú adattal is használható < Kisebb, mint > Nagyobb, mint >= Nagyobb vagy egyenlő, mint <= Kisebb vagy egyenlő, mint [NOT] BETWEEN Két érték közt van, egyenlőség megengedett (zárt intervallum) [NOT] IN A listában szereplő egyik értékkel megegyezik [NOT] ALIKE Egy részlete megegyezik vele (illeszkedik a sablonhoz)* =[] Paraméteres lekérdezés *: Az SQL ANSI92 nyelvben csak az ALIKE operátor használható. Alapértelmezésként az Access az SQL ANSI89 nyelvet használja, ami a LIKE és ALIKE operátort is felismeri, azonban a helyettesítő karakterek eltérőek. Az ALIKE operátor esetén használt helyettesítő karaktereket az 5.2. táblázat tartalmazza. 5.2. táblázat Helyettesítő karakterek ANSI89 ANSI92 Egyezés a helyettesítő karakterrel? vagy Egy tetszőleges karakter # [1-9] Egy tetszőleges számjegy * % Tetszőleges számú (akár 0) karakter [] [] Bármely karakter, ami a megadott tartományon belül van. Pl.:[a-m] vagy [1-5] vagy [abcdef] [!] [!] Bármely karakter, ami a megadott tartományon kívül esik. Pl.: [!a-m] A dátum adattípust az Access számként tárolja, ami a bázis dátum (1899. december 30. 0:00) óta eltelt napok számának felel meg. Például 1899. december 31. 12:00 az 1,5-nek felel meg és fordítva. Ennek megfelelően feltételben dátum adattípust két féleképpen is össze lehet hasonlítani konstanssal: vagy a bázis dátum óta eltelt napok számát megadva, vagy a dátumot #ISO dátum jelölés# formátumban kiírva: #nn-hh-éééé# (területi beállításoktól függetlenül ez a dátum formátum mindig működik). Példák: SELECT ename FROM emp WHERE sal=1250; SELECT ename FROM emp WHERE ename= CLARK ; SELECT ename FROM emp WHERE sal>comm; SELECT ename FROM emp WHERE sal NOT BETWEEN 500 and comm; SELECT ename FROM emp WHERE empno IN( 7900, 1234 ); SELECT ename FROM emp WHERE empno ALIKE 7900 OR empno ALIKE 1234 ; SELECT ename FROM emp WHERE empno ALIKE _[1-5]0% ; SELECT ename FROM emp WHERE empno=[azonosító száma?]; SELECT ename, hiredate from emp where hiredate IN(#28-09-1981#,29637); 25
5.5. Aritmetikai, logikai és összefűző operátorok Az aritmetikai operátorokat az 5.3. táblázat tartalmazza. 5.3. táblázat Aritmetikai operátorok Operátor Leírás + Összeadás, 5+2=7 - Kivonás, 5-2=3 * Szorzás, 5*2=10 / Osztás, 5/2=2,5 \ Osztás, ami az eredmény egész értékét adja eredményül, 5\2=2 ^ Hatványozás, 5^2=25 MOD Osztás maradékát adja eredményül: 5 MOD 2 =1 Több feltételt logikai operátorral összekapcsolva lehet megadni (összetett feltételek képzése). A logikai operátorokat az 5.4. táblázat tartalmazza. 5.4. táblázat Logikai operátorok Bemenetek Logikai operátorok kimenetei A B AND OR EQV IMP NOT(A) XOR 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 1 1 0 0 0 NULL 0 NULL NULL NULL 1 1 1 NULL NULL 1 NULL NULL NULL 0 NULL 0 0 NULL NULL NULL NULL NULL NULL 1 NULL 1 NULL NULL 1 NULL NULL NULL NULL NULL NULL NULL NULL NULL Az összefűző operátorokat az 5.5. táblázat tartalmazza. 5.5. táblázat Összefűző operátorok Operátor Leírás + Két szöveg adattípusú karakterlánc egyesítése egy karakterlánccá a NULL érték propagálásával: ha az egyik karakterlánc NULL értékű, a kimenet is az. & Két karakterlánc egyesítése egy karakterlánccá. 26
6. SELECT parancs SELECT parancs szerkezete: SELECT [DISTINCT] <select-lista> [FROM <táblanév, lekérdezés név> WHERE <sorfeltétel> GROUP BY <kifejezés> HAVING <csoportfeltétel> ORDER BY <kifejezés>]; 6.1. Függvények A Microsoft Access beépített függvényei műveletet hajtanak végre, az adatok átalakítására és feldolgozására alkalmasak. A függvényeket a bemeneti rekordok száma szerint két csoportra bonthatjuk (6.1. ábra). Függvény Sorfüggvény (1 rekord) Csoportfüggvény (több rekord) 6.1. ábra Függvények csoportosítása a bemeneti rekordok száma szerint A függvények jellemzői: a bemenet és kimenet adattípusa eltérhet, a függvények egymásba ágyazhatóak. A sorfüggvények fontosabb jellemzői az alábbiak: minden esetben egy argumentum (oszlopnév, konstans, kifejezés) a bemenet, minden rekordhoz egy visszaadott érték tartozik, a select-listában, a WHERE és az ORDER BY részekben alkalmazhatóak. A sorfüggvényeket a bemenet és kimenet adattípusa szerint további alcsoportokra bonthatjuk, melyek közül a fontosabbakat mutatjuk be. A gyakran használt beépített sorfüggvényeket az 6.1. táblázat tartalmazza. (A felhasználó is definiálhat függvényeket.) Bizonyos beépített függvények több csoportba is tartoznak, így például a Day függvény az átalakítás és a dátum/idő függvény csoportban is megtalálható. 27
Csoport Függvény CDate(szám) Dátum/idő Matematikai Szöveg Day(dátum) Weekday(dátum, [hét első napja]) Date() Time() Now() Weekdayname(szám, [rövidítés], [hét első napja]); Abs(szám) Int(szám) vagy Fix(szám) Kerek(szám, [pontosság]) (Round( )) Sqr(szám) LCase(karakterlánc) UCase(karakterlánc) 6.1. táblázat Gyakran használt beépített sorfüggvények az Access-ben Leírás Egy szám típusú értéket dátum értékké konvertál. Egy egész számot ad vissza, ami a hónap valamely napjának felel meg (1..31). Egy egész számot ad vissza, amely a hét valamely napját jelöli (1..7); hét első napja: 1, ha vasárnap; 2, ha hétfő stb. Alapértelmezés szerint 1. A rendszerdátumot adja eredményül. A rendszeridőt adja eredményül. A rendszerdátumot és -időt adja eredményül. A hét napjának nevét adja eredményül. szám: hét napjának száma 1..7 rövidítés: o 0: az eredmény a teljes név o -1: az eredmény a rövidített név hét első napja: lásd weekday fv. A szám abszolút értékét adja eredményül. Egy szám egészrészét adja eredményül Egy számot a megadott számú tizedeshelyre kerekítve ad vissza Egy szám négyzetgyökét adja eredményül. Kisbetűssé alakított szöveget ad eredményül. Nagybetűssé alakított szöveget ad eredményül. StrConv(szöveg, n) Ha n: 1: nagybetűssé alakított szöveget ad eredményül, 2: kisbetűssé alakított szöveget ad eredményül, 3: a szavak első betűjét nagybetűssé, a többit kisbetűssé alakítja Len(karakterlánc) A szöveg karakterszámát adja eredményül. Megjegyzés: az 5.2. fejezetben bemutatott Iif függvény a programfolyamat csoportban található. Példák: SELECT CDate(40235); SELECT Weekday(hiredate, 2) FROM EMP; 28
SELECT Date(); SELECT Round(Sqr(13), 2); A csoportfüggvények (vagy más néven összesítőfüggvények) fontosabb jellemzői az alábbiak: a függvény változója az egy csoportba sorolt rekordok megjelölt oszlopában található értékek, csoportonként egy értéket ad eredményül, a null értéket tartalmazó sorokat figyelmen kívül hagyják, a select-listában, a HAVING és az ORDER BY részekben alkalmazhatóak. A csoportfüggvényeket az 6.2. táblázat tartalmazza. 6.2. táblázat Csoportfüggvények az Access-ben Függvény Sum() Avg() Min() Max() Count() StDev() Var() First() Last() Leírás A csoportban szereplő értékek összegét adja eredményül. A csoportban szereplő értékek átlagát adja eredményül. A csoport legkisebb értékű elemét adja eredményül. A csoport legnagyobb értékű elemét adja eredményül. A csoportban szereplő értékek számát adja eredményül. (A csoportba tartozó rekordok száma is ezzel a függvénnyel képezhető.) A csoportban szereplő értékek szórását adja eredményül. A csoportban szereplő értékek szórásnégyzetét adja eredményül. A csoportban szereplő elemek közül az elsőt adja eredményül. A csoportban szereplő elemek közül az utolsót adja eredményül. Nem kötelező GROUP BY kifejezéssel csoportot képezni, annak érdekében, hogy lehessen használni a csoport függvényeket. GROUP BY nélkül a tábla teljes tartalmára vonatkozik a művelet (az objektum valamennyi rekordja egyetlen csoportot alkot). Példa: SELECT Avg(sal) FROM EMP; 6.2. Csoportképzés (GROUP BY) Lehetőség van az egyes rekordokat csoportokba sorolni. A csoportképzés alapját jelentő oszlopnevet vagy neveket a GROUP BY kifejezés után adjuk meg. Azok a rekordok fognak egy csoportba kerülni, amelyeknél megegyezik a csoportképző oszlop tartalma. Olyan oszlopot érdemes csoportképzőnek választani, amelyekben van ismétlődő érték. A csoportképző oszlopot célszerű felvenni a select-listába. A select-listában csak csoportra jellemző érték szerepelhet (csoportképző oszlopok és/vagy csoportfüggvénnyel képzett kifejezés). Ha a csoportképzés szempontjaként több oszlopnevet is megadunk, akkor a lekérdezés a csoportosításkor balról jobbra haladva veszi figyelembe az oszlopneveket. A csoportképző szempontok eltérő sorrendje esetén a csoportosítás értelme is eltérő. Ha több csoportképző szempontot (oszlopot) egyidejűleg alkalmazunk, akkor azok lehetnek egymásba ágyazódóak, vagy függetlenek. 29
GROUP BY <oszlop1>, <oszlop2>,, <oszlopn> A 6.2. ábra példa az egymásba ágyazódó csoportképzésre. (Pl. alkalmazottak csoportosítása lakóhelyük szerint; az alkalmazottak, mint egyedek feltüntetésétől eltekintettünk). Régió 1 Régió 2 Megye 1 Város2 Város1 Megye 2 Város3 Megye 3 Megye 4 Város4 Megye 5 Város5 Város6 6.2. ábra Régió-megye-város csoportképzés A 6.3. ábra példát mutat a független szempontok (deptno, job) szerinti csoportképzésre. A csoportképző szempontok sorrendje az eredménylistán belüli sorrendet befolyásolja (6.3. táblázat). (A személyeket, mint egyedeket az azonosítószámmal jelölt körök mutatják). 6.3. táblázat Eltérő csoportképzési sorrendek eredménylistái GROUP BY deptno, job GROUP BY job, deptno deptno job Count job deptno Count 10 CLERK 1 ANALYST 20 2 10 MANAGER 1 CLERK 10 1 10 PRESIDENT 1 CLERK 20 2 20 ANALYST 2 CLERK 30 1 20 CLERK 2 MANAGER 10 1 20 MANAGER 1 MANAGER 20 1 30 CLERK 1 MANAGER 30 1 30 MANAGER 1 PRESIDENT 10 1 30 SALESMAN 4 SALESMAN 30 4 Példa: mekkora az egyes vezetők beosztottjainak átlagfizetése? SELECT mgr, Avg(sal) FROM EMP GROUP BY mgr; 30
1. csoportosítás GROUP BY deptno, job 10 20 CLERK 7934 MANAGER 7782 PRESIDENT 7839 MANAGER 7566 CLERK 7369 7876 ANALYST 7788 7902 30 CLERK 7900 SALESMAN 7499 7521 MANAGER 7698 7844 7654 ANALYST 2. csoportosítás GROUP BY job, deptno CLERK 20 10 7788 7902 7934 30 MANAGER 7900 20 7369 7876 10 7782 30 7698 20 7566 PRESIDENT 10 7839 SALESMAN 30 7499 7521 7844 7654 6.3. ábra Csoportképzés telephely és beosztás szerint 31