KURZUS: Informatikai rendszerek alapjai
MODUL: Adatbázis-kezelés
2. lecke: Az adatbázis-kezelés a gyakorlatban
Cél: Ebben a leckében az adatbázis-kezelés gyakorlati megvalósításaival ismerkedünk meg. Áttekintjük napjaink legismertebb, legfontosabb adatbázis-kezelő "márkáit", és az ezek alapját képező SQL szabványt. Megismerkedünk a legfontosabb SQL szabványú parancsokkal. | |||||||
Követelmények: Ön akkor sajátította el megfelelően a tananyagot, ha | |||||||
| |||||||
Időszükséglet: A tananyag elsajátításához (a feladatok megoldásával együtt) hozzávetőlegesen 6 órára lesz szüksége. | |||||||
Kulcsfogalmak | |||||||
| |||||||
Ismert adatbázis-kezelők | |||||||
Az adatkezeléssel kapcsolatban eddig megfogalmazott elveket, elvárásokat sok-sok szoftver teljesíti. Ha csak a relációs adatmodellt használó adatkezelő programokat vesszük számításba, akkor is sokféle szoftver (RDBMS, Relational DataBase Management System) közül válogathatunk. Ezek puszta felsorolása is nehézségbe ütközne és valójában nem is válna hasznunkra, azonban a relációs adatbázis-kezelő piac legjelentősebb képviselőit név szerint is megemlítjük. | |||||||
Az egyik legnagyobb név az adatbázis-kezelők között az Oracle. Az 1977-es alapítású cég sokféle üzleti szoftvermegoldást kínál, ezek természetesen mind a legalapvetőbb termékükre, az adatbázis-kezelőre épül, amit önállóan is árusítanak. Elsősorban a nagyvállalati környezetre koncentrálnak. Felmérések szerint a világ összes adatbázis-kezelőjének a kb. fele (!) Oracle termék. Az Oracle Database etalonnak számít elképesztő funkcionalitásával. Minden komoly szerver-operációs rendszeren fut. Szokták mondani, hogy amit ez a rendszer nem tud, arra biztosan nincs is szükség... | |||||||
| |||||||
A Microsoft SQL Server nevű terméke az 1980-as évek végére nyúlik vissza, amikor a Sybase felvásárlásával szert tettek egy komoly adatbázis-kezelőre, amit utána az új néven saját maguk fejlesztettek tovább. Elterjedtségének legfőbb oka a Microsoft egyéb termékeihez való kötődés. A Microsoftra jellemzően csak Windows környezetben fut, amivel sok-sok felhasználásból eleve kizárta magát. Windowsos irodai környezetben azonban sokszor találkozhatunk vele. | |||||||
A PostgreSQL talán a legfejlettebb adatbázis-kezelő a szabad szoftverek piacán. Szintén a 80-as években indult a fejlesztése, Ingres néven, Nagyjából mindent tud, amit fizetős társai, és természetesen sokféle platformon elérhető. | |||||||
Végül megemlítjük a MySQL rendszert, amit az 1990-es évek közepe óta fejlesztenek és a legelterjedtebb adatbázis-kezelők között van. Többféle licenszeléssel, a legtöbb esetben ingyen elérhető. Ingyenessége úgy is megmaradt, hogy felvásárolta a Sun, a Sun-t pedig bekebelezte az Oracle - azaz a MySQL ma gyakorlatilag Oracle termék, a "saját" adatbázis-szerverük kistestvére. Olyan rendszerek futnak ezen az adatbázison, mint például a Wikipedia, Facebook vagy Twitter. (A Google is több szolgáltatáshoz használja, de tudni lehet, hogy épp a kereséseket egy saját fejlesztésű, és nem relációs adatbázis-kezelő rendszer szolgálja ki.) Kb. 30 operációs rendszeren elérhető. Nagy port kavart, mikor jópár éve a NASA egyes korábbi (Oracle) adatbázisait MySQL szerverekre költöztette. | |||||||
Az imént felsorolt cég- és termék-, és szolgáltatás nevekről fogalmazzuk meg 1-1 mondatban, hogy mi a fő tevékenységük, funkciójuk. Melyek kapcsán mondhatjuk, hogy bizonyosan sok adatkezelési feladatuk van? | |||||||
Desktop adatbázis-kezelők | |||||||
Folyamatosan megismerjük, milyen felépítésű és működési logikájú egy adatbázis-szerver. A szerverekhez pedig az egyedi feladatokat megvalósító kliensprogramok kapcsolódnak. Ezeket a programokat futtatják például a gyárak adminisztrátorai, vagy a bankok és hivatalok ügyfélszolgálatosai. | |||||||
Az ilyen szoftvermegoldásokat jellemzően profi informatikus és szoftverfejlesztő szakemberek tervezik meg és készítik el, nekünk ebben a tárgyban nem ilyen jellegű tudás elsajátítása a célunk. Ha az egyetem elvégzése után egy termelő nagyvállalathoz, adóhivatalhoz vagy pénzügyi szolgáltató céghez megyünk dolgozni, minden bizonnyal a cég legfőbb Önálló feladataira a már mások által megtervezett, elkészített vagy megvásárolt adatbázis- kliensprogramokat kell majd használnunk, nem kell az adatbázissal magával foglalkoznunk. | |||||||
Azonban az élet sok területén képzelhető el, hogy mégis olyan jellegű adatkezelésre kényszerülünk saját magunk, ami már túlmutat az egy-két Excel fájlban tárolható adatok bonyolultsági szintjén. | |||||||
Ilyenkor nagy segítség, hogy a kurrens irodai programcsomagok (pl. Microsoft Office, LibreOffice) tartalmaznak saját adatbázis-kezelő szoftvert, ezek használata pedig sokkal kevesebb szakmai jártasságot igényel "komolyabb" társaiknál. | |||||||
Az adatbázis-kezelők használatát a tárgyhoz kapcsolódó gyakorlatokon tehát ún. desktop típusú adatbázis-kezelővel fogjuk gyakorolni. Ez az az adatbázis-kezelő típus, ami a nem-informatikusok számára is a legegyszerűbben telepíthető, kezelhető, ezért ők egyedi adatbázis-kezelési feladatok megoldására valószínűleg a későbbiekben is ilyen eszközhöz nyúlnak. | |||||||
A desktop típusú adatbázis-kezelők is a megismert elvek szerint működnek, a nagy különbség alapvetően a felhasználási területből adódó egyszerűsítési lehetőségekben keresendő. A saját irodai gépünkön sokkal kisebb adatmennyiséggel, kevésbé komplex adatokkal, kevesebb jogosultsági kérdéssel kell foglalkoznunk, így a sok-sok apróságban egyszerűsített rendszer használata a kezdő számára áttekinthetőbb. | |||||||
Sok szoftvert készítettek erre a felhasználási területre, elsőként említést érdemel a valamikor széles körben használt, de mára elfeledett DBase rendszer. Ennek megjelenése szintén az 1980-as évek elejére tehető, kimondottan asztali számítógépekre, kisebb feladatokra tervezték. Valójában annyira egyszerű lett a rendszer, hogy definíció szerint nem is lenne adatbázis-kezelőnek tekinthető, mert sok alapvető funkciót eleve nem valósítottak meg benne, másokat pedig csak "kézzel" lehet elvégezni benne, amit egy valódi RDBMS automatikusan megold. Inkább nevezzük csak adatkezelő szoftvernek. | |||||||
Fájlformátuma elterjedtsége okán kvázi-szabvány lett, a mai napig sok program felismeri, egyszerűbb adatátvitelekhez használható és természetesen visszaszorulóban van. | |||||||
Amíg a DBase kizárólag parancssori, karakteres felülettel rendelkezett (és egyedi programokat kellett írni a használatához), addig a FoxPro előbb szöveges interfésszel (valójában karakteres, de karaktergrafikai elemeket, ablakokat, egeret is használó felület) és kényelmes, saját fejlesztőrendszerrel is rendelkezett. Korábban egy különálló cég fejlesztette, később felvásárolta a Microsoft, majd az 1990-es évek közepén felhagyott a fejlesztésével. | |||||||
Szintén az 1990-es évek technológiájának jelentős képviselője a Borland Database Engine, amit Windows alkalmazások adattárolásának támogatására fejlesztettek ki. | |||||||
| |||||||
Az említett rendszerek a szépen lassan eltűntek, jelenleg a legismertebb hasonló szoftver a Microsoft Office programcsomag Access nevű adatbázis-kezelője, az ingyenes konkurens LibreOffice programcsomagban pedig a Base néven találunk otthoni használatra szánt adatbázis-kezelőt. Ezek a szoftverek saját, "beépített" adatbázis-kezelővel is rendelkeznek, de természetesen kliensként is használhatók: a rendelkezésre álló kezelőfelületen keresztül, vagy akár saját fejlesztésű kliensalkalmazással is használhatunk másik, külső, komolyabb adatbázis-kezelő rendszereket is a segítségükkel. | |||||||
A kettő közül egyértelműen az Access a komolyabb tudású program. A LibreOffice fő előnye, hogy többféle operációs rendszeren elérhető és ingyenes. A két szoftver működési logikája, képernyőképe egyébként sok esetben szinte megtévesztésig hasonló, az egyik szoftverrel szerzett tapasztalatainkat könnyűszerrel hasznosíthatjuk a másik termék használata esetén is. Amint említettük, ezek a desktop adatbázis kezelők inkább otthoni, vagy nagyon egyszerű feladatok elvégzésére alkalmasak, de tanulni mindenképpen lehet velük. | |||||||
Külső adatbázishoz való kapcsolódásnak kétféle módja lehetséges: | |||||||
| |||||||
A desktop adatbázis-kezelők tehát három terméket tartalmaznak egybeépítve: | |||||||
| |||||||
A tanuláshoz használt adatbázis-rendszer | |||||||
A tananyagban található példák bármely, a későbbiekben ismertetett SQL szabványnak megfelelő bármelyik adatbázis-kezelővel kipróbálhatóak. Az egyszerűbb követhetőség miatt a hallgatóknak hozzáférést biztosítunk egy adatbázis-szerverhez, amiben az előkészített példák könnyen kipróbálhatóak. | |||||||
A használt MySQL adatbázis-szerverhez webes felületen biztosítunk hozzáférést (a phpMyAdmin segítségével), így a tanuláshoz semmilyen extra program telepítése nem szükséges. A rendszer a http://193.224.129.119/dbgyak címen elérhető egy böngésző segítségével; a bejelentkezéshez szükséges adatokat az Ön tutorja fogja megadni. A továbbiakban, amikor e tananyagban az ev-NEPTUN felhasználói nevet, vagy a dbNEPTUN adatbázisnevet látja, akkor azt minden esetben a saját Neptun kódjának behelyettesítésével értelmezze. | |||||||
| |||||||
A bejelentkezésnél ki lehet választani a program nyelvét, több tucat nyelv között a magyar is szerepel. Bejelentkezés után a 4. ábrához hasonló kép fogadja: | |||||||
| |||||||
A bejelentkezéssel a program automatikusan hozzákapcsolódott egy adatbázis-szerverhez. A jobb oldalon láthatjuk e szerver legfontosabb paramétereit (a szerver típusát, verziószámát - ezek részletekbe menő, bonyolultabb feladatok esetén fontosak, számunkra e pillanatban nincsen jelentősége). A kezdőlapon azonnal van lehetősége a jelszavának megváltoztatására (ez esetben a böngészőben újra be kell jelentkeznie, hiszen maga a böngésző "nem tud arról", hogy módosult felhasználói azonosítással szeretne tovább dolgozni, tehát megszakítja a munkamenetet). | |||||||
Itt mondjuk el, hogy a lehetőség bár technikailag adott más megoldásra is, az adatbázis-rendszerek tipikusan olyan módon működnek, hogy a kért módosítások azonnal végrehajtásra és tárolásra kerülnek, és ezek visszavonására nincsen mód. Ezért az adatbázisokon mindig nagy körültekintéssel végezzünk módosításokat. | |||||||
A képernyő bal oldalán az Ön számára látható adatbázisok találhatók (a képen dbGyak és dbNEPTUN néven látja ezeket). A dbGyak adatbázis csak olvasható, és a közös használatú táblákat tartalmazza. A másik adatbázis az Ön saját adatbázisa, amiben gyakorolhat a félév során, azután pedig törlésre kerül. Amennyiben a saját munkáját meg szeretné őrizni, az Exportálás funkció segítségével bármikor lementheti az adatait. Az 5. ábrán a dbGyak nevű adatbázis tábláinak adatai láthatóak, miután a neve előtti pluszjellel lenyitottuk. | |||||||
| |||||||
Az egyes táblákkal kapcsolatos műveletek magától értetődő módon a táblanév melletti linkekre kattintással történik. Megnézhetjük a tábla tartalmát, kereshetünk benne, vagy különböző módosításokat hajthatunk végre. Ezek kipróbálását javasoljuk, de részletesen nem foglalkozunk velük, hiszen bármiféle magyarázat nélkül is logikus a használatuk. A phpMyAdmin kezelésének részletihez tanulmányozzuk annak dokumentációját (pontos cím az ajánlott irodalomban), ez egyébként a phpMyAdmin ablak bal felső sarkában található linkről is elérhető). | |||||||
Az aktuálisan használt adatbázis neve mindig látható a képernyő tetején (az 5. ábrán ez a dbGyak), erre figyeljünk akkor is, amikor a későbbiekben például SQL parancsokat fogunk kiadni, hiszen a kiadott parancs arra az adatbázisban kerül értelmezésre, amelyhez kapcsolódóan kiadták. | |||||||
Az aktuális adatbázist a bal oldali menüben annak nevére kattintva jelölhetjük ki. | |||||||
SQL nyelv | |||||||
Az Adatkezelési elvárások című alfejezetben megfogalmazott elvárásokat akkor tudja egy adatkezelő rendszer legjobban teljesíteni, ha fejlesztője nem az egyes feladatokra készít egyéni megoldásokat, hanem nagyobb munkával bár, de elkészít egy általános célra használható, átgondolt rendszert, aminek segítségével az egyéni feladatok már hatékonyabban, gyorsabban megoldhatók. A relációs adatbázisok egyik alapötlete is éppen ez az egységesítési törekvés volt. Természetes, hogy az elméleti modell mellett gyakorlati, valódi nyelvrendszert is ki kellett fejleszteni - a történelmi kitérőkkel nem törődve mondjuk azt, hogy a relációs adatbázis-kezelők szabványos kezelőnyelve a Structured Query Language, rövidítve az SQL lett. A kifejezés jelentése strukturált lekérdezőnyelv, a strukturáltság az egységességet, a tiszta logikát jelzi, a lekérdezés kifejezés pedig onnan jön, hogy az adatbázis általános célja, hogy benne tárolt adatokat kérdezzünk le belőle - természetesen, nem csak a tényleges lekérdezések részei az SQL-nek, hanem minden, az adatbázis-kezelő számára küldött parancs (például adatbevitel) is. |
Az SQL a relációs adatbázis-kezelő rendszer (RDBMS) szabványos kezelőnyelve. |
A különböző cégek munkája, tapasztalata tehát szabványban egyesült - a fejlődés miatt azonban maga a szabvány (ANSI és ISO szabványokról beszélünk) sokszor módosult, több lépcsőben fejlődött. A szabványok kidolgozói azonban gondosan ügyeltek arra, hogy az új nyelvi elemek a korábbiakkal összeegyeztethetők legyenek - az SQL nyelvvel kezdő szinten dolgozók számára nem is nagyon fontos, hogy pontosan melyik szabvánnyal dolgoznak, számukra elég az SQL nyelv ismerete. | |||
Az egyes szoftvergyártók, bár alapvetően elfogadták az SQL szabványt, különböző SQL szabványt vehetnek alapul és nem biztos, 100%-osan meg is valósítják annak minden részletét. Ráadásul megtörténhet, hogy apró egyéni ötleteikkel itt-ott bővítenek a szabványokon - így aki sokat dolgozik egy bizonyos termékkel, szépen lassan annak a nyelvét ismeri meg. Nem kell nagy különbségekre gondolni, az SQL változatok igen egységesek, az egyik rendszer ismeretével a másik gond nélkül használható, legfeljebb belefutunk egy-egy szintaktikai hibát okozó apróságba, amit könnyűszerrel javíthatunk. Ilyen apróság például, hogy az SQL nyelvben és az egyszeres (') vagy dupla idézőjel (") jelzi a karakterláncok elejét és végét, de van olyan adatbázis-kezelő, ami erre a célra csak az egyszeres idézőjelet (') fogadja el. Az általunk használt MySQL rendszer mindkét idézőjelet elfogadja, természetesen megfelelő párban használva őket. | |||
Ezen tananyag hátralévő részében is lehetnek jelentéktelen eltérések a tananyag példái és az általunk épp használt adatbázis-kezelő között, a példákat értelemszerűen használjuk. | |||
Az SQL tehát a relációs adatbázis kezelőnyelve, és mivel csak relációs típusú adatbázisokkal foglalkozunk, ezért sokszor el is hagyjuk e jelzőt. Az SQL nem önálló szoftver, hanem mindig az adott adatbázis-kezelőhöz kapcsolódik, annak integrált része, illetve magának a nyelvnek a neve. | |||
Az SQL nyelv a relációs kalkulus logikájára épül: nem azt kell leírni, hogy hogyan kapjuk meg a kívánt adatokat, hanem azt, mely adatokat szeretnénk látni. A kért adatok konkrét előkeresésének módját az adatbázis-kezelőre bízzuk. A nyelv úgy lett kialakítva, hogy a parancsok formalizált angol mondatok -az egyszerűbb SQL parancsokat minimális angol nyelvtudással is nagyon könnyű értelmezni: | |||
SELECT name FROM students WHERE neptunid='ABC123' | |||
A fenti mondat egy SQL parancs, és az angolul tudók azonnal értik, hogy azon hallgató nevét keressük ki a hallgatók táblából, akinek a neptunkódja ABC123. Az SQL-t egyszerű szintaktika jellemzi és a parancsokban a kis- és nagybetűket nem különbözteti meg (a könnyű olvashatóság érdekében a példákban az SQL nyelvi elemeket nagybetűvel fogjuk írni). Egy-egy SQL parancs nagyon hosszú lehet, több tucat sorból is állhat, ezért a parancsok végét érdemes jelölni, a szabvány szerint ez az interaktív karakteres felületeken a pontosvessző (;). Ebben az anyagban is fogunk pontosvesszőt használni a többsoros parancsoknál, ez egyértelművé teszi, hogy a sorok egyetlen parancsként értendőek. | |||
Figyeljük meg, hogy a fenti parancs nem mondta meg, hogy pontosan milyen algoritmus mentén lehet a kérdéses hallgató nevét megtalálni, csupán egy "kérdést" tett fel, és annak megválaszolási módját az adatbázisra bízta. Maga az SQL nem is tartalmaz algoritmikus elemeket, például ciklusokat, vagy feltételes elágazást: ha szükség van ilyenekre, akkor az SQL parancsokat valamely más környezetbe, például programnyelvbe ágyazva kell kiadnunk. | |||
Kommunikáció az adatbázis-kezelő rendszerrel | |||
Tekintsük át, milyen módokon adhatunk SQL parancsokat az adatbázis-kezelő számára: | |||
| |||
| |||
Az előző módok bármelyikét is használjuk tehát, az adatbázis felé mindenképp egy szöveges formájú, SQL nyelven megfogalmazott parancs megy - akár mi magunk fogalmaztuk meg a parancsot, akár az általunk használt program adta ki (20. ábra). Az adatbázis-kezelő rendszeren belül az SQL parancsunkat az ún. SQL parancsértelmező kapja meg, ami, amint a neve is mutatja, értelmezi az általunk megfogalmazott parancsot. Ez a szoftverkomponens jelezné azonnal, ha például hibás, tehát végrehajthatatlan parancsot adtunk ki. Ha a parancsot helyesnek találja, elő kell állítani az adatbázis-kezelő belső felépítésének megfelelő algebrai kifejezést - ennek mikéntje már az adatbázis-kezelő rendszer belső ügye. Ezután fontos momentum az optimalizálás: ugyanis, mint korábban már említettük, az SQL nem procedurális nyelv: nem mondjuk meg, hogy pontosan mit, hogyan csináljon az adatbázis-kezelő, hanem azt mondjuk meg, hogy milyen eredményt szeretnénk látni. A megvalósítás megtervezése az adatbázis-kezelő rendszer feladata, és itt az előforduló hatalmas adatmennyiségek miatt hatalmas szerep jut a jó optimalizálásnak. Emlékezzünk arra, hogy két, egyenként 10 millió rekordot tartalmazó tábla Descartes-szorzata 1014 rekordot eredményezne, ha az optimalizáló nem figyelné, hogy egy ilyen műveletet pontosan hogyan, milyen sorrendben kell végrehajtani. Amikor a belső adatmodellnek megfelelően, elkészült egy optimálisnak tekintett, az eredeti parancsunknak megfelelő kifejezés, megtörténhet a tényleges adathozzáférés, a kért adatok kinyerése, vagy változtatások végrehajtása. Az eredmények pedig visszakerülnek a klienshez (eredményekről alapvetően a lekérdezéseknél beszélhetünk, de valójában mindig van, egy törlési műveletnél például visszaadott eredmény az az üzenet, hogy "48500 rekord törölve". | |||
RDBMS Utasítások és csoportosításuk | |||
A továbbiakban áttekintjük az SQL nyelv legfontosabb elemeit. Nem célunk teljes, mindenre kiterjedő leírást tenni - messze meghaladná ezen tárgy kereteit, és értelme sem lenne, hiszen erre ott vannak az egyes adatbáziskezelők dokumentációi. Ebben a tananyagban csupán a megértéshez és a legalapvetőbb feladatok elvégzéséhez szükséges nyelvi elemek egyszerűbb alapváltozataival foglalkozunk. Az egyes parancsok általában sokkal részletesebb funkcionalitással is bírnak, mint ahogy itt tárgyaljuk - mi az egyszerűbb, alapvető eseteket és használati módokat tekintjük át. A teljes, és sokkal részletesebb parancsokért a használt adatbázis-kezelő dokumentációját kell tanulmányozni, és persze a használat során gyakorlatot, tapasztalatot szerezni. | |||
A relációs adatbázis-kezelők szerteágazó parancsait a következőképpen szokás csoportosítani: | |||
| |||
A zárójelbe írt szavak az SQL parancsok kulcsszavai. Angolul értőknek nagyon könnyű lesz memorizálni őket, mivel ahogy említettük, az SQL nyelv parancsai angolul értelmes mondatok. | |||
DDL | |||
A DDL (Data Definition Language - adatdefiníciós nyelv) csoportba tartoznak a táblák és különböző egyéb komponensek létrehozását, szükség szerinti módosítását és törlését végző parancsok. | |||
Ezen parancsok dolgoznak a háttérben akkor is, amikor a 7. ábrán láthatóhoz hasonló felületeken hozzuk létre vagy módosítjuk egy tábla szerkezetét és paramétereit. (Ehhez a képernyőképhez mi magunk úgy juthatunk el, ha a dbGyak adatbázis napsugár nevű táblájának szerkezetét megnézzük. Ez a lap alkalmas megtekintésre, de az itt szereplő adatok módosítására is.) | |||
| |||
Azt látjuk, hogy a napsugár tábla 9 mezőből áll, minden mezőhöz egy-egy sor tartozik. Az első mező a Név, a második az ID a felsorolásban, az utolsó pedig a Csoportkód. | |||
Szintén leolvasható a 7. ábráról, hogy az egyes szöveges mezők milyen kódolású szövegek tárolását feltételezik - a példában a ma széles körben használt UTF8 karakterkódolás van beállítva. A karakterkódolással nem foglalkozunk részletesen, de annyit tudnunk kell, hogy ezen múlik, hogy a használt betűkészlet speciális karakterei (például, magyar nyelv esetén az ékezetes magánhangzók) megfelelően megjelenjenek. Ha egy magyar szó ékezetes betűit nem megfelelően látjuk, akkor a megfelelő karakterkódolást kell ellenőriznünk. A használt adatbázis-rendszer alapértelmezetten használja az UTF8-at, tehát a tanulás idején ezzel különösebb teendőnk nincsen. | |||
A 8. ábrán látható grafikus megoldás helyett a szabványos SQL parancsok kiadására is mindig van lehetőség (9. ábra). A phpMyAdmin rendszerben ehhez a felső menüben található SQL gombra kell kattintanunk. A tananyagban szemléltetésként többször a grafikus felületet mutatjuk, de a konkrét feladatoknál nem a grafikus felület kezelésére, hanem az SQL parancsokra koncentrálunk. Ne feledjük, hogy a grafikus felület akár azonos termék esetén verziónként is változhat, addig az SQL szabvány legfontosabb elemeinek ismeretét bármely relációs adatbázisban hasznosítani tudjuk a későbbiekben. | |||
| |||
A továbbiakban tehát a jobb megértés és megjegyzés miatt javasoljuk, hogy minél több parancsot próbáljanak ki, akár változtatásokkal is, tapasztalják meg, miként működik az SQL szerver. Azt is csak személyes tapasztalattal lehet megtanulni, hogyan kell felismerni és elhárítani az esetleges felhasználói hibákat (a hibásan gépelt parancsokat). Újból felhívjuk a hallgatók figyelmét, hogy az adatbázis-rendszereknél nem jellemző a "Mentés gomb" vagy mentés előtt a visszavonás (Mégse - Undo) lehetősége, a kiadott parancsok tipikusan azonnal és végérvényesen végrehajtódnak. A parancsok kiadása kapcsán tehát megfelelő körültekintéssel kell eljárni. | |||
A munka befejeztével tehát nem kell a munkánkat külön elmenteni, bár van kilépés gomb, valójában a böngészőablak bezárása is hasonló eredményre vezet. | |||
Létrehozás - CREATE | |||
A létrehozás kulcsszava a CREATE, a parancs általános formája (ez tehát még nem konkrét, kiadható parancs, ebben a formában még nem tudjuk kipróbálni): | |||
CREATE objektumtípus paraméterek | |||
Az egyik legegyszerűbb eset, a tábla létrehozása: | |||
CREATE TABLE táblanév (mező1 típus1 megszorítás1, ...); | |||
A táblanév és a mezők nevei az angol ábécé betűiből, aláhúzásjelből (_) és számokból állhatnak. A mezőnevet követi az adattípus megadása (lásd Adattípusok című szakasz). Ha több mezőből áll a tábla, a szükséges adatokat vesszővel (,) elválasztva egymás után soroljuk fel. | |||
Amikor egy új táblára van szükségünk, érdemes ellenőrizni, hogy esetleg nem hoztuk-e létre már korábban. E folyamat egyszerűsítésére hasznos lehetőség az IF NOT EXISTS módosító használata: | |||
CREATE TABLE IF NOT EXISTS táblanév ... | |||
Így a táblát a szokásos módon létrehozza, ha még nem volt ilyen nevű táblánk, de nem jelez hibát, ha már korábban létezne (ilyenkor a parancs gyakorlatilag semmilyen módosítást nem csinál) Akkor szoktuk így írni a táblát létrehozó parancsokat, ha pl. egy fájlba gyűjtjük egy komplett adatbázis-feladathoz tartozó táblák létrehozását, és el akarjuk kerülni a parancssorozat újbóli futtatásából adódó hibákat. | |||
A megszorításokról, más szóval integritási feltételekről olvashattunk az Integritásőrzés és az Integritási feltételek című szakaszban, a konkrét megvalósítást pedig a DDL című szakaszban tárgyaljuk. | |||
Példa egy tábla létrehozására, amit már mi magunk is kipróbálhatunk. A parancsot be is gépelhetjük (úgy jobban megjegyezzük), de természetesen a vágólapon keresztül is az SQL ablakba másolhatjuk: | |||
CREATE TABLE IF NOT EXISTS kikoto | |||
A NOT NULL jelentésével a későbbiekben (Integritási feltételek című szakaszban és az Integritási feltételek megadása című pontban) foglalkozunk, itt csak jegyezzük meg, hogy hatására az adott mezőnek mindenképpen kell értéket kapnia (azaz nem maradhat kitöltetlen). | |||
Az Indítás gomb megnyomása után a következő képernyőképet kapjuk (9. ábra): | |||
| |||
Figyeljük meg, hogy a kiadott parancsot szintaktikailag kiszínezve, átrendezve kapjuk vissza, és szükség esetén tovább szerkeszthetjük, és újra kiadhatjuk, ha a megjelenő Módosítás gombra kattintunk. | |||
A kikoto tábla hajókikötők nevének tárolására alkalmas, mindegyik rekordhoz létrehoztunk egy szám-azonosítót is. Ez a tábla létezik a dbGyak adatbázisban, és a későbbi példákban használni fogjuk. A saját adatbázisunkban természetesen kiadható a fenti parancs, így elkészíthetjük a saját kikoto táblánkat. A 23. ábrán látszik, hogy jelenleg a dbNeptun az aktuális adatbázis, így a parancs kiadása után ide készül el a kikoto nevű tábla. | |||
Később, amikor a balatoni hajómenetrenddel fogunk dolgozni, egy másik táblára is szükségünk lesz: a menetrendet a menetrend nevű táblában tároljuk. A kikötő azonosítóját is fogjuk használni ebben a táblában is. A menetrend táblában felsoroljuk, hogy az egyes járatok honnan, hova és mikor közlekednek. Ehhez alkalmas a következő paranccsal létrehozható táblázat: | |||
CREATE TABLE menetrend ( | |||
Amint láthatjuk, ezt a parancsot az áttekinthetőség érdekében most több sorba írtuk. Így is begépelhetők a parancsok, ha nem egyértelmű, ilyen esetben egy lezáró jellel (;) kell jeleznünk, hogy hol van a parancs vége. | |||
Hozzunk létre egy olyan táblát, amiben például a hajózási társaság alkalmazottak adatai tárolhatók: | |||
CREATE TABLE dolgozo (id INT PRIMARY KEY, nev VARCHAR(30), munkakor CHAR(1)); | |||
A relációs adatbázis-kezelők alapötlete, hogy nemcsak a konkrét tárolandó adatokat, hanem minden egyéb szükséges információt is olyan módon tároljon az adatbázis "saját" magában, hogy ezek kezelése hasonlítson a normál táblaadatokéra. Így indexet is a CREATE paranccsal készíthetünk: | |||
CREATE INDEX munkakor ON dolgozo (munkakor NOT NULL); | |||
Ez a parancs egy munkakor nevű indexet hozott létre, ami a dolgozo táblához kapcsolódóan a munkakor mezőt indexeli. Az indexnév a későbbi hivatkozáshoz (például az index törléséhez) kell szokásos módon ugyanazt a nevet adtuk neki, mint az indexelt mezőnek. A két munkakor szó nem keveredik össze, hiszen az egyik helyen indexet, a másik helyen táblamezőt azonosít. Az SQL - logikus módon - a nevek egyediségét csak azonos típusú objektumok esetén követeli meg. Az esetleges megszorításokat az indexelendő mező után írjuk. Ha több mezőt akarnánk bevonni az indexelésbe, akkor ezeket vesszővel (,) elválasztva egymás után sorolhatjuk fel. | |||
Hozzunk létre indexet a kikötők nevére, amivel biztosítani akarjuk, hogy ne lehessen két azonos nevű kikötő a táblában (UNIQUE kulcsszó): | |||
CREATE UNIQUE INDEX kikotonev ON kikoto (név); | |||
Mindent a CREATE paranccsal hozunk létre. A következő parancs például egy adatbázis-felhasználót készít, és azonnal jelszót is beállít hozzá: | |||
CREATE USER név IDENTIFIED BY 'jelszó'; | |||
Ne feledjük, az adatbázisnak kiadott parancsok jogosultsághoz kötődnek. Ezt a parancsot például nincs jogunk kiadni, ha megpróbáljuk, hibaüzenetet kapunk (Access denied - engedély megtagadva). | |||
Módosítás - ALTER | |||
A CREATE paranccsal elkészített objektumok szükség esetén az ALTER paranccsal módosíthatók: | |||
ALTER objektumtípus paraméterek | |||
Például módosítsuk a dolgozo tábla nev mezőjének típusát (Az ALTER és MODIFY szavak azonos módon használhatók) | |||
ALTER TABLE dolgozo ALTER nev VARCHAR(40) NOT NULL; | |||
Módosítás az is, ha például egy új mezőt veszünk be a táblastruktúrába. Ehhez az ADD szót kell használnunk: | |||
ALTER TABLE dolgozo ADD lakcim VARCHAR(40); | |||
Az ALTER paranccsal nem tudjuk a táblákban tárolt adatokat módosítani: az ALTER magának a tábladefiníciónak a módosítására szolgál. | |||
Törlés - DROP | |||
A korábban létrehozott, de szükségtelenné vált objektumok a DROP (eldobás) paranccsal törölhetők: | |||
DROP objektumtípus paraméterek | |||
Például, töröljük ki a munkakor indexet, majd utána a dolgozo táblát: | |||
DROP INDEX munkakor; | |||
Az index törlését csak a példa kedvéért írtuk le: a dolgozo tábla törlése kapcsán automatikusan törlődött volna minden hozzá kapcsolódó adat, így a tábla indexei is. | |||
Integritási feltételek megadása | |||
Az integritási szabályok értelméről, fajtáiról az Integritási feltételek című szakaszban olvashattunk. A konkrét SQL megvalósítások a következők: | |||
| |||
CREATE TABLE díszpolgár ... CHECK (lakcim_varos="Győr" AND kor>50) | |||
| |||
DML | |||
A DML (Data Manipulation Language - adatmódosító nyelv) csoportba tartoznak azok a parancsok, amik a táblákban tárolt adatok bevitelét, módosítását és törlését végzik. | |||
Beszúrás - INSERT | |||
A legegyszerűbb eset, amikor a felsorolt konstans értékeket akarjuk egy táblába beszúrni: | |||
INSERT INTO "dolgozo" VALUES | |||
(Az egybetűs munkakör ('p') itt a portás szóra utal.) Az adatok feltöltése valójában sok hasonló parancs kiadásából áll. Sok adat egyidejű feltöltése esetén van mód ezen parancsok összevonására, ahogyan azt a következő példában látni fogjuk. | |||
Töltsük fel adatokkal a korábban (a Létrehozás - CREATE című pontban) létrehozott kikoto és menetrend táblákat! Nyissa meg a letölthető fájlok között a kikoto.txt és menetrend.txt szövegfájlokat, amiben egy-egy SQL parancs található. A vágólapon keresztül másolja be az SQL ablakba és hajtsa végre őket. | |||
Módosítás - UPDATE | |||
A módosítás kulcsszava az UPDATE. A következő parancs a 32-es azonosítójú dolgozó nevét (ha van ilyen) Kapitány Jánosra módosítja. Ha nincs ilyen azonosítóval rendelkező rekord, nem keletkezik hiba, de nem is történik semmi. | |||
UPDATE dolgozo SET nev='Kapitány János' WHERE id=32; | |||
A mi példa-táblánkban valóban nincs ilyen, ezért azt a visszajelzést kapjuk, hogy 0 sor módosult (24. ábra). | |||
| |||
Nagyon fontos megjegyezni, hogy ha a WHERE kulcsszót nem adjuk meg, a parancs szintaktikailag akkor is helyes, és az összes rekordra vonatkozik. A következő parancs kiadása esetén a dolgozo tábla összes rekordjában megváltozna a tárolt személyek neve. Sok esetben hasznos lehet valamely adat egységes módosítása, de nagyon könnyű komoly kárt is tenni az adatokban. | |||
UPDATE dolgozo SET nev='Kapitány János' | |||
Mindez teljesen logikus, de mindig figyeljünk arra, hogyha nem adunk meg (szelekciós, szűkítő) feltételt, a parancs minden elérhető rekordra vonatkozik. Így lesz ez a lekérdezéseknél is, de sokkal veszélyesebb, hogy ugyanez történik módosításnál és törlésnél is. | |||
Törlés - DELETE | |||
Egy példa a DELETE parancs használatára (gondolkozzunk, mielőtt kipróbáljuk): | |||
DELETE FROM dolgozo | |||
Az előző példák alapján már tudnunk kell, hogy ez a parancs a dolgozo tábla összes rekordját kitörli. Általában nem ezt akarjuk, hanem valamely szelekciós feltétel alapján törlünk: | |||
DELETE FROM dolgozo WHERE dolgozo_id=8392 | |||
Törölni mindig csak rekord egységenként lehet, tehát a fenti parancsok mindig "egész" rekordokat törölnek. (Ha egy mezőt akarunk törölni, azt a tábladefiníció módosításával tehetjük meg, ami így az egész táblára vonatkozik. Ne tévesszük össze ezt a lehetőséget egy konkrét rekord egyik mezője tartalmának "kitörlésével"! Ehhez nem szó szerinti törlésre van szükség, hanem egyszerűen módosítsuk az adott mezőt, pl. NULL értékre.) | |||
Sokszor egyszerűbb az adatok módosítása a grafikus lehetőségek használatával, parancsok begépelése nélkül. Ez a lehetőség mindig a rendelkezésünkre áll, a 25. ábrán látható, hogy a kikoto tábla rekordjait SQL parancsok ismerete nélkül is szerkeszthetjük. Ilyenkor is az itt megismert DML parancsok dolgoznak a háttérben. Új rekordot (sort) a Beszúrás gomb megnyomásával szúrhatunk be a táblázatba. | |||
| |||
DCL | |||
A DCL a Data Control Language (adatvezérlő nyelv) rövidítése. A szó szerinti magyar fordítás nem túl szerencsés, hiszen nem a klasszikus értelemben vett vezérlő utasítások tartoznak ide! A programozási nyelvekben vezérlő utasítások közé a ciklusszervező utasítások, feltételes elágazások (for és while ciklus, if és switch szerkezetek) tartoznak: az SQL nem programozási nyelv és semmi hasonlót nem is tartalmaz! Említettük már, de e gondolat kapcsán hasznos megismételni, hogy míg a hagyományos, procedurális programnyelvekben a programozó a végrehajtandó lépéseket fogalmazza meg, addig az SQL nyelvben csak az elvárt működésre, eredményre utalunk, nem írjuk le a feladat végrehajtásának algoritmusát. | |||
(Létezhetnek, léteznek procedurális kiegészítők az SQL nyelvhez, például az Oracle PL/SQL programnyelve, de ezek már túlmutatnak az általunk most tanulmányozott alap SQL nyelven és ezen a tananyagon.) | |||
Ezek alapján a DCL magyar megfelelőjének talán az adatfelügyelő nyelv megnevezés lenne a szerencsés, a mindenki által használt adatvezérlővel szemben. | |||
A DCL csoportba az adatbázis-kezelő rendszer felhasználóival, a hozzájuk és az adatbázis-objektumokhoz kapcsolódó jogosultságokkal foglalkozó parancsok tartoznak. A gyakorlásra szánt adatbázisban a hallgatók nem rendelkeznek olyan rendszergazdai jogosultsággal, ami például felhasználók kezelésére jogosítaná fel őket, ezért a most következő parancsokat nem tudják működés közben kipróbálni. | |||
Nézzünk néhány példát az ide tartozó parancsokra. Először is, (egy már ismert DDL parancs segítségével) létrehozhatunk egy felhasználót: | |||
CREATE USER diak1 | |||
Bár megtehettük volna, de nem adtunk neki jelszót. Megtehetjük utólag: | |||
ALTER USER diak1 SET PASSWORD 'Frédi' | |||
Hozzunk létre egy másik felhasználót is az adatbázisban: | |||
CREATE USER diak2 PASSWORD 'Béni' | |||
A felvett felhasználóink számára létrehozunk egy hallgato nevű jogosultságot, és ezt a - egyelőre nem részletezett - jogot a két diákunknak adományozzuk: | |||
CREATE ROLE hallgato; | |||
E két utóbbi műveletet akár úgy is megfogalmazhatnánk, hogy a két megadott felhasználót hozzáadtuk a hallgato csoporthoz. Már csak azt kell beállítanunk, hogy a hallgato csoportnak mihez legyen joga az adatbázisunkban: | |||
GRANT SELECT, UPDATE ON TABLE táblanév TO hallgato | |||
A hallgato csoport, tehát a mindenkor hozzátartozó felhasználók jogot kaptak a táblanév nevű tábla lekérdezésére és adatainak módosítására, de ez alapján nincsen joguk a táblába új rekordot felvinni, vagy onnan törölni. | |||
Ennél sokkal finomabban is beállíthatjuk az egyes felhasználók jogosultságait. Beállíthatjuk többek között, hogy honnan jelentkezhetnek be a hálózaton keresztül az adatbázisba, hogy például egy óra alatt hány lekérdezést vagy más műveletet végezhetnek (hogy ne terheljék túl a rendszert, vagy hogy elejét vegyük az adataink jogosulatlan böngészésének), előírhatjuk, hogy egy táblának csak bizonyos oszlopait kérdezhetik le, vagy csak azokat módosíthatják, szabályozhatjuk, hogy a kapott jogokat tovább adhatják-e más felhasználóknak (GRANT OPTION), stb. | |||
Az átadott jogokat a REVOKE paranccsal vehetjük vissza. Egy felhasználótól a következő paranccsal minden jogát elvesszük: | |||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM diak1 | |||
Az ALL PRIVILEGES az összes jogot egyben jelenti, így biztosan nem felejtettünk ki semmit felsorolni. Így a hallgatónk semmit nem tud többé kezdeni az adatbázisban, de maga a felhasználó még létezik. Ha nincs rá szükség, csak egy mozdulat végleg kidobni: | |||
DROP user diak1 | |||
Bár ezeket az egyszerű parancsokat nem volt alkalmunk kipróbálni, a működésük logikája bizonyára így is megérthető. Efféle parancsok segítségével van megoldva, hogy minden felhasználó csak a saját számára kijelölt adatbázist láthassa a szerveren, és ne tudják egymás munkáját véletlenül vagy szándékosan megtekinteni vagy módosítani. | |||
DQL | |||
A DQL a Data Query Language (adatlekérdező nyelv) rövidítése. Gyakorlatilag egyetlen parancs, a SELECT tartozik ide, aminek célja az adatbázisban tárolt adatok kinyerése. | |||
A SELECT parancs kiemelt szerepet kap a többi parancs között: amellett, hogy a legtöbb alkalmazásban ezt használják a legtöbbet, messze a legösszetettebb is. Ezért külön, A SELECT parancs című alfejezetben foglalkozunk részletesen vele. | |||
Grafikus felületeken is összeállíthatók egyszerűbb lekérdezések (12. ábra), és bár egyszerűbb esetekben gépelés nélkül, kényelmesen használhatók, az ezeken elérhető lehetőségek azonban csak töredékei a mögöttes parancsok teljes funkcionalitásának. | |||
| |||
A lekérdezések más parancsokba ágyazhatók (részletesen lásd később a Beágyazott SELECT parancs című alfejezetben): | |||
| |||
A SELECT legalapvetőbb formája a következő: | |||
SELECT mit FROM honnan WHERE feltételek | |||
A SELECT parancsot annak fontossága és összetettsége miatt külön leckében, A SELECT parancs című alfejezetben tárgyaljuk. |
Leckezáró kérdések, feladatok | |||||||||||||
1. Melyik feladatokra alkalmas tipikusan egy desktop adatbáziskezelő?
![]() | |||||||||||||
2. Mi a pontos funkciója a tanuláshoz használt phpMyAdmin rendszernek?
![]() | |||||||||||||
3. Ki akarok törölni egy táblát. Melyik parancsot kell használnom?
![]() | |||||||||||||
4. Írja ide azt a két szót SQL szintaktika szerint, amivel egy táblát létrehozó SQL parancsnak kezdődnie kell: ![]() | |||||||||||||
5. Mi történik az alábbi SQL parancs kiadása után? DELETE FROM adatok
![]() | |||||||||||||
6. Jelölje meg azokat a parancsokat, amelyek használhatók tábladefiníció kezelésére:
![]() | |||||||||||||
7. Mely állítások jellemzőek az SQL nyelvre?
![]() | |||||||||||||
8. A dolgozó táblát a következő paranccsal hoztuk létre és ezzel kapcsolatban más parancsot nem adtunk ki: | |||||||||||||
CREATE TABLE dolgozo (id char(3) PRIMARY KEY, nev VARCHAR(30), | |||||||||||||
Használható-e az adószám a dolgozók azonosítására?
![]() | |||||||||||||
9. Mi történik az indexekkel, ha azt a táblát töröljük, amihez kapcsolódnak?
![]() | |||||||||||||
10. A táblaszerkezet változatlanul hagyása mellett egyes rekordok adatait szeretném módosítani. Melyik SQL parancs való erre? ![]() |