Adatbáziskezelő rendszerek Adatbázis: • A valós világ egy meghatározott részének leírásához használt, adott formátumú és rendszer szerint tárolt

adatok együttese • Olyan adatok együttese, amit egy adatbáziskezelő rendszer kezel. Adatbáziskezelő rendszerekkel szembeni elvárások: • Tegye lehetővé új adatbázisok létrehozását, az adatbázis logikai struktúrájának (sémájának) egy speciális nyelven (adatdefiníciós nyelv) való megadását. • Biztosítsa, hogy a felhasználók az adatokat egy megfelelő nyelv (adatmanipulációs nyelv, lekérdező nyelv) segítségével lekérdezhessék, módosíthassák. • Támogassa nagyon nagy mennyiségű adat hosszú időn keresztül történő tárolását. Garantálja az adatok biztonságát a meghibásodásokkal és az illetéktelen felhasználókkal szemben. Tegye lehetővé a hatékony adathozzáférést a lekérdezések és módosítások számára. • Több felhasználó egyidejű munkáját támogassa. Figyelje a több felhasználó által egy időben történő adathozzáféréseket úgy, hogy azok ne vezethessenek az adatok hibássá vagy következetlenné válásához. Az első adatbáziskezelő rendszerek: • 60-as évek végén jelentek meg. • Nem támogattak semmilyen magas szintű lekérdező nyelvet. • Első jelentős alkalmazási területek azok a rendszerek voltak, amelyekben sok kis adatelem szerepelt és a rendszerben sok lekérdezés és módosítás volt. Példa - Repülőgép helyfoglalás: • Adatelemek: o Egy vevő helyfoglalása egy adott járatra (ülőhely, választott menü) o Járatokra vonatkozó információ (indulás, érkezés, honnan, hová, repülőgép) o Jegyárak, előjegyzések, még kapható jegyek • Lekérdezések: o Egy adott városból egy másikba mely járatok indulnak egy hozzávetőlegesen megadott időpontban o Mely ülőhelyek szabadok o Mennyi egy jegy ára • Adatmódosítások: o Egy vevő helyfoglalása egy adott járatra o Egy ülőhely kiadása o Egy menüválasztás bejegyzése Példa - Banki rendszerek: • Adatelemek: o Ügyfelek nevei és címei. o Folyószámlák és hitelszámlák egyenlegei. o Az ügyfelek és a számlák között fennálló kapcsolatok (pl. kinek melyik számla felett van aláírási joga). • Lekérdezések: Egy adott számla egyenlege • Adatmódosítások: Egy adott számlára vonatkozó befizetés vagy kifizetés Példa - Vállalati nyilvántartások: • Adatelemek: o Eladásokra vonatkozóak o Kimenő és bejövő számlákra vonatkozóak

o Dolgozókra vonatkozóak (név, cím, fizetés, nyereségrészesedés) • Lekérdezések (jelentések): o Kinnlevő számlák o Dolgozók havi fizetése • Adatmódosítások: o Minden egyes eladás, vásárlás, számlakibocsátás, számlakifizetés o Dolgozók felvétele, elbocsátása, előléptetése Adatbáziskezelő rendszerek: Kezdetben egyedi programok készültek az egyes vállalatoknál a különböző adatok nyilvántartására. A tömeges alkalmazási igény kikényszerítette az adatformátumok szabványosítását, és általános célú adatbáziskezelő szoftverek kifejlesztését. Minden adatbáziskezelő rendszerben biztosítani kell az adatmódosítást. Relációs adatbáziskezelők: Az adatokat a felhasználók felé táblázat (reláció) formájában jelenítjük meg (a háttérben persze bonyolult struktúrák is lehetnek). A relációs adatbáziskezelőknek az a lényege, hogy mindent külön tárolunk, és így keresünk köztük relációt. A lekérdezések magas szintű nyelv segítségével fejezhetők ki, amely jelentősen növeli az adatbázis programozók hatékonyságát. Példa: Számlák nevű reláció

• Attribútumok (oszlopok): számlaszám, egyenleg, típus • Lekérdezés (SQL): o SELECT egyenleg – az egyenleg attribútumból kérdezzen le o FROM Számlák – a számlák táblából o WHERE számlaszám = 67890; - mit kérdezzen le (a 67890-et) • Vizsgáld meg a FROM után szereplő reláció minden sorát. • Válaszd ki azokat a sorokat, amelyek a WHERE után megfogalmazott követelményeknek eleget tesznek. • Add meg eredményként ezeknek a soroknak a SELECT után megadott attribútumait. • Még egy lekérdezés (SQL): o SELECT számlaszám o FROM Számlák o WHERE típus='betétszámla' AND egyenleg < 0; A gyakorlatban a rendszernek optimalizálnia kell a lekérdezést: hatékony végrehajtási módot kell találni még akkor is, ha a lekérdezésben szereplő relációk nagyon nagyok. Az IBM volt az első olyan cég, amely relációs adatbáziskezelő rendszereket árusított. Ma is a relációs adatbáziskezelő rendszerek a legelterjedtebbek a piacon. Adatbáziskezelő rendszerek felépítése:

• • •

Adatok, metaadatok: Az ábra alján az adatok tárolására szolgáló hely látható. Ez a rész nem csak adatokat, hanem metaadatokat is tartalmaz, ami az adatok szerkezetét írja le (relációs adatbáziskezelő esetén a relációk nevei, attribútumok nevei, attribútumok típusai). Napló bejegyzések: A napló bejegyzések információk az adatbázis közelmúltban történt változásairól. Ezek segítségével oldható meg, hogy a rendszer még rendszerhiba esetén se veszítsen adatot. Statisztikák: Az adatbáziskezelő rendszer által összegyűjtött információk az attribútumokról, relációkról és az adatbázis más komponenseiről. Indexek: Az adatbáziskezelő rendszerek gyakran indexeket használnak az adatok elérésére. Az index olyan adatstruktúra, amely lehetővé teszi, hogy az adatelemeket gyorsan megtaláljuk, ha ismerjük a hozzá tartozó értékek bizonyos részét. A leggyakrabban előforduló példa olyan index, amelyiknek a segítségével egy reláció azon sorait kereshetjük meg, amelyekben az egyik attribútum értéke adott. Az indexek a tárolt adatok közé tartoznak, viszont az, hogy mely attribútumokra léteznek indexek, a metaadatok részét képezik. Az indexelés arra is jó, hogy bizonyos adatelemeket (amelyek indexelve vannak) gyorsabban megtaláljunk. Tárkezelő: A tárkezelő feladata a kért információk beolvasása a tárolóhelyről, illetve az adatok módosítása, ha a felette álló rendszerszintek ilyen irányú kérést fogalmaznak meg. Lehetne az operációs rendszer fájlkezelő része is, de a hatékonyság érdekében az adatbáziskezelők általában közvetlenül felügyelik az adatok lemezen való tárolását. A tárkezelő két részből áll: o Fájlkezelő: fájlok lemezen való elhelyezkedését tartja nyilván, az állomány blokkjait írja/olvassa ha a pufferkezelő erre kéri. o Pufferkezelő: a fájlkezelő segítségével adatblokkokat olvas be a lemezről és kiválaszt egy memóriaterületet, ahol az adott blokkot tárolni fogja. Egy lemezblokkot a memóriában tarthat egy ideig, de ha a blokk által foglalt memóriára egy másik blokknak van szüksége, akkor a blokkot visszaírja a lemezre. Lekérdezésfeldolgozó: A lekérdezésfeldolgozónak nevezett egység feladata, hogy a lekérdezéseket, illetve egyéb adatbázisműveleteket (adatok és metaadatok módosítása), amelyek gyakran egy magas szintű nyelven vannak megfogalmazva, egyszerű utasítások sorozatává alakítsa. Gyakran a lekérdezésfeldolgozás legnehezebb része a lekérdezés optimalizálása, vagyis egy megfelelő végrehajtási terv kiválasztása. A bonyolult lekérdezések sokszor lehetővé teszik, hogy átrendezzük az elemi műveleteket, és így nagyon sok végrehajtási terv adódik. Tranzakciókezelő: A tranzakciókezelő rész felelős a rendszer sértetlenségéért. Ennek kell biztosítani, hogy az egy időben futó lekérdezések és módosítások ne ütközzenek

azok kihatását el kell különíteni egymástól. o Egy alkalmazói program interfészén keresztül.össze egymással. A tranzakciók „helyes” lefutásával szembeni elvárásokat négy pontban szokták összefoglalni: o Atomosság: Megköveteljük. Például ha két ügynök éppen ugyanarra a járatra ad el jegyet és a járaton már csak egy hely van. hogy egy tranzakció vagy teljes egészében hajtódjon végre. az adatbázis adminisztrátorok adhatják ki. hogy a tranzakció befejezése után az adatbázis ismét következetes állapotba kerüljön. Noha ezt a feltételt megsérthetjük a tranzakció alatt (pl. hogy alkosson. utasok átrendezése). • Lekérdezések (adatokra vonatkozóan): o Input o Egy általános lekérdezőinterfészen keresztül. vagy semmi ne hajtódjon végre belőle. A tranzakciókezelő kapcsolatot tart a lekérdezésfeldolgozóval. ha a rendszer közvetlenül a tranzakció befejezése után hibásodik meg. Adatbáziskezelő rendszerekkel kapcsolatos főbb tevékenységek: • Adatbázistervezés: o Hogyan alakítsunk ki egy jól használható adatbázist? o Mely információk kerüljenek be az adatbázisba? o Milyen legyen az adatok szerkezete? o Milyen feltételezésekkel éljünk az adatelemek típusára és értékeire vonatkozóan? . hogy egyetlen ülőhelyet se rendeljünk hozzá két különböző utashoz. ha a két tranzakció egymás után fut le. akkor annak eredménye nem veszhet el rendszerhiba esetén sem. o Következetesség: Egy adatbázisban általában beszélhetünk a következetes állapotok fogalmáról. hogy az aktuális lekérdezések éppen mely adatokon dolgoznak. Kapcsolatot tart a tárkezelővel is. hiszen a konfliktusok elkerüléséhez tudni kell. Például egy repülőgép helyfoglalási adatbázisban egy megfelelő következetességi feltétel. még akkor sem. mert az adatok védelmére szolgáló módszerek többnyire magukban foglalják a módosítások naplózását. akkor az egyik kérést teljesíteni kell. hogy egy vagy több lekérdezést vagy módosítást egy tranzakcióba csoportosítsanak. ezek helyes lefutásának biztosítása is a tranzakciókezelő feladata. a másikat pedig vissza kell utasítani. Ez azt jelenti. hogy semmiféle olyan eredményt vagy kihatást nem tapasztalhatunk az adatbázisban. o Tartósság: Ha egy tranzakció befejeződött. amelyeket egymás után egy egységként kell végrehajtani. és épp a konfliktusok megakadályozásáért késleltethet bizonyos műveleteket (zárolás). a tranzakciókezelőnek biztosítani kell. Az adatbázisrendszerek gyakran sok tranzakció egyidejű végrehajtását engedik meg. de amit igen. • Sémamódosítások: az ezekre vonatkozó utasításokat csak az arra illetékes személyek. A tranzakció tulajdonképpen olyan műveletek egy csoportja. • Módosítások (adatokra vonatkozóan): hasonló. amelyekben az adatok megfelelnek bizonyos elvárásoknak. és hogy a rendszer még rendszerhiba esetén se veszíthessen adatokat. amit a két tranzakció egyidejű futása okozott. azt általában egyszerűbben tehetjük meg (mezők kitöltése). mint a lekérdezéseknél. és ami nem fordult volna elő. Például az automatából történő pénzfelvétel és a hozzá kapcsolódó megterhelés az ügyfél számláján egyetlen atomi tranzakciót kell. Általában nem tehetünk fel akármilyen kérdést. Például a rendszer megengedi SQL lekérdezések begépelését. Az adatbáziskezelők többnyire megengedik a felhasználóknak. o Elkülönítés: Amikor két vagy több tranzakció egyidejűleg fut.

hogy az adathozzáférés hatékony legyen? A relációs adatmodell Adatmodell: Egy adatmodell adatok leírására szolgáló eszköz. Egy Z attribútum értéktartományát dom(Z)-vel jelöljük.. vagyis elemei nem lehetnek struktúrák. Vagyis T elemei (a1. amelyhez azonosító nevet rendelünk. ahol A az {A1.. (Ahol nem értelemzavaró.An) módon szokás jelölni. ahány oszlopa van a táblának. logikai).. relációséma helyett egyszerűen csak sémát mondunk. Codd. • Az adatokra megfogalmazható megszorítások...An attribútumok.. sztring.. amelyet a megnevezésével azonosítunk. • dom(szerző) = legfeljebb 30 hosszú karaktersorozatok halmaza.Ai-vel jelöljük. ahol az egyes attribútumok értéktartománya: • dom(könyvszám) = 6-jegyű decimális számok halmaza. Egy sorát rekordnak nevezzük... Az értéktartomány megadása rendszerint típus és hossz megadását jelenti.. cím).An) séma felett: T dom(A1) × .) A relációsémát R(A1. Az adattábla (vagy egyszerűen csak tábla) sorokból és oszlopokból áll. ahol ai ϵ dom(Ai) (i=1. A relációs adatmodellnél az értéktartomány csak atomi értékekből állhat (szám.. listák. amely az attribútum megadását pontosítja. stb... halmazok.. Például: Egy könyvek nyilvántartására szolgáló relációséma KÖNYV (könyvszám.. Használjuk még az R(A) jelölést is. R pedig a séma neve.. .. Attribútumnak nevezünk egy tulajdonságot (jellemzőt). mint amilyenek a tranzakciók vagy a triggerek? Adatbázismegvalósítás: o Hogyan készítsünk el egy adatbáziskezelő rendszert? o Hogyan valósítsuk meg a lekérdezésfeldolgozót. a tranzakciókezelőt? o Hogyan szervezzük meg az adatok tárolását.an) alakúak. A leírás általában három fő részből áll: • Az adatok struktúrája.. Reláció az R(A1.• • o Hogyan kapcsolódjanak egymáshoz az adatelemek? Adatbázisprogramozás: o Hogyan fejezzük ki az adatbázisra vonatkozó lekérdezéseket és egyéb műveleteket? o Hogyan használjuk ki az adatbáziskezelő rendszerek egyéb lehetőségeit. • dom(cím) = legfeljebb 50 hosszú karaktersorozatok halmaza.. × dom(An)...An} attribútumhalmaz.. ha különböző sémák azonos nevű attribútumait kell megkülönböztetni (például személy(ID. A relációs adatmodell: A relációs adatmodellt 1970-ben definiálta E. ahol A1. F. amely annyi mezőből áll. úgynevezett adattáblák formájában jelennek meg. A relációs adatmodellben az adatok kétdimenziós táblázatok.nev a személy tábla név attribútumára való hivatkozás).n). módosítások). de gyakorlati alkalmazása csak az 1980-as években vált általánossá. • Az adatokon végezhető műveletek (lekérdezések. és értéktartományt rendelünk hozzá. Az R séma Ai attribútumát R.. A gyakorlatban az attribútumnévhez általában informális leírást (kódolási utasítást) kell mellékelni.. szerző. Relációsémának nevezünk egy attribútumhalmazt... Nev…) sémában a szemely. dátum.

. de nem tudjuk. hogy egy sor valamelyik attribútumának értéket kell adni. és relációpéldányról.. Több adattábla együttesen alkotja a relációs adatbázist.. Általános esetben a sémára és táblára külön jelölést használunk (például R séma feletti T tábla). dom(An) egyesített értéktartományt és az A = {A1. aminek itt értelme lenne (pl. A leggyakoribb okok: • Ismeretlen érték: magáért beszél (pl. amelynek oszlopai az A1.. sorai pedig T egyes elemeinek felelnek meg. amelynél minden j-re ti(Aj) ϵ dom(Aj) teljesül..tk} halmazt. amely az adattáblának felel meg.An attribútumoknak. Relációnak nevezünk egy T = {t1. amely a relációsémának felel meg.. de konkrét példák esetén a kettőt azonosan jelöljük (például KÖNYV séma és KÖNYV tábla). így a relációs modellben a tábla minden sora különböző.. A tábla fejlécében a relációsémát szokták megadni. és a konkrét adatbáziskezelő rendszerek általában megengednek azonos sorokat is.. amely egy teljes jelenségkör leírására alkalmas.. A következő példa egy könyvtári nyilvántartás egy lehetséges megvalósítását mutatja: itt a KÖNYV táblában adjuk meg az adott könyvet kikölcsönző olvasó számát is. • Alkalmazhatatlan érték: nincs olyan érték. • Visszatartott érték: nem vagyunk feljogosítva az érték ismeretére (pl. ahol ti: A  D olyan leképezés... kölcsönző neve egy éppen nem kikölcsönzött könyvnél). titkos telefonszám). és a sorokra semmilyen rendezettséget nem tételez fel. Valójában az adatok gépi tárolása mindig valamilyen sorrendben történik.An} attribútumhalmazt.. így egy másik definíció is használatos: • Tekintsük a D = dom(A1) . A relációs modell valójában a tábla oszlopaira sem határoz meg sorrendet.A reláció megjelenési formája az adattábla.. Mivel a reláció fenti definíciója akaratlanul is kiköti az oszlopok sorrendjét. hogy mi is ez az érték. A relációs modellnél beszélhetünk relációtípusról. kölcsönző születésnapja). . Az elméleti modell és a gyakorlati alkalmazás ezen eltéréseire mindig ügyelni kell. Mivel a definíció szerint a T reláció egy halmaz.. NULL érték: Előfordul.

. indul}. Ezt követik a sémaelemek deklarációi. rendszám. Ha K egyetlen attribútumból áll. Kulcs: Az A attribútumhalmaz K részhalmazát kulcsnak nevezzük.Az ilyen attribútumok esetén használhatunk egy speciális NULL értéket. egyet kiválasztunk közülük.. érkezik}.... hogy az olvasószám attribútum mindkét táblában szerepel... Legyenek R1(A1.An) és R2(B1. R2 feletti T1. Másodlagos kulcs abban az esetben lehet NULL érték is. és nem az aktuális táblák tulajdonsága. ez lesz az elsődleges kulcs: VOLÁN (gkvez.. Nem fontos a sémát egyszerre deklarálni. hogy azok melyik sémára vonatkoznak. A NULL értékkel nem lehet műveletet végezni. ez lesz az elsődleges kulcs. T2 táblák esetén T1 bármely sorában az L-beli attribútumok nem NULL értékei megegyeznek valamely T2-ben előforduló sor megfelelő K-beli attribútumainak értékeivel.. indul. akkor egyszerű. név. • tetszőleges R1.... cím.. két NULL értéket nem tekint(het)ünk egyenlőnek (gondoljunk két ismeretlen születésnapra). ha az elsődleges kulccsal egyértelmű azonosítást tudunk végezni.. vagyis egyetlen valódi részhalmaza sem szuperkulcs.. hanem egy feltétel előírása a relációsémára.. Ezek közül önkényesen kiválasztunk egyet.. hogy az egymásnak megfelelő attribútumok értéktartománya ugyanaz. A NULL érték bizonyos szempontból ugyanolyan érték. pl. Az elsődleges kulcsot alkotó attribútumokat aláhúzással szokás jelölni. Ha egy relációsémának több kulcsa is van. ha egy másik séma elsődleges kulcsára hivatkozik. olvasószám) OLVASÓ (olvasószám. A kulcshoz hasonlóan a külső kulcs is feltétel előírása a sémákra. vagy a hivatkozott kulcsra mutató nyíllal jelöljük.. A külső kulcsot dőlt betűvel. rendszám. Relációsémák definiálása SQL-ben: Relációséma létrehozására a CREATE TABLE utasítás .. Szuperkulcs: Egy R(A1. ezzel kapcsolatot létesít a táblák között. egyébként összetett kulcsról beszélünk. A kulcs nem a tábla tulajdonsága.Bm} elsődleges kulcs R2-ben. indul. Most egy L {A1. utasítással jelölhetjük ki. A kulcs meghatározása az attribútumok jelentésének vizsgálatával lehetséges..An} attribútumhalmaz külső kulcs az R1-ben R2-re vonatkozóan. szerző..An} attribútumhalmaz egy K részhalmazát szuperkulcsnak nevezzük. {rendszám. Formálisan: bármely ti ϵ T és tj ϵ T esetén ti ≠ tj  ti(K) ≠ tj(K). indul}. Az aktuális sémát a • SET SCHEMA sémanév.. {gkvez. de a későbbi módosításoknál ügyelni kell arra. K = A mindig szuperkulcs.An) relációséma esetén az A = {A1. akkor is minden sor különböző marad. és így a különálló adattáblák együttese egy szervesen összefüggő adatbázist alkot. {rendszám. érkezik) Itt négy kulcs van: {gkvez. Példa: A könyvtári nyilvántartás relációs adatbázissémája: KÖNYV (könyvszám. Más szempontból viszont nem is érték. ezáltal kerülnek kapcsolatba egymással.. Szemléletesen: ha a táblán a K-n kívüli oszlopokat letakarjuk. ha minimális szuperkulcs. ha bármely R feletti T tábla bármely két sora K-n különbözik. A példában jól látható. mint a többi. érkezik) Külső kulcs: Egy relációséma attribútumainak valamely L részhalmaza külső kulcs (másnéven idegen kulcs). lakcím) Adatbázissémák definiálása SQL-ben: A sémadefiníció legegyszerűbb formája a következő: • CREATE SCHEMA sémanév. Példa: Az alábbi tábla gépkocsik mozgásának menetlevélszerű nyilvántartását tartalmazza: VOLÁN (gkvez.. akkor relációs adatbázissémát kapunk. ha • K és L attribútumai összepárosíthatók úgy.Bm) relációsémák és legyen K {B1. Ez rávilágít a következőre: A relációs adatmodell lényege. hogy a különböző relációsémák azonos attribútumokat tartalmazhatnak. érkezik}. Relációs adatbázisséma: Ha egy adatbázis valamennyi táblájának sémáját felírjuk a kulcsok és külső kulcsok jelölésével együtt. és nem egy adott tábla vizsgálatával.

. de tetszőleges számú további kulcs lehet. lakcím CHAR(40) DEFAULT 'ismeretlen'. FOREIGN KEY (osztálykód) REFERENCES Osztály(osztálykód)). osztálykód CHAR(3) REFERENCES Osztály(osztálykód)). osztálykód) relációsémákat SQL-ben: • CREATE TABLE Osztály (osztálykód CHAR(3) PRIMARY KEY.. osztálynév CHAR(20). A PRIMARY KEY (elsődleges kulcs) és UNIQUE (kulcs) közötti különbségek: • Egy sémában csak egy elsődleges kulcs. Adattípusok (rendszerenként eltérők lehetnek): • CHAR(n): n hosszúságú karaktersorozat • VARCHAR(n): legfeljebb n hosszú karaktersorozat • INT: egész szám • REAL: valós (lebegőpontos) szám • DECIMAL(n. • Külső kulccsal csak a másik tábla elsődleges kulcsára lehet hivatkozni. név CHAR(30). Példa: Hozzuk létre egy vállalat dolgozóit nyilvántartó • OSZTÁLY (osztálykód. osztálynév. ebből d tizedesjegy • BOOLEAN: logikai • DATE: dátum • TIME: idő Az adattípushoz "DEFAULT érték" megadásával alapértelmezett érték definiálható.d): n jegyű szám. név CHAR(30). vezAdószám DECIMAL(10)). osztálykód CHAR(3)...szolgál. míg kulcs attribútumoké igen. lakcím CHAR(40) DEFAULT 'ismeretlen'. név. oszlopnév adattípus [feltétel] [. Feltételek (egy adott oszlopra vonatkoznak): • PRIMARY KEY: elsődleges kulcs • UNIQUE: kulcs • REFERENCES tábla(oszlop): külső kulcs Táblafeltételek (az egész táblára vonatkoznak): • PRIMARY KEY (oszloplista): elsődleges kulcs • UNIQUE (oszloplista): kulcs • FOREIGN KEY (oszloplista) REFERENCES tábla(oszloplista): külső kulcs Ha a (külső) kulcs összetett.. A tábla módosításakor a definiált kulcsfeltételek automatikusan ellenőrzésre kerülnek. hogy a rendszer nem enged olyan módosítást. • Elsődleges kulcs attribútumok értéke nem lehet NULL. akkor csak táblafeltétel formájában adható meg. PRIMARY KEY (adószám). Ha ilyet nem adunk meg. vezAdószám) • DOLGOZÓ (adószám. amely egyben egy üres táblát is létrehoz a sémához. lakcím. • Egyes adatbáziskezelő rendszerek az elsődleges kulcshoz automatikusan indexet hoznak létre. illetve új sor felvételét. • CREATE TABLE Dolgozó (adószám DECIMAL(10) PRIMARY KEY. A kulcsfeltételek . PRIMARY KEY és UNIQUE esetén ez azt jelenti. Az attribútumok definiálása mellett kulcsok és külső kulcsok megadására is lehetőséget nyújt: CREATE TABLE táblanév ( oszlopnév adattípus [feltétel]. A DOLGOZÓ sémát másképp is definiálhatjuk: • CREATE TABLE Dolgozó (adószám DECIMAL(10). amely egy már meglévő kulccsal ütközne. . az alapértelmezett érték NULL. táblaFeltételek] ). .

ügyfélszám. tartalék. ALTER TABLE Osztály MODIFY (vezAdószám REFERENCES Dolgozó(adószám)).. ALTER TABLE Dolgozó MODIFY (lakcím VARCHAR(60)). . cím. mint a CREATE TABLE utasításban.. mind a hitelek hozzá vannak rendelve egy fiókhoz. egyenleg. Itt új elem egy "oszlopnév adattípus [feltétel]". fiók_név. ügyfél_cím) Számla(számla_szám. • CREATE TABLE Ügyfél (ügyfél_szám char(20). • Mind a számlák.ellenőrzése csak indexekkel oldható meg hatékonyan! Relációséma törlésére a DROP TABLE utasítás szolgál: • DROP TABLE táblanév.). tartalék) Ügyfél(ügyfél_szám. . cím. . tartalék int. számla_szám) Adós(ügyfél_szám. ügyfél_név char(30). • számlák: számlaszám. Fiók(fiók_név. • A fiókokat a nevük azonosítja. egyenleg) Hitel(hitel_szám. Például: ALTER TABLE Dolgozó ADD (születésiidő DATE). Ugyanígy módosítás egy "oszlopnév adattípus [feltétel]". hogy egy létező megszorítást módosítani vagy törölni tudjunk szükséges. illetve több hitele is lehet.. PRIMARY KEY (ügyfél_szám)). PRIMARY KEY (fiók_név). . fiók_név. A kulcsfeltétel újra érvényesíthető: ALTER TABLE Dolgozó ADD CONSTRAINT NévKulcs UNIQUE (név). • Az ügyfeleket az ügyfélszámuk azonosítja. • ügyfelek: név. Példa: Tekintsünk egy banki adatbázist. hogy a megszorításnak neve legyen. Ahhoz. • Minden ügyfélnek több számlája. • hitelek: hitelszám. fiók.. összeg) Számlatulajdonos(ügyfél_szám. ügyfél_név. újelem)] [MODIFY (módosítás. oszlop)]. Hatására a séma és a hozzá tartozó adattábla is törlődik. összeg. vagy egy "táblafeltétel". . • A hiteleket a hitelszám azonosítja. Relációséma módosítása: ALTER TABLE táblanév [ADD (újelem.. fiók. hitel_szám) • CREATE TABLE Fiók (fiók_név char(30). tulajdonosok. .. módosítás)] [DROP (oszlop. . • A számlákat a számlaszám azonosítja. mind a hitelek több ügyfélhez is tartozhatnak. ügyfél_cím char(100). • Mind a számlák. adósok. amelyben a következőket tartjuk nyilván: • fiókok: név. Például a Dolgozó tábla név attribútuma esetén: • név CHAR(30) CONSTRAINT NévKulcs UNIQUE Ezután a kulcsfeltétel elvethető a következő utasítással: ALTER TABLE Dolgozó DROP CONSTRAINT NévKulcs. fiók_város char(30). hogy a megszorítás elé a CONSTRAINT név előtagot írjuk. fiók_város. Egy megszorításnak úgy adhatunk nevet.

FOREIGN KEY (fiók_név) REFERENCES Fiók(fiók_név)). az átnevezés. Először az adatbázis lekérdezés problémáját absztrakt nézőpontból vizsgáljuk. amelyek két reláció sorait kombinálják. fiók_név char(30). amelyekből egy könyvkereskedő legalább egyet eladott az i-edik hónapban (1 ≤ i ≤ 12). Ezek halmazelméleti egyesítése. amelyek vagy a T1 vagy a T2 táblában előfordulnak. ami nem más. • Egy művelet. Alkalmazva a következőkben definiált operátorokat (műveleteket) a relációkra vagy egyszerűbb relációs algebrai kifejezésekre. PRIMARY KEY (számla_szám). a vetítés oszlopokat hagy el. Halmazműveletek: • Unió: Legyen R tetszőleges relációséma. FOREIGN KEY (ügyfél_szám) REFERENCES Ügyfél(ügyfél_szám). cím. A relációs algebrai műveletek négy osztályba sorolhatók: • Hagyományos halmazműveletek (egyesítés. Például: Példa: Az ELADi(szerző. számla_szám char(10). mint olyan programok írása. PRIMARY KEY (ügyfél_szám. amely nem befolyásolja a reláció sorait. összeg int. bemutatva a fő lekérdező műveleteket. CREATE TABLE Adós (ügyfél_szám char(20). amelyek a reláció egyes részeit eltávolítják: a kiválasztás sorokat. FOREIGN KEY (számla_szám) REFERENCES Számla(számla_szám)). illetve a reláció nevét. a T = T1 T2 tábla. • Műveletek. valamint T1 és T2 táblák R felett. amelyek az adatbázis aktuális előfordulására vonatkozó különféle kérdésekre felelnek.• • • • CREATE TABLE Számla (számla_szám char(10). mint operandusok (konstans relációkat is megengedve). azon sorokból áll. metszet. PRIMARY KEY (hitel_szám). CREATE TABLE Számlatulajdonos (ügyfél_szám char(20). FOREIGN KEY (fiók_név) REFERENCES Fiók(fiók_név)). CREATE TABLE Hitel (hitel_szám char(10). de megváltoztatja a reláció sémáját. fokozatosan egyre bonyolultabb kifejezéseket építhetünk fel. mind pedig T2-ben. • Műveletek. hitel_szám char(10). egyenleg int. FOREIGN KEY (ügyfél_szám) REFERENCES Ügyfél(ügyfél_szám). ha jelen van mind T1-ben. azaz az attribútumok neveit. számla_szám). Egy sor csak egyszer szerepel az egyesítésben. FOREIGN KEY (hitel_szám) REFERENCES Hitel(hitel_szám)). PRIMARY KEY (ügyfél_szám. Ekkor . különbség) relációkra alkalmazva. fiók_név char(30). hitel_szám). kiadásiév) táblák azon könyvek adatait tartalmazzák. még akkor is. Műveletek a relációs modellben Adatbázisok lekérdezése: A felhasználó számára az adatbázisokkal kapcsolatos legfontosabb feladat általában az adatbázis lekérdezése. Relációs algebra: A relációs algebrai kifejezések alapjait a relációk képezik.

. cím.. valamint T1 és T2 táblák R felett. ám a T2 táblában nem.. azon sorokból áll. A metszet kifejezhető a különbség segítségével: T1 T2 = T1 – (T1 – T2) Redukciós műveletek: • Vetítés: Adott oszlopok kiválasztása a táblából. Az új tábla sémája a megfelelő attribútumok kiválasztásával adódik. Például: Példa: Tekintsük megint az ELADi(szerző. mind pedig a T2 táblában előfordulnak. de februárban nem. valamint T1 és T2 táblák R felett. a T = T1 T2 tábla. Különbség: Legyen R tetszőleges relációséma. Jelölése: πattribútumlista(tábla) . amelyek a T1 táblában előfordulnak. a különbség nem. Például: • Példa: Tekintsük ismét az ELADi(szerző. a T = T1 – T2 tábla. amelyekből minden hónapban történt eladás. • Halmazműveletek tulajdonságai: Az unió és metszet kommutatív. ELAD12 azon könyvek adatait tartalmazza. Ekkor ELAD = ELAD1 – ELAD2 azon könyvek adatait tartalmazza. Ekkor ELAD = ELAD1 . amelyek mind a T1. Metszet: Legyen R tetszőleges relációséma. kiadásiév) táblákat (1 ≤ i ≤ 12). azon sorokból áll.. amelyekből januárban adtak el. kiadásiév) táblákat (1 ≤ i ≤ 12).• ELAD = ELAD1 . cím. Ezek halmazelméleti különbsége. ELAD12 a teljes év folyamán eladott könyvek adatait tartalmazza. Ezek halmazelméleti metszete.

A feltétel általában attribútumokból és konstansokból felépülő logikai kifejezés.cím(KÖNYV) táblában összevonásra kerülnek.• Ha az attribútumlista nem tartalmaz kulcsot. Az eredménytábla sémája megegyezik az eredetivel. akkor a rekordok száma csökkenhet. Kiválasztás: Adott feltételnek eleget tevő sorok kiválasztása a táblából. Jelölés: σfeltétel(tábla) . akkor a megfelelő rekordok a πszerző. Például ha két könyv szerzője és címe megegyezik (ugyanazon könyv különböző példányai).

Az átnevezés jele a „ró” (ρ).. . ..Ai). ahol X = A B nem üres.... cím. . Például: Ha R1 és R2 attribútumai között azonos nevűek vannak. r2. akkor R-ben az eredeti séma nevével különböztetjük meg őket (például R1. × dom(Bm) táblák R1 és R2 felett. A NULL értékek nem kerülnek be a kombinációs táblába. An.. Példa: A gyakorlatban általában külső kulcs alapján végeznek természetes összekapcsolást. Ha T1 és T2 sorainak száma r1 ill. Az R1 és R2 feletti T1 és T2 táblák természetes összekapcsolása egy R(A definiálunk: B) feletti T tábla. oszlopainak száma c1 és c2. amelyet a következőképp • Vagyis.. akkor a T táblában r1×r2 sor és c1+c2 oszlop van. akkor vetítéssel visszakaphatók az eredeti táblák: A Descartes-szorzat műveletet nem szokták alkalmazni a gyakorlatban.. Ha két tábla Descartes-szorzatát képezzük. valamint T1 dom(A1) × . majd a projekcióval a duplán szereplő Xbeli attribútumokat csak egy példányban tartjuk meg (az A B halmazelméleti unió. olvasószám) OLVASÓ (olvasószám. × dom(An) és T2 dom(B1) × .. ami a táblát nevezi át. de az attribútumai maradnak ugyanazok. . R2. A σ sorokat.. a két tábla Descartes-szorzatából kiválasztjuk azokat a sorokat. Jelölés: T = T1 T2. a π oszlopokat jelöl.Kombinációs műveletek: A kombinációs művelet jele a ∞.. × dom(An) × dom(B1) × . Bm) két tetszőleges relációséma... An) és R2(B1. Jelölés: T = T1 × T2. lakcím) . × dom(Bm) tábla. Általában tekintsük az R1(A) és R2(B) relációsémákat. szerző. • Descartes-szorzat: Legyenek R1(A1.Ai. Bm) séma feletti T dom(A1) × .. Természetes összekapcsolás: A relációs modell lényegéhez tartozik. . hogy T1 minden sorát párosítjuk T2 minden sorával..X és R2. Tekintsük a könyvtári nyilvántartás adatbázissémáját: KÖNYV (könyvszám. vagyis benne az X elemei csak egyszeresen szerepelnek). B1. . . az összekapcsolási műveletek definiálásánál azonban szükségünk lesz rá. Ekkor a T1 és T2 táblák Descartes-szorzata az az R(A1. amelyet úgy kapunk. név.. hogy két tábla között a megegyező attribútumok létesítenek kapcsolatot. hiszen az adathalmaz redundanciáját növeli. . csak a közös értékek. amelyek az R1.X attribútumokon megegyeznek.

akkor T-ből vetítéssel általában nem állítható elő T1 ill. de az olvasószám mellett az olvasó nevének és lakcímének a feltüntetésével.Ha most a kikölcsönzött könyvek listáját szeretnénk megkapni. a raktározott mennyiséget egy RAKTÁR (raktárkód. T2. akkor ez a KÖLCSÖN = KÖNYV OLVASÓ természetes összekapcsolás művelettel végezhető el. hogy adott áruféleséget több raktár tárol. vevőkód. Például. Théta-összekapcsolás: Itt a táblák Descartes-szorzatából tetszőleges feltétel szerint választunk ki sorokat: T = σfeltétel (T1 × T2). Az eladási ajánlatok ekkor egy AJÁNLAT (raktárkód. a vevők igényeit pedig egy VEVŐ (vevőkód. mennyiség) táblában. Az eredményül kapott tábla a már ismert adatbázis esetén: • Ha T = T1 T2. mivel a ki nem kölcsönzötteknél a KÖNYV táblában az olvasószám értéke NULL. Jelölése: T = T1 feltétel T2. a fenti KÖLCSÖN tábla csak a kikölcsönzött könyveket tartalmazza. igény) táblába generálhatók az alábbi théta-összekapcsolás művelettel: . Példa: Tegyük fel. mennyiség. igény) táblában tartjuk nyilván.

Műveletek függetlensége: Az eddig megismert relációs algebrai műveletek közül láttuk. fiók_név. tartalék) Ügyfél(ügyfél_szám. egyik sem fejezhető ki a másik öt segítségével. An) séma feletti T3 tábla. Az eredményreláció neve S. kiválasztás. attribútumainak neve pedig balról jobbra A1. hogy a T2 tábla minden s sorára a ts sor előfordul a T1 táblában. ahol R2 összes attribútuma benne van R1 attribútumainak halmazában. …. hogy ezen relációk attribútumainak nevét szabályozni tudjuk. ügyfél_név. összeg) Számlatulajdonos(ügyfél_szám. számla_szám) Adós(ügyfél_szám. A2. amely pontosan azon t sorokból áll. a hányados és a két összekapcsolás kifejezhető a másik hat – egyesítés. Átnevezés: Relációs algebrai műveletek alkalmazásával újabb relációkat kapunk. különbség. Bm) valamint R2(B1. Ekkor a T1 ÷ T2 hányados az az R3(A1. R2 felett. A2. B2. … . amelyre T3 × T2 T1. … . amelyik átnevezi a relációkat.An(T1) azon t sorait adja meg. A2. … . hitel_szám) • Keressük meg az 1000000 Ft feletti hiteleket!: • Keressük meg az 1000000 Ft feletti hitelek hitelszámait!: . Bm) tetszőleges relációsémák. hogy a metszet. An. Ez utóbbi hat operátor már független halmazt alkot. ügyfél_cím) Számla(számla_szám. továbbá legyenek T1 és T2 táblák R1 ill. Ahhoz. Egy R reláció átnevezéséhez a operátort használjuk.A2. Tegyük fel. fiók_név. … . Példa: Fiók(fiók_név. sorai megegyeznek R soraival. Példa: Az T1 ÷ T2 hányadost kifejezhetjük a már megismert relációs algebrai műveletekkel: Itt a második tag π A1. Úgy is fogalmazhatnánk. B2.AJÁNLAT = RAKTÁR igény≤mennyiségVEVŐ Relációk hányadosa: Legyenek R1(A1. egyenleg) Hitel(hitel_szám. fiók_város.…. hogy ts nincs benne T1-ben. hogy T2 nem üres. Descartes szorzat és átnevezés – segítségével. amelyekre van olyan s sor T2-ben. gyakran szükséges egy olyan operátor. hogy T1 ÷ T2 hányados az a legnagyobb számosságú T3 tábla. melyekre igaz. vetítés. An. B1.

• Keressük meg azoknak az ügyfeleknek az ügyfélszámát. Keressük meg azoknak az ügyfeleknek az ügyfélszámát. amelyeknél van nagyobb. akik számlát vezetnek a banknál vagy hitelt vettek fel a banktól (nem kizárva egyik a másikat)! Keressük meg azoknak az ügyfeleknek az ügyfélszámát. akik számlát vezetnek a Növekvő jólét és a Boldog öregkor nevű fióknál is! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. akik hitelt vettek fel a Növekvő jólét nevű fióknál!: • • Természetes összekapcsolással • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. akik számlát is vezetnek a banknál és hitelt is vettek fel a banktól! Keressük meg azoknak az ügyfeleknek az ügyfélszámát. akik hitelt vettek fel a Növekvő jólét nevű fióknál! Természetes összekapcsolással • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. akik számlát vezetnek a Növekvő jólét és a Boldog öregkor nevű fióknál is! . akik hitelt vettek fel a Növekvő jólét nevű fióknál és semelyik fióknál nem vezetnek számlát! Természetes összekapcsolással • Keressük meg a legnagyobb számlaegyenleget! • Itt a második tag azok a számlaegyenlegek.

ahol t sorváltozó és c konstans (itt < helyett ≤ . = . = . Itt s egy sorváltozó. A relációs algebra segítségével megfogalmazott lekérdezéseknél pontosan le kellett írnunk. > . A Ψ logikai formula a következőképpen épülhet fel: • alapformulák: o t ϵ R. amelyben s az egyetlen szabad változó. hogy vannak budapesti fiókok)! Kifejezésfák: A relációs algebrában több relációs algebrai operátort is használhatunk egyetlen kifejezésben. tartalék) Ügyfél(ügyfél_szám. = . ügyfél_cím) . Például: Keressük meg azoknak az ügyfeleknek a nevét. ahol t és u sorváltozók (itt < helyett ≤ .• Keressük meg azoknak az ügyfeleknek az ügyfélszámát. a belső csúcsok pedig operátorok. ügyfél_név. = . Sorkalkulus: Relációs sorkalkulus által meghatározott reláció:{s | Ψ(s)}. Az operátorok egymás utáni alkalmazását kifejezésfával szemléltethetjük. ilyenkor egy vagy több operátor eredményére alkalmazunk egy másik operátort. A logikai alapú nyelvek ezzel szemben csak azt igénylik. akik az összes budapesti fióknál vezetnek számlát (azt feltehetjük. amely algebra helyett logikán alapul. • építkezési szabályok: Példa: Fiók(fiók_név. melyeket az adott csúcs gyermekeire alkalmazunk. ≥ is állhat). amelyeket a Ψ logikai formulába helyettesítve a formula értéke igaz lesz. Ψ pedig egy alkalmas logikai formula. o t[attribútumi] < u[attribútumj]. hogy mely relációkon milyen műveleteket milyen sorrendben kell elvégezni a kívánt eredmény eléréséhez. A fa levelei relációk. ahol t sorváltozó és R alapreláció. > . t[attribútumi] < c. hogy a kívánt eredményre vonatkozó elvárásainkat fogalmazzuk meg. akik hitelt vettek fel a Növekvő jólét nevű fióknál! Logikai alapú lekérdezések: Az adatbázisok lekérdezésének létezik más megközelítése is. fiók_város. A reláció azon s sorokból fog állni. ≥ is állhat). olyan.

összeg) Számlatulajdonos(ügyfél_szám. akik hitelt vettek fel a Növekvő jólét nevű fióknál! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát.Számla(számla_szám. egyenleg) Hitel(hitel_szám. fiók_név. számla_szám) Adós(ügyfél_szám. akik számlát vezetnek a banknál vagy hitelt vettek fel a banktól (nem kizárva egyik a másikat)! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. akik számlát is vezetnek a banknál és hitelt is vettek fel a banktól! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. fiók_név. akik az összes Budapesti fióknál vezetnek számlát! . akik hitelt vettek fel a Növekvő jólét nevű fióknál és semelyik fióknál nem vezetnek számlát! • Keressük meg azoknak az ügyfeleknek a nevét és címét. akik hitelt vettek fel a Növekvő jólét nevű fióknál! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. hitel_szám) • Keressük meg az 1000000 Ft feletti hiteleket! • Keressük meg az 1000000 Ft feletti hitelek hitelszámait! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát.

hogy sorváltozók helyett egyszerű változók szerepelnek benne (egyébként a felépítés nagyon hasonló). = . A tapasztalat szerint sok lekérdezés egyszerűbben fogalmazható meg oszlopkalkulussal. …. Oszlopkalkulus: Az oszlopkalkulus alapvetően abban különbözik a sorkalkulustól. Egy {s | Ψ(s)} kifejezést biztonságosnak nevezünk. t2. A probléma megoldására vezették be a biztonságos kifejezés fogalmát. s2. Relációs oszlopkalkulus által meghatározott reláció: {s1. tk)ϵ R. sk)}. …. ≥ is állhat). amelyeket a Ψ logikai formulába helyettesítve a formula értéke igaz lesz. o ti < tj. míg maga a végeredmény már nem ilyen. ≥ is állhat). Itt s1. amelyben csak s1. sk szabad változók. • a Ψ formula bármely tφ(t) részformulájára teljesül. sk) sorokból fog állni.Biztonságos sorkalkulus: Bizonyos sorkalkulus kifejezések kiértékelésével problémák lehetnek. ahol ti és tj oszlopváltozók (itt < helyett ≤ . • a Ψ formula bármely tφ(t) részformulájára teljesül. s2. • építkezési szabályok: . s2. > . Ψ pedig egy alkalmas logikai formula. akkor t minden komponense hozzátartozik dom(φ)-hez. ha • a Ψ formulát kielégítő minden s sor komponensei hozzátartoznak dom(Ψ)-hez. t2. A reláció azon (s1. Egy adott Φ formulára jelölje dom(Φ) azoknak az attribútumértékeknek a halmazát. …. ahol t1. = . A biztonságos sorkalkulus csak ilyeneket enged meg. = . = . akkor t minden komponense hozzátartozik dom(φ)-hez. s2. Tekintsük például az kifejezést. …. > . …. hogy ha φ(t) hamis a t-n kívüli φbeli szabad változók valamely értéke mellett. o ti < c. sk oszlopváltozók. s2. hogy a közbenső relációk nőnek kezelhetetlenül nagy méretűvé. kiegészítve a Φ -beli konstansokkal. Itt az eredményhalmaz tipikus esetben ábrázolhatatlanul nagy lesz. tk oszlopváltozók és R alapreláció. A Ψ logikai formula a következőképpen épülhet fel: • alapformulák: o (t1. …. amelyek a Φ -beli alaprelációkban előfordulnak. hogy ha φ(t) igaz a t-n kívüli φbeli szabad változók valamely értéke mellett. sk | Ψ(s1. A probléma úgy is jelentkezhet. …. ahol ti oszlopváltozó és c konstans (itt < helyett ≤ .

hogy ha φ(t) hamis a t-n kívüli φbeli szabad változók valamely értéke mellett. fiók_város. hogy ha φ(t) igaz a t-n kívüli φbeli szabad változók valamely értéke mellett. ha • a Ψ formulát kielégítő minden (s1. …. hitel_szám) • Keressük meg az 1000000 Ft feletti hiteleket! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. ügyfél_név. Ezek megoldására itt is bevezethető a biztonságos kifejezés fogalma. • a Ψ formula bármely tφ(t) részformulájára teljesül. tartalék) Ügyfél(ügyfél_szám. sk)} kifejezést biztonságosnak nevezünk. akik hitelt vettek fel a Növekvő jólét nevű fióknál! A hitel összegét is adjuk meg! Kevésbé precízen: • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. …. A biztonságos oszlopkalkulus csak ilyeneket enged meg. s2. ügyfél_cím) Számla(számla_szám. fiók_név.Biztonságos oszlopkalkulus: Akár a sorkalkulusnál. …. s2. bizonyos oszlopkalkulus kifejezések kiértékelésével is lehetnek problémák. fiók_név. összeg) Számlatulajdonos(ügyfél_szám. • a Ψ formula bármely tφ(t) részformulájára teljesül. Egy {s1. akkor t hozzátartozik dom(φ)-hez. sk) rendezett k-as esetén s1. számla_szám) Adós(ügyfél_szám. akiknek 1000000 Ft feletti hitelük van! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. egyenleg) Hitel(hitel_szám. akik az összes budapesti fióknál vezetnek számlát! . sk hozzátartoznak dom(Ψ)-hez. akik számlát vezetnek vagy hitelt vettek fel a Növekvő jólét nevű fióknál (nem kizárva egyik a másikat)! • Keressük meg azoknak az ügyfeleknek az ügyfélszámát. Példa: Fiók(fiók_név. s2. akkor t hozzátartozik dom(φ)-hez. sk | Ψ(s1. …. s2.

VezAdószám) sémát. • Törlés esetén: Ha egy osztály valamennyi dolgozóját töröljük. Előny: egyetlen táblában a dolgozók és az osztályok adatai is nyilván vannak tartva. Megoldás: a relációséma felbontása két sémára DOLG (Név.Kifejezőerő: Tételszerűen: A relációs algebra. ez a rekord fölöslegessé válik. ahol VezAdószám a vállalati osztály vezetőjének adószámát jelenti. adószám. Normalizálás I Redundáns relációséma: Tekintsük egy vállalat dolgozóit nyilvántartó DOLGOZÓ (Név. amelynek még nincsenek alkalmazottai. hogy az osztálynevet máshogy adják meg (például "Tervezési" helyett "tervezési" vagy "Tervező"). Később. mivel Osztálynév és VezAdószám több helyen szerepel. a biztonságos sorkalkulus és a biztonságos oszlopkalkulus a kifejezőerő szempontjából ekvivalensek. Osztálykód) OSZT (Osztálykód. Hátrány: redundancia. akkor az osztályra vonatkozó információk is elvesznek. VezAdószám) • • . ha a név. o Ha új osztály létesül. Cím. ami hibákhoz vezethet. • Új felvétel esetén: o Új dolgozó felvételénél előfordulhat. Osztálynév. több helyen kell a módosítást elvégezni. Adószám. Adószám. ha lesznek alkalmazottak. Osztálykód. akkor ezt csak úgy tudjuk felvenni. cím attribútumokhoz NULL értéket rendelünk. A redundancia aktualizálási anomáliákat okozhat: • Módosítás esetén: Ha egy osztály neve vagy vezetője megváltozik. Cím. Osztálynév.

összeg) . VezAdószám) séma jellemző függőségei: • f1: {Adószám}  {Név.... Cím. Osztálynév.Funkcionális függőség: A funkcionális függőség bevezetésének egyik motivációja a redundanciák felismerése. megnevezés. Cím. Osztálykód. ha bármely R feletti T tábla esetén valahányszor két sor megegyezik P-n. törvényszerűen megjelenik ugyanaz az Osztálynév és ugyanaz a VezAdószám is..An} attribútumhalmaz részhalmazai. VezAdószám} Példák további függőségekre: • f3: {Adószám}  {Osztálynév} • f4: {Cím. ha Q P. Adószám. ellenkező esetben nem triviális függőségről beszélünk • A P  Q függést teljesen nemtriviálisnak nevezzük. Osztálykód. vagyis bármely ti ϵ T és tj ϵ T esetén ti(P) = tj(P)  ti(Q) = tj(Q) Elnevezések: • A P  Q függést triviálisnak nevezzük... VezAdószám) reláció minden olyan sorában. egységár. A jelenség pontos matematikai leírása a következő: Legyen R(A1.. és P valamint Q az {A1. mennyiség. Cím.. P-től funkcionálisan függ Q (jelölésben P  Q). Például a korábban vizsgált DOLGOZÓ (Név. akkor megegyezik Q-n is. Példa: A korábban vizsgált DOLGOZÓ (Név. Osztálykód}  {VezAdószám} Egy raktár készletét nyilvántartó RAKTÁR (cikkszám. ami nyilván felesleges. Osztálynév. Adószám. Osztálykód} • f2: {Osztálykód}  {Osztálynév.An) egy relációséma. Ezt a felismerésünket a következőképpen is megfogalmazhatjuk: a DOLGOZÓ relációsémában az Osztálykód attribútum egyértelműen meghatározza az Osztálynév és VezAdószám attribútumokat. ha Q P= A gyakorlatban általában teljesen nemtriviális függőségeket adunk meg. ahol megjelenik egy Osztálykód.

ahol A={A1.. mivel egységár × mennyiség = összeg teljesül. hogy F+-ban van-e. ha minden olyan R feletti T tábla esetén. pl. hogy egy X  Y funkcionális függőség az F függőségi halmaz logikai következménye. Osztálynév. Legyen R egy relációséma és F funkcionális függőségek egy halmaza R-en. megnevezés.. akkor ezzel megtiltjuk. Jelölés: Azoknak a funkcionális függőségeknek a halmazát. Az f3 és f4 függőségeket nem vettük hozzá Fhez. egységár. Osztálykód.. amely az adószámból a lakcímet előállítaná. hogy ha a P  Q függőség fennáll. . hogy egy személyhez több lakcímet is tárolhassunk. egységár} • {egységár.. mert érezhetően következményeik f1-nek és f2-nek. F) párt. akkor ez tulajdonképpen egy feltételt jelent az aktuális táblára nézve. i = 1... Adószám. mennyiség}  {összeg} függvény már számítható. mennyiség}  {összeg} Egy funkcionális függőség nem az aktuális tábla.. amely P minden konkrét értékéhez egyértelműen meghatározza Q értékét. Jelölés: R = (A. illetve • egy adott X  Y funkcionális függőségről eldönteni. Adószám. f2}. mennyiség.. Ha például a DOLGOZÓ (Név. amelyre F minden függősége teljesül.fm} az A-n definiált funkcionális függőségek egy halmaza (fi: Pi  Qi.. × dom(An). A függőségi halmaz olyan követelményrendszert definiál. Példa: A korábban vizsgált DOLGOZÓ (Név.m). az F lezártjának nevezzük és F+-szal jelöljük: Alapfeladatok: • egy F funkcionális függőség halmaz F+ lezárását meghatározni. hanem a séma tulajdonsága. Ha az attribútumhalmazra megállapítunk egy funkcionális függőséget. Az előbbi RAKTÁR (cikkszám. A funkcionális függőség és a szuperkulcs fogalmak kapcsolatára mutat rá a következő: • Állítás: Legyen R(A) egy relációséma. VezAdószám) sémához tartozó függőségi halmaz F = {f1. X  Y is igaz. ha K  A. Most egy K ( A) attribútumhalmaz akkor és csak akkor szuperkulcs. Cím. amit eddig csak az attribútumok informális leírásával adhattunk meg. Adattábla (reláció) R felett: T dom(A1) × . Osztálykód. az Adószám  Cím függőség esetén nem tudunk olyan algoritmust adni.An} attribútumhalmaz és F={f1 . amelyek az F függőségi halmaz logikai következményei. Azt mondjuk. Osztálynév.. Cím. összeg) séma esetén azonban az {egységár... Ez a függvény általában csak elméletileg létezik. A "funkcionális" kifejezés arra utal... ha a funkcionális függőségeket nem kívánjuk hangsúlyozni. F) helyett továbbra is használjuk az egyszerűbb R(A) jelölést.séma esetén az alábbi függőségeket állapíthatjuk meg: • {cikkszám}  {megnevezés. • Bizonyítás: A szuperkulcs és a funkcionális függőség definíciója alapján nyilvánvaló. VezAdószám) sémában megállapítjuk az Adószám  Cím funkcionális függőséget. Relációséma és adattábla fogalma a funkcionális függőségeket is figyelembe véve: Relációsémának nevezünk egy R = (A. akkor adott tábla esetén létezik egy dom(P)  dom(Q) függvény. amely eleget tesz az F-beli függőségeknek.

. Tranzitivitás: Ha X  Y és Y  Z. akkor X  (Y Z). Bizonyítás: A reflexivitás miatt {B1... Most ti(X)=tj(X) és Y • X esetén ti(Y) = tj(Y) triviálisan teljesül..... ahonnan tranzitivitással X  (Y Z).. hogy ha egy F funkcionális függőség halmazból egy X  Y funkcionális függőség levezethető az Armstrong axiómák segítségével.. Következésképpen Y X+. az elnevezésnek inkább történeti okai vannak). akkor X ZY Z.k). Ha most ti(X) = tj(X). A2. amelyekre XAi levezethető F-ből az Armstrong axiómák segítségével. ahol X(i)-ből X(i+1) előállítása a következőképpen történik: . Így az egyesítési szabály szerint X  Y is levezethető az Armstrong axiómák segítségével. X  Bk . ha Y X+. X+ definíciója szerint XAi levezethető az Armstrong axiómák segítségével minden 1 ≤ i ≤ n esetén. Ha most ti(X Z) = tj(X Z). A bővítés miatt (X X)  (Y X) és (X Y)  (Z Y).... akkor X  Z.. Ám ekkor Y  Z miatt ti(Z) = tj(Z) is fennáll. • Most tegyük fel. Attribútumhalmaz lezártja: Megmutatjuk. A szétvágási szabály szerint ekkor X  Ai levezethető az Armstrong axiómák segítségével minden 1 ≤ i ≤ n esetén. amelyek arról szólnak.k).. o Bizonyítás: Tekintsük egy R feletti tábla két tetszőleges ti és tj sorát... akkor az levezethető F-ből az Armstrong axiómák segítségével. Algoritmus X+ számítására: Képezzük az X = X(0) X(1) X(2) . • A3. halmazsorozatot. . majd a tranzitivitásból X  Bi adódik (i = 1. ahol Ai-k attribútumok. Bizonyítás: Belátjuk.. • Egyesítési szabály: Ha X  B1.. hogy ha X  Y és X  Z... akkor X  Y. Az F funkcionális függőség halmazból az X  Y függőség akkor és csak akkor vezethető le az Armstrong axiómák segítségével. akkor nyilván ti(X) = tj(X) és ti(Z) = tj(Z). az X attribútumhalmaznak az F funkcionális függőségi halmaz szerinti lezártjának nevezzük és X+-szal jelöljük. Világos. akkor X  Y miatt ti(Y) = tj(Y) teljesül. Legyen R(A. Innen az állítás adódik. ahol Ai-k attribútumok.Három egyszerű következtetési szabályt.. Azon Ai ϵ A attribútumok halmazát. i = 1. akkor X  B1. o Bizonyítás: Tekintsük egy R feletti tábla két tetszőleges ti és tj sorát.. Innen pedig ti(Z) = tj(Z) miatt ti(Y Z) adódik..... Reflexivitás: Ha Y X. akkor Ha egy F funkcionális függőség halmaznak egy X  Y funkcionális függőség logikai következménye. o Bizonyítás: Tekintsük egy R feletti tábla két tetszőleges ti és tj sorát. Ezeket a szabályokat Armstrong axiómáknak nevezzük (itt nem szigorú értelemben vett matematikai axiómákról van szó.F) egy relációséma és X A.Bk}. X  Bk (Bi ϵ A attribútumok. ..Bk}  Bi.. akkor X  {B1.. Bizonyítás: • Szétvágási szabály: Ha X  {B1. i = 1.Bk} (Bi ϵ A attribútumok. Bizonyítás: • Legyen Y X+ és Y=A1 A2…An. Bővítés: Ha X  Y. hogy az X  Y függőség levezethető az Armstrong axiómák segítségével és legyen Y=A1A2…An.. hogy bizonyos funkcionális függőség teljesüléséből milyen más funkcionális függőségek teljesülésére következtethetünk: • A1. Ám ekkor X Z)=tj(Y  Y miatt ti(Y) = tj(Y) is fennáll..k).. hogy egy X attribútum halmaz F funkcionális függőség halmaz szerinti X+ lezártja hatékonyan kiszámítható.

de Z nem része X(i)-nek! Ha találunk ilyeneket. Azonban ez T-n csak úgy lehetséges. Az indukciós feltevés szerint Y X+. hogy ha Ak ϵ X+. B. hogy legyen. amelyre Y része X(i)-nek. hogy Ak ϵ X+. így az eljárás nyilván véges sok lépésben véget ér. Be kell még látnunk. két sorból álló T relációt: Megmutatjuk. és legyen X(i) az algoritmus által eredményül adott halmaz.X) algoritmus által eredményül adott halmazban. Másrészt mivel Ak ϵ X+. hogy ha egy Ak attribútum LEZÁRÁS(R.F. Ekkor azonban az algoritmus még nem állhatott meg. akkor megállunk (és azt állítjuk. Most X(i) = X(i+1). E}. ott X  Ak is igaz kell.Keressünk olyan F-beli Y  Z függőséget. Példa: Tekintsük az R(Z. Ezzel a LEZÁRÁS(R.F) sémát. ezért F összes funkcionális függősége teljesül T-n.F. Indirekt tegyük fel. Majd a szétvágási szabályt: mivel Ak ϵ Z. Ha nem. így minden olyan relációpéldányon. ahol F teljesül. Az Ak attribútum azért került bele X(j)be. hogy Ak ϵ X+.D} • {D. hogy X+= X(i)).F. C. hogy az így megadott T megsérti valamelyik F-beli U  V függőséget. és F az alábbi függőségeket tartalmazza: • {C}  {A} • {B}  {C. hogy F összes funkcionális függősége teljesül T-n. Alkalmazzuk a tranzitivitást: X  Y és Y  Z X  Z. amely egyrészt X(i) attribútumaiból. Ez pedig azt jelenti. Tekintsük a következő. Az algoritmus (egy lehetséges) pszeudokódja a következő: Tétel: A LEZÁRÁS(R. ahol Z = {A. ahol Y X(j-1) és Ak ϵ Z. Ám az Armstrong axiómák segítségével levezethető függőségek logikai következményei F-nek.X) során valamikor belekerül mondjuk X(j)-be. akkor legyen X(i+1) az a halmaz. Ekkor Ak ϵ X. másrészt a talált függőségek jobb oldalán lévő attribútumokból áll. mert F tartalmaz egy Y  Z függőséget.E}  {C} Határozzuk meg a {B}+ halmazt! . ha Ak ϵ X(i).X) algoritmus helyesen számítja ki X+-t. azaz U X(i) de V nem részhalmaza X(i)-nek. hogy j > 0 és X(j-1) csak X+-beli attribútumokat tartalmaz. Tegyük fel. akkor Ak valóban X+-ban van. így X  Ak. akkor Ak benne van a LEZÁRÁS(R. Alapeset: j = 0.X) algoritmus helyességének bizonyítása teljes. így a reflexivitás szerint Ak ϵ X+. ezért az X  Ak függőség levezethető F-ből az Armstrong axiómák segítségével. Mivel az attribútumok halmaza véges. Bizonyítás: Először teljes indukcióval belátjuk. D. mert X(i+1) nem egyezik meg X(i)-vel.F. Ellentmondásra jutottunk. Most X  Y levezethető az Armstrong axiómák segítségével. Indukciós lépés: Tegyük fel.

amely következik F-ből (itt Ak egyetlen attribútum). hogy minden F-beli X  Y függőség hozzátartozik-e G+-hoz és minden G-beli W  Z függőség hozzátartozik-e F+-hoz. Valamennyi Y X+ részhalmazra az X  Y függőséget + vegyük hozzá F -hoz. ahol Ak egy attribútum és Ak X.X) algoritmus által kiszámolt X+ halmazban. ha G minden W  Z függősége benne van F+. Ha ezek közül valamelyik nem teljesül. akkor F+ és G+ nyilván nem egyezhetnek meg. Minimális fedés: Egy speciális ekvivalens funkcionális függőségi rendszer hasznos lesz a későbbiekben: A G funkcionális függőségi halmazt az F funkcionális függőségi halmaz minimális fedésének nevezzük. Így G+ F+ is fennáll. hogy az U  V függőség F-ből történő levezetéséhez hozzávesszük a felhasznált F-beli függőségek G-ből történő levezetését. Hasonlóan. mondjuk egy F-beli X  Y függőség nincs G+-ban. továbbá • • • A G-beli funkcionális függőségek X  Ak alakúak. Legyen F és G funkcionális függőségek két családja. akkor a már korábban bevezetett T relációnak van két olyan sora. A G-beli funkcionális függőségek bal oldalai minimálisak. ha F+ = G+. A G-ből nem hagyható el funkcionális függőség. F és G ekvivalenciájának eldöntéséhez elég ellenőrizni. Annak eldöntéséhez pedig. hogy mondjuk egy F-beli X  Y függőség hozzátartozik-e G+-hoz elég ellenőrizni. Ha viszont F minden X  Y függősége benne van G+-ban. hogy F és G ekvivalensek. ellentmondás. hogy az Armstrong axiómák segítségével egy adott függőség halmazból következő bármely függőség formálisan levezethető. azaz bármely {X  Ak} ϵ G esetén (G – {X  Ak})+ valódi részhalmaza G+-nak. Minden X részhalmazhoz állítsuk elő X+-t. ha G ekvivalens F-fel.ban. akkor egy G+-beli U  V függőség levezetését úgy kapjuk meg F-ből. Tekintsünk egy R relációsémát az F függőségi halmazzal.X) algoritmus által kiszámított X+ halmazban.F. . vagyis bármely {X  Ak} ϵ G esetén X bármely Y valódi részhalmazára ((G – {X  Ak}) {Y  Ak})+ ≠ G+. de különböznek az Ak attribútumon. Ez a következőképpen látható be. így F X  Ak nem lehet igaz. akkor egy F+-beli U  V függőség levezetését úgy kapjuk meg G-ből. Függőséghalmaz lezárása: Vegyük az A attribútumhalmaz összes részhalmazát. már egyszerű. Ha Ak benne van a LEZÁRÁS(R. és legyen X  Ak olyan függőség. hogy az U  V függőség G-ből történő levezetéséhez hozzávesszük a felhasznált G-beli függőségek F-ből történő levezetését. Függőséghalmazok ekvivalenciája: A LEZÁRÁS eljárás jól használható funkcionális függőségi rendszerek ekvivalenciájának tesztelésére is. Azt mondjuk. hogy az X attribútumhalmaz G szerinti X+(G) lezártja tartalmazza-e Y-t. melyek megegyeznek X-en. akkor X  Ak természetesen levezethető F-ből az Armstrong axiómák segítségével.F.Mindezek után annak bizonyítása. Így F + G+ teljesül. Ha viszont Ak nincs benne a LEZÁRÁS(R.

ha K+ = A.D} • {C}  {A. hogy K+ = A teljesül-e. ezért elhagyható. Bizonyítás: K  A pontosan akkor teljesül. Ezután K-ból sorra elhagyunk attribútumokat.D} • {A. és mindig ellenőrizzük. Példa: Tekintsük az R(Z.B}  {C} • {A.B}  {C} és {C}  {D} miatt az {A. .B}  {D} • {A. ahol Z = {A. a következő eljárás létrehoz egyet: Az első for ciklus végrehajtása után minden G-beli funkcionális függőség jobb oldala egyelemű.C}  {B} • {A. Végül az utolsó for ciklusban a G-beli funkcionális függőségek közül elhagyjuk a feleslegeseket. C.C. D}. Most K akkor és csak akkor szuperkulcs. ha K+= A.C}  {D} • {C}  {A} • {C}  {B} {C}+ = {A.F) egy relációséma és K A. Így a G minimális fedés a következő függőségekből áll: • {A.F) sémát. ezért elhagyható.B} Az első for ciklus végrehajtása után G az alábbi függőségekből áll: • {A.B}  {C. Ezután G már csak az alábbi függőségekből áll: • {A.B. Kulcs meghatározása: Először legyen K = A. ez mindig szuperkulcs.D} miatt az {A. A következő for ciklusban a bal oldalakat minimalizáljuk.C}  {B.B}  {C} • {C}  {A} • {C}  {B} • {C}  {D} Kulcsok: Állítás: Legyen R(A.B}  {D} függőség felesleges.B}  {D} • {C}  {A} • {C}  {B} • {C}  {D} Végül {A.B}  {C} • {A. és F az alábbi függőségekből áll: • {A. B.Minden F funkcionális függőségi halmaznak van minimális fedése.C}  {B} és {A.C}  {D} függőségekben az A attribútum felesleges.

Normalizálás II Relációséma felbontása: Mint már utaltunk rá. Ekkor az R(A) séma felbontása X. hogy {B. hogy • {A.F) sémára alkalmazva ezt az összefüggést kapjuk. C.E} szuperkulcs. így bármely K kulcsra {B. Egy relációséma felbontása azt jelenti. Legyen R(A) egy relációséma. C. Egy felbontást hűségesnek nevezünk.E} K {B. Látszik. D}.Y A úgy. hogy minden kulcsnak tartalmaznia kell B-t és E-t. vagyis az egyetlen kulcs {B. Y szerint az R1(X) és R2(Y) sémákra a következőképpen értelmezhető: Az R séma feletti tetszőleges T táblát az R1 és R2 feletti T1 és T2 táblákkal helyettesítjük úgy. C. ha bármely R feletti T tábla esetén T = T1 T2. D}+ = {A. D. C. hogy Z-ből B-t. amiből az következik. E}. C. E}+ = {A.E}. Példa . hogy T1 = πX (T) és T2 = πY (T). hogy egyik esetben sem kaptunk szuperkulcsot. az anomáliák megszüntetésének egy lehetséges módja a relációk alkalmas felbontása. és X.E} {C} Jól látható. és F az alábbi függőségeket tartalmazza: • {C}  {A} • {B}  {C. E} és V = {A. D. C. D. ahol Z = {A. E}. hogy U = {B. Megvizsgáljuk. vagyis a felbontás után adódó táblákat természetes összekapcsolás művelettel összekapcsolva az eredeti táblát kapjuk vissza.D} • {D. C.Példa: Tekintsük az R(Z. D. D. hogy ezáltal két új reláció sémáját alakítjuk ki belőlük. A következő észrevétel valamennyire behatárolja a kulcsok keresésénél szóba jövő attribútumhalmazokat: Az iménti R(Z. B. E}. B. C. hogy a séma attribútumait szétosztjuk úgy. B. illetve E-t elhagyva szuperkulcsot kapunk-e: Világos.F) sémát. hogy X Y = A. • {A. D}.hűséges felbontás: .

VezAdószám) • OSZT (Osztálykód. hogy itt DOLGOZÓ = DOLG OSZT.Világos. Adószám. ha a DOLGOZÓ sémát a VezAdószám mentén bontjuk fel: • DOLG (Név. de ennek vezetője azonos az 5-ös osztály vezetőjével. Ha például Takács dolgozó az 1-es osztályon dolgozik. egyszer az 5ös osztály dolgozójaként . hogy egy személy több osztálynak is vezetője legyen. VezAdószám) Ugyanis a DOLGOZÓ definiálásakor nem kötöttünk ki VezAdószám  Osztálykód függést. Osztálynév. ezzel megengedtük. Cím. Példa – nem hűséges felbontás: Nem hűséges felbontást kapunk. akkor a DOLG OSZT táblában Takács kétszer fog szerepelni: egyszer az 1-es.

ezért csak azt kell megmutatni. C. továbbá C  D.A gyakorlatban rendszerint a Heath tétel alapján végzünk felbontást: Ha az R(A) sémánál A = B C D. Bizonyítás: Legyen T egy tetszőleges R feletti tábla. Nyilván T T1 T2. . hogy T1 T2 T. ahol B. D diszjunktak és nem üresek. akkor az R1(B C) és R2(C D) felbontás hűséges. T1 és T2 pedig a megfelelő szétbontott táblák.

ahol F1 úgy választandó meg. Cím. ha az attribútumok értéktartománya csak egyszerű (atomi) adatokból áll (nem tartalmaz például listát vagy struktúrát). Normálforma (1NF): Azt mondjuk. VezAdószám) sémákra hűséges. VezAdószám} függőség teljesül. Több különböző normálformát vezettek be az adatbázis elmélet fejlődése során. Osztálykód) • OSZT (Osztálykód. egy R(A. hogy a hűségesség miatt a DOLG és OSZT táblákból természetes összekapcsolás művelettel mindig visszaállítható az eredeti DOLGOZÓ tábla. ha (A1 A2)  (A1 – A2) vagy (A1 A2)  (A2 – A1). Példa: A DOLGOZÓ(Név. 1. Adószám. vagyis bármely X’ X valódi tartalmazás esetén X’  Y már nem igaz. hogy a már említett anomáliákat elkerüljük. ha X-ből bármely attribútumot elhagyva a függőség már nem teljesül.Tehát a t1 és t2 egyesítésével keletkező sor megegyezik t(1)-gyel. F1) és R2(Y. hogy egy vállalat azzal a szokatlan feltétellel él. hogy X-től teljesen függ Y. A relációs sémák normálformára hozásának célja. Mivel az 1NF feltétel teljesülését már a relációs modell definíciójánál kikötöttük.F) sémának az R1(X. Y szerint az R1(X. F2+ pedig az F+ azon részhalmazával legyen egyenlő. és X  Y. VezAdószám) séma felbontása a • DOLG (Név. Osztálynév. Ekkor a DOLGOZÓ sémában a Cím  VezAdószám függés lép fel. Megjegyzés: Ha K kulcs. a következőkben ezek közül tekintjük át a legfontosabbakat. hogy egy relációséma 1NF-ben van.F) relációséma felbontása X. akkor A teljesen függ K-tól. Egy R(A. ha (F1 F2)+ = F+. de ez nem változtat azon a tényen. Osztálykód. Adószám. F2) sémákra való felbontását függőségőrzőnek nevezzük. Függőségőrző felbontás: A függőségeket is figyelembe véve. hogy minden dolgozó a hozzá legközelebb lakó osztályvezetőhöz kell hogy tartozzon. könnyen ellenőrizhető szükséges és elégséges feltételt fogalmaz meg a következő tétel (nem bizonyítjuk): Az R(A) relációséma R1(A1) és R2(A2) sémákra való felbontása akkor és csak akkor hűséges. Normálforma (2NF): Legyen X. mint azt az alábbi példa mutatja: Tegyük fel. Cím. Azt mondjuk. F2) sémák. amely csak Y-beli attribútumokat tartalmaz. A felbontás során ez a függőség elvész. mert az {Osztálykód}  {Osztálynév. Egy hűséges felbontás nem feltétlenül függőségőrző. 2. hogy F1+ az F+ azon részhalmazával legyen egyenlő. vagyis szerepel T-ben. Osztálynév. . Egy felbontás hűségességére vonatkozó. amely csak X-beli attribútumokat tartalmaz. F1) és R2(Y. Y A. ezért minden sémát eleve 1NFnek tételezünk fel.

hogy egy vállalat dolgozói különféle projekteken dolgoznak meghatározott heti óraszámban. A – K pedig a másodlagos attribútumok halmaza. Példa: Tegyük fel.. Vagyis ha a séma kulcsai K1. így ezek szükségképpen B-n is megegyeznek. . Kr az elsődleges attribútumok halmaza. Projektkód}  Óra A sémában {Adószám. akár Projektkód-ot elhagyva ez már nem teljesül. ekkor az R(A) sémát az R1(C L) és R2(L B) sémákkal helyettesítjük. akkor 2NF-ben van. Projekthely) . ha minden másodlagos attribútum teljesen függ bármely kulcstól. akkor a séma 2NF-ben van.. egy megfelelő tábla a következő: Függőségek: • Adószám  Név • Projektkód  {Projektnév. amíg az összes relációséma 2NF-ben nem lesz.Egy attribútumot elsődleges attribútumnak nevezünk. 2NF-re hozás: Ha valamely K kulcsra L K és L  B. Adószám. ha szerepel a relációséma valamely kulcsában. ugyanakkor akár Adószám-ot. akkor K = K1 . Ezt a DOLGPROJ (Név. Tegyük fel ugyanis. amelyek L-en megegyeznek. hogy egy R(A. Kr. VezAdószám) • Ha a sémában nincs másodlagos attribútum. A Heath tétel alapján a felbontás hűséges. Adószám) o DPROJ (Adószám. Projekthely} • {Adószám. Projektkód. érkezik) Ha a séma nincs 2NF-ben. Projektkód.. vagyis nem függ teljesen a kulcstól. Ekkor a táblában több olyan sor lehet. Projektnév. indul. Projektkód} kulcs. Óra. lépés: Felbontással az Adószám  Név függőség leválasztása: o DOLG (Név. mivel ettől minden attribútum függ. Megjegyzés: • Ha minden kulcs egy attribútumból áll. Legyen C = A – (L B). rendszám. Példa: VOLÁN(gkvez. Cím. Név csak Adószám-tól függ. Projektnév. Osztálykód. Az eljárást addig ismételjük. Példa: DOLGOZÓ(Név. Óra.. 2NF-re hozás: • 1. Projekthely) sémával tartjuk nyilván. hogy valamely K kulcs L részhalmazától funkcionálisan függ másodlagos attribútumok egy B halmaza: L  B. Azt mondjuk. ami a B értékek redundáns tárolását eredményezi.. Adószám. ellenkező esetben másodlagos attribútumról beszélünk. A séma nincs 2NF-ben. akkor a táblában redundancia léphet fel. akkor a sémát felbontjuk az L  B függőség szerint (itt B legyen az összes L-től függő másodlagos attribútum halmaza).F) relációséma 2NF-ben van. mert pl. Osztálynév.

lépés: Újabb felbontás a DPROJ sémára: o DOLG (Név. Projekthely} függőség miatt még mindig nincs 2NF-ben. 2. Projektkód. Projektnév. Óra) o Itt már mindhárom séma 2NF-ben van.• 38 o Az így kialakult séma a Projektkód  {Projektnév. Projekthely) o DP (Adószám. Adószám) o PROJ (Projektkód. .

Normálforma (3NF): Legyen X. . Azt mondjuk. • az Y  Z függés teljesen nemtriviális.3. Z A. Az "X nem függ Y-tól" és az "Y  Z függés teljesen nemtriviális" kiegészítő feltételek nem csak a triviális esetek kiszűréséhez kellenek. hogy Z közvetlenül függ X-től. hanem a későbbi állítások szempontjából is lényegesek. akkor a táblában redundancia léphet fel. hogy egy R(A. ha minden másodlagos attribútuma közvetlenül függ bármely kulcstól.F) relációséma 3NF-ben van. • X nem függ Y-tól. Ha a séma nincs 3NF-ben. ha van olyan Y A amelyre • X  Y és Y  Z. és X  Z. Azt mondjuk. hogy X-től tranzitívan függ Z. Ellenkező esetben azt mondjuk.

akkor a sémát felbontjuk az Y  B függőség szerint (itt B legyen az összes Y-tól függő másodlagos attribútum halmaza). Osztálynév. a felbontás hűségességét. és még sincs 2NF-ben. Cím. Adószám.F) relációsémát hűséges és függőségőrző módon felbont 3NF-ben lévő relációsémákra. Osztálykód} • Osztálykód  {Osztálynév. Cím. amíg az összes relációséma 3NF-ben nem lesz. 3NF-re hozás: felbontás az Osztálykód  {Osztálynév. illetve függőségőrzését a két sémára történő felbontásnál elmondottakhoz hasonlóan definiálhatjuk. Az eljárást addig ismételjük. Legyen C = A – (Y B). Adószám. hogy az R séma 3NF-ben van. vagyis a táblában több olyan sor lehet. 3NF-re hozás: Ha valamely K kulcsra K  Y  B tranzitív függés fennáll. Ez utóbbi azt jelenti. ami a B értékek redundáns tárolását eredményezi. így Y nem szuperkulcs. VezAdószám). Egy relációséma felbontását több sémára. Cím. VezAdószám} függőség szerint: • DOLG (Név. Mivel Y-tól nem függ K. hogy valamely Ai másodlagos attribútum nem teljesen függ valamely K kulcstól. mert egyetlen kulcs az Adószám. Osztálykód. ahol K nem függ Y-tól és Y B üres. amelyek Y-on megegyeznek. Heath tétele alapján a felbontás hűséges. Ugyanakkor nincs 3NF-ben. hogy valamely K kulcstól tranzitívan függ a másodlagos attribútumok egy B halmaza. Osztálykód) • OSZT (Osztálykód. VezAdószám) A következő algoritmus tetszőleges R(A. ekkor az R(A) sémát az R1(C Y) és R2(Y B) sémákkal helyettesítjük.F) relációséma 3NF-ben van. Példa: Egy vállalat dolgozóit és az osztályokat tartjuk nyilván az alábbi. vagyis valamely Y attribútumhalmazra K  Y és Y  B. . akkor 2NF-ben is van.Tegyük fel ugyanis. Osztálynév. mert például az Osztálynév tranzitívan függ az Adószámtól: Adószám  Osztálykód  Osztálynév. már ismert sémában: DOLGOZÓ (Név. VezAdószám} A séma 2NF-ben van. Ezek a sorok az Y  B függőség miatt szükségképpen B-n is megegyeznek. amely egyelemű. Függőségek: • Adószám  {Név. Állítás: Ha egy R(A. Bizonyítás: Indirekt tegyük fel.

ami ellentmond a BCNF feltételezésnek. Utca. A 3NF egy ekvivalens megfogalmazását jelenti a következő állítás: Egy R(A. {A1A2. így L nem szuperkulcs. Megjegyzés: Ha R(A. Indirekt tegyük fel. Függőségek: • {Város. Az eljárást addig ismételjük. {A2A1}.F) relációséma attribútumhalmaza kételemű. akkor a sémát felbontjuk az L  B függőség szerint (itt B legyen a szóba jövő legbővebb attribútumhalmaz). amelyre L  Ai. Irányítószám). hogy a séma BCNF-ben van. A2A1}. • vagy Ai elsődleges attribútum. ha bármely nemtriviális L  Ai függés esetén • vagy L szuperkulcs. ezért az L  Ai függés ellentmond a feltételnek. ilyen az alábbi példa. Ekkor viszont a K  L  Ai tranzitív függés fennáll (K kulcs). ugyanis K  L  Ai. hogy (nagy)városi lakcímeket tartunk nyilván. és a függőség miatt szükségképpen B-n is megegyeznek. Ekkor viszont K-tól tranzitíven függ Ai. Legyen C = A – (L B). akkor a séma BCNF-ben van. ami ellentmondás. Bizonyítás: Indirekt tegyük fel. Utca. Ekkor F-re a következő lehetőségek vannak: . Bizonyítás: Indirekt tegyük fel. Utca. hogy az R séma 3NF-ben van.F) relációséma BCNF-ben van. A tranzitív függés definíciójából adódóan ekkor L-től nem függ K (ezért L nem szuperkulcs). hogy L  B és L nem szuperkulcs. hogy a séma két kulccsal rendelkezik: • {Város.F) relációséma akkor és csak akkor van 3NF-ben. Utca. ahol K kulcs. amelyek L-en megegyeznek. de nincs 3NF-ben. Tegyük fel ugyanis. {A1A2}. és Ai másodlagos attribútum. Házszám. Világos. Heath tétele alapján a felbontás hűséges. amíg az összes relációséma BCNF-ben nem lesz. de nincs 3NF-ben. Állítás: Ha egy R(A. BCNF-re hozás: Ha L  B teljesen nemtriviális függés és L nem szuperkulcs. továbbá L  B nemtriviális. hogy R-re teljesül a fenti feltétel. de egy adott irányítószámhoz csak egy város. akkor 3NFben is van. akkor a táblában redundancia léphet fel. Házszám} A séma 3NF-ben van. Város) . Utca. Boyce-Codd normálforma (BCNF): Azt mondjuk.A2}. ami a B értékek redundáns tárolását eredményezi. A relációséma CÍM(Város. Ez azt jelenti. hogy L nem szuperkulcs. hogy egyik esetben sem sérül a BCNF feltétel.vagyis van olyan L K. de van olyan nemtriviális L  Ai függés. ekkor az R(A) sémát az R1(C L) és R2(L B) sémákkal helyettesítjük. Ha a séma nincs BCNF-ben. hogy egy R(A. ha bármely nemtriviális L  B függés esetén L szuperkulcs. ugyanis nincs másodlagos attribútuma. vagyis van olyan K  L  B tranzitív függés. Nincs azonban BCNF-ben az Irányítószám Város függés miatt.F) relációséma BCNF-ben van. Házszám) • CÍM2 (Irányítószám. hogy egy városhoz több irányítószám tartozhat. valamint Ai nem eleme L-nek (mivel másodlagos attribútum). akkor általában BCNF-ben is van. Legyen ugyanis A = {A1. Ekkor a táblában több olyan sor lehet. Házszám} • {Irányítószám. Tegyük fel. tehát minimális). és L-től nem függ K (mivel K kulcs. Mivel K nem függ L-től. Házszám}  Irányítószám • Irányítószám  Város Belátható. Adódnak azonban kivételek. BCNF-re hozás: felbontás az Irányítószám  Város függőség szerint: • CÍM1 (Irányítószám. irányítószámmal együtt. vagyis valamely K kulcsra és Ai másodlagos attribútumra K  L  Ai tranzitív függés teljesül. Példa: A gyakorlatban ha egy séma 3NF-ben van.

akkor azok t kombinációja is szerepel a táblában: Állítás: Ha K L . amelyre az alábbiak teljesülnek: • t(K) = ti(K) = tj(K) • t(L) = ti(L) • t(M) = tj(M) Jelölés: K L. Többértékű függőség: Tekintsünk egy RENDELHET (Nagyker. és legyen M = A – (K L). Kj. akkor van olyan t sor. Mivel nincs nem triviális funkcionális függőség. ha bármely R feletti T tábla esetén ha a ti és tj sorokra ti(K) = tj(K). míg a Város részére legalább 20 karaktert kell fenntartani. Bizonyítás: t = tj választással nyilvánvaló. L. akkor az (Ni. Ez azt jelenti. ezért a séma BCNF-ben van. ha valahányszor valamely ti. hogy ha valamely (Ni. ahol a tábla egy sora adott kiskereskedőnek adott nagykereskedőtől beszerezhető árufajtáját jelenti. Ak) párok szerepelnek a táblában. K L akkor teljesül. . Áru) sémát. Bizonyítás: A szimmetriából nyilvánvaló. mivel nehézkessé teszi a címek kezelését. L A. Legyen K. Végezetül megjegyezzük. hogy érdemes-e a felbontást elvégezni. ha több százezer címet kell nyilvántartani viszonylag kevés városban. ugyanakkor a tábla látható módon erőteljesen redundáns. akkor K Állítás: Ha K  L.F) relációséma bontható fel hűséges és függőségőrző módon BCNF-ben lévő relációsémákra. tj sorok megegyeznek K-n. hogy K-tól többértékűen függ L. hogy nem minden R(A. Ennek ellenére vitatható. Kisker. Ak) hármas is kell hogy szerepeljen. pedig tárolóhely megtakarítást jelenthet. akkor a nagykereskedő összes áruját nyilvántartásba vesszük.A fenti felbontás talán erőszakoltnak tűnik. Az Irányítószám ugyanis csak 4 karakter. Azt mondjuk. Ha egy kiskereskedő adott nagykereskedővel kapcsolatban áll. Kj) és (Ni. akkor K M. A sémában egyetlen kulcs van: az összes attribútum.

C. hogy K szuperkulcs. hasonlóan a funkcionális függőségek Armstrong axiómáihoz. akkor K L miatt K szuperkucs.és M-értékek redundánsan szerepelnek. Nyilván T T1 T2. D diszjunktak és nem üresek. Két eset lehetséges: • • Ha K L = A. Ha ugyanis K L. Legyen R egy relációséma és F többértékű függőségek egy halmaza R-en.) 4. Állítás: Ha egy R(A. és t = ti választásával a feltétel mindig teljesül. akkor a táblában több olyan sor lehet. Jelölés: F K L A funkcionális és többértékű függőségeket az alábbi (közös) axiómarendszerrel jellemezhetjük: Tétel: A fenti axiómák segítségével egy adott függőség halmazból következő bármely funkcionális és többértékű függőség formálisan levezethető. hogy T1 T2 T. hogy egy K L többértékű függőség logikai következménye az F többértékű függőség halmaznak. akkor a tábla redundanciát tartalmazhat. ha minden nemtriviális K L függés esetén K szuperkulcs. amiből a 4NF tulajdonság miatt következik.F) séma 4NF-ben van. és K nem szuperkulcs. (Levezetésen az axiómák véges sokszori alkalmazását értjük a formális logika szabályai szerint. akkor BCNF-ben is van.A többértékű függőségekhez is létezik egy axiómarendszer. Ha K L A. Azt mondjuk. Bizonyítás: Legyen K  L nemtriviális függés. amelyre F minden függősége teljesül. hogy egy relációséma 4NF-ben van. akkor az R1(B C) és R2(C D) felbontás hűséges. belátjuk. ha minden olyan R feletti T tábla esetén. akkor legyen L' = L – K. ha K L= és K L ≠ A. Most K L' nemtriviális. Normálforma (4NF): A K L függést nemtriviálisnak nevezzük. illetve a levezethetőség fogalma is hasonlóan definiálható. továbbá C D. hogy K szuperkulcs. Bizonyítás: Legyen T egy tetszőleges R feletti tábla. Ekkor K  L'. . A logikai következmény. ezért csak azt kell megmutatni. A gyakorlatban rendszerint a Fagin alábbi tétel alapján végzünk felbontást: Ha az R(A) relációsémánál A = B C D. T1 és T2 pedig a megfelelő szétbontott táblák. ahol B. (Ugyanis K L = A esetén M üres. és ezekben a sorokban az L. Ha egy séma nincs 4NF-ben.) Azt mondjuk. K L is igaz. amely K-n megegyezik.

Ez hűséges felbontás Fagin tétele szerint. Áru) séma az alábbi felbontással hozható 4NF-re: • SZÁLLÍT (Nagyker. Az eljárást addig ismételjük. akkor az R(A) sémát felbontjuk az R1(K L) és R2(K M) sémákra. Példa: A RENDELHET(Nagyker. A további normálformák egyre szigorúbb feltételeket írnak elő. de nem kötelező. Az ezek szerinti normalizálás célszerű. amíg az összes relációséma 4NF-ben nem lesz. Kisker. A gyakorlatban azt kell . Áru) Összefoglalás: Az 1NF-re hozás a relációs modellnél kötelező.4NF-re hozás: Ha K L nemtriviális függés. és K nem szuperkulcs. amelyek kiküszöbölik a redundanciát és az aktualizálási anomáliákat. Kisker) • KÍNÁL (Nagyker.

stb. Egyed-kapcsolat modell: A valós világ jelenségeit egyedekkel. lakcím tulajdonságokat rendelhetünk. amely egyértelműen meghatározza az egyedet. Példa: Tegyük fel. Az egyed-kapcsolat diagramoknak sajátos jelölésrendszerük van: • az egyedeket téglalappal. hogy azok egyértelműen meghatározzák az egyedet. illetve egy adott olvasó. az ezt ábrázoló diagramot egyedkapcsolat diagramnak nevezik. esetünkben eltekintünk. (További tulajdonságoktól. struktúrákat. mint kiadó. a valós világban létező dolgot. szám. Általánosított fogalmakat használva beszélhetünk "könyv" egyedről és "olvasó" egyedről is. Ekkor a "könyv" egyed tulajdonságai: könyvszám. szerző. könyvszámot (könyvtári számot) célszerű felvenni. Esetünkben egyed lehet egy könyv a könyvtárban. Kapcsolatok: Könyvtári nyilvántartásunk azonban ezzel még nincs kész. név. A "könyv" és "olvasó" egyedek között ugyanis egy sajátos kapcsolat léphet fel. Hasonló meggondolások alapján az "olvasó" egyedhez olvasószám. így minden könyvhöz egy egyedi azonosítót. hogy a redundancia és az anomáliák mennyire jelentenek súlyos veszélyt. Példa: Könyvtári nyilvántartás E-K diagramja. hogy egy könyvtár kölcsönzési nyilvántartását szeretnénk adatbázissal megoldani.mérlegelni. Az attribútumok csak atomi típusúak lehetnek (pl. dátum). az "olvasó" egyedé az olvasószám. Például a könyv mint egyed legfontosabb tulajdonságai a címe és a szerző neve. .). Esetünkben a "könyv" egyed kulcsa a könyvszám. Egyed-kapcsolat modell Grafikus leíró eszköz. • az attribútumokat ellipszissel. Kulcsok: Egy egyed attribútumainak olyan minimális részhalmazát. • az olvasókról. amit tulajdonságokkal akarunk leírni. amelyet kölcsönzésnek nevezünk. tulajdonságokkal és kapcsolatokkal leíró modellt egyed-kapcsolat modellnek. halmazokat. Ehhez nyilvántartást kell vezetni: • a könyvekről. Attribútumok: Tulajdonságnak vagy attribútumnak nevezzük az egyed egy jellemzőjét. indokolt-e azok megszüntetésével a táblák számát növelni. sztring. Az attribútumokat úgy célszerű megválasztani. • a kapcsolatokat rombusszal szokták jelölni. cím. • a kölcsönzésekről. Rövidítve az E-K modell és E-K diagram elnevezések is használatosak. listákat nem engedünk meg. kulcsnak nevezzük és aláhúzással jelöljük. Mivel adott szerző adott című könyve több kiadásban is megjelenhet. Egyednek nevezünk egy. sőt adott kiadásból is több példány lehet a könyvtárban. diagram segítségével szemléletesen adja meg az adatbázis struktúráját. kiadási év. Az adatbázis implementálásához a diagramot transzformálni kell valamilyen nyelvi leírásra.

amikor minden E-egyedhez csak legfeljebb egy F-egyed tartozhat. . Például. hogy a könyvtáros most csak azt akarja nyilvántartani. Ekkor a könyv és olvasó egyedek között N:1 kapcsolat lép fel. hogy a könyvtáros egy olvasónak egyszerre több könyvet is hajlandó kiadni. viszont egy könyv egyszerre csak egy olvasónál lehet. • 1. azonban egy F-egyedhez csak legfeljebb egy E-egyed tartozhat. • Az összetartozó előadást és gyakorlatot egy kurzusnak tekintjük. mint fogalmat jelöli (például könyvek esetén a "szerző" fogalmat). és kapcsolattípust amely két egyedtípus közötti kapcsolatot. egyedtípus és egyedhalmaz helyett egyszerűen egyedet mondunk. az utóbbi a könyv fogalmat jelenti. Egy valós adatbázisban minden egyedtípusnak egy konkrét egyedhalmaz (egyedpéldányok halmaza) felel meg. amely adott egyed típus adott tulajdonságát. ugyanis egy olvasónál egyszerre több könyv is lehet. amikor egy E-egyedhez több F-egyed tartozhat. amikor mindkét fajta egyedhez tetszőleges számú másik fajta egyed tartozhat. hogy a könyvtáros egy olvasónak egyszerre csak egy könyvet hajlandó kiadni. egy egyetemi oktatási adatbázisnál a kurzus egyedtípus többféleképpen értelmezhető: • Több féléven keresztül tartó kurzust egy egyednek tekintünk. A továbbiakban az egyedpéldány. Fontos az egyedtípus pontos meghatározása. Ekkor a könyv és olvasó egyedek között 1:1 kapcsolat lép fel. amely egy egyedpéldány adott tulajdonságát jelenti (például adott könyv szerzőjének nevét). mint fogalmat jelöli. Ekkor már egy könyv több könyvolvasó kapcsolatban is részt vehet. • Adott helyen és időpontban tartott foglalkozást tekintünk kurzusnak. ugyanis meg kell különböztetni egyedpéldányt és egyedtípust. hiszen egy könyv egyszerre csak egy olvasónál lehet. illetve egy olvasó egyszerre csak egy könyvet kölcsönözhet ki. • N:M kapcsolat. Ugyanígy meg lehet különböztetni kapcsolatpéldányt. Ha több hallgatói csoport van. változat: Tételezzük fel. és tulajdonságtípusról. A könyvtári nyilvántartás mindhárom típusra példával szolgálhat. és fordítva. • 1:N kapcsolat. • 2. ezért a két egyed között N:M kapcsolat áll fenn. Példánkban az előbbi egy adott könyvet. ha ez nem értelemzavaró. akkor mindegyik csoport gyakorlati órája külön egyedpéldányt jelent. hogy egy adott könyvet eddig mely olvasók kölcsönözték ki. • 3. Hasonlóan beszélhetünk tulajdonságpéldányról. Kapcsolatok típusai: Két egyed közötti kapcsolat (E és F jelöli a két egyedtípust): • 1:1 kapcsolat. változat: Most tételezzük fel.Eddig kissé pontatlanul fogalmaztunk. változat: Tegyük fel. amely két egyed példány közötti konkrét kapcsolatot jelent (például X olvasó kikölcsönözte Y könyvet).

hogy egy olvasót csak akkor veszünk nyilvántartásba. Ez a kapcsolat mutatja. intézetek.Látjuk. és nincs minden olvasónál könyv. A teljes részvétel általában nem teljesül. tanszékek). A 3. ezért azt az E-K diagramon is jelölni szokták. hogy adott (film. Ezt az egyed és a kapcsolat közötti kettős vonallal jelölik. és 2. hogy egy egyedtípus önmagával áll kapcsolatban. és szükség esetén visszavezethető bináris kapcsolatokra. ha valamikor legalább egy könyvet kikölcsönzött. hogy ez a modell nem zárja ki a körkörös hivatkozásokat. Itt a stúdiókra mutató nyíl azt jelenti. A szerződések kapcsolatban filmstúdiók. Nézzünk egy példát sokágú kapcsolatra. Itt 1:N kapcsolatról van szó. Egy egyedtípus teljesen részt vesz egy kapcsolatban. hogy X egységnek Y egység a főegysége. hogy egy stúdió mely színésszel melyik filmre kötött szerződést. változatnál viszont megkövetelhetjük. Előfordul. változatánál rendszerint nincs minden könyv kikölcsönözve. Hasonló állítás nem igaz a (film. stúdió) és (stúdió. hogy a kapcsolat típusa igen lényeges az E-K modell szempontjából. például a könyvtári nyilvántartás 1. Lehetőség van kettőnél több egyed közötti kapcsolat definiálására is. színész) párokra. Ez a típus ritkábban lép fel. . Megjegyzendő. színész) pár legfeljebb egy stúdióval állhat kapcsolatban. ha minden egyedpéldány kapcsolatban áll valamely másik egyeddel. filmek és színészek vesznek részt. Az alábbi ábra egy hierarchikus felépítésű intézmény szervezeti egységeit modellezi (például egyetemi karok. ahol egy kapcsolatpéldány azt jelenti.

hogy attribútumokat rendeljünk egy kapcsolathoz. stúdió) hármashoz rendelnénk a szerződések kapcsolathalmazában. csak a kapcsolatai révén lesz meghatározott. amelyeket az attribútumaik nem határoznak meg egyértelműen. Példa: Egy számítógép szerviz nem bajlódik azzal. az éppen jó lenne. Az egyedkapcsolat modell lehetővé teszi. hanem azokat a tulajdonosaik szerint tartja nyilván. mert különböző színészeknek valószínűleg különböző összegeket fizetnek. azonos paraméterekkel rendelkező gépe van. amelynek attribútumai éppen a kapcsolathoz rendelt attribútumok. és a filmekhez sem. Ha előfordulhat. Ez nem rendelhető a színészhez. hogy a modellben szeretnénk nyilvántartani a szerződésekhez tartozó fizetéseket is. Gyenge egyedek: Gyenge egyedek. Ehelyett természetesen lehetséges egy új egyed felvétele is.Tegyük fel. mivel a műszaki paraméterek nem határozzák meg egyértelműen a gépet. film. Ez azonban könnyebben kezelhető. A stúdióhoz sem rendelhető. Meghatározó kapcsolat jele: kettős rombusz. Itt a számítógép gyenge egyed. nem az összes gépet. hisz egy adott film szereplői valószínűleg különböző összegeket kapnak. hisz itt csak adott tulajdonos gépeit kell egymástól megkülönböztetni. Ha azonban a fizetést a (színész. hogy egy tulajdonosnak több. hisz egy színész különböző filmek esetén valószínűleg különböző összegeket kap. hogy egyedi azonosítót rendeljen a javított gépekhez. akkor a számítógép egyedhez egy sorszám attribútum felvétele is szükséges a megkülönböztetésre. . Jele: kettős téglalap.

További attribútumok a helyiség neve és alapterülete. amelynek csúcsa a főtípus felé mutat. akkor a főtípus és az altípusok viszonyát specializáló kapcsolattal írhatjuk le. A helyiség egyed altípusai: • tanterem (attribútumai az ülőhelyek száma. . Példa: Tekintsük egy oktatási intézmény helyiség-nyilvántartását. A háromszögbe "az egy" szöveget szoktak írni. a tábla és vetítő típusa). • számítógépterem (attribútuma a gépek száma). ezzel is hangsúlyozva a kapcsolat jellegét. Az egyes helyiségeket a tartalmazó épület azonosítójával és az azon belüli ajtószámmal azonosítjuk. kapcsolatban áll az irodában dolgozó személyekkel). • iroda (attribútumai az irodában működő telefon és fax száma. Jelölés: háromszög.Specializáló kapcsolatok: Ha valamely általános egyednek bizonyos altípusait külön szeretnénk modellezni.

• ügyfelek: név. Ha ugyanis egyedhalmazokat képzelünk a főtípus és altípusok helyére. • A számlákat a számlaszám azonosítja. név. adósok. ajtószám. • A hiteleket a hitelszám azonosítja. tartalék. A specializáló kapcsolat az egyedek többszörös előfordulását eredményezi. összeg. de sajátos módon nem különböző egyedeket. hanem ugyanazon egyed két előfordulását kapcsolja össze. mosdó. stb. Az altípus mindig teljesen részt vesz ebben a kapcsolatban. illetve több hitele is lehet. raktár. cím. például egy konkrét előadóterem egyaránt része a Helyiség és a Tanterem egyedhalmazoknak. Például a tanterem teljes attribútumhalmaza: épület. tábla. ügyfélszám. • A fiókokat a nevük azonosítja. Példa: Tekintsünk egy banki adatbázist. .). akkor egy egyedpéldány több egyedhalmazban is szerepel. • hitelek: hitelszám. hogy az altípusoknak lehetnek saját attribútumai és kapcsolatai. • Az ügyfeleket az ügyfélszámuk azonosítja. amelyben a következőket tartjuk nyilván: • fiókok: név. tulajdonosok. fiók. mind a hitelek több ügyfélhez is tartozhatnak. hogy egy egyed csak a főtípushoz tartozik (például folyosó. Végül az is lehet. A specializáló kapcsolat lényegében 1:1 kapcsolatot jelent egy főtípus és egy altípus között. • Minden ügyfélnek több számlája. • Mind a számlák. egy számítógépes oktatóterem például tanterem és gépterem egyszerre. fiók. míg a főtípus általában nem. cím. alapterület. • Mind a számlák. • számlák: számlaszám. Egy egyed egyszerre kettőnél több egyedhalmazban is előfordulhat. férőhely.Látjuk. egyenleg. mind a hitelek hozzá vannak rendelve egy fiókhoz. ugyanakkor öröklik a főtípus attribútumait és esetleges kapcsolatait is. vetítő.

név. Példa: . lakcím). Az ábra szerinti könyvtári nyilvántartás esetén a könyveket egy KÖNYV táblában tarthatjuk nyilván. A séma feletti adattábla minden egyes sora egy egyedpéldánynak felel meg. Az olvasók nyilvántartására egy OLVASÓ nevű tábla szolgálhat. attribútumai az egyed attribútumai. amely az alábbi séma szerint épül fel: KÖNYV(könyvszám. amelynek sémája: OLVASÓ(olvasószám.Relációs adatbázisséma készítése E-K diagramból Az E-K modell minden egyedéhez felírunk egy relációsémát. kulcsa az egyed kulcs attribútumai. cím). szerző. amelynek neve az egyed neve. A gyenge egyed relációsémáját bővíteni kell a meghatározó kapcsolat(ok)ban szereplő egyed(ek) kulcsával.

merevlemez. merevlemez.Az ábra szerinti számítógép nyilvántartás adatbázissémája a következő: • TULAJDONOS (személyiszám. . akkor ezeket egy sorszám attribútummal különböztetjük meg: • TULAJDONOS (személyiszám. akkor a kapcsolat sémája az egyed sémájába beolvasztható.. lakcím) • SZÁMÍTÓGÉP (processzor.. személyiszám) Ha egy tulajdonosnak több. színésznév) Kapcsolatok: Általános szabály: • Vegyünk fel a kapcsolathoz egy új sémát. memória. Példa: . lakcím) • SZÁMÍTÓGÉP (processzor. személyiszám. Bi a további attribútumok halmaza). sorszám) Példa: Az ábrán látható Szerződés egyed leképezése: SZERZŐDÉS (fizetés. R-ben Ki külső kulcs hivatkozás az Ri sémára. amelynek neve a kapcsolat neve. Rn(Kn Bn) sémák felelnek . azonos gépe lehet. ahol B a kapcsolat saját attribútumai... akkor a kapcsolatnak egy R(K1 Kn B) sémát feleltetünk meg. név. ha az összekapcsolt egyedeknek az R1(K1 B1). filmcím.. meg (Ki a kulcs. • Ha ezen séma kulcsa megegyezik valamely kapcsolódó egyed kulcsával. Formálisan. Az R feletti adattábla minden egyes sora egy kapcsolatpéldánynak felel meg. attribútumai pedig a kapcsolódó egyedek kulcs attribútumai és a kapcsolat saját attribútumai. memória. név. filmév.

Ha egy könyvet éppen senki sem kölcsönzött ki. cím. név. Ehhez a kapcsolat típusát kell megvizsgálni. olvasószám) vagy a KÖLCSÖN (könyvszám. a KÖLCSÖN (könyvszám. név. A megfelelő táblák a következők: . akkor a kölcsönzés 1:1 kapcsolatot jelent. olvasószám) sémát vehetjük fel a kapcsolathoz. Tehát. A KÖLCSÖN sémát az azonos kulcsú sémába olvasztva a o KÖNYV (könyvszám. Nézzük meg sorra a már tárgyalt három változatot! • 1. hogy mi lesz a kulcs ebben a sémában. olvasószám).Az ábrán szereplő "kölcsönzés" kapcsolat esetén az alábbi sémát kapjuk: KÖLCSÖNZÉS(könyvszám. változat: Ha egy olvasónak egyszerre csak egy könyvet adnak ki. lakcím. lakcím) vagy a o KÖNYV (könyvszám. szerző. Kérdés. olvasószám) o OLVASÓ (olvasószám. akkor a megfelelő mező üresen marad (azaz NULL értékű). a másodiké az OLVASÓ sémáéval egyezik meg. könyvszám) adatbázissémát kapjuk. Az első séma kulcsa a KÖNYV sémáéval. cím) o OLVASÓ (olvasószám. illetve ha egy olvasónál éppen nincs könyv. Ilyenkor a KÖLCSÖN sémában a könyvszám és az olvasószám egyaránt kulcs. szerző.

• 2. akkor a könyv-olvasó kapcsolat N:1 típusú. Ekkor a KÖLCSÖN sémában csak a könyvszám lehet kulcs. . lakcím) Most több könyvnél is szerepelhet ugyanazon olvasó száma. cím. név. változat: Ha egy olvasó több könyvet is kikölcsönözhet. ezért a KÖLCSÖN sémát csak a KÖNYV sémába olvaszthatjuk: o KÖNYV (könyvszám. szerző. olvasószám) o OLVASÓ (olvasószám.

hogy az OLVASÓ sémát bővítjük könyvszám attribútummal. Ekkor a KÖLCSÖN sémában {könyvszám. akkor nem csak egy olvasóhoz tartozhat több könyv.• Az a lehetőség. Az adatbázisséma ezért a következő: o KÖNYV (könyvszám. már nem járható. olvasószám} kulcs. A KÖLCSÖN sémát most sem a KÖNYV. ami ellentmond a relációs adatmodell alapelvének: az adattábla egy mezőjébe csak atomi értéket lehet beírni. Ekkor egy olvasóhoz több könyvszámot kellene beírnunk. olvasószám) . szerző. cím) o OLVASÓ (olvasószám. lakcím) o KÖLCSÖN (könyvszám. név. 3. hanem egy könyvhöz is több olvasó (N:M kapcsolat). változat: Ha az egyes könyvek összes eddigi kikölcsönzőjét nyilvántartjuk. sem az OLVASÓ sémába nem tudjuk beolvasztani.

Lényegében itt is a 2. ezért az új attribútumot főegységkódnak nevezzük: . vagyis az EGYSÉG (egységkód. Előfordul. • 1:N kapcsolat esetén az „N” oldali egyed sémájába új attribútumként felvesszük a másik egyed kulcs attribútumait. de a könyveknek csak elenyészően kis százaléka van egy adott pillanatban kikölcsönözve. valamint a kapcsolat attribútumait. Ez a redundancia megszűnik. o a kapcsolat saját attribútumai. ha a kölcsönzéseket egy külön KÖLCSÖN (könyvszám. szabályt alkalmazhatjuk. olvasószám) sémában tartjuk nyilván. akkor az olvasószám attribútum értéke majdnem minden sorban NULL lesz. Ha például a KÖNYV sémát bővítjük az olvasószám attribútummal. Mivel egy sémában nem szerepelhet két azonos attribútumnév. és annak sémájába új attribútumként felvesszük a másik egyed meghatározó (kulcs) attribútumait. hogy 1:1 illetve 1:N kapcsolat esetén sem érdemes a kapcsolat sémáját beolvasztani a megfelelő egyed sémájába. • N:M kapcsolat esetén új sémát veszünk fel. valamint a kapcsolat attribútumait. Példa: Az alábbi diagram szerinti szervezeti egység nyilvántartás önmagával kapcsolatban álló egyedet tartalmaz. amelynek attribútumai o a kapcsolódó egyedek kulcs attribútumai.A előzőek alapján az alábbi szabályok fogalmazhatók meg két egyed közötti kapcsolatok leképezésére relációs modellbe: • 1:1 kapcsolat esetén kiválasztjuk a kapcsolatban résztvevevő két egyed valamelyikét (bármelyiket). megnevezés) sémát kell bővíteni egységkód attribútummal.

év. stúdiónév. Megjegyezzük. főegységkód) ahol főegység a fölérendelt szervezeti egység kódja. Mivel a SZERZŐDÉS kapcsolatban a film és a színész már meghatározza a stúdiót (lásd a nyilat az ábrán). hossz. cím) • SZERZŐDÉS (filmcím. Specializáló kapcsolatok: . színésznév. hogy ha a szétbontott változatból indulunk ki. lakcím) • STÚDIÓ (név. ezért a stúdiónév már nem része a kulcsnak. fizetés) Az azonos nevek ütközésének elkerülésére a SZERZŐDÉS sémában módosított attribútumneveket alkalmaztunk. szalagfajta) • SZÍNÉSZ (név. akkor is a fenti adatbázissémához jutunk.EGYSÉG (egységkód. filmév. • Az általános szabály alapján felírhatjuk az előbbi E-K diagram relációs adatbázissémáját: • FILM (cím. megnevezés.

az attribútumok uniójával. telefon. férőhely. ajtószám. név. a főtípus táblájában minden egyed szerepel. Az aktuálisan értékkel nem rendelkező attribútumok NULL értékűek. gépszám. o HELYISÉG (épület. ajtószám) Hátrányok: o Az ilyen egyesített táblában általában sok NULL attribútumérték szerepel. ajtószám. ajtószám) Hátrány: Itt is előfordulhat. tábla. sz. ajtószám. változat: A főtípushoz és minden altípushoz külön séma felvétele. 2. ajtószám. Példa: . épület. ajtószám. alapterület. 3. ajtószám. az altípusok a főtípustól csak a kulcsattribútumokat öröklik. terem alapterületét keressük). férőhely. név. alapterület. vetítő. telefon. ajtószám) Hátrányok: o Kereséskor gyakran több táblát kell vizsgálni (ha például a Központi épület 211. gépszám) o IRODA (épület. vetítő) o GÉPTEREM (épület. név. tábla. alapterület) o TANTEREM (épület. ajtószám. ajtószám. változat: A főtípushoz és minden altípushoz külön séma felvétele. tábla.• • • 1. az altípusok öröklik a főtípus attribútumait. fax) o DOLGOZÓ (adószám. név. gépszám) o IRODA (épület. Egy egyed több táblában is szerepelhet. Egy egyed csak egy táblában szerepel. alapterület) o TANTEREM (épület. o Elveszíthetjük a típusinformációt (például ha a gépteremnél a gépszám nem ismert és ezért NULL. név. név. lakcím. lakcím. fax) o DOLGOZÓ (adószám. név. változat: Egy közös séma felvétele. telefon. lakcím. fax) o DOLGOZÓ (adószám. név. férőhely. épület. ajtószám. o HELYISÉG (épület. és annyi altípuséban ahánynak megfelel. hogy több táblában kell keresni (például ha a tantermek nevére és férőhelyére vagyunk kíváncsiak). o Kombinált altípus (például számítógépes tanterem) csak új altípus felvételével kezelhető. o HELYISÉG (épület. akkor a gépterem lényegében az egyéb helyiségek kategóriájába kerül). alapterület. név. vetítő) o GÉPTEREM (épület. épület. alapterület.

fiók_név. ügyfél_név. az SQL eredeti változata. az ANSI (American National Standards Institute) definiálta. tartalék) • Ügyfél(ügyfél_szám. fiók_név. *. nagygépre). • 1992: SQL92 (vagy SQL2) szabvány. akkor elhagyható).és oszlopnevekre lehet hivatkozni.oszlop (ha a tábla egyértelmű. nap). másodperc. törtmásodperc). Az SQL = Structured Query Language (struktúrált lekérdező nyelv).• Fiók(fiók_név. csak tábla. • 1983: IBM DB2 (SQL alapú. • 1981: ORACLE 2 (SQL alapú. Nem algoritmikus nyelv. hitel_szám) Az SQL nyelv I Általános jellemzés: A legszélesebb körben használt adatbáziskezelő rendszerek egy SQL-nek nevezett nyelv segítségével kérdezik le és módosítják az adatbázist. • Utasítások sorfolytonosan írhatók. összeg) • Számlatulajdonos(ügyfél_szám. egyenleg) • Hitel(hitel_szám. • Idő: TIME '15:31:02.5' (óra. az IBM-nél fejlesztették ki. • 2008: SQL2008 szabvány. / . számla_szám) • Adós(ügyfél_szám. Szintaxis: • Kisbetű és nagybetű a nyelv alapszavaiban egyenértékű. fiók_város. nagygépre). Történeti áttekintés: • 1976: SEQUEL. • 1999: SQL99 (vagy SQL3) szabvány. • Változó nincs. ügyfél_cím) • Számla(számla_szám. • Szövegkonstans: 'szöveg' • Dátum: DATE '1968-05-12' (év. de beépíthető algoritmikus nyelvekbe (beágyazott SQL). hónap. lezárás pontosvesszővel. • 2003: SQL2003 szabvány. • Kifejezésben hivatkozás egy tábla adott oszlopára: tábla. -. perc. • Aritmetikai műveletek: +. • 1986: első SQL szabvány.

vagy más módon használható fel. A DISTINCT opciót akkor kell kiírni.An (σfeltétel (T1 × . An FROM T. ill. a felsorolt táblák Descartes-szorzatából szelektáljuk a feltételnek eleget tévő sorokat. azonban ezek közül mindig csak egy aktív (a többi alvó kapcsolat). egyéb utasításokat eljuttatják a szerverhez. amelyen elérhető SQL kliens.. • Karaktersorozatok illesztése: Két karakterlánc egyenlő. × Tm )). Az adatbázisszerver a választ általában egy tábla formájában küldi vissza a kliensnek. NOT. Példa: szerző LIKE '%Jeffrey%' igaz minden olyan névre. amely egy vagy több adattáblából egy eredménytáblát állít elő. Olyan számítógépen tudunk csak SQL alkalmazásokat futtatni. != vagy <> • Logikaiműveletek: AND. Ez azt jelenti.. Relációs algebrai műveletek: • Projekció: SELECT [DISTINCT] A1.. mert az SQL egyidejűleg több kapcsolat felépítését is támogatja. Vagyis. Ha a mintában "%" illetve "_" jel szerepel.. utasítással szüntethetünk meg. Lekérdezések: Lekérdezésre a SELECT utasítás szolgál.. ha az azonos sorokból csak egyet kívánunk megtartani (a SELECT utasítás alapértelmezésben nem szünteti meg az ismétlődéseket). >=. Erre azért van szükség.An FROM T1.. és a lekérdezéseket. a legtöbb esetben a DEFAULT kulcsszó beírásával az alapértelmezés szerint elérhető szerverhez kapcsolódhatunk. Egy kapcsolatot az alábbi utasítással tehetünk aktívvá: • SET CONNECTION kapcsolatnév. • Szelekció: SELECT * FROM T WHERE feltétel.Tm WHERE feltétel utasítás egyenértékű a következő relációs algebrai kifejezéssel: πA1. Az SQL lehetővé teszi.. sok más szoftverfajtához hasonlóan kliens-szerver felépítést használnak... cím FROM Könyv.. Példa: o SELECT DISTINCT szerző. amelyek a felhasználókkal kommunikálnak... ha benne NULL érték szerepel (háromértékű logika).. ez valamennyi oszlop felsorolásával egyenértékű. Egy SQL szerverrel a következő utasítás segítségével teremthetünk kapcsolatot: • CONNECT TO szervernév AS kapcsolatnév AUTHORIZATION felhasználónév és jelszó A szerver neve az installálástól függ.. Egyetlen SELECT akár egy komplex felhasználói programot helyettesíthet! A SELECT utasítás alapváltozata: • SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel]. Egy korábban felépített kapcsolatot a • DISCONNECT kapcsolatnév. hogy az egyik folyamat (a kliens) kéréseit egy másik folyamat (a szerver) hajtja végre.. eltekintve a lekérdező interfészektől.. <=. ha a karaktereknek ugyanabból az egymás után következő sorozatából áll. A fenti SELECT A1.• Relációjelek: =. . <. Kliensek és szerverek: Az adatbáziskezelő rendszerek. Példa: o SELECT * FROM Könyv WHERE szerző = 'Jeffrey Ullman'. Egy logikai kifejezés értéke ISMERETLEN (UNKNOWN) is lehet. . A SELECT legegyszerűbb változatával adattábla listázását érhetjük el: • SELECT * FROM T. ha az x karaktersorozat megfelel a megadott mintának. Az eredménytábla a képernyőn listázásra kerül. hogy mintákkal is összehasonlíthassunk karakterláncokat: o x LIKE minta: igaz. Ha az oszloplista helyére * karaktert írunk.. OR. amelyben szerepel a "Jeffrey" részlet. az tetszőleges karaktersorozatot illetve tetszőleges karaktert jelent. majd ezekből projekcióval választjuk ki az eredménytábla oszlopait. A CONNECT utasításban megadott kapcsolatnevet használhatjuk a későbbiekben a kapcsolat azonosítására. >. A legegyszerűbb kliens-szerver felépítésben az egész adatbáziskezelő egyetlen szerver.

ha egy táblának önmagával való Descartes-szorzatát képezzük.cikkszám. tábla. férőhely.adószám. akkor az UNION. T2 WHERE feltétel. név. Másképpen: o SELECT Áru. INTERSECT és EXCEPT kulcsszavak után az ALL kulcsszót kell írni. Másképpen: SELECT * FROM T1. A SELECT utasítással ellentétben. mennyiség) táblából egy (áru. Példa: Tekintsük az alábbi helyiség-adatbázist: o HELYISÉG (épület. az egyesítés.cikkszám. gépszám) Ekkor az oktatási célú géptermek listája: • (SELECT épület. Az eredménytábla oszlopainak elnevezésére pedig alias neveket adhatunk meg. Ha az ismétlődéseket meg akarjuk tartani. fizetés) táblából: • SELECT d1.név. osztálykód. metszet és különbség operátorok alapértelmezésben megszűntetik az ismétlődéseket. hogy önmagával ne párosítson rekordot. o R EXCEPT ALL S eredményében egy t sor előfordulásainak száma egyenlő a t sor R-beli előfordulási számából kivonva a t sor S-beli előfordulási számát. hogy egy azonos nevű dolgozópár csak egyszer jelenjen meg. • Unió: (SELECT * FROM T1) UNION (SELECT * FROM T2).név=d2. d2.Descartes-szorzat (T1 × T2): SELECT * FROM T1 CROSS JOIN T2. T2. A FROM után megadott táblák esetén is használhatók alias nevek. • Metszet: (SELECT * FROM T1) INTERSECT (SELECT * FROM T2). ajtószám. • Természetes összekapcsolás: Állítsuk elő például az o ÁRU (cikkszám. hanem tetszőleges kifejezéseket. Ilyenkor az operátorok a következőképpen működnek: o R UNION ALL S eredményében egy t sor előfordulásainak száma egyenlő a t sor R-beli és S-beli előfordulási számának az összegével. név. Az adószámokra előírt feltétel azért kell. Másképpen: o SELECT * FROM T1. ha az eredmény pozitív (különben természetesen 0). • . egységár * mennyiség AS érték. Vásárlás WHERE Áru. Példa: A RAKTÁR(cikkszám. megnevezés. Példa: Azonos nevű dolgozók lekérése a DOLGOZÓ (adószám. mennyiség FROM Áru. ’Ft’ AS pénzegység FROM Raktár. ajtószám. érték. d1.cikkszám = Vásárlás. például akkor. Dolgozó AS d2 WHERE d1.adószám FROM Dolgozó AS d1. lakcím. Alias nevek: A SELECT után megadott oszloplista nem csak oszlopneveket. alapterület) o TANTEREM (épület. név. pénzegység) tábla létrehozása: • SELECT név AS áru. sőt konstansokat is tartalmazhat.adószám < d2. • Különbség: (SELECT * FROM T1) EXCEPT (SELECT * FROM T2).adószám. amely csak akkor szünteti meg az ismétlődéseket. egységár.név AND d1. ajtószám. megnevezés) o VÁSÁRLÁS (cikkszám. ajtószám FROM Tanterem) INTERSECT (SELECT épület. mennyiség) táblák természetes összekapcsolását: o SELECT * FROM Áru NATURAL JOIN Vásárlás. ajtószám FROM Gépterem). illetve. ha jelen van a DISTINCT kulcsszó. • Théta összekapcsolás: SELECT * FROM T1 JOIN T2 ON feltétel. o R INTERSECT ALL S eredményében egy t sor előfordulásainak száma egyenlő a t sor R-beli és S-beli előfordulási számának a minimumával. vetítő) o GÉPTEREM (épület.

lakcím. osztálykód. név. Általános alakjuk: • függvénynév ([DISTINCT] oszlopnév) Ha DISTINCT szerepel. Dolgozónkénti és projektenkénti óraszám összegzés a PROJEKTORA (dolgozó. akkor a SELECT utasítás a • GROUP BY oszloplista alparanccsal bővítendő. SUM(óra) FROM Projektóra GROUP BY projekt. • COUNT: elemek száma. osztálykód.. Az egyes függvények: • AVG: átlagérték. amely az átlagfizetést adja. . AVG(fizetés) FROM Dolgozó GROUP BY osztálykód HAVING AVG(fizetés) > 80000. lakcím. Összesítő függvények: Egy oszlop értékeiből egyetlen értéket hoznak létre (például átlag). Erre szolgál az • ORDER BY oszlopnév [DESC]. A számításnál a NULL értékek figyelmen kívül maradnak. • SELECT SUM(fizetés) FROM Dolgozó. • SUM: összeg. amely a GROUP BY-ban is szerepel. a Dolgozó tábla sorainak. Példa: Azon osztályok listája a DOLGOZÓ (adószám. amely a SELECT utasítás végére helyezhető. ahol az átlagfizetés > 80000 Ft: • SELECT osztálykód. név. a DESC kulcsszó írandó a megfelelő oszlopnév után. és az eredménytáblának a megadott oszlopok szerinti rendezését írja elő. az alias név állhat közvetlenül az átnevezendő oszlop illetve tábla után (mindenféle írásjel nélkül). fizetés) táblát: • SELECT AVG(fizetés) FROM Dolgozó. akkor az oszlopban szereplő azonos értékeket csak egyszer kell figyelembe venni. SELECT projekt. • MAX: maximális érték.. az eredménytábla egyetlen elemből áll. • MIN: minimális érték. Az eredménytáblában egy csoportból egy rekord lesz.Megjegyezzük. Példa: Osztályonkénti átlagfizetést számolunk a DOLGOZÓ (adószám. vagyis a dolgozók száma. melyeknél oszloplista értéke azonos. osztálykód. Egy csoportba azok a sorok tartoznak. fizetés) táblában. név.. hogy az AS kulcsszó opcionális. • SELECT COUNT() FROM Dolgozó. . a gyakorlatban rendszerint valamilyen rendezettségben kívánjuk látni az eredményt. AVG(fizetés) FROM Dolgozó GROUP BY osztálykód. az osztályok száma Csoportosítás: Ha a tábla sorait csoportonként szeretnénk összesíteni. Példák: Tekintsük ismét a DOLGOZÓ (adószám. Az összesítő függvényeket általában egy SELECT záradékbeli oszlopra alkalmazzuk. óra) táblában: • SELECT dolgozó. fizetés) táblában: • SELECT osztálykód. a fizetések összege. amely valamennyi oszlopot együtt jelenti. Rendezés: Bár a relációs modell nem definiálja a rekordok sorrendjét. Alapértelmezés szerint a rendezés növekvő sorrendben történik. az összesítő függvények csoportonként hajtódnak végre. lakcím. Ennél a függvénynél az oszlopnév helyére * is írható. A SELECT után összesítő függvényen kívül csak olyan oszlopnév tüntethető fel. • SELECT COUNT(DISTINCT osztálykód) FROM Dolgozó. SUM(óra) FROM Projektóra GROUP BY dolgozó. A GROUP BY által képezett csoportok közül a csoport bizonyos összesített tulajdonsága alapján válogathatunk a • HAVING feltétel alparancs segítségével: csak a feltételnek eleget tevő csoportok kerülnek összesítésre az eredménytáblába. oszlopnév [DESC] alparancs. projekt. ha fordítva kívánjuk.

Keressük meg azokat a fiókokat. fizetés DESC. ORDER BY rendezés Példa: • Fiók(fiók_név.fiók_város = ’Budapest’). SELECT projekció • 6. Keressük meg minden fióknál a számlatulajdonosok számát! • SELECT fiók_név. osztálykód.számla_szám = Számla. végrehajtási sorrendjük viszont: • 1.fiók_név FROM Fiók AS F1. WHERE szelekció • 3. Keressük meg azokat a fiókokat.fiók_város = ’Budapest’.fiók_név FROM Fiók AS F1. ezen belül a fizetések csökkenő sorrendjében a DOLGOZÓ (adószám. amelyek tartaléka nagyobb valamennyi budapesti fiók tartalékánál! • (SELECT fiók_név FROM Fiók) EXCEPT (SELECT F1. akik hitelt vettek fel a Növekvő jólét nevű fióknál! • SELECT DISTINCT ügyfél_szám FROM Adós. A SELECT utasítás általános alakja: A SELECT utasítás az alábbi alparancsokból állhat: Az egyes alparancsok megadási sorrendje az előbb látott. összeg) • Számlatulajdonos(ügyfél_szám. COUNT(DISTINCT ügyfél_szám) FROM Számlatulajdonos. név. fiók_név. Másképpen: • SELECT DISTINCT ügyfél_szám FROM Adós NATURAL JOIN Hitel WHERE fiók_név = 'Növekvő jólét'. fiók_név.hitel_szám = Hitel. Hitel WHERE Adós. hitel_szám) Keressük meg azoknak az ügyfeleknek az ügyfélszámát.hitel_szám AND fiók_név = 'Növekvő jólét'. . FROM Descartes-szorzat • 2. GROUP BY csoportosítás • 4. számla_szám) • Adós(ügyfél_szám.számla_szám GROUP BY fiók_név. lakcím. fizetés) táblában: • SELECT osztálykód. Fiók AS F2 WHERE F1. Számla WHERE Számlatulajdonos. egyenleg) • Hitel(hitel_szám. tartalék) • Ügyfél(ügyfél_szám. Fiók AS F2 WHERE F1. fizetés FROM Dolgozó ORDER BY osztálykód.tartalék AND F2. név.tartalék AND F2. ügyfél_név. ügyfél_cím) • Számla(számla_szám.tartalék > F2. HAVING csoport-szelekció • 5. fiók_város.Példa: Dolgozók és fizetéseik listája az osztálykódok növekvő. amelyek tartaléka nagyobb valamelyik budapesti fiók tartalékánál! • SELECT DISTINCT F1.tartalék <= F2.

hogy az SQL nyelv megenged egy speciális értéket. ha x értéke NULL. egy logikai kifejezés értéke háromféle lehet: igaz. Keressük meg azon ügyfelek számlaegyenlegeinek átlagát. Megjegyezzük. melyet NULL-nak nevezünk.ügyfél_szám. akik Budapesten laknak és legalább három számlájuk van! • SELECT Számlatulajdonos. hogy az "x IS NULL" kifejezés nem egyenértékű az "x = NULL" kifejezéssel. .számla_szám AND ügyfél_cím LIKE 'Budapest' GROUP BY Számlatulajdonos. AVG(egyenleg) FROM Ügyfél. < vagy =). Külön felhívjuk a figyelmet.ügyfél_szám AND Számlatulajdonos. és hamis.számla_szám = Számla. Háromértékű logika: Mint láttuk. hogy egy x kifejezés értéke NULL-e. hamis. A kifejezés értéke igaz. Számlatulajdonos.Másképpen: • SELECT fiók_név. COUNT(DISTINCT ügyfél_szám) FROM Számlatulajdonos NATURAL JOIN Számla GROUP BY fiók_név. amikor NULL értékekkel dolgozunk: • Amikor egy aritmetika műveletben (pl. egy összehasonlítási operátor segítségével (pl. hanem NULL.ügyfél_szám HAVING COUNT(Számlatulajdonos. a NULL-t is beleértve. Nézzük hogyan működnek a logikai műveletek e háromértékű logikában. hogy 0 * x és x – x értéke x = NULL esetén a várakozással ellentétben nem 0. + vagy *) valamelyik tag NULL. • Amikor egy NULL értéket hasonlítunk össze bármely más értékkel. akkor az eredmény az ISMERETLEN logikai érték. ahol a számlaegyenlegek átlaga legalább 100000 Ft! Az egyes fiókoknál a számlaegyenlegek átlagát is adjuk meg! • SELECT fiók_név. Az x IS NULL kifejezés segítségével tudhatjuk meg. Két fontos szabályt kell figyelembe venni. Számla WHERE Ügyfél. akkor az eredmény is NULL.ügyfél_szám = Számlatulajdonos. ugyanis az utóbbi értéke az ISMERETLEN logikai érték. AVG(egyenleg) FROM Számla GROUP BY fiók_név HAVING AVG(egyenleg) >= 100000.számla_szám) >= 3. ha nem. NULL értékek: Már többször utaltunk rá. ismeretlen. Keressük meg minden olyan fiók nevét.

Az összekapcsolásokat kettőnél több relációra is értelmezhetjük. A fentiek miatt használatos a külső összekapcsolás művelet. Ha egy sor nem párosítható a másik tábla egyetlen sorával sem. név. amelyek T1 egyetlen sorával sem párosíthatók.A SELECT utasítások WHERE záradékában szereplő feltételt a rendszer minden sorra leellenőrzi. Itt pedig az összekapcsolás feltétele az. • SELECT… FROM R {LEFT|RIGHT|FULL} OUTER JOIN S ON feltételek [WHERE …]. • A T1 és T2 táblák jobb oldali külső összekapcsolása (RIGHT OUTER JOIN) esetén az eredménytáblában T2 azon sorai is szerepelnek. amelyek T2 egyetlen sorával sem párosíthatók. Ezen sorokban a T2-beli attribútumok értéke NULL. • A T1 és T2 táblák bal oldali külső összekapcsolása (LEFT OUTER JOIN) esetén az eredménytáblában T1 azon sorai is szerepelnek. hanem az összes könyvet lássuk. olvasószám) • OLVASÓ (olvasószám. hogy a KÖLCSÖN táblában ne csak a kikölcsönzött könyveket. amit az ON kulcsszó után írunk. • SELECT… FROM R NATURAL {LEFT|RIGHT|FULL} OUTER JOIN S [WHERE …]. amelyekre a feltétel kiértékelése IGAZ. hogy általában a kapcsolt táblák nem minden sora szerepel az eredménytáblában. és az eredménybe csak azok a sorok kerülnek be. . amelyek T1 egyetlen sorával sem párosíthatók. Ezen sorokban pedig a T1-beli attribútumok értéke NULL. Hasonlóan T2 azon sorai is szerepelnek az eredménytáblában. lakcím) Ha most például a KÖNYV táblában téves olvasószám szerepel. akkor a KÖNYV és OLVASÓ táblák természetes összekapcsolásával adódó KÖLCSÖN táblában az adott könyv nem fog szerepelni. szerző. Tekintsük a könyvtári nyilvántartás adatbázissémáját: • KÖNYV (könyvszám. Ezen sorokban a T1-beli attribútumok értéke NULL. Ilyenkor az összekapcsolási feltétel az egyező nevű attribútumok egyenlősége (az egyenlő attribútumok közül az egyiket kihagyjuk az eredményből). azok a sorok melyekre az eredmény HAMIS vagy ISMERETLEN nem lesznek benne az eredményben! Külső összekapcsolás: A már megismert természetes összekapcsolás veszélye. Ezen sorokban a T2-beli attribútumok értéke NULL. akkor azt lógó sornak nevezzük. cím. További természetes igény lehet. amely az összekapcsolt két tábla egyikénél vagy mindkettőnél valamennyi rekord megőrzését garantálja. • A T1és T2 táblák teljes külső összekapcsolása (FULL OUTER JOIN) esetén az eredménytáblában T1 azon sorai is szerepelnek. amelyek T2 egyetlen sorával sem párosíthatók.

..olvasószám AND lakcím LIKE '%Pécs%'). ha a halmaz nem üres. akiknek az osztályon belül a legnagyobb a fizetése (ha több ilyen van. A fenti a példában az alkérdést elég csak egyszer kiértékelni.olvasószám = Olvasó. név. tartalék) • Ügyfél(ügyfél_szám.. Egy kiértékelés során a külső változónevek konstansnak tekintendők... • SELECT szerző. osztálykód FROM Dolgozó AS D1 WHERE fizetés = (SELECT MAX(fizetés) FROM Dolgozó AS D2 WHERE D1. • x relációjel ANY halmaz: igaz.osztálykód = D2. A DOLGOZÓ tábla két példányát a D1 és D2 alias nevek különböztetik meg: • SELECT név. olvasószám) • OLVASÓ (olvasószám. Például az alábbi két lekérdezés a • KÖNYV (könyvszám. Léteznek olyan SQL operátorok. karaktersorozatok. fizetés) táblából. lakcím. és az eredmény logikai érték lesz. osztálykód. ha a halmaznak van olyan eleme.. Az esetek többségében a halmaz (reláció) egy alkérdés eredménye. Speciális logikai operátorok: • x IN halmaz: igaz. Példa: Most azon dolgozók listáját kérjük a DOLGOZÓ (adószám. hiszen a Dolgozó tábla minden egyes sorára ugyanazt az eredményt kapjuk. név. Olvasó WHERE Könyv. számla_szám) . lakcím) táblákból a pécsi olvasók által kikölcsönzött könyvek listáját adja: • SELECT szerző. Egy ilyen halmaz felsorolással vagy SELECT utasítással állítható elő. HAVING feltételében skaláris értékeket (egészek. cím FROM Könyv. fizetés. osztálykód. ez utóbbi SELECT utasítást alkérdésnek vagy belső SELECT-nek nevezik.osztálykód). Ha egy SELECT utasítás WHERE vagy HAVING feltételében olyan logikai kifejezés szerepel. amelyeket halmazokra (relációkra) alkalmazhatunk. . mint az átlagfizetés: • SELECT név. fizetés) táblában. valós számok.B1 AND . • EXISTS halmaz: igaz. Példa: Az alábbi utasítás azon dolgozók listáját adja a DOLGOZÓ(adószám. • x relációjel ALL halmaz: igaz. AND T1.A1=T2. • UNIQUE (multi)halmaz: igaz. Azonban az SQL lehetőséget nyújt ezeken a helyeken halmazok vizsgálatára is. ügyfél_név. összeg) • Számlatulajdonos(ügyfél_szám. An) és T2(B1. egyenleg) • Hitel(hitel_szám.. amellyel x a megadott relációban van. akik fizetése kisebb. dátumok) hasonlítottunk össze. ügyfél_cím) • Számla(számla_szám. amely SELECT utasítást tartalmaz. fiók_név.. akkor a külső SELECT minden egyes rekordjára kiértékelődik a belső SELECT. lakcím.. fiók_név. fiók_város. cím FROM Könyv WHERE olvasószám IN (SELECT olvasószám FROM Olvasó WHERE lakcím LIKE '%Pécs%'). Példa: Halmazelméleti metszet művelet megvalósítása a T1(A1. Bizonyos esetekben az alkérdés összekapcsolás műveletet helyettesíthet. cím.Bn). ha x megegyezik a megadott halmaz egy elemével. Ha viszont a belső SELECT-ben a külső SELECTbeli táblák oszlopnevei szerepelnek.An=T2. Bn) táblákra alkérdés használatával: • SELECT * FROM T1 WHERE EXISTS (SELECT * FROM T2 WHERE T1. mindegyiket ki kell listázni).Alkérdések: Eddig a lekérdezések WHERE ill. fizetés FROM Dolgozó WHERE fizetés < (SELECT AVG(fizetés) FROM Dolgozó). Példa: • Fiók(fiók_név. ha a (multi)halmazban nincs két azonos sor. név. szerző. ha x a halmaz minden elemével a megadott relációban van.

amelyekben számlaegyenlegek átlaga a legmagasabb! • SELECT fiók_név FROM Számla GROUP BY fiók_név HAVING AVG(egyenleg) >= ALL (SELECT AVG(egyenleg) FROM Számla GROUP BY fiók_név). ügyfél_szám AND R. ügyfél_szám = R. Keressük meg azokat a fiókokat. amelyek tartaléka nagyobb valamelyik budapesti fiók tartalékánál! • SELECT fiók_név FROM Fiók WHERE tartalék > ANY ( SELECT tartalék FROM Fiók WHERE fiók_város = ’Budapest’). Több ideiglenes reláció is definiálható egy lekérdezéshez. ilyenkor a definíciókat vesszővel választjuk el. amelyek tartaléka nagyobb valamennyi budapesti fiók tartalékánál! • SELECT fiók_név FROM Fiók WHERE tartalék > ALL (SELECT tartalék FROM Fiók WHERE fiók_város = ’Budapest’). Keressük meg azoknak az ügyfeleknek az ügyfélszámát. fiók_név.számla_szám AND Számla. máshol nem lehet használni őket.fiók_név = ’Növekvő jólét’). Ezek a relációk csak az utasításon belül élnek. tartalék) • Ügyfél(ügyfél_szám.ügyfél_szám AND T. akiknek legfeljebb egy számlájuk van a Növekvő jólét nevű fióknál! • SELECT T.ügyfél_szám FROM Számlatulajdonos AS T WHERE NOT UNIQUE (SELECT R.• Adós(ügyfél_szám. számla_szám) • Adós(ügyfél_szám. ügyfél_szám = R. hogy egy lekérdezéshez ideiglenes relációkat hozzunk létre. ügyfél_cím) • Számla(számla_szám. egyenleg) • Hitel(hitel_szám.ügyfél_szám FROM Számlatulajdonos AS S WHERE NOT EXISTS ((SELECT fiók_név FROM Fiók WHERE fiók_város = ’Budapest’) EXCEPT (SELECT fiók_név FROM Számla.számla_szám AND Számla.fiók_név = ’Növekvő jólét’). Jegyezzük meg.ügyfél_szám = T. amelyekre a lekérdezésben névvel hivatkozhatunk. fiók_név.számla_szám)). akiknek legalább két számlájuk van a Növekvő jólét nevű fióknál! • SELECT DISTINCT T. Példa: • Fiók(fiók_név.ügyfél_szám FROM Számla. Számlatulajdonos AS T WHERE S. hogy Keressük meg azoknak az ügyfeleknek az ügyfélszámát. fiók_város. összeg) • Számlatulajdonos(ügyfél_szám. Számlatulajdonos AS R WHERE T.ügyfél_szám FROM Számlatulajdonos AS T WHERE UNIQUE (SELECT R.számla_szám = Számla. . hitel_szám) Keressük meg azokat a fiókokat.ügyfél_szám FROM Számla. ügyfél_szám AND R. ügyfél_név.számla_szám = Számla.számla_szám = Számla. Keressük meg azokat a fiókokat. akiknek az összes budapesti fiókban van számlájuk! • SELECT DISTINCT S.érték. Ideiglenes relációk: Lehetőség van arra. Számlatulajdonos AS R WHERE T. Az utasítás alakja: • WITH R(oszloplista) AS R-et definiáló lekérdezés R-et használó lekérdezés. Max_egyenleg WHERE Számla. Keressük meg azoknak az ügyfeleknek az ügyfélszámát.egyenleg = Max_egyenleg. hitel_szám) Keressük meg a legnagyobb egyenlegű számlákat! • WITH Max_egyenleg(érték) AS SELECT MAX(egyenleg) FROM Számla SELECT számla_szám FROM Számla.

Keressük meg azokat a fiókokat. Így az egymásból legfeljebb egy átszállással elérhető város párokhoz jutottunk. név. a PÁROSOK eredményez új sorokat. hova) AS Párosok UNION (SELECT Párosok. Ez a következőképp lehetséges: . .honnan. hogy csak lineáris rekurzió használható.hova = Eljut. AVG(egyenleg) FROM Számla GROUP BY fiók_név SELECT fiók_név. A többi oszlop NULL értéket vesz fel. amennyit az oszloplista tartalmaz.. lakcím. Egyébként. Ezért az egyesítés második tagja most az egymásból egy ill. 'Tóth Aladár'. érték) táblát szeretnénk létrehozni. Rekurzió: A WITH utasítás segítségével rekurzív lekérdezéseket is megfogalmazhatunk. Ha valamelyik lépésben már nem bővül az ELJUT reláció. • INSERT INTO Dolgozó (név. Az ELJUT reláció kezdetben üres. A második lépésben a PÁROSOK és az ELJUT is ugyanazt tartalmazza. Határozzuk meg azokat a várospárokat. A táblába adatokat tölthetünk át másik táblából is. hova FROM Járatok. Fiók_összeg_átlag WHERE Fiók_összeg. ehhez vesszük még hozzá az egymásból közvetlenül elérhető város párokat. Példa: A következő relációban repülőgép járatokról tárolunk információkat: JÁRATOK(légitársaság. adószám) VALUES ('Tóth Aladár'.érték. két átszállással elérhető város párokat eredményezi. Eljut WHERE Párosok. hova. indulás. név. egységár. 1111). egyenleg_átlag) AS SELECT fiók_név. az egymásból közvetlenül elérhető város párokat. egyenleg_átlag FROM Fiók_átlag WHERE egyenleg_átlag >= 100000. ezért a kiértékelés első lépésében csak az egyesítés első tagja. A harmadik lépésben az ELJUT reláció az egymásból legfeljebb egy átszállással elérhető város párokat tartalmazza. utasítással történik. akkor az eljárás befejeződik.hova FROM Párosok.Keressük meg a számlaegyenlegek átlagát minden olyan a fióknál. RECURSIVE Eljut(honnan. hova) AS SELECT honnan. Ezek közül az egyik. Fiók_összeg_átlag(érték) AS SELECT AVG(összeg) FROM Fiók_összeg SELECT fiók_név FROM Fiók_összeg. • INSERT INTO Dolgozó VALUES (1111. SUM(egyenleg) FROM Számla GROUP BY fiók_név. mint az összes fiók számlaegyenleg összegének átlaga! • WITH Fiók_összeg(fiók_név. Ha oszloplista nem szerepel. akkor valamennyi oszlop értéket kap a CREATE TABLE-ben megadott sorrendben. mennyiség) táblából egy Készlet (áru. ha a VALUES(értéklista) helyére egy alkérdést írunk: • INSERT INTO táblanév [(oszloplista)] SELECT . osztálykód) táblát. a DEFAULT kulcsszóval meghatározott értéket kapják. Eljut. honnan. az oszlopnévlistában nem szereplő mezők a NULL értéket ill. Azonban ilyen lekérdezésekre több megkötés van.. Az SQL nyelv II Adattáblák aktualizálása: A táblába új sor felvétele az • INSERT INTO táblanév [(oszloplista)] VALUES (értéklista). Példa: Tekintsük a DOLGOZÓ (adószám. A SELECT annyi oszlopot kell hogy kiválasszon. ahol a számlaegyenlegek összege nagyobb. stb.honnan) SELECT * FROM Eljut. hogy a Raktár (cikkszám. Így az egymásból legfeljebb két átszállással elérhető város párokhoz jutunk. összeg) AS SELECT fiók_név. . '12' ). ehhez vesszük még hozzá az egymásból közvetlenül elérhető város párokat.összeg > Fiók_összeg_átlag. érkezés). Így most az egyesítés második tagja az egymásból egy átszállással elérhető város párokat eredményezi. amelyek elérhetők egymásból! • WITH Párosok(honnan. amely az áruféleség megnevezését és az aktuálisan tárolt mennyiség értékét tartalmazza. Ezen kívül feltételek vannak még például a negáció használatára. Példa: Tegyük fel. ahol ez az átlag legalább 100000 Ft! • WITH Fiók_átlag(fiók_név.

• UPDATE Dolgozó SET osztálykód = '003' WHERE osztálykód = '012'. lakcím. . amely eleget tesz a WHERE feltételnek. COMMIT előtt még egyaránt rendelkezésre áll az eredeti és a módosított adat. Tekintsük például a következő táblákat: • DOLGOZÓ (adószám. Biztosítani kell. Módosítás esetén is alkalmazható alkérdés. az addig kiadott SQL parancsok hatását véglegesíti. név. • UPDATE Számla SET egyenleg = egyenleg + 10000 WHERE számlaszám = 456. A COMMIT utasítással a tranzakció sikeres befejeződését jelezzük. osztálynév. osztálykód) táblát. Ha a WHERE feltételt elhagyjuk. fizetés) • PROJEKT (adószám. Példa: Tekintsük ismét a DOLGOZÓ (adószám. Először nyilván ellenőriznünk kell. amelyek eleget tesznek a WHERE feltételnek. 5. amelyeket egy egységként célszerű kezelni. óraszám) Az alábbi utasítás fizetésemelést hajt végre az A12 projekt dolgozóinál: • UPDATE Dolgozó SET fizetés=fizetés+10000 WHERE adószám IN (SELECT adószám FROM Projekt WHERE pkód='A12'). név. • UPDATE Számla SET egyenleg = egyenleg + 10000 WHERE számlaszám = 456. utasítással történik. hogy az 123 számú számla egyenlege legalább 10000 Ft. így a változás visszafordítható. • . pkód. Sor(ok) törlése a • DELETE FROM táblanév [ WHERE feltétel ].. Az értékadás minden olyan soron végrehajtódik. Az átutalás összege legyen 10000 Ft. • UPDATE Dolgozó SET lakcím = 'Szeged. . akkor az értékadás az összes sorra megtörténik. akkor az átutalt összeg elvész. Probléma: Ha hardver vagy szoftver hiba miatt az adatbáziskezelő rendszer egy tranzakció végrehajtása közben leáll (rendszerösszeomlás). INSERT INTO Készlet SELECT név. A tranzakciós feldolgozást támogató legfontosabb SQL utasítások a COMMIT és a ROLLBACK. • DELETE FROM Dolgozó WHERE név = 'Kovács József '. Példák: Tekintsük a • DOLGOZÓ (adószám. • DELETE FROM Osztály. Tranzakciók: Egy tranzakció adatbáziskezelő műveletek olyan sorozata. Ha WHERE feltétel nem szerepel. Hatására azok a sorok törlődnek. hogy újraindításakor a tranzakció előtti állapotot kell reprodukálni. lakcím. A COMMIT lezárja a tranzakciót. érték INTEGER). akkor az átutalást a következő két UPDATE utasítással valósítjuk meg. vagy egyik se hajtódjon végre. mert a részműveletek közben átmenetileg sérülhet az adatbázis integritása. vezAdószám) táblákat. egységár * mennyiség FROM Raktár. Rendszerösszeomlás esetén ez utóbbi azt jelenti. és ez a fenti példában a két UPDATE utasítás között következik be. Rózsa u. név. akkor az összes sor törlődik (de a séma megmarad).CREATE TABLE Készlet (áru CHAR(20). • UPDATE Számla SET egyenleg = egyenleg – 10000 WHERE számlaszám = 123. Példa: A SZÁMLA (számlaszám. COMMIT.' WHERE név = 'Kovács József'. egyenleg) táblán banki átutalást hajtunk végre az 123 számú számláról a 456 számúra. Sor(ok) módosítása az • UPDATE táblanév SET oszlop = kifejezés. oszlop = kifejezés [ WHERE feltétel ]. osztálykód) • OSZTÁLY (osztálykód. utasítással lehetséges.. Ha igen. Az előbbi két UPDATE utasítást a következőképpen foglalhatjuk egy tranzakcióba: • BEGIN TRANSACTION UPDATE Számla SET egyenleg = egyenleg – 10000 WHERE számlaszám = 123. hogy vagy végrehajtódjon a tranzakció valamennyi utasítása.

• READ COMMITTED: piszkos adat olvasása nem engedélyezett. akkor a fedezetellenőrzés dacára az egyenleg negatív lehet: • 1. • Változó adat olvasása: a tranzakció újraolvas egy adatot. Párhuzamosan futó tranzakciók esetén az alábbi anomáliák léphetnek fel: • Piszkos adat olvasása: más tranzakció által módosított. és ebből ketten egyszerre kívánnak átutalni 80000 Ft-ot. • Fantom adat olvasása: a tranzakció újraolvas egy táblát. folyamat: sz1: egyenleg := egyenleg – 80000 (új egyenleg: –60000) • 1. de még nem véglegesített adat olvasása. amelybe közben más (véglegesített) tranzakció új sorokat szúrt be. amely nagy adatbázis és sok egyidejű kliens folyamat esetén elfogadhatatlan. • 1. Ez tulajdonképpen azt jelenti. folyamat: sz1 fedezet ellenőrzés OK. Ekkor az előbb induló tranzakció zárolja az egész adatbázist mindaddig. hogy nem engedünk meg párhuzamos hozzáféréseket. majd kölcsönösen egymásra várnak. hogy tovább dolgozhassanak.A ROLLBACK utasítással a tranzakció sikertelen befejeződését jelezzük. mikor egyik vagy mindkettő módosítja az adatbázist. • READ WRITE: a tranzakció olvassa és írja is az adatbázist. . Az elérés paraméter két lehetséges értéke: • READ ONLY: a tranzakció csak olvassa az adatbázist. így a két olvasás eredménye eltér egymástól. amíg véget nem ér. Az adatbáziskezelő rendszer általában nem tudja megakadályozni. amelyet közben más (véglegesített) tranzakció módosított vagy törölt. A ROLLBACK visszapörgeti a változásokat a tranzakció elejéig. és ilyenkor visszapörgeti az azt előidéző valamelyik tranzakciót. folyamat: sz2: egyenleg := egyenleg + 80000 • 2. Például: A példában a tranzakciók előbb zárolják az S és T táblát. amelyhez hozzá akar férni. Ez azonban holtponthoz (deadlock) vezethet. hogy egy folyamat csak azt a táblát zárolja. akkor egymást megzavarhatják. Ekkor mindhárom anomália egyaránt felléphet. Egy másik lehetőség. folyamat: sz1 fedezet ellenőrzés OK. Példa: Az előbbi pénzátutalás program esetén ha az első számla egyenlege 100000 Ft. azok nem fognak megjelenni az adatbázisban. de észleli a holtpontot. Az izoláció paraméter négy lehetséges értéke: • READ UNCOMMITTED: piszkos adat olvasása engedélyezett. Most viszont a második tranzakció el sem tud indulni az első befejezése előtt. mikor is párhuzamos folyamatok egymásra várnak. folyamat: sz1: egyenleg := egyenleg – 80000 (új egyenleg: 20000) • 2. Kliens-szerver modellben ha a tranzakciók párhuzamosan. vagyis elérhetőségének korlátozása más tranzakciók részére. A fenti anomáliák kiszűrése a tranzakció izolációs szintjének megadásával lehetséges: • SET TRANSACTION elérés ISOLATION LEVEL izoláció. folyamat: sz3: egyenleg := egyenleg + 80000 A probléma egy lehetséges megoldása az adatok időleges zárolása. Az utasítás a tranzakció elején adható ki. Itt csak az utolsó két anomália léphet fel. időosztásban futnak. • 2.

hogy elfogadja-e azt. Nyilván minél magasabb szintű izolációt alkalmazunk. • T2-ben nem megengedett olyan kulcs módosítása vagy sor törlése. ezért csak más helyet tud foglalni (ha van). hogy adott esemény bekövetkezésekor (például egy adott táblába történő beszúráskor). Itt egyik anomália sem léphet fel. vagyis párhuzamos végrehajtása egyenértékű kell. Kulcsok és idegen kulcsok: Aktív elemek közül eddig a következőkkel találkoztunk: • PRIMARY KEY (oszloplista): elsődleges kulcs • UNIQUE (oszloplista): kulcs • FOREIGN KEY (oszloplista) REFERENCES tábla(oszloplista): külső kulcs Idegen kulcsok: REFERENCES (külső kulcs hivatkozás) esetén ON-feltételek megadásával szabályozhatjuk a rendszer viselkedését (jelölje T1 a hivatkozó és T2 a hivatkozott táblát): Alapértelmezés (ha nincs ON-feltétel): • T1-ben nem megengedett olyan beszúrás és módosítás. Az SQL nyelv III Aktív elemek: A kereskedelmi adatbáziskezelő rendszerek mindegyike biztosítja a felhasználók számára úgynevezett aktív elemek létrehozásának a lehetőségét. amely T2-ben nem létező kulcs értékre hivatkozna. hogy legyen a sorban egymás utáni végrehajtással. utasítást (amely egyébként az alapértelmezés). annál nagyobb az adatbiztonság.az ügyfél visszautasítása miatt . Ebben a példában piszkos adat olvasása történhet a következőképpen: A T1 tranzakció ideiglenesen lefoglalja például az 52-es helyet. • . de csökken a párhuzamosítás lehetősége. amit egyszer megírunk és eltárolunk az adatbázisban. A READ WRITE + READ UNCOMMITTED tranzakciók a legveszélyesebbek (ezért READ UNCOMMITTED esetén az alapértelmezés READ ONLY) Példa: A pénzátutalás program esetén a leírt anomália megszüntethető. vagy egy logikai kifejezés értékének igazzá válásakor végrehajtásra kerüljön. Az elérés paraméter alapértelmezése • READ UNCOMMITTED izolációs szint esetén READ ONLY. A párhuzamosan futó tranzakció az 52-es helyet már foglaltnak érzékeli. • SERIALIZABLE: sorosítható tranzakció. majd megkérdezi az ügyfelet. ha nem akkor visszavon (ROLLBACK). Ha igen. Ha úgy döntünk. ha a tranzakció elején kiadjuk a • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. Itt csak az utolsó anomália fordulhat elő. Ugyanakkor . Ha van ON-feltétel: • ON UPDATE CASCADE: ha T2 egy sorában változik a kulcs értéke. de azt T2 mégsem tudta lefoglalni. és az olvasott adatokat más folyamat nem módosíthatja a tranzakció végéig. Az izoláció paraméter alapértelmezése SERIALIZABLE. • minden más esetben READ WRITE. hogy a leírt anomália nem jelent komolyabb veszélyt és várhatóan igen ritkán fog fellépni.REPEATABLE READ: piszkos adat olvasása nem engedélyezett. akkor véglegesít (COMMIT). akkor a rá való T1beli hivatkozások is megfelelően módosulnak (módosítás továbbgyűrűzése). Egy aktív elem olyan kifejezés vagy utasítás. kiadásával gyorsíthatjuk a párhuzamos tranzakciók feldolgozását. amelyre T1 hivatkozik. akkor • SET TRANSACTION READ WRITE ISOLATION LEVEL READ UNCOMMITTED.T1 később felszabadítja az 52es helyet. Tekintsünk egy számítógépes repülőgép-helyfoglalást: A program először lefoglalja az első szabad helyet. és azt várjuk el.

Hatására a rendszer megakadályoz minden olyan műveletet. Sorra vonatkozó megszorítások a CREATE TABLE végére. Alakja: • CREATE ASSERTION név CHECK (feltétel).vezAdószám AND fizetés < 100000)). fizetés. Osztály WHERE Dolgozó. A következőképpen írhatjuk elő.) Példa: CREATE TABLE Dolgozó (adószám DECIMAL(10) PRIMARY KEY. lakcím CHAR(40) DEFAULT 'ismeretlen'. nem CHAR(1) CHECK (nem = 'F' OR nem = 'N')). név CHAR(30). • ha egy dolgozót vezetőnek nevezünk ki. Az önálló megszorítás törlése: • DROP ASSERTION név. Példa: Tekintsük a következő táblákat: • DOLGOZÓ(adószám. osztálykód) • OSZTÁLY(osztálykód. akkor T1-ben a rá való külső kulcs hivatkozások értéke NULL lesz. Megszorítások hatályba léptetése: Bizonyos esetekben előfordulhat. osztkód CHAR(3) REFERENCES Osztály(osztkód)). Ilyenkor a megoldás a következő: Minden megszorításhoz • DEFERRABLE ill. a táblafeltételek után helyezendők el. amelyek több sorra vagy több táblára (általában. a legbonyolultabbak az önálló megszorítások. név CHAR(30) NOT NULL. NOT DEFERRABLE záradék segítségével megadhatjuk. ha a feltétel teljesül. ON DELETE SET NULL: ha T2-ben törlünk egy sort. amely az adott attribútum NULL értékét eredményezné. ha a tábla valamely sora megváltozik. DEFERRABLE záradék esetén • .• • • ON DELETE CASCADE: Ha T2-ben törlünk egy sort. amelyek az épségi megszorításokat az adatbázisséma részeként adjuk meg. A feltételben szereplő táblák bármelyikének módosításakor a feltétel ellenőrzésre kerül. (Itt SET NULL helyett SET DEFAULT is írható. akkor T1-ben a rá való külső kulcs hivatkozások értéke NULL lesz. lakcím CHAR(40). • CHECK (feltétel): Az adott attribútum módosítását a rendszer csak akkor engedi meg. Akkor lépnek működésbe. a teljes adatbázissémára) vonatkozhatnak. NOT DEFERRABLE záradék esetén. Önálló megszorítások: Az SQL nyelv számos lehetősége közül. Ezért a fenti önálló megszorítás nem helyettesíthető egyetlen sorra vonatkozó megszorítással. osztálykód CHAR(3) REFERENCES Osztály(osztálykód) ON UPDATE CASCADE ON DELETE SET NULL). osztálynév. hogy a definiált megszorítások együttesen az adatbázis számunkra kívánatos módosításait is megakadályozzák (körkörös megszorítások). Példa: • CREATE TABLE Dolgozó (adószám DECIMAL(10) PRIMARY KEY. a feltételek teljesülését a módosítás után a rendszer azonnal ellenőrzi. név. További megszorítások: Kulcsfeltételeken kívül másfajta megszorításokat is definiálhatuk: • NOT NULL: Az adott attribútum értéke nem lehet NULL.Adószám = Osztály. A feltétel két esetben sérülhet: • ha egy dolgozó fizetését változtatjuk. ON UPDATE SET NULL: ha T2 egy sorában változik a kulcs értéke. hogy a vezetők fizetése legalább 100 000 Ft legyen: • CREATE ASSERTION VezetőFizetés CHECK (NOT EXISTS (SELECT * FROM Dolgozó. vezAdószám). akkor T1-ben is törlődnek a rá hivatkozó sorok (törlés továbbgyűrűzése). hogy a rendszer mikor hajtsa végre az adott megszorítás ellenőrzését. amely az alapértelmezés.

egyenleg >= 100000))). ügyfél_név. Egy DEFERRABLE záradékú megszorítás lehet: • INITIALLY DEFERRED: ilyenkor a feltételek teljesülését csak az aktuális tranzakció végén ellenőrzi a rendszer. törlés vagy módosítás). ezt bármikor megváltoztathatjuk.fiók_név = Fiók. A trigger három dologban tér el a megszorítástól: • A triggereket a rendszer csak akkor ellenőrzi.számla_szám AND Számla. Számla WHERE Hitel. Szintaxis: • CREATE ASSERTION név CHECK (feltétel) DEFERRABLE INITIALLY {DEFERRED | IMMEDIATE}. fiók_név. Számlatulajdonos. aki számlát is vezet és a számla egyenlege legalább 100000 Ft! • CREATE ASSERTION egyenleg-ellenőrzés CHECK (NOT EXISTS (SELECT * FROM Hitel WHERE NOT EXISTS ( SELECT * FROM Adós. Ha viszont a trigger feltétele teljesül. hogy minden hitelhez tartozik olyan adós.ügyfél_szám = Számlatulajdonos.viszont lehetőségünk van azt mondani. • CREATE TRIGGER név { BEFORE | AFTER } { DELETE | INSERT | UPDATE [OF oszlopok] } ON tábla [ REFERENCING [OLD ROW AS régi] [NEW ROW AS új]] [ FOR EACH ROW ] [WHEN (feltétel)] programblokk. . fiók_város. Névvel ellátott DEFERRABLE megszorítások esetén a megszorítás hatályba léptetésének idejére vonatkozó megkötést a következő módon változtathatjuk meg: • SET CONSTRAINTS név {DEFERRED | IMMEDIATE}. az adatbázis-programozó által megadott események bekövetkeznek (adott relációra vonatkozó beszúrás.fiók_név))). ha bizonyos.fiók_név = Fiók.fiók_név) >= (SELECT SUM(egyenleg) from Számla WHERE Számla. ügyfél_cím) • Számla(számla_szám. fiók_név. Triggerek: A trigger egy aktualizálási művelet esetén végrehajtandó programrészletet definiál. AFTER: az aktualizálási művelet előtt vagy után lép működésbe a trigger. összeg) • Számlatulajdonos(ügyfél_szám. • INITIALLY IMMEDIATE: ilyenkor a feltételek teljesülését a módosítás után a rendszer azonnal ellenőrzi. • Ha a feltétel nem teljesül.számla_szám = Számla. akkor a rendszer végrehajtja a triggerhez tartozó műveletet. Ellenőrizzük. Példa: • Fiók(fiók_név. hogy a feltételek teljesülését csak az aktuális tranzakció végén ellenőrizze a rendszer.hitel_szám = Adós. egyenleg) • Hitel(hitel_szám. o BEFORE.ügyfél_szám AND Számlatulajdonos. hogy a hitelek összege minden bankfiókban kisebb. számla_szám) • Adós(ügyfél_szám. • A kiváltó esemény azonnali megakadályozása helyett a trigger először egy feltételt vizsgál meg.hitel_szám AND Adós. o név: a trigger neve. akkor a kiváltó eseményre válaszul a triggerrel összefüggésben semmi nem történik. mint a számlaegyenlegek összege! • CREATE ASSERTION összeg-ellenőrzés CHECK (NOT EXISTS (SELECT * FROM Fiók WHERE (SELECT SUM(összeg) FROM Hitel WHERE Hitel. hitel_szám) Ellenőrizzük. tartalék) • Ügyfél(ügyfél_szám. Azonban a megszorítás DEFERRABLE volta miatt.

Ilyen esetben • a számlaegyenleget nullázzuk. számla_szám FROM Számlatulajdonos WHERE Számlatulajdonos. osztálykód). – új. fiók_név. END.fizetés WHERE adószám=új. új. tartalék) • Ügyfél(ügyfél_szám.egyenleg < 0) BEGIN INSERT INTO Adós (SELECT ügyfél_szám. hogy egy dolgozó fizetését csökkentsük.fizetés) UPDATE Dolgozó SET fizetés=régi. o INSERT INTO Hitel VALUES (új.számla_szám. hogy a dolgozók fizetését úgy változtassuk. ON tábla: ezen tábla aktualizálásakor lép működésbe a trigger. END.számla_szám = új. pontosvesszővel elválasztva. hogy a tábla aktuális sorának aktualizálás előtti és utáni állapotára névvel hivatkozzunk.adószám. mégpedig az OLD TABLE és NEW TABLE kulcsszavakkal.DELETE. o FOR EACH ROW: ha megadjuk. UPDATE Számla SET egyenleg = 0 WHERE Számla. REFERENCING: lehetővé teszi. név. o o o Az SQL nyelv IV .számla_szám). Az alábbi trigger megakadályozza. hitel_szám) Az alábbi trigger megakadályozza. o CREATE TRIGGER negatív-egyenleg AFTER UPDATE OF egyenleg ON Számla REFERENCING NEW ROW AS új FOR EACH ROW WHEN (új. akkor a trigger a tábla minden egyes sorára lefut. NEW ROW AS új FOR EACH ROW WHEN (régi. fiók_város. hogy egy számla egyenlege negatív legyen. • ennek a hitelnek a száma ugyanaz. fizetés. INSERT INTO Dolgozó (SELECT  FROM régi).számla_szám. fiók_név. UPDATE OF: az aktualizálási művelet neve. amelynek összege a számlán megjelenő hiány. • létrehozunk egy hitelt. név. összeg) • Számlatulajdonos(ügyfél_szám.egyenleg). számla_szám) • Adós(ügyfél_szám. ügyfél_név.fiók_név. fizetés. ügyfél_cím) • Számla(számla_szám. Példa: Tekintsük a következő táblát: DOLGOZÓ(adószám. hogy az átlagfizetés 50000 Ft alá csökkenjen: • CREATE TRIGGER átlagfizetés AFTER UPDATE OF fizetés ON Dolgozó REFERENCING OLD TABLE AS régi. Ekkor csak a tábla aktualizálása során megváltozott sorok halmazának a változás előtti és utáni állapotára hivatkozhatunk. ilyen esetben a korábbi fizetést állítja vissza: • CREATE TRIGGER fizetéscsökkentés AFTER UPDATE OF fizetés ON Dolgozó REFERENCING OLD ROW AS régi.fizetés > új. egyenleg) • Hitel(hitel_szám. INSERT. o WHEN feltétel: a megadott feltétel teljesülése esetén hajtódik végre a trigger. Példa: • Fiók(fiók_név. Ha nem adjuk meg. amelyet az aktualizálási művelet érint (sor szintű trigger). Az alábbi trigger megakadályozza. osztálykód) IN új. o programblokk: egy vagy több SQL utasításból álló blokk.számla_szám = új. akkor egy aktualizálási művelet esetén csak egyszer fut le a trigger (utasítás szintű trigger). mint a negatív egyenlegű számláé. NEW TABLE AS új FOR EACH STATEMENT WHEN (50000 > (SELECT AVG(fizetés) FROM Dolgozó)) BEGIN DELETE FROM Dolgozó WHERE (adószám.

egységár. lakcím FROM Dolgozó WHERE osztálykód='A01'. Ha egy módosítható nézettáblába új rekordot veszünk fel. Példa . fizetés) táblához a • CREATE VIEW Dolg(adószám. Ha a nézettábla tartalmát módosítjuk. Bizonyos esetekben lehetőség van a nézettáblák módosítására.Adatok elrejtése: a DOLGOZÓ (adószám. amelyek nem léteznek fizikailag az adatbázisban. Tulajdonképpen egy transzformációs formula. mint ha ennek segítségével a tárolt táblák adatait látnánk egy speciális szűrőn keresztül. név. hogy egy nézettáblát mikor lehet módosítani. akkor az alaptáblának a nézettáblában nem szereplő oszlopaiba szükségképpen NULL kerül felvételre. ott rendszerint nézettábla neve is szerepelhet. név. hogy nem lehet módosítani a nézettáblát. ha definíciójában • SELECT után DISTINCT opció van. érték) AS SELECT név. Nem lehet módosítani például a fenti Készlet tábla érték mezőjét. Az SQL szabványok pontosan leírják. hogy a Dolg(adószám. 'Tóth Pál'. • FROM után egynél több táblanév fordul elő. utasítással történik. mint a tárolt adattáblák. vagyis ahol egy SQL parancsban táblanév adható meg. lakcím. Nézettábla törlése a • DROP VIEW táblanév. osztálykód. és természetesen megjelenik a nézettáblában is.Származtatott adatok kezelése: a RAKTÁR (cikkszám. név. 'Győr'). név. azaz a rendszer valamilyen fizikai struktúban tárolja ezeket. lakcím) AS SELECT adószám. de a Dolg tábla lakcím mezője már gond nélkül módosítható. név. elég annyit megjegyeznünk. A nézettábla nem tárol adatokat. A nézettáblák általában ugyanúgy használhatók. Ilyen relációkat egy lekérdezéshez hasonló kifejezés segítségével definiálhatunk. ha azt a rendszer korrekten és egyértelműen végre tudja hajtani a tárolt táblákon. fizetés) táblához létrehozzuk a következő nézettáblát: • CREATE VIEW Dolg(adószám. lakcím) AS SELECT adószám. hogy egy SQL rendszer csak akkor engedi meg a nézettábla módosítását. osztálykód. Példa . Nézettáblák alkalmazási lehetőségei: • Származtatott adattáblák létrehozása. A SELECT utasítás eredménytáblája alkotja a nézettáblát. és majd csak a rá való hivatkozáskor generálja a szükséges adatokat. összegzőtáblák). név. amelyet úgy képzelhetünk el. ezeket nézettábláknak nevezzük. akkor a módosítás a megfelelő tárolt táblákon hajtódik végre. Létezik az SQL relációknak egy másik típusa. lakcím) nézettáblába új rekordot szeretnénk felvenni: • INSERT INTO Dolg VALUES (3333.Nézettáblák: A CREATE TABLE utasítás segítségével definiált relációk fizikailag léteznek az adatbázisban. A leírás elég bonyolult. utasítással létrehozott nézettáblát. név. . amelyek a törzsadatok módosításakor automatikusan módosulnak (pl. • Bizonyos adatok elrejtése egyes felhasználók elől (adatbiztonság vagy egyszerűsítés céljából). Tegyük fel. Nézettábla létrehozása: • CREATE VIEW táblanév(oszloplista) AS alkérdés. A CREATE VIEW végrehajtásakor a rendszer csak letárolja a nézettábla definícióját. Alapelv. mennyiség) táblából létrehozott nézettábla: • CREATE VIEW Készlet(áru. egységár * mennyiség FROM Raktár. lakcím FROM Dolgozó WHERE osztálykód='A01'. név. • WHERE után alkérdésben szerepel a FROM utáni táblanév. Példa: Tekintsük a DOLGOZÓ (adószám. lakcím.

vagyis az új dolgozó nem az 'A01' osztályra kerül felvételre. A hiba kiküszöbölhető. osztálykód) AS SELECT adószám. kifejezetten a nézettáblák módosítását támogató ún. vagy 'A01'-től különböző osztálykód felvitelét. amelynek segítségével hatékonyan meg tudjuk találni a reláció azon sorait. 'Tóth Pál'. név.adószám. amelynek első oszlopa az indexkulcsot.Mivel osztálykód nem szerepel Dolg-ban. nem engedi meg az osztálykód módosítását. Példa: . amely nem tesz eleget a leválogatási feltételnek. így értéke az új rekordban szükségképpen NULL lesz. új. amelyek az adott attribútumon valamilyen fix értéket vesznek fel. osztálykód FROM Dolgozó WHERE osztálykód='A01' WITH CHECK OPTION. új. 'A01'). és így nem jelenik meg Dolgban. hogy létezik egy egészen más szemléletű. 'Győr'. INSTEAD OF triggert használó megoldás is: • CREATE TRIGGER DolgBeszúrás INSTEAD OF INSERT ON Dolg REFERENCING NEW ROW AS új FOR EACH ROW INSERT INTO Dolgozó(adószám.név. 'A01'). Ha a CREATE VIEW utasítás végére a WITH CHECK OPTION záradékot illesztjük. Az indexet is táblaként lehet elképzelni. akkor a rendszer nem engedi meg a nézettábla olyan módosítását. osztálykód) VALUES (új. lakcím. Indexek: Egy reláció valamely attribútumához tartozó index egy olyan adatszerkezet. Az adott attribútumot indexkulcsnak nevezzük. lakcím. név. Például • CREATE VIEW Dolg2(adószám. lakcím. lakcím. osztálykód FROM Dolgozó WHERE osztálykód='A01'.lakcím. ha az osztálykódot is felvesszük Dolg oszlopai közé: • CREATE VIEW Dolg2(adószám. Végül megjegyezzük. név. név. lakcím. INSERT INTO Dolg2 VALUES (3333. osztálykód) AS SELECT adószám. név. a második a megfelelő rekord fizikai sorszámát tartalmazza.

Egy csomópont egy lemezblokkot foglal el. Indexek definiálásánál két szempontot kell mérlegelni: • Adott attribútumokhoz tartozó index megléte jelentősen gyorsítja azokat a lekérdezéseket. amelyekben az adott attribútumok szerepelnek. illetve gyorsíthatja azokat az összekapcsolás műveleteket. utasítással történik. így a gyakorlatban „konstans” keresési idővel számolhatunk. Index törlése a • DROP INDEX indexnév. Mivel a keresés idejében a lemezolvasás a meghatározó.i) párt fűzzük fel a fára. így a rekordok sorszámai nem változnak meg. amely a megadott tábla felsorolt oszlopaira. fizikailag továbbra is a táblában marad. A B-fát általában mágneslemezen tárolják. amelyhez az adott attribútumok tartoznak a beszúrás. Index létrehozása a • CREATE INDEX indexnév ON tábla(oszloplista).i) pár beszúrásra kerül az indexbe. A folyamatot úgy képzelhetjük el. ahol zi az indexkulcs értéke az adott rekordban. mint indexkulcsra generál indexet. • A tábla rendezett listázásához a B-fát kell bejárni. akkor az index is újragenerálódik. hiszen ekkor végig kell menni a teljes táblán. Ha a sok törölt rekord miatt a tábla fizikai tömörítése is szükségessé válik. az egyes rendszereknél csak logikailag törlődik. • minden módosítás után kiegyensúlyozott marad (így a módosítás a legrosszabb esetben is n helyett csak log(n) műveletet igényel). törlés és módosítás műveletek sokkal bonyolultabbak és időigényesebbek. amelyekben az adott attribútumok értékeit rögzítjük. • Ha a táblába új rekordot veszünk fel. amely a bináris keresőfa általánosítása. de valamilyen formában minden rendszer támogatja. • Ha rekordot törlünk a táblából. Az indextábla általában úgynevezett B-fa (balanced = kiegyensúlyozott) struktúrában kerül tárolásra. egyidejűleg a (zi. . Tulajdonságai: • egy csomópontnak kettőnél több gyermeke lehet. Az index használata: • Az elkészült indexben az indexkulcs adott értékéhez (például a 2276 könyvszámhoz) gyorsan előkereshető a megfelelő fizikai rekord sorszáma. Az indexek kezelése nem része az SQL szabványnak. hogy az i-edik rekordhoz egy (zi. ezért akár több száz gyermekre mutató pointert is tartalmazhat.i) párt generálunk. ez mindig a tábla végére kerül. Index létrehozása viszonylag lassú.Az index konkrét megvalósítása adatbáziskezelő rendszerenként változik. utasítással lehetséges. • Azon relációk esetén. i pedig a rekord fizikai sorszáma. A keresés ritkán mélyebb 3 szintnél. és ezt a (z i.

Materializált nézettáblák: A nézettáblákra eddig úgy tekintettünk, mint egy reláció logikai leírására. Azonban ha egy nézettáblát elég sokszor használunk, akkor érdemes lehet azt fizikailag is létrehozni, materializálni. Ennek persze ára van, ezt a nézettáblát az alaptáblák minden változtatásánál módosítani kell. Materializált nézettáblák a (virtuális) nézettáblákhoz hasonlóan hozhatók létre: • CREATE MATERIALIZED VIEW táblanév(oszloplista) AS alkérdés; A materializált nézettáblákat ugyanúgy használhatjuk lekérdezések FROM záradékában, mint a (virtuális) nézettáblákat. Mivel a materializált nézettáblák fizikailag léteznek, az azokat használó lekérdezések számottevően hatékonyabbak lehetnek, hiszen a „nehéz” részeket, pl. összekapcsolások, már a materializált nézettábla létrehozásakor végrehajtottuk. Viszonylag ritkán fordul elő, hogy az alaptáblák valamely módosítása után a materializált nézettáblát „nulláról” kell újra építeni. Általában elég néhány módosító utasítást végrehajtani a materializált nézettáblán, amelyek ráadásul tipikusan csak néhány rekordot érintenek (ezek valamely attribútuma egy fix érték). Egy másik megközelítés, hogy a materializált nézettáblákat nem frissítjük az alaptáblák minden módosítása után, csak meghatározott időközönként. Az SQL nyelv V Tárolt eljárások és függvények: A kereskedelmi adatbáziskezelő rendszerek mindegyike biztosít a felhasználók számára olyan lehetőséget, hogy az adatbázis sémával együtt eljárásokat és függvényeket is tárolhatunk, amelyeket SQL lekérdezésekben, illetve más SQL utasításokban használhatunk. Ezek az eljárások és függvények egy egyszerű, általános célú nyelven készülnek, és lehetővé teszik – az adatbázison belül – egy sor olyan művelet végrehajtását, amelyek nem fejezhetők ki SQL-ben. A következőkben a legfontosabb elemeket tekintjük át, amelyeket az SQL/PSM vagy PSM-96 szabvány ajánl. Az egyes rendszerek ettől több ponton is eltérhetnek, az alapötletek azonban mindenhol ugyanazok. Egy tárolt eljárást a következőképpen adhatunk meg: • CREATE PROCEDURE név (paraméterek) lokális deklarációk eljárástörzs; Egy tárolt függvény hasonló adhatunk meg, azonban itt a visszatérési érték típusát is specifikálni kell: • CREATE FUNCTION név (paraméterek) RETURNS típus lokális deklarációk eljárástörzs; Egy tárolt eljárás paraméterei mód-név-típus hármasok. A paraméter nevét a megszokott típusdeklaráció követi, azonban a nevet megelőzi a használat módja (adatközvetítés iránya), ami IN, OUT vagy INOUT lehet. • IN: csak az eljárásba közvetít értéket, onnan kifelé nem (alapértelmezés, elhagyható), • OUT: csak a hívónak ad vissza értéket, bevitelre nem használható, • INOUT: mindkettő. Ezzel szemben egy tárolt függvény paraméterei csak IN módban használhatók. Tehát egy függvény információt csak a visszatérési értékén keresztül adhat át, máshogy nem. Példa: A következő eljárás vesz két címet – régicím valamint újcím – és a már jól ismert banki adatbázisunkban az újcím értékre változtatja azoknak az ügyfeleknek az ügyfél_cím attribútumát, akik eddig a régicím címen laktak. • CREATE PROCEDURE Költözés(IN régicím VARCHAR[255], IN újcím VARCHAR[255]) UPDATE Ügyfél SET ügyfél_cím=újcím WHERE ügyfél_cím=régicím; A paraméterek típusa konzisztens kell, hogy legyen a használt adattábla megfelelő attribútumainak típusával. Egyszerű utasítások: Egy tárolt eljárást a következő utasítással hívhatunk meg:

• CALL eljárásnév (paraméterek); Az utasítás kiadható • Más tárolt eljárásban vagy függvényben, • Általános SQL interfészen keresztül: o CALL Valami(1,3); Jegyezzük meg, hogy tárolt függvényt nem hívhatunk meg ilyen módon. Egy függvény – a programozási nyelveknél megszokottakhoz hasonlóan – itt is csak egy kifejezés részeként jelenhet meg. Egy tárolt függvény visszatérési értékét a • RETURN kifejezés; utasítással állíthatjuk be. Azonban – a programozási nyelveknél megszokottaktól eltérően – a return utasítás nem fejezi be a függvény végrehajtását, az a következő sorral folytatódik. Lokális változókat a • DECLARE név típus; utasítással definiálhatunk. A lokális változók magától értetődően csak az eljáráson, ill. függvényen belül élnek. Értékadó utasítás a következő: • SET változó=kifejezés; A kifejezés lehet egy lekérdezés is, amennyiben az egyetlen értéket eredményez. A NULL megengedett kifejezés. Ha pontosvesszővel végződő utasítások egy listáját a BEGIN és END kulcsszavak közé zárjuk, akkor azt a rendszer egyetlen utasításként kezeli. Ez a konstrukció ott hasznos, ahol a rendszer egyetlen utasítást vár. Ez a helyzet például az eljárások és függvények törzsénél is. Tetszőleges utasításnak adhatunk cimkét, ami egy névből és utána egy kettőspontból áll. A címke mindig megelőzi a cimkézett utasítást. Az utasítás általános formája a következő: • IF feltétel THEN utasításlista ELSEIF feltétel THEN utasításlista ELSEIF … ELSE utasításlista ENDIF; A feltétel természetesen valamilyen logikai kifejezés, ami egy SQL utasítás WHERE záradékában is előfordulhatna. Minden utasításlista pontosvesszővel végződő utasítások sorozata, nem szükséges BEGIN és END közé zárni őket. Az ELSEIF részek, továbbá az utolsó ELSE opcionálisak, tehát az IF … THEN … END IF szerkezet is használható. Példa: Tekintsünk egy filmeket nyilvántartó relációt: FILM (cím, év, stúdió, hossz, színes). Itt a cím attribútum a film címe, az év attribútum a gyártás éve, a stúdió attribútum a gyártó neve, a hossz attribútum a film hossza, a színes attribútum pedig azt mondja meg, hogy a film színes vagy fekete-fehér (logikai érték). A következő függvény bemenete egy e év és egy s stúdió, vissza pedig egy logikai értékkel tér, amely pontosan akkor igaz, ha az s stúdió az e évben gyártott legalább egy fekete-fehér filmet, vagy az e évben egyetlen filmet sem gyártott. • CREATE FUNCTION FF (e INT, s CHAR[15]) RETURNS BOOLEAN IF NOT EXISTS(SELECT  FROM Film WHERE év = e AND stúdió = s) THEN RETURN TRUE; • ELSEIF 1<= (SELECT COUNT() FROM Film WHERE év = e AND studió = s AND NOT színes) THEN RETURN TRUE; ELSE RETURN FALSE; END IF; Lekérdezések: SELECT … FROM …WHERE lekérdezések több módon is használhatók tárolt eljárásokban és függvényekben: • Használhatók feltételekben, mint ahogy az előbbi példában láttuk. • Használhatók értékadások jobb oldalán, amennyiben egyetlen érték az eredmény. • Akkor is legális a használata, ha az eredmény egy sor. Ilyenkor az utasításnak van egy INTO záradéka, ahol specifikákjuk, hogy az eredmény melyik komponense melyik változóba kerüljön. Ezek lehetnek eljárásparaméterek vagy lokális változók.

Ha az eredmény több sor, akkor egy rekordmutató, úgynevezett kurzor használata szükséges. Kurzor: Egy kurzort először definiálni kell: • DECLARE kurzornév CURSOR FOR alkérdés; A kurzor a lekérdezés (SELECT utasítás) által definiált eredménytáblához rendelődik. Használat előtt a kurzort meg kell nyitni: • OPEN kurzor; Hatására a kurzor a tábla első sora elé mutat. A kurzort léptetni a • FETCH FROM kurzor INTO változólista; utasítással lehet. Hatására a kurzor a soron következő rekordra lép, és annak mezői a változólista megfelelő elemeibe tárolódnak. Ha a FETCH elérte a tábla végét (az utolsó utáni rekordra lép), akkor a változók nem kapnak értéket, és SQLSTATE változóba a '02000' konstans kerül. SQLSTATE változó: hibakódot tartalmaz, az SQL utasítások állítják be. Általában 5 karakterből áll, hibátlan végrehajtás esetén értéke '00000'. Használat után a kurzort le kell zárni: • CLOSE kurzor; A lejárt kurzor OPEN-nel újra megnyitható, így a tábla többször végigjárható. Ciklusok: A legegyszerűbb ciklus konstrukció: • LOOP utasításlista END LOOP; A LOOP utasításnak gyakran adunk címkét, így a • LEAVE loop-címke utasítással – ha szükséges – kiléphetünk a ciklusból. Tipikusan akkor akarunk kilépni egy ciklusból, ha az kurzor segítségével dolgoz fel egy táblát, és a tábla végére értünk. Ehhez legtöbbször egy feltételt deklarálunk, amely az SQLSTATE változó '02000' értékének felel meg (nincs több sor): • DECLARE NincsTöbbSor CONDITION FOR SQLSTATE '02000' ; Az utasítás általános alakja: • DECLARE név CONDITION FOR SQLSTATE érték; Példa: Tekintsük ismét a filmeket nyilvántartó relációt: FILM (cím, év, stúdió, hossz, színes). A következő eljárás bemenete egy s stúdió, kimenete pedig a stúdió által gyártott filmek hosszának a átlaga. • CREATE PROCEDURE Átlag(IN s CHAR[15], OUT a REAL) DECLARE NincsTöbbSor CONDITION FOR SQLSTATE '02000' ; DECLARE mozi CURSOR FOR SELECT hossz FROM Film WHERE stúdió = s; DECLARE újhossz INTEGER; DECLARE db INTEGER; • BEGIN SET a = 0; SET db = 0; OPEN mozi; gyűjt: LOOP FETCH FROM mozi INTO újhossz; IF NincsTöbbSor THEN LEAVE gyűjt END IF; SET db = db + 1; SET a = a + újhossz; END LOOP; SET a = a / db; CLOSE mozi; END; Létezik FOR ciklus is, amelynek általános alakja: • FOR ciklusnév AS kurzornév CURSOR FOR lekérdezés DO utasításlista END FOR;

END. BEGIN SET a = 0. END. OUT a REAL) DECLARE db INTEGER. Az 'utasítás' végrehajtása után a DECLARE utáni paramétertől függően. Ha nem létezik a kérdéses című film. RETURN (SELECT év FROM Film WHERE cím = c). és csak a blokk utasításásaira vonatkozik. vizsgálja. DECLARE NincsTöbbSor CONDITION FOR SQLSTATE '02000' . Példa: Tekintsük ismét a filmeket nyilvántartó relációt: FILM (cím. amely a blokk végrehajtása alatt történt visszagörgetjük (meg nem történtté tesszük). megnyitja. TöbbSor RETURN NULL. A kivételkezelő mindig egy BEGIN … END blokkban jelenik meg. színes). Kivételkezelő deklarálása: • DECLARE CONTINUE|EXIT|UNDO HANDLER FOR feltétellista utasítás. • '21000' : több mint egy sor az eredmény. hogy mikor hagytuk el az utolsó sort.Ez az utasítás deklarálja a kurzort. akkor NULL értékkel tér vissza a függvény. hossz. Itt nem specifikálhatjuk. majd a blokkot elhagyjuk és a blokk után következő első utasítást hajtjuk végre. További cikluskonstrukciók: • WHILE feltétel DO utasításlista END WHILE. Kivételkezelés: Az SQL rendszer képes hibák jelzésére az öt karakteres SQLSTATE változó értékének '00000'-tól különbözővé állításával. végigmegy vele a lekérdezés eredményének sorain. év. mint lokális változókat. majd bezárja a kurzort. END FOR. A következő függvény bemenete egy c filmcím. BEGIN DECLARE EXIT HANDLER FOR NincsTöbbSor. három dolog történhet: • CONTINUE: a blokk utasításainak végrehajtását a hibát előidéző utasítás után következővel folytatjuk. • EXIT: a blokkot elhagyjuk és a blokk után következő első utasítást hajtjuk végre. • DO SET db = db + 1. Lássuk az előző példát FOR ciklussal: • CREATE PROCEDURE Átlag(IN s CHAR[15]. Ehelyett a lekérdezés eredményében szereplő attribútumneveket kell használni. melyek által reprezentált hibák megjelenése esetén az 'utasítás' hajtódik végre. • REPEAT utasításlista UNTIL feltétel END REPEAT. Tárolt eljárásokban és függvényekben lehetőségünk van annak meghatározására. visszatérési értéke a film gyártásának éve. ha egy adott utasítássorozat végrehajtása során hiba lép fel. • UNDO: az adatbázis és a lokális változók minden módosítását. vagy több ilyen című film is van. hogy az egyes komponensek mely változókba kerüljenek. stúdió. hogy mit tegyen a rendszer. DECLARE TöbbSor CONDITION FOR SQLSTATE '21000' . A feltétellista SQLSTATE '?????' alakú kifejezések vesszővel elválasztott sorozata. SET db = 0. SET a = a + hossz. Két példa: • '02000' : nincs több sor. • FOR gyűjt AS mozi CURSOR FOR SELECT hossz FROM Film WHERE stúdió = s. • CREATE FUNCTION Évszám (c VARCHAR[255]) RETURNS INT. SET a = a / db. Az SQL nyelv VI .

éspedig az a felhasználó. Oszlopok megadása esetén az engedély csak az adott oszlopokra vonatkozik.A2. producerAzon) • Stúdió(stúdióNév. ha a felhasználó a végrehajtáshoz szükséges valamennyi jogosultsággal rendelkezik. Példa: Tekintsük a következő. janeway átruházza a Stúdió táblára vonatkozó SELECT és INSERT jogosultságát. UPDATE[(oszlopok)]. • ALL PRIVILEGES: az összes adományozható jogosultság.J). • INSERT[(oszlopok)]. az engedélyezési diagramot. hossz. Él: (F1. Felhasználó: akinek a jogosultságot adományozzuk. törlés) rendelkezik az adott elem felett. színes. picard WITH GRANT OPTION. Csomópont: adott F felhasználónak adott A adatbáziselemre vonatkozó adott J jogosultsága (F. kirk továbbadja a a Stúdió táblára vonatkozó SELECT és INSERT(név) jogosultságát. Mivel a jogosultságok továbbadása során jogosultságok bonyolult rendszere jöhet létre. Tegyük fel. hogy a sémát egy janeway nevű felhasználó hozta létre. aki létrehozta.J2) azt fejezi ki. .Jogosultságok: Minden adatbáziselemnek van tulajdonosa. INSERT ON Stúdió TO sisko. élei adományozást jelentenek. elnökAzon). stúdióNév. GRANT SELECT ON Film TO kirk. DELETE: táblamódosítás engedélyezése a megfelelő utasítással. filmek adatait nyilvántartó adatbázist: • Film(cím. INSERT(név) ON Stúdió TO sisko. Továbbá egy adott csomópontban * jelöli az illető jogosultságra vonatkozó engedélyezési képességet. cím. Jogosultság adományozása más felhasználónak: • GRANT jogosultságok ON adatbáziselemek TO felhasználók [WITH GRANT OPTION]. • TRIGGER: trigger definiálásának engedélyezése. ezért a kiosztott jogosultságok áttekintésére kidolgoztak egy eszközt. hogy F1 felhasználó az A1 elemre érvényes J1 jogosultsága alapján F2-nek az A2 elemre J2 jogot adományozott. Egy jogosultság lehet (többek között) • SELECT: lekérdezés engedélyezése. módosítás. valamint a Film táblára vonatkozó SELECT jogosultságát a kirk és picard felhasználóknak az engedélyezési képességekkel együtt: • GRANT SELECT. valamint ** jelöli a tulajdonosi mivoltból származó jogosultságokat (ezek nem engedélyezéssel születtek). valamint a Film táblára vonatkozó SELECT jogosultságát a sisko felhasználónak szintén az engedélyezési képességek nélkül: • GRANT SELECT. picard továbbadja a megszerzett jogosultságait a sisko felhasználónak az engedélyezési képességek nélkül: • GRANT SELECT.J1)  (F2. A tulajdonos minden joggal (lekérdezés. • REFERENCES: külső kulcs hivatkozás engedélyezése az adatbáziselemre. Adatbáziselem: amelyre a jogosultságot adományozzuk. WITH GRANT OPTION: továbbadományozási jog adása. picard WITH GRANT OPTION.A1. INSERT ON Stúdió TO kirk. GRANT SELECT ON Film TO sisko. • EXECUTE: tárolt eljárás illetve függvény végrehajtásának engedélyezése. év. Az engedélyezési diagram csomópontjai jogosultságot. Egy SQL utasítást csak akkor hajt végre a rendszer.A. GRANT SELECT ON Film TO sisko.

hogy ugyanazt a jogot az illető más forrásból nem szerezte meg.Jogosultság visszavonása: • REVOKE jogosultságok ON adatbáziselemek FROM felhasználó {CASCADE. A REVOKE kulcsszó helyett írhatjuk a REVOKE GRANT OPTION FOR kulcsszavakat is. ha a jogosultság nem lett továbbadományozva. . feltéve. janeway visszavonja a picard felhasználónak átadott jogosultságokat: • REVOKE SELECT. ami nem magának a jogosultságnak. hanem csak engedélyezési képességének viszszavonását eredményezi. RESTRICT}. REVOKE SELECT ON Film FROM picard CASCADE. CASCADE: a visszavont jogosultság alapján továbbadományozott jogosultságok is visszavonásra kerülnek. RESTRICT: a visszavonás csak akkor hajtódik végre. INSERT ON Stúdió FROM picard CASCADE.

Sign up to vote on this title
UsefulNot useful