Előadás 03 Algebrai optimalizáció Mi a NULL? Multihalmazok Kiterjesztett műveletek a relációs algebrában
Algebrai optimalizáció Cél: a relációs algebrai kifejezéseket minél gyorsabban akarjuk kiszámolni. Költségmodell: a kiszámítás költsége arányos a relációs algebrai kifejezés részkifejezéseinek megfelelő relációk tárolási méreteinek összegével. Módszer: a műveleti tulajdonságokon alapuló ekvivalens átalakításokat alkalmazunk, hogy várhatóan kisebb méretű relációk keletkezzenek. Ekvivalens átalakítás: oly módon alakítjuk át a kifejezést, hogy az adatbázis minden lehetséges előfordulására (vagyis bármilyen is a táblák tartalma) minden esetben ugyanazt az eredményt (vagyis ugyanazt az output táblát) adja az eredeti és az átalakított kiértékelő fa. Az eljárás heurisztikus, tehát nem az argumentum relációk valódi méretével számol. Az átalakítások sorrendje nem determinisztikus, így más sorrendben végrehajtva az átalakításokat más végeredményt kaphatunk, de mindegyik általában jobb költségű, mint amiből kiindultunk.
A relációs algebrai kifejezést gráffal ábrázoljuk. Kifejezésfa: Megjegyzés: Mivel az SQL bővebb, mint a relációs algebra, ezért az optimalizálást bővített relációs algebrára is meg kell adni, de először a hagyományos algebrai kifejezéseket vizsgáljuk. A relációs algebrai kifejezést gráffal ábrázoljuk. Kifejezésfa: a nem levél csúcsok: a relációs algebrai műveletek: unáris ( ,,) – egy gyereke van bináris (-,,) – két gyereke van (bal oldali az első, jobb oldali a második argumentumnak felel meg) a levél csúcsok: konstans relációk vagy relációs változók Kiértékelése alulról felfelé történik!
E1(r1,...,rk) és E2(r1,...,rk) relációs algebrai kifejezések ekvivalensek (E1 E2 ), ha tetszőleges r1,...,rk relációkat véve E1(r1,...,rk)=E2(r1,...,rk). A szabályok olyan állítások, amelyek kifejezések ekvivalenciáját fogalmazzák meg. Bizonyításuk könnyen végiggondolható. Az állítások egy részében a kifejezések szintaktikus helyessége egyben elégséges feltétele is az ekvivalenciának.
Kommutativitás (szorzás, természetes összekapcsolás, théta-összekapcsolás) E1 E2 E2 E1 E1 || E2 E2 || E1 Asszociativitás (szorzás, természetes összekapcsolás, théta-összekapcsolás) (E1 E2) E3 E1 (E2 E3) (E1 || E2) || E3 E1 || (E2 || E3)
Vetítések összevonása, bővítése Legyen A és B két részhalmaza az E reláció oszlopainak úgy, hogy A B. Ekkor A(B(E)) A(E). Kiválasztások felcserélhetősége, felbontása Legyen F1 és F2 az E reláció oszlopain értelmezett kiválasztási feltétel. Ekkor F1F2(E) F1(F2(E)) F2(F1(E)). Kiválasztás és vetítés felcserélhetősége Legyen F az E relációnak csak az A oszlopain értelmezett kiválasztási feltétel. Ekkor A(F(E)) F(A(E)). Általánosabban: Legyen F az E relációnak csak az AB oszlopain értelmezett kiválasztási feltétel, ahol AB=. Ekkor A(F(E)) A(F(AB(E))).
Kiválasztás és szorzás felcserélhetősége Legyen F az E1 reláció oszlopainak egy részhalmazán értelmezett kiválasztási feltétel. Ekkor F(E1E2) F(E1)E2. Speciálisan: Legyen i=1,2 esetén Fi az Ei reláció oszlopainak egy részhalmazán értelmezett kiválasztási feltétel, legyen továbbá F=F1F2. Ekkor F(E1E2) F1(E1)F2(E2). Általánosabban: Legyen F1 az E1 reláció oszlopainak egy részhalmazán értelmezett kiválasztási feltétel, legyen F2 az E1E2 reláció oszlopainak egy részhalmazán értelmezett kiválasztási feltétel, úgy hogy mindkét sémából legalább egy oszlop szerepel benne, legyen továbbá F=F1F2. Ekkor F(E1E2) F2 (F1(E1)E2).
Kiválasztás és egyesítés felcserélhetősége Legyen E1, E2 relációk sémája megegyező, és F a közös sémán értelmezett kiválasztási feltétel. Ekkor F(E1E2) F(E1)F(E2). Kiválasztás és kivonás felcserélhetősége Ekkor F(E1 - E2) F(E1) - F(E2). Kiválasztás és természetes összekapcsolás felcserélhetősége Legyen F az E1 és E2 közös oszlopainak egy részhalmazán értelmezett kiválasztási feltétel. Ekkor F(E1||E2) F(E1) || F(E2).
Vetítés és szorzás felcserélhetősége Legyen i=1,2 esetén Ai az Ei reláció oszlopainak egy halmaza, valamint legyen A=A1A2. Ekkor A(E1E2) A1(E1)A2(E2). Vetítés és egyesítés felcserélhetősége Legyen E1 és E2 relációk sémája megegyező, és legyen A a sémában szereplő oszlopok egy részhalmaza. Ekkor A(E1E2) A(E1)A(E2). Megjegyzés: A vetítés és kivonás nem cserélhető fel, azaz A(E1 - E2) A(E1) - A(E2). Például:
A metszet és az unió kommutativitása E1 U E2 = E2 U E1 E1 E2 = E2 E1 Az unió és a metszet asszociativitása (E1 U E2) U E3 = E1 U (E2 U E3) (E1 E2) E3 = E1 (E2 Ç E3) A szelekció disztributív az unió, a metszet és a különbség műveletek felett sF(E1 - E2)= sF(E1) - sF(E2) = sF(E1)-E2
Az optimalizáló algoritmus a következő heurisztikus elveken alapul: Minél hamarabb szelektáljunk, hogy a részkifejezések várhatóan kisebb relációk legyenek. A szorzás utáni kiválasztásokból próbáljunk természetes összekapcsolásokat képezni, mert az összekapcsolás hatékonyabban kiszámolható, mint a szorzatból történő kiválasztás. Vonjuk össze az egymás utáni unáris műveleteket (kiválasztásokat és vetítéseket), és ezekből lehetőleg egy kiválasztást, vagy vetítést, vagy kiválasztás utáni vetítést képezzünk. Így csökken a műveletek száma, és általában a kiválasztás kisebb relációt eredményez, mint a vetítés. Keressünk közös részkifejezéseket, amiket így elég csak egyszer kiszámolni a kifejezés kiértékelése során.
Minta feladat SELECT A1, A2, B4, C3 FROM A,B,C WHERE A.A1 = B.B3 AND B.B4 = C.C3 AND A.A2 = 'X' Ha A, B, C három 10 oszlopos 100 soros tábla akkor a from A,B,C 30 oszlopos 1000000 soros táblát állít elő
SELECT * FROM ( SELECT A1, A2, B4 FROM (SELECT A1, A2 FROM A WHERE A2=X), (SELECT B3, B4 FROM B) WHERE A.A1=B.B3), (SELECT C3 FROM C)) WHERE B.B4=C.C3;
Mi a NULL? A NULL érték A NULL egész egyszerűen annyit jelent, hogy nincs beállított érték, vagyis röviden: ismeretlen. A NULL nem egyenlő a nulla (0) értékkel, sem az üres stringgel. értelmezésére több lehetőségünk is van: Nem-ismert érték: például tudom, „Joe’s Bár”-jának van valamilyen címe, de nem tudom, hogy mi az. Nem-definiált érték: például a házastárs attribútumnak egyedülálló embereknél nincs olyan értéke, aminek itt értelme lenne, nincs házastársa, ezért null érték.
Megjegyzések: – Összehasonlításnál a NULL minden relációban UNKNOWN (ismeretlen) értékkel tér vissza, ezért nem ad vissza sort. (IS szóval kell hasonlítani) (a NULL nem tesztelhető a szokványos összehasonlító operátorokkal (<, >, =, <>, !=, etc) – A NULL-al végzett műveletek NULL-t fognak visszaadni NULL-t tartalmazó kifejezés eredménye NULL, azaz 35431 + NULL eredménye ismeretlen (azaz NULL) – A COUNT(*) beleszámolja a NULL-okat, meg a COUNT(mezőnév) nem – Minden adat típus felveheti a NULL értéket
– A NULL nem foglal helyet (ez csak részben igaz, mert valahogy jelezni kell, hogy adott helyen NULL van) – Primary key nem lehet olyan oszlop, ami engedi a NULL értéket – Kezelni az ISNULL, COALESCE (NVL) függvényekkel, illetve a CASE WHEN utasítással lehet azt, hogy egy kifejezés értéke NULL-e, az IS NULL operátorral tesztelhetjük (illetve ennek ellenkezőjét az IS NOT NULL operátorral) – A GROUP BY és DISTINCT egyenlőként kezeli a NULL értékeket (NULL = NULL!) – Az EXCEPT, INTERSECT, UNION operátorok egyenlőként kezelik a NULL értékeket (NULL = NULL!) – A WHERE feltételben lévő IS NULL és társai teljesítmény gyilkos lekérdezéseket eredményezhetnek, kerüljük őket. – Default beállítás az SQL Serverben az ANSI_NULLS ON. Ezt meg lehet változtatni a SET ANSI_NULLS OFF paranccsal és akkor tényleges NULL = NULL lesz. Ez a beállítás nem javasolt, de azért előfordulhatnak olyan esetek, amikor jól jöhet.
Multihalmazok A multihalmazként kezelt relációban megengedjük ugyan, hogy ugyanazon sor többször szerepeljen, viszont a sorok sorrendje itt sem számít éppúgy, mint a halmazként kezelt relációk esetén. Ebben a fejezetben a relációkat inkább multihalmaznak tekintjük, mint halmaznak. Éppen ezért ugyanaz a sor többször is megjelenhet egy adott relációban. Néhány relációs műveletet azonban át kell fogalmaznunk, amennyiben a relációkra multihalmazokként tekintünk.
Mire jók a multihalmazok? A forgalomban lévő ABKR-ek a relációkat multihalmazként valósítják meg (nem pedig halmazként), mint ahogy azt már korábban is említettük. A relációk hatékony megvalósítása szempontjából a relációk multihalmazokként való kezelése több módon is gyorsíthatja a relációs műveleteket. Például: 1. Ha két multihalmazként értelmezett reláció unióját vesszük, akkor az egyik reláció sorait egyszerűen lemásoljuk, és ehhez a másolatához hozzáadjuk a másik reláció összes sorát. Ebben az esetben nem kell megszüntetnünk azon ismétlődő sorokat sem, amelyek mind a két relációban szerepelnek. 2. Ha a reláció vetítését halmazként fogjuk fel, akkor minden vetített sort össze kell hasonlítanunk az összes többi vetített sorral azért, hogy meggyőződjünk arról, hogy a vetítésben minden sor csak egyszer szerepel. Ezzel szemben, hogyha az eredményt multihalmaznak tekintjük, akkor minden sort levetítünk, és egyszerűen hozzáadjuk ezeket az eredményhez. Így egyetlen összehasonlítást sem kell végeznünk a vetítésből származó sorok között.
Multihalmazok egyesítése, metszete, különbsége Mind a három műveletnek új értelmezése lesz multihalmazok esetén. Tegyük fel, hogy R és S multihalmazok, és legyen t az R n-szer, illetve az S m-szer előforduló sora. Megengedjük azt is, hogy akár n, akár m, akár mindkettő 0 legyen. Ekkor: • Az R U S multihalmazon értelmezett egyesítésben a t sor n + m-szer fog előfordulni. • Az R n S multihalmazon értelmezett metszetben a t sor min(n, m)-szer fog előfordulni. • Az R - S multihalmazon értelmezett különbségben a t sor max(O, n - m)-szer fog előfordulni. Azaz ha a t többször fordul elő R-ben, mint S-ben, akkor t az R- S-ben annyiszor fordul elő, mint ahányszor előfordult R-ben mínusz ahányszor előfordul S-ben. Amennyiben viszont t legalább annyiszor előfordul S-ben, mint R-ben, akkor t nem lesz benne R-S különbségben. Informálisan tehát t minden egyes előfordulása S-ben ,,semlegesíti" t egy előfordulását R-ben.
Multihalmazok vetítése A vetítés során mindegyik sort külön kezeljük. Ha az R reláció multihalmaz, akkor '∏A,B(R) eredménye multihalmaz. Ha vetítés során különböző sorokból egy vagy több attribútum elhagyásával egyforma sorokat kapunk, akkor ezeket az egyforma sorokat nem kell kiküszöbölni a multihalmaz vetítésének eredményéből. példa: Ha az R relációjának (1,2,5), (1,2,7) és (1,2,8) sorait levetítjük az A és B attribútumokra, akkor mindhárom sor ugyanazt az (1,2) sort eredményezi. Ez azt jelenti, hogy a multihalmaz-eredményben az (1,2) sor háromszor szerepel, míg a hagyományos vetítéssel csak egyszer szerepelne.
Algebrai azonosságok multihalmazok esetén R U S = S U R. Ez az azonosság fennáll, ha az R és S relációkat halmazként kezeljük, de akkor is fennáll, ha a relációkat multihalmazként kezeljük. (R U S) - T = (R - T) U (S - T). Ez az azonosság érvényes halmazokra, viszont nem érvényes multihalmazokra. Multihalmazokon értelmezett kiválasztás A multihalmazon végzett kiválasztás azt jelenti, hogy a kiválasztás feltételét minden egyes sorra alkalmazzuk. A multihalmazoknál megszokott módon itt sem küszöböljük ki az azonos sorokat.
Multihalmazok szorzata A multihalmazok Descartes-szorzatára vonatkozó szabály pontosan az, amit vártunk: az első reláció minden egyes sorát össze kell párosítanunk a második reláció mindegyik sorával függetlenül attól, hogy az adott sor hányszor szerepel az adott relációban. Következésképpen, ha az r sor m- szer szerepel az R relációban és az s sor n-szer szerepel az S relációban, akkor az rs sor mn-szer szerepel az R x S szorzat eredményében. Multihalmazok összekapcsolása A multihalmazok összekapcsolása szintén nem szolgál különösebb meglepetéssel. Az első reláció minden egyes sorát összehasonlítjuk a második reláció valamennyi sorával, és eldöntjük, hogy az így kapott sorpárok sikeresen összekapcsolhatók-e vagy sem. Ha az összekapcsolás elvégezhető, akkor az eredményből nem kell kiküszöbölni a megegyező sorokat.
Kiterjesztett műveletek a relációs algebrában A korábbi halmazos szemlélettel szemben most a relációkra, mint sorok multihalmazára tekintünk. Ennek a két résznek az elképzelései képezik a legtöbb korszerű lekérdező nyelv alapjait. Habár az olyan nyelvek, mint az SQL, számos olyan, ezektől eltérő műveletet is tartalmaznak, amelyek alkalmazások írásánál nagyon fontosak lehetnek. Ezért a relációs műveletek egy teljesebb kezelési megközelítésében szerepelni kell még néhány más műveletnek is, amelyeket ezen alrész során be is fogunk vezetni. A kiegészítések a következők:
1. Az ismétlődések megszüntetésének művelete: δ (delta) 1. Az ismétlődések megszüntetésének művelete: δ (delta). Ez a művelet a multihalmazt halmazzá alakítja a sorok másolatainak megszüntetésével. 2. Az összesítő műveletek. Ilyen például az összegzés, illetve az átlag, amelyek ugyan nem a relációs algebra műveletei, de csoportosító műveletekkel használhatók (ezt később részletezzük). Az összesítő műveletek egy reláció attribútumaira (oszlopaira) vannak értelmezve. Például egy oszlopra vonatkozó összegzés értéke azt a számot reprezentálja, amelyet az oszlopban szereplő értékek összeadása által kapunk meg. 3. Csoportosítás. A sorok csoportosítása egy reláció sorainak „csoportokba” történő besorolása a reláció egy vagy több attribútumának értékétől függően. Ezek után már az egyes csoportok oszlopaira összesítési művelet is végezhető, amely lehetővé teszi számunkra néhány olyan lekérdezés megfogalmazását is, amelyeket a klasszikus relációs algebrával nem tudtunk kifejezni. A γ (gamma) csoportosítási művelet egy olyan művelet, amely a csoportosítás és az összesítés hatását kombinálja.
4. Kiterjesztett vetítés művelet 4. Kiterjesztett vetítés művelet. Ez kiterjeszti a π művelet hatását azzal, hogy néhány oszlopra történő vetítés mellett azt is lehetővé teszi, hogy az érintett oszlopok valamilyen összesítési relációja alapján új oszlopok kiszámítását is elvégezhessük. 5. Rendezési művelet. A τ (tau) egy relációt a sorainak egy vagy több attribútumtól függő rendezett listájává alakít. Megfontoltan kell bánni ezzel az operátorral, hiszen a relációs algebra néhány művelete nincs értelmezve listára. Ezzel szemben a vetítés és a kiválasztás elvégezhető listákra is, sőt az eredményben a lista elemeinek sorrendje is megkövetelhető. 6. Külső összekapcsolás. Az összekapcsolásnak az egyik fajtája, amely a lógó sorokat is megőrzi. A lógó sorok NULL értékekkel „egészülnek ki” a külső összekapcsolás eredményében, tehát a lógó sorok is szerepelnek a végered-ményben.
A B 1 2 3 4 Ismétlődések megszüntetése Néhány esetben szükségünk lehet olyan műveletre, amely a multihalmazból halmazt állít elő. A δ(R) kifejezést használjuk arra, hogy olyan halmazt kapjunk, amely R relációnak csak a különböző sorait tartalmazza. példa. Tekintsük az R relációját: Ekkor δ(R) a következő: A B 1 2 3 4 A B 1 2 3 4
Összesítési műveletek Több olyan művelet is létezik, amely alkalmazható számok vagy karakterláncok halmazaira vagy multihalmazaira. Ezek a műveletek összegzik vagy összesítik a reláció egy oszlopában szereplő értékeket. Ezen tulajdonságuk miatt ezeket összefoglalóan összesítési műveleteknek nevezzük. A legáltalánosabb műveletek ezek közül az alábbiak: 1. SUM, az oszlop értékeinek összegét határozza meg. 2. AVG, az oszlop értékeinek átlagát határozza meg. 3. MIN, illetve MAX az oszlop értékeinek minimumát, illetve maximumát határozza meg. Amennyiben karakterláncokat tartalmazó oszlopra alkalmazzuk, akkor a lexikografikusan (ábécé szerinti) legelső, illetve legutolsó értéket határozzák meg. 4. COUNT, az oszlopban található (nem feltétlenül különböző) elemek számát határozza meg. Vagy más szavakkal a COUNT egy reláció bármely attribútumára alkalmazva megadja a reláció sorainak a számát, beleértve az ismétlődéseket is.
példa. Tekintsük az alábbi relációt: Tekintsünk néhány példát az adott reláció attribútumain történő összesítésekre: 1. SUM(B) = 2 + 4 + 2 + 2 = 10. 2. AVG(A) = (1 + 3 + 1 + 1)/4 = 1.5. 3. MIN(A) = 1. 4. MAX(B) = 4. 5. COUNT(A) = 4. A B 1 2 3 4
Csoportosítás Néha nem egyszerűen egy oszlop összesítésére van szükségünk, hanem a reláció sorait kell csoportosítanunk egy vagy több oszlop értékei szerint, és így csoportonként összesíthetünk. Például, ha szeretnénk meghatározni mindegyik stúdió által előállított filmpercek összességét stúdiónként csoportosítanunk kell a Filmek reláció sorait a stúdióNév szerint, majd csoportonként ki kell számolni a hossz összegét(csoportonként alkalmazzuk a SUM(hossz) összesítést).
A csoportosítási művelet Most már bevezethetünk egy olyan műveletet, ami lehetővé teszi egy reláció csoportokra osztását, illetve néhány oszlopra vonatkozó összesítést. Ha van csoportosítás, akkor az összesítés az egyes csoportokon belül értendő. A γ (gamma) alsó indexeként szereplő L elemeknek egy listája, ahol egy elem az alábbiak közül bármelyik lehet: a) Az R reláció egy attribútuma, ahol γ R-re van alkalmazva. Azaz egyike R olyan attribútumainak, amelyre a csoportosítást végeztük. Ezt az elemet csoportosítási attribútumnak nevezzük. b) A reláció valamelyik attribútumára vonatkozó összesítési művelet. Ha az összesítés eredményére névvel szeretnénk hivatkozni, akkor egy nyilat és egy új nevet kell utána írnunk. A kiindulásul szolgáló attribútumot összesítési attribútumnak nevezzük.
Az γL(R) kifejezés eredményrelációjának felépítése a következő: 1 Az γL(R) kifejezés eredményrelációjának felépítése a következő: 1. Osszuk R sorait csoportokba. Egy csoport azokat a sorokat tartalmazza, amelyeknek az L listán szereplő csoportosítási attribútumokhoz tartozó értékei megegyeznek. Ha nincs csoportosítási attribútum, akkor az egész R reláció egy csoportot képez. 2. Minden csoporthoz hozzunk létre olyan sort, amelyik tartalmazza: i. A szóban forgó csoport csoportosítási attribútumait. ii. Az L lista összesítési attribútumaira vonatkozó összesítéseket. (Az adott csoport összes sorára.)
példa. Tegyük fel, hogy adott az alábbi reláció: SzerepelBenne(cím, év, színészNév) Meg szeretnénk találni minden olyan színészt, aki már szerepelt legalább három filmben, illetve a hozzá tartozó első film dátumát is. Az első lépésben csoportosítanunk kell a színészNév mezővel, mint csoportosítási attribútummal. Mindegyik csoportra ki kell számolnunk a MIN(év) összesítést. Emellett viszont ki kell számítanunk a COUNT(cím) összesítést is minden csoportra ahhoz, hogy eldönthessük azt, mely csoport elégíti ki a legalább három filmben való szereplés feltételeit. Elsőként írjuk fel a csoportosító kifejezést: γszínészNév, MIN(év)→elsőFilmÉv, COUNT(cím)→filmekSzáma(SzerepelBenne) A kifejezés első két oszlopa kelleni fog a végeredményben is. A harmadik oszlop egy segéd-attribútum (amelyet filmekSzáma-nak neveztünk) annak meghatározására, hogy az adott színész szerepelt-e már legalább három filmben. Azaz a lekérdezésnek megfelelő algebrai kifejezést egy filmekSzáma>=3 feltétellel történő kiválasztással és az első két oszlopra történő vetítéssel kell kiegészítenünk.
∏ színészNév, elsőFilmÉv filmekSzáma >= 3 γszínészNév, MIN(filmÉv) elsőFilmÉv, COUNT(filmCím) filmekSzáma SzerepelBenne
A vetítés művelet kiterjesztése Tekintsük át újra a bevezetett πL(R) vetítési műveletet. A klasszikus relációs algebrában az L az néhány attribútumának listájaként értelmezhető. Most pedig terjesszük ki a vetítés műveletét úgy, hogy lehetővé tegye számítások elvégzését is a sorok választott komponenseivel. A kiterjesztett vetítés, amelynek jelölése szintén πL(R), vetítési listájában a következő típusú elemek szerepelhetnek: 1. Az R reláció egy attribútuma. 2. Egy x → y kifejezés, melyben x és y attribútum neveket jelölnek. Az L lista x → y eleme lekérdezi az R x attribútumát és y-ra nevezi át az oszlop nevét, azaz az eredmény sémájában ezen attribútum neve y lesz. 3. Egy E → z kifejezés, ahol E az R reláció attribútumaira vonatkozó (konstansokat, aritmetikai műveleteket, illetve karakterlánc-műveleteket tartalmazó) kifejezés, z pedig az E kifejezés alapján számolt, az eredményekhez tartozó új attribútumnak a nevét jelöli. Példaként tekintsük az a + b → x kifejezést a lista elemének, ekkor ez az a és b attribútumok összegét jelöli, amelynek a neve x lesz. A c||d → e elem jelentése pedig az, hogy c és d karakterláncként értelmezett attribútumokat összefűzzük, majd az eredményül kapott oszlopot e-nek nevezzük el.
A vetítés kiszámítása R összes sorának figyelembevételével történik A vetítés kiszámítása R összes sorának figyelembevételével történik. Az L lista kiértékelése a sor azon komponenseinek behelyettesítésével történik, amelyek szerepeltek L attribútumai között. A behelyettesítéskor az L-ben szereplő műveleteket is elvégezzük. Az eredmény egy olyan reláció lesz, amelynek a sémáját az L listában szereplő nevek (illetve átnevezések) alkotják. R minden egyes sora egy sort eredményez a végeredményben. Ezért az R relációban többször előforduló sorok az eredményben is többször fordulnak elő. A végeredményben viszont akkor is lehetnek ismétlődések, ha R-ben eredetileg nem voltak. példa. Legyen az R reláció: Ekkor πA,B+C→X (R) értéke a következő: A B C 1 2 3 4 5 A X 3 9
Rendezési művelet Jó néhány esetben elképzelhető, hogy egy reláció sorait egy vagy több attribútuma alapján szeretnénk rendezni. Lekérdezéseink során gyakran megköveteljük az eredményreláció rendezettségét A τL(R) kifejezés, ahol R egy relációt, az L pedig az R reláció attribútumait tartalmazó listát jelenti, magát az R relációt határozza meg csak már az L lista alapján meghatározott rendezett alakban. Ha az L lista tartalma A1, A2, . . ., An, akkor R sorait először A1 értékei szerint fogja rendezni. A megmaradt csomókat A2 értéke szerint tovább bontja, majd az olyan soroknál, amelyek mind A1, mind A2 szerint is azonos rendezettségűek, az A3 értéke szerint rendezi, és így tovább. Azokat a csomókat, amelyek An értéke szerinti rendezés után is megmaradtak, tetszőleges sorrendben helyezzük el.
Külső összekapcsolások Az összekapcsolás műveletének egyik tulajdonsága, hogy lehetnek lógó sorok, amelyek nem kapcsolhatóak össze más sorokkal, azaz nem lesz egyezés ezen sorok és a másik reláció sorai között a közös attribútumokon. A lógó sorokhoz nem tartozik sor az összekapcsolás eredményében, így az összekapcsolás nem biztos, hogy az eredeti reláció adatait hiánytalanul tükrözi. Az ilyen esetekben az összekapcsolás egy változatát, nevezetesen a „külső összekapcsolást”, ajánlott alternatívaként használni.
Először is tekintsük a „természetes” esetet, amelyben az összekapcsolás a benne szereplő két reláció közös attribútumaiban lévő értékeknek az egyenlőségén lapult. Az R S alakú külső összekapcsolás először elvégzi az R ⨝S természetes összekapcsolást, majd ehhez hozzáadja az R és az S lógó sorait is. Az előbbi módon hozzáadott sort minden olyan attribútumában ki kell egészíteni egy speciális null szimbólummal (⊥), amellyel a sor ugyan nem rendelkezett, de az összekapcsolás eredményében már szerepel. Megjegyezzük, hogy ⊥ szimbólum a NULL értéknek felel meg SQL-ben.
Az alap (természetes) külső összekapcsolás elvének létezik több variánsa is. Az R l S bal oldali külső összekapcsolás annyiban különbözik a külső összekapcsolástól, hogy csak a bal oldalon szereplő R argumentum lógó sorainak A szimbólummal kiegészített változatát adjuk hozzá az eredményhez. Az R r S jobb oldali külső összekapcsolás annyiban különbözik a külső összekapcsolástól, hogy csak a jobb oldalon szereplő S argumentum lógó sorainak ⊥ szimbólummal kiegészített változatát adjuk hozzá az eredményhez.
A három természetes összekapcsolási műveleten túl a théta- összekapcsolás még hátramaradt, amely során először egy théta- összekapcsolást végzünk, majd az eredményéhez hozzáadjuk azokat a ⊥ szimbólummal kiegészített sorokat is, amelyeket a théta-összekapcsolás feltételének ellenőrzése során nem tudunk a másik reláció egyetlen sorával sem társítani. A C kifejezést használjuk a C feltétellel rendelkező théta-összekapcsolás jelölésére. Ez a művelet is módosítható L vagy R segítségével bal vagy jobb oldali külső összekapcsolássá.
Gyakorlat 03
Feladat: Ez a példa, a II. világháború csatahajóival(bb) és cirkálóival (bc) foglalkozik, és a következő sémájú relációkat tartalmazza: Hajóosztályok(osztály, típus, ország, ágyúkSzáma, kaliber, vízkiszorítás) Hajók(hajónév, osztály, felavatva) Csaták(csatanév, dátum) Kimenetelek(hajónév, csatanév, eredmény) 1. Melyek azok a hajók, amelyeket 1921 előtt avattak fel? 2. Adjuk meg azokat a hajóosztályokat a gyártó országok nevével együtt, amelyeknek az ágyúi legalább 16-os kaliberűek. 3. Adjuk meg a Denmark Strait-csatában elsüllyedt hajók nevét. 4. Adjuk meg az adatbázisban szereplő összes hadihajó nevét. (Ne feledjük, hogy a Hajók relációban nem feltétlenül szerepel az összes hajó!) 5. Melyek azok az országok, amelyeknek csatahajóik is és cirkálóhajóik is voltak? 6. Melyik hajó melyik országban készült?
7. Adjuk meg a Guadalcanal csatában részt vett hajók nevét, vízkiszorítását és ágyúinak a számát. 8. Soroljuk fel a biztosan 1943 előtt épült hajókat! 9. Melyik csatában volt mindenféle eredmény? 10. Melyik években avattak legalább 3 hajót? 11. Az 1921-es washingtoni egyezmény betiltotta a 35 000 tonnánál súlyosabb hajókat. Adjuk meg azokat a hajókat, amelyek megszegték az egyezményt. 12. Adjuk meg azokat a hajókat, amelyek "újjáéledtek", azaz egyszer már megsérültek egy csatában, de egy későbbi csatában újra harcoltak. 13. Adjuk meg azokat az osztályokat, amelyekbe csak egyetlenegy hajó tartozik. 14. Évenkénti bontásban hány hajót avattak? 15. Mely hajóosztályból mikor avatták az utolsó hajót?