490 likes | 890 Views
6. Relaatioalgebra ja relaatiokalkyyli. Relaatioalgebra pitää sisällään relaatiotietokantamallin perusoperaatiot. Relaatioalgebran avulla voidaan tietokantaan kohdistaa kyselyitä. Kyselyiden tuloksiksi saadaan uusia relaatioita, joita voidaan käyttää hyväksi myöhemmissä kyselyissä.
E N D
6. Relaatioalgebra ja relaatiokalkyyli • Relaatioalgebra pitää sisällään relaatiotietokantamallin perusoperaatiot. • Relaatioalgebran avulla voidaan tietokantaan kohdistaa kyselyitä. • Kyselyiden tuloksiksi saadaan uusia relaatioita, joita voidaan käyttää hyväksi myöhemmissä kyselyissä. • Relaatioalgebran operaatiot voidaan jakaa karkeasti kahteen ryhmään: • 1. Matemaattiset joukko-opilliset operaatiot, joihin kuuluvat joukkojen unioni, leikkaus, erotus ja karteesinen tulo. Nämä ovat käyttö- kelpoisia, koska relaatiot määriteltiin edellä tuplien joukoksi. • 2. Erityisesti relaatiotietokantoja varten määritellyt operaatiot, joita ovat muun muassa valinta, projektio ja liitos.
6.1 Unaariset relaatio-operaatiot: valinta ja projektio 6.1.1 Valintaoperaatio • Relaatio-operaation unaarisuudella tarkoitetaan sitä, että kyseiseen operaatioon osallistuu kerrallaan vain yksi relaatio ( vrt. binäärisyys, ternäärisyys jne. ). • Valintaoperaatiolla ( =select ) pystytään relaatiosta suodattamaan tietyn valintaehdon täyttävät tietueet ( esimerkiksi henkilöt, jotka ovat kirjoilla osastolla 4 ). • Valintaehdossa voi esiintyä vakioarvoja, attribuuttien nimiä ja matemaattisia operaattoreita { =, , <, >, , }. Ehtoja voidaan yhdistää toisiinsa loogisilla operaattoreilla AND, OR ja NOT. • Mikäli vertailua tehdään kentän mukaan, joka on lueteltua tyyppiä (esimerkiksi värien nimet), vain yhtä- ja erisuuruusvertailut ovat mahdollisia. • Merkkijonoille on käytettävissä vielä erikoisoperaattoreita, kuten merkkijonon toisen merkkijonon osajonona esiintymisen testaus ( SUBSTRING_OF ).
Valinnasta käytetään relaatioalgebrassa symbolia σ. • Valintaoperaatio merkitään yleisesti: σ<valintaehto>(R), missä valintaehto on muotoa <attribuutin nimi> <vertailuoperaattori> <vakio> tai <attribuutin nimi> <vertailuoperaattori> <attribuutin nimi> • Valintaehtoa testataan jokaiselle relaation R tuplalle niiden attribuuttien osalta, joita valintaehdossa esiintyy. • Esimerkkejä valintaoperaatioista: σDNO=4( EMPLOYEE ) : valitsee osaston 4 työntekijät σSALARY>30000( EMPLOYEE ) : valitsee ne työntekijät, joiden palkka on yli 30000 €. σ(DNO=4 AND SALARY>25000) OR (DNO=5 AND SALARY>30000)( EMPLOYEE ): valitsee osastolla 4 olevat yli 25000 € palkatut jaosastolla 5 olevat yli 30000 €:n palkatut työntekijät.
Tarkastellaan kirjan esimerkin 6.1 a)-kohtaa. • Valinnan tuloksena saatavan relaation aste on sama kuin sen relaation, johon valinta on kohdistettu ( = R ). Toisin sanoen, valinnan tulosrelaatio sisältää kaikki samat attribuutit kuin sen kohderelaatio. • Tulosrelaatiossa tuplien määrä on korkeintaan yhtä suuri kuin tuplien määrä kohderelaatiossa. • Tulosrelaation tuplien lukumäärän suhdetta kohderelaation tuplien määrään kutsutaan valintaehdon selektiivisyydeksi. • Valintaoperaatio on kommutatiivinen, eliσ<ehto1>(σ<ehto2>(R)) = σ<ehto2>(σ<ehto1>(R)). Tämä tarkoittaa sitä, että perättäiset n valintaa voidaan koota yhdeksi valinnaksi, jossa esiintyy n-1 kappaletta JA-operaattoreita osaehtojen välillä.
6.1.2 Projektio-operaatio • Toisin kuin valintaoperaatio valitsi relaatiosta tuplia (=rivejä), projektio (=project) valitsee attribuutteja (=sarakkeita). • Projektiolla pystytään valitsemaan relaatiosta tarkalleen ne sarakkeet, joista ollaan kiinnostuneita. • Projektiota kuvaa relaatioalgebrassa merkintä . • Projektio-operaatio merkitään yleisesti tapaan <attribuuttilista>(R). • Tulosrelaatiossa esiintyy relaation R attribuuteista tarkalleen ne, jotka esiintyvät attribuuttilistassa, ja kenttien esiintymisjärjestys tulosrelaatiossa on attribuuttilistassa annetun mukainen. • Mikäli tulosrelaatioon ilmestyy samansisältöinen tupla useammin kuin kerran, moninkertaiset esiintymät hävitetään tuloksesta, jotta tulosrelaationkin tuplat voitaisiin mieltää joukoksi.
Projektion tulosrelaation tuplien määrä on korkeintaan yhtä suuri kuin sen kohderelaation R tuplien määrä. Jos projektion attribuuttilista sisältää R:n superavaimen, tietueita esiintyy tulosrelaatiossa yhtä monta kuin R:ssä. • Esimerkkejä projektioista: LNAME, FNAME, SALARY(EMPLOYEE) : valitsee tulosrelaatioonrelaationEMPLOYEE attribuutit LNAME, FNAME ja SALARY. SALARY, FNAME, LNAME(EMPLOYEE) : kuten edellinen, mutta kenttien järjestys tulosrelaatiossa on eri. • Projektio ei ole kommutatiivinen, sillä <attribuuttilista1>(<attribuuttilista2>(R)) = <attribuuttilista1>(R), ja tämäkin pitää paikkansa vain, jos attribuuttilista2 sisältää kaikki attribuuttilistassa1 esiintyvät attribuutit. Muutoin vasemmanpuoleinen projektioilmaus on virheellinen. • Tarkastellaan kirjan esimerkin 6.1 b)- ja c)-kohtia.
6.1.3 Perättäiset operaatiot ja uudelleennimeäminen: RENAME-operaatio • Jokainen relaatioalgebralla muodostettu tulosrelaatio voidaan tarvittaessa nimetä (aikaisemmissa esimerkeissä näin ei toimittu). • Ellei operaatiojonoa haluta kirjoittaa yhdeksi ketjutetuksi operaatioksi, on nimeämistä käytettävä välitulosten säilömiseksi. Välitulosrelaatiolle annetaan tällöin jokin sopiva nimi, joka kuvaa välituloksen tulkintaa (esimerkiksi OSASTONJOHTAJAT). • Esimerkki: halutaan etsiä tutkimusosastolla työskentelevien henkilöiden etu- ja sukunimi sekä palkka---> tarvitaan avuksi sekä valinta että projektio. Ketjutettuna yhdeksi operaatioksi saataisiin muoto FNAME, LNAME, SALARY(DNO=5(EMPLOYEE)). Sisempi, valintaoperaatio, valitsee kaikki osaston 5 työntekijät kaikkine attribuutteineen. Ulompi, projektio, pudottaa tuloksesta tarpeettomat attribuutit pois.
Toinen vaihtoehto olisi antaa sisemmän operaation tulokselle nimi, vaikkapa OSASTOLLA5. Tällöin saadaan: OSASTOLLA5 <-- DNO=5(EMPLOYEE) TULOS <-- FNAME, LNAME, SALARY(OSASTOLLA5). • Haluttaessa voidaan myös tulosrelaation attribuutit nimetä uudelleen. Tästä on hyötyä esimerkiksi unioni- ja liitosoperaatioita muodostettaessa. Tällöin pitää tulosrelaation nimen perään esitellä sulkujen sisällä uudet attribuuttinimet tulosrelaatiolle. Esimerkki: TULOS(ETUNIMI, SUKUNIMI, PALKKA) <---FNAME, LNAME, SALARY(OSASTOLLA5). • Tarkastellaan kirjan esimerkkiä 6.2. • Uudelleennimeämisoperaattoria voidaan käyttää tarpeen mukaan kuten valinta- ja projektio-operaattoreitakin. Samalla kerralla voidaan haluttaessa nimetä sekä tulosrelaatio että attribuutit. S(B1, B2, ..., Bn)(R) - nimeää sekä tulosrelaation että sen attribuutit S(R) - nimeää ainoastaan tulosrelaation (B1, B2, ..., Bn)(R) - nimeää ainoastaan tuloksen attribuutit
6.2 Joukkoteoreettiset operaatiot 6.2.1 Unioni-, leikkaus- ja erotusoperaatiot • Unionioperaation avulla voidaan kahteen relaation kuuluvat tuplat yhdistää. • Unionioperaattorista käytetään merkintää . • Esimerkki: halutaan löytää niiden henkilöiden henkilötunnukset, jotka ovat itse töissä osastolla 5 tai toimivat jonkin osastolla 5 työskentelevän henkilön välittömänä esimiehenä. 1. Etsitään osaston 5 työntekijät OSASTOLLA5 = σDNO=5(EMPLOYEE) 2. Poimitaan osaston 5 työntekijöiden hetu (haetun vastauksen ensimmäinen osa): TULOS1 <-- SSN(OSASTOLLA5)
3. Etsitään osastolla 5 työskentelevien henkilöiden esimiehet (haetun vastauksen toinen osa): TULOS2 <-- SUPERSSN(OSASTOLLA5) 4. Yhdistetään kohtien 2 ja 3 tulokset: TULOS <-- TULOS1 TULOS2 • Unionin tulosrelaatiosta hävitetään duplikaatit saman tuplan kuuluessa molempiin osatuloksiin. • Tarkastellaan kirjan esimerkkiä 6.3. Unioni on binäärinen operaatio, s. o. kahden relaation R ja S välinen, eli R S. • Unioniin osallistuvien relaatioiden R ja S tuplien pitää olla tyypiltään yhteensopivia, eli R:n ja S:n asteluvut ovat samat ja jokaista i:n arvoa kohti dom(Ai) = dom(Bi), kun 1 in, ja Ai:t viittaavat R:n ja Bi:t S:n attribuutteihin. • Tyyppien yhteensopivuusvaatimus koskee unionin lisäksi myös leikkaus- ja erotusoperaatioita.
Relaatioiden R ja S leikkaukseen R S kuuluvat tuplat, jotka kuuluvat sekä R:ään että S:ään. Relaatioiden erotukseen R-S kuuluvat puolestaan tuplat, jotka löytyvät relaatiosta R mutta eivät relaatiosta S. • Mikäli unioniin, leikkaukseen tai erotukseen osallistuvien relaatioiden R ja S vastinattribuutit ovat erinimiset, käytetään sopimuksen mukaisesti tulosrelaatiossa relaation R mukaista nimeämistä. • Tarkastellaan kirjan esimerkkiä 6.4. • Unioni ja leikkaus ovat kommutatiivisia (vaihdannaisia) ja lisäksi myös assosiatiivisia (liitännäisiä) operaatioita. • Erotus ei ole kommutatiivinen, joten yleensä R-S S-R. 6.2.2 Karteesinen tulo -operaatio • Karteesinen tulo R x S (ristitulo, ristiliitos) on myös binäärinen operaatio, mutta siihen osallistuvien relaatioiden ei tarvitse olla tyypiltään yhteensopivia.
Karteesisessa tulossa jokainen R:n tietue yhdistetään jokaisen S:n tietueen kanssa siten, että tulosrelaatiossa S:n attribuutit liitetään R:n attribuuttien jatkeeksi. Jos R:n asteluku on n ja S:n asteluku on m, on R x S:n asteluku n + m. Vastaavasti, jos R:ssä on tuplia nR kappaletta ja S:ssä nS, tällöin tulosrelaatio R x S sisältää nR * nS tuplaa järjestyksessä r1s1, r1s2, ..., r1sm, r2s1, r2s2, .., r2sm, ..., rns1,rns2, ..., rnsm. Karteesinen tulo on sinänsä yleensä hyödytön, mutta sille saadaan käyttöä kohdistamalla siihen valintaoperaatioita. • Esimerkki: halutaan löytää kaikkien naispuolisten työntekijöiden perheenjäsenet. Hyödyntämällä karteesista tuloa voitaisiin suorittaa seuraavat perättäiset operaatiot:1. NAISPUOLISET_TYÖNTEKIJÄT <-- SEX='F'(EMPLOYEE)2. NAISP_TT_NIM <-- FNAME, LNAME,SSN(NAISPUOLISET_TYÖNTEKIJÄT) 3. KAIKKIEN_TYÖNTEK_PERHEENJ <-- NAISP_TT_NIM x DEPENDENT 4. ETSITT_PERHEENJ <-- SSN=ESSN(KAIKKIEN_TYÖNTEK_PERHEENJ)5. TULOS <-- FNAME, LNAME, DEPENDENT_NAME(ETSITT_PERHEENJ)
6.3.1 Liitosoperaatio • Tarkastellaan kirjan esimerkkiä 6.5. • Käytännössä edellisen esimerkin kaltaisissa tilanteissa käytetään karteesisen tulon sijasta liitosoperaatiota. 6.3 Binääriset relaatio-operaatiot: liitos ja jakolasku • Liitosoperaatiolla (join operation) voidaan yhdistää eri relaatioissa sijaitsevia tuplia toisiinsa. • Tietokannoissa, joissa esiintyy useita relaatioita, liitosoperaatio toimii tärkeänä tiedon linkittäjänä taulujen välillä. • Kahden relaation R(A1, A2, ... An) ja S(B1, B2, ..., Bm) välinen liitosoperaatio on yleisesti muotoa: • RX<liitosehto>S, missä liitosehto koostuu perättäisistä JA-operaatioista, ja se on muotoa Ai Bj, missä Ai on R:n ja Bj S:n attribuutti, joiden arvoalueet ovat samat, ja on jokin operaattoreista {=, <, >, , , }.
Jos liitokseen osallistuvassa relaatiossa R on n ja relaatiossa S m attribuuttia, on tulosrelaatiossa m + n attribuuttia ( liitosattribuutti esiintyy kahdesti ). • Mikäli liitosattribuutin arvona on NULL, kyseinen tupla ei tule valituksi liitoksen tulosrelaatioon. • Esimerkki: etsitään kaikkien niiden työntekijöiden nimet, jotka toimivat jonkin osaston johtajina. JOHTAA_OS <-- DEPARTMENTXMGRSSN=SSNEMPLOYEE TULOS <-- DNAME, LNAME, FNAME(JOHTAA_OS) Liitos tehdään osaston vierasavainkentän MGRSSN mukaan, joka viittaa työntekijärelaatioon. • Tarkastellaan kirjan esimerkkiä 6.6.
6.3.2 Liitosoperaation kaksi erikoistapausta: luonnollinen liitos ja yhtäsuuruusliitos • Kun liitosehdossa esiintyy muitakin kuin yhtäsuuruusoperaattoreita, käytetään liitoksesta nimitystä theta-liitos, muutoin kyseessä on yhtäsuuruusliitos (= equijoin ). • Haluttaessa olla toistamatta liitosattribuuttia voidaan käyttää ns. luonnollista liitosta (natural join), joka hävittää liitosehtoattribuuttien duplikaatit tuloksesta. • Standardin mukaisessa luonnollisessa liitoksessa liitosattribuuttien nimien pitää olla kummassakin relaatiossa samat. Esimerkiksi tehtäessä luonnollinen liitos projektin ja osaston välille pitäisi osastonumeroa kuvaava attribuutti muuntaa osastorelaatiossa projektin vastaavan kentän nimiseksi (tai päinvastoin). • Esimerkki: OS_PROJ <-- PROJECT * (DNAME, DNUM, MGRSSN, MGRSTARTDATE)(DEPARTMENT) • Nimeäminen ei tietystikään ole tarpeen, jos liitosattribuutit ovat jo alun perin saman nimiset (vrt. luonnollinen liitos osaston ja sen toimipisteiden välillä).
Epästandardissa esityksessä voidaan luonnollisen liitoksen liitosattribuutit esittää kahtena listana, joiden pareittaisten attribuuttien arvojen pitää vastata toisiaan. Liitosattribuuteista ainoastaan 1. listan attribuutit näkyvät tuloksessa. Epästandardi esitys on muotoa: Q <--- R *(<lista1>),(<lista2>)S • Ellei yksikään tuplien yhdistelmä täytä liitosehtoa, tulokseksi saadaan tyhjä relaatio. • Jos puolestaan kaikki yhdistelmät toteuttavat liitosehdon tai liitosehto puuttuu kokonaan, tuloksena on karteesinen tulo, jolloin tuplia ilmestyy tulosrelaatioon nr * ns kappaletta. • Liitoksen selektiivisyyttä mittaa tulosrelaation tuplien ja karteesisen tulon tuplien lukumäärän suhde. • Liitokseen voi osallistua kerralla myös useampia kuin kaksi relaatiota. • Esimerkki: Etsitään kullekin projektille sitä kontrolloivan osaston tiedot, ja tälle edelleen osaston johtajan tiedot. ((PROJECT XDNUM=DNUMBERDEPARTMENT)XMGRSSN=SSNEMPLOYEE)
6.3.3 Relaatioalgebran operaatioiden täydellinen joukko • Voidaan todistaa, että kaikki relaatioalgebran operaatiot voidaan esittää operaatioiden {, , , -, x} avulla. Täten kyseisten operaatioiden joukko on täydellinen. • Esimerkiksi leikkaus voitaisiin esittää kahden joukon unionin ja niiden molempiensuuntaisten erotusten unionin erotuksena:R S ( R S ) - ((R - S) (S - R)) • Kuitenkin, leikkausoperaatio on sen verran yleinen, että sen esittäminen unionin ja erotuksen avulla olisi turhan työlästä käytännössä. • Samoin liitos voitaisiin esittää karteesisen tulon ja valinnan yhdistelmänä:R X<liitosehto>S <valintaehto> (R x S) • Edelleen, luonnollinen liitos voitaisiin esittää karteesisena tulona, jota edeltää uudelleennimeäminen ja operaatiot valinta ja projektio
6.3.4 Jakolaskuoperaatio • Myös seuraavaksi esiteltävä jakolaskuoperaatio (division) voitaisiin esittää projektion ja karteesisen tulon avulla. • Jakolaskuoperaatiota tarvitaan, kun tulosrelaatioon halutaan tietueita, joilla on kaikki samat tarkastelun kohteena olevat ominaisuudet kuin jollain tietyn entiteettityypin yksittäisellä edustajalla. • Tarkastellaan esimerkin 6.8 a)-kohtaa, jossa halutaan löytää ne henkilöt, jotka työskentelevät kaikissa niissä projekteissa, joissa John Smith työskentelee. • 1. Selvitetään John Smithin henkilötunnus • SMITH <-- FNAME='John' AND LNAME='Smith'(EMPLOYEE) • 2. Tutkitaan, missä projekteissa hän työskentelee. • SMITH_PNOS <-- PNO(WORKS_ONXESSN=SSNSMITH)
3. Projisoidaan WORKS_ON -taulusta henkilötunnus ja projektinumero. SSN_PNOS <-- ESSN, PNO(WORKS_ON) 4. Suoritetaan jakolasku SSN_PNOS SMITH_PNOS, joka jättää jäljelle ne henkilötunnukset, joilla esiintyy SSN_PNOS -välituloksessa kaikki ne projektinumerot kuin John Smithillä. SSNS(SSN) <-- SSN_PNOS SMITH_PNOS 5. Muodostetaan 4. kohdan tulosrelaation luonnollinen liitos työntekijä- taulun kanssa, niin saadaan valmista. TULOS <-- FNAME, LNAME(SSNS * EMPLOYEE) • Kahden relaation R ja S välinen jakolaskuoperaatio R S on mahdollinen silloin, kun S:n attribuutit ovat R:n attribuuttien (aito) osajoukko. • Oletetaan, että R:ään kuuluvien attribuuttien joukko on Z ja S:ään kuuluvien attribuuttien joukko on X. Tällöin jakolaskun tuloksen T attribuuttien joukko Y sisältää ne Z:n attribuutit, joita ei esiinny X:ssä, eli Y = Z - X.
Jotta tupla t kuuluisi relaatioiden R ja S jakolaskun tulosrelaatioon T, pitää relaatiossa R esiintyä jokaista S:n arvoa kohti attribuuttijoukon Y arvona t. • Tarkastellaan kirjan esimerkkiä 6.8 b)-kohtaa. Relaatio R sisältää attribuutit A ja B, ja relaatio S attribuutin A. Tällöin R:n ja S:n jakolaskuun kuuluu yksistään attribuutti B. Koska relaation S ainoa attribuutti A sisältää arvot a1, a2 ja a3, pitää kutakin A:n arvoa kohti R:stä löytyä vähintään yksi tupla siten, että näiden tuplien attribuutin B arvo olisi sama. Tällöin kyseisen vaatimuksen täyttävä B:n arvo esiintyy jakolaskun R S tulosrelaation T tuplana. Koska R sisältää tuplat (a1,b1), (a2,b1) ja (a3,b1), niin tällöin tupla b1 kuuluu tulosrelaatioon. Vastaavasti, koska R sisältää tuplat (a1,b4), (a2,b4) ja (a3,b4), myös b4 kelpaa tulosrelaation T tuplaksi. Sen sijaan b2 ja b3 eivät kelpaa, koska sekä a1, a2 että a3 eivät kaikki muodosta R:ssä tuplaa b2:n eikä b3:n kanssa (esimerkiksi yhdistelmät (a2,b2) ja (a1,b3) puuttuvat). • Relaatioiden välinen jakolasku korvautuu projektion, karteesisen tulon ja erotuksen avulla seuraavasti: T <--- R S T1 <--- Y(R) T2 <--- Y((S x T1) - R) T <--- T1 - T2
6.4 Muita relaatioihin kohdistuvia operaatioita • Joitakin relaatiotietokantoihin liittyviä kyselyitä ei pystytä esittämään relaatioalgebran turvin. • Tällaiset kyselyt tuottavat ns. koostettua ja ryhmiteltyä tietoa tietokannan ominaisuuksista. 6.4.1 Aggregaattifunktiot ja ryhmittely • Toisinaan on tarpeen kohdistaa relaatioon matemaattisten tunnuslukujen laskentaa tai selvittää tietyn ehdon täyttävien tietueiden tai arvojen lukumäärä. • Tähän tarkoitukseen voidaan käyttää ns. aggregaattifunktioita, joista tyypillisimmät ovat summa (sum), keskiarvo (average), maksimin (maximum) ja minimin (minimum) määrääminen sekä lukumäärä (count).
Aggregaattifunktio esitellään tyyliin <ryhmittelyattribuutit> F <funktiolista> (R), missä ryhmittelyattribuutit ovat lista R:n attribuutteja, joiden mukaan tietueet halutaan ryhmitellä ja funktiolista puolestaan koostuu <funktio, attribuutti> -pareista, missä funktio on jokin seuraavista: SUM, AVERAGE, MAXIMUM, MINIMUM ja COUNT, ja attribuutti puolestaan se, johon kyseinen funktio halutaan kohdistaa. • Tarkastellaan kirjan esimerkkiä 6.9: lasketaan osastokohtainen työntekijämäärä ja heidän keskipalkkansa, sekä koko yrityksen työntekijämäärä ja keskipalkka. R(DNO, NO_OF_EMPLOYEES, AVERAGE_SAL) (DNOFCOUNT SSN, AVERAGESALARY(EMPLOYEE)) a)-kohdan operaatiossa on nimetty uudelleen tulostettavat kentät, joista ensimmäinen on osastonumero ja seuraavat kuvaavat työntekijöiden lukumäärää osastolla ja osastokohtaista keskipalkkaa. Uudelleennimeäminen ei kuitenkaan ole välttämätöntä, kuten b)-kohdassa nähdään. Tällöin aggregaattikenttien nimiksi tulostuvat tyyliin operaatio_attribuutti (esimerkiksi COUNT_SSN, AVERAGE_SALARY). • Duplikaatteja ei eliminoida aggregaattifunktioita käytettäessä.
6.4.2 Rekursiiviset sulkeumaoperaatiot • Myös aggregaattifunktion tulokseksi saadaan aina relaatio, vaikka se voikin näyttää yksittäiseltä luvulta ( vrt. kohta c )! • Joskus saattaa olla tarpeen soveltaa tietokannan relaatiolle ns. rekursiivista sulkeumaoperaatiota, jossa tarkastellaan toistuvia riippuvuuksia samaa tyyppiä olevien tuplien välillä. • Esimerkiksi kelpaisi työntekijän 'esimiesketjun' selvittäminen: ensiksi lähin esimies, tämän jälkeen esimiehen lähin esimies jne., kunnes korkeimmalla hierarkiassa olevalla ei enää ole esimiestä. • Relaatioalgebran avulla täydellistä sulkeumaa ei voida ilmaista, mutta tietylle ennalta määrätylle syvyydelle asti rekursiossa pystytään etenemään. • SQL3:n syntaksi kuitenkin tukee rekursiivista sulkeumaoperaatiota.Tarkastellaan esimerkkiä, jossa etsitään työntekijät, joiden välitön esimies on James Borg, sekä henkilöt, joiden esimiehen lähin esimies on James Borg ( ts. James Borgin välittömät tai 'toisen tason alaiset' ).
Ensinnä henkilöt, joille Borg on lähin esimies: BORG <--- SSN(FNAME='James' AND LNAME='Borg'(EMPLOYEE)) HLÖ_ESIM(SSN1, SSN2) <--- SSN, SUPERSSN(EMPLOYEE)TULOS1(SSN) <--- SSN1(HLÖ_ESIM XSSN2=SSN(BORG) Sitten henkilöt, joille TULOS1:n henkilö toimii esimiehenä (toisen asteen alaiset): TULOS2(SSN) <--- SSN1(HLÖ_ESIM XSSN2=SSN(TULOS1) Lopuksi yhdistetään välitulokset: TULOS <--- TULOS1 TULOS2 • Tarkastellaan tilanteen kehittymistä esimerkin 6.10 avulla.
6.4.3 Ulkoinen liitos • Ulkoisiin liitoksiin ( outer join ) tulee valituksi ainakin jommastakummasta relaatiosta R tai S tuplia, jotka eivät täytä liitosehtoa. • Mikäli kaikki ( siis liitosehtoa toteuttamattomatkin ) R:n tuplat halutaan näkyviin, mutta S:n tuplien pitää täyttää esitetty liitosehto, käytetään ns. vasenta ulkoista liitosta. • Jos puolestaan kaikki S:n tuplat halutaan näkyviin, mutta R:n tuplista vain liitosehdon täyttävät halutaan mukaan tulokseen, käytetään oikeaa ulkoista liitosta. • Mikäli sekä R:n että S:n kaikkien tuplien halutaan näkyvän tulosrelaatiossa riippumatta asetetun liitosehdon toteutumisesta, tarvitaan käyttöön ns. täysi ulkoinen liitos. • Vasemmassa ulkoisessa liitoksessa ( merkitään ]X ) S:n attribuutit jäävät puuttuviksi tuplassa R:n tuplaa t kohti, mikäli tupla t ei täytä liitosehtoa. • Oikeassa ulkoisessa liitoksessa ( merkitään X[ ) tilanne on tarkalleen päinvastainen.
6.4.4 Ulkoinen unioni • Täydessä ulkoisessa liitoksessa ( merkitään ]X|[ ) jäävät tilanteesta riippuen joko R:n tai S:n attribuutit puuttuviksi, jos liitosehto relaatioiden välillä ei toteudu. • Esimerkki: halutaan listata kaikkien työntekijöiden nimet ja niiden jatkeeksi vielä heidän mahdollisesti johtamansa osaston nimi ( s. o. kaikki työntekijät tulostetaan väistämättä, ja lisäksi osastotiedot osastojen johtajilta ). Otetaan avuksi vasen ulkoinen liitos: TILAP <--- (EMPLOYEE ]XSSN=MGRSSNDEPARTMENT) TULOS <--- FNAME, MINIT, LNAME, DNAME(TILAP) • Tarkastellaan kirjan kuvaa 6.11, joka esittää edellisen esimerkin tulosrelaatiotaulua. • Ulkoinen unioni voidaan muodostaa kahden osittain yhteensopivan relaation välille.
Tällöin osa kentistä on kummassakin relaatiossa yhteisiä, mutta näiden lisäksi ulkoiseen unioniin osallistuvissa relaatioissa esiintyy kenttiä, jotka löytyvät vain toisesta ulkoiseen unioniin osallistuvasta relaatiosta R ja S. • Yhteensopivat attribuutit sisältävät kummassakin relaatiossa sen avaimen. • Tarkastellaan esimerkkiä: yliopiston opiskelijoilla ja virkamiehillä on yhteisinä kenttinään nimi, hetu ja laitos. Tämän lisäksi opiskelijoilla voisi olla tallennettuna tieto hänen ohjaajastaan, kun taas virkamiehillä olisi omana erillisenä attribuuttinaan virka-asema. Opiskelijoiden ja virkamiesten ulkoiseen unioniin tulisi yhteisten kenttien jatkeeksi kummankin relaation ei-yhteiset kentät. Jos sama henkilö esiintyy sekä opiskelijana että virkamiehenä, häntä kuvaavassa tuplassa voi esiintyä ei-puuttuva arvo kaikilla attribuuteilla. Muussa tapauksessa virkamiehen ohjaajatiedoksi ja opiskelijan virka-asemaksi asetetaan arvo NULL. • Ulkoinen unioni vastaa sellaista täyttä ulkoista liitosta, jonka liitosattribuutteina toimivat kaikki siihen osallistuvien relaatioiden yhteiset attribuutit. • Kannattaa huomioida, ettei myöskään relaatioiden tuplien sisältämien arvojen manipulointi esimerkiksi aritmeettisten operaatioiden avulla ole mahdollista relaatioalgebran avulla.
6.5 Esimerkkejä relaatioalgebran mukaisista kyselyistä • Tarkastellaan kirjassa olevia seitsemää esimerkkiä sivuilla 171-173 ( luennolla jaetaan niistä paperikappale ). 6.6 Tupla - relaatiokalkyyli • Relaatioalgebrassa pyrittiin kuvaamaan, miten kyselyn toteuttamiseksi tarvittavat tiedot haetaan eri relaatioista. Toisin sanoen - relaatioalgebraa voidaan pitää proseduraalisena tietokantakielenä. • Relaatiokalkyyleissä puolestaan on tarkoituksena kuvata, mitä tietoja halutaan kyselyssä etsiä. Siten relaatiokalkyylit voidaan tulkita ei-proseduraalisiksi tietokantakieliksi. • Relaatiokalkyyleissä ei kiinnitetä tarkalleen eri ilmausten evaluointijärjestystä toisin kuin relaatioalgebrassa • Relaatioalgebran ilmaisuvoima on identtinen relaatiokalkyylien kanssa. Siten kaikki relaatioalgebran ja ilmaukset ovat muunnettavissa relaatiokalkyyleillä esitettävään muotoon ja vastaavasti päinvastoin.
Relaatiotietokannan kyselykielen sanotaan olevan relationaalisesti täydellinen, mikäli sillä on sama ilmaisuvoima relaatiokalkyylin kanssa. • Monilla relaatiotietokannan varsinaisilla ns. kyselykielillä on kuitenkin tätä suurempi ilmaisuvoima, koska niihin on lisätty mukaan relaatioalgebraan kuulumattomia piirteitä, kuten koostefunktiot, ryhmittely ja lajittelu. 6.6.1 Tuplamuuttujat ja arvoaluerelaatiot • Tupla-relaatiokalkyyli perustuu ns. tuplamuuttujien määrittelyyn. • Tuplamuuttujan arvoalueena käsittää yleensä yksittäisen relaation kaikki esiintymät eli tuplat. Siten tuplamuuttuja voi saada arvokseen minkä tahansa kyseisessä relaatiossa olevan tuplan. • Yksinkertainen tupla-relaatiokalkyylin kysely on muotoa { t | EHTO ( t ) }, missä t on tuplamuuttuja ja EHTO ( t ) siihen liittyvä ehdollinen ilmaus. • Kyselyn tulokseen päätyvät kaikki ne tuplat, jotka toteuttavat niille esitetyn ehdon.
Attribuutteihin kohdistuvat ehdot esitetään käyttämällä pistenotaatiota. • Esimerkki: { t | EMPLOYEE ( t ) ANDt.salary > 50000 } • Valitsee sellaiset työntekijätaulun tuplat, joissa palkka on yli 50000. • Myös projektio-operaatio voidaan esittää pistenotaation avulla. • Esimerkki: { t.FNAME, t.LNAME | EMPLOYEE ( t ) ANDt.salary > 50000 } • Kuten edellisessä esimerkissä, mutta vain etu- ja sukunimi tulostuvat • Jokaista tuplamuuttujaa t kohti on esiteltävä sen • määrittelyrelaatio R tyyliin R( t ). • ehto, jonka perusteella tuplat kelpuutetaan kyselyn vastaukseen • luettelo attribuuteista, jotka halutaan listata • Esimerkki Q0: Etsitään kaikkien John B. Smith -nimisten työntekijöiden osoite ja syntymäaika { t.BDATE, t.ADDRESS | EMPLOYEE ( t ) ANDt.FNAME = 'John' AND t.MINIT = 'B' ANDt.LNAME = 'Smith' }
Tuplamuuttujien ja listattavien attribuuttien esittelyosa päättyy pystyviivaan ( | ), jota seuraa kyselylle asetettava valintaehto. 6.6.2 Ilmaukset ja kaavat tupla-relaatiokalkyylissä • Tupla-relaatiokalkyylin yleinen ilmaus on muotoa { t1.At1, t2.At2, ..., tn.Atn| EHTO ( t1, t2, ..., tn, tn+1, tn+2, ..., tm ) }, missä t1, t2, ..., tm ovat tuplamuuttujia, At1, At2, ... Atn ovat lista sen relaation attribuutteja, joita kukin ti valitsee. Ehto on puolestaan relaatiokalkyylin mukainen kaava, ja siinä voi esiintyä sellaisiakin tuplamuuttujia, joita ei tarvita lopullisessa tuloksessa. • Kaava koostuu predikaattikalkyylin atomeista, jotka ovat jotain seuraavaa muotoa olevia: • R( ti ), missä R on relaation nimi ja tituplamuuttuja • ti.A <operaattori> tj.B, missä tija tj ovat tuplamuuttuja ja operaattori jokin vertailuoperaattoreista { =, <, ≤, >, ≥, ≠ } sekä A on jokin tuplamuuttujan ti ja vastaavasti B jokin tuplamuuttujan tj kohderelaation attribuuteista • ti.A <operaattori> c tai c <operaattori> tj.B, missä ti, tj, A, B ja operaattori ovat kuten edellä ja c on vakioarvo.
Jokainen edeltäneistä atomeista saa totuusarvokseen joko TOSI tai EPÄTOSI kutakin yksittäistä tuplien kombinaatiota kohti. • Yleisesti tuplamuuttuja t vaihtelee ylitse kaikkien käsillä olevien tietokannan tietueiden, ellei sitä erityisesti rajoiteta edustamaan jotain tiettyä relaatiota R ilmauksella R( t ). Tällöin tuplamuuttujan totuusarvoksi tulee TOSI tarkalleen kaikilla relaatioon R kuuluvilla tuplilla; muualla t saa arvokseen EPÄTOSI. • Kaava voidaan muodostaa paitsi yksittäisestä atomista niin myös yhdistelemällä atomeja loogisilla operaattoreilla AND, OR ja NOT. Rekursiivinen määrittely on seuraavanlainen: • 1. Jokainen atomi on kaava. • 2. Jos F1 ja F2 ovat kaavoja, niin myös ( F1ANDF2 ), ( F1ORF2 ), NOT( F1 ) ja NOT( F2 ) ovat kaavoja. • Kaavojen totuusarvot määräytyvät normaalin propositiologiikan sääntöjen mukaisesti ( säännöt kerrataan luennolla, mikäli tarpeen ).
6.6.3 Olemassaolo- ja universaalikvanttorit • Kaavoissa voi esiintyä atomien ja loogisilla konnektiiveilla toisiinsa liitettyjen kaavojen lisäksi myös kvanttoreita, joita on kahta lajia: olemassaolo- ( eli eksistenssi- ) ja kaikki- ( eli universaalikvanttori ). • Olemassaolokvanttoria merkitään symbolilla ( ), ja universaalikvanttoria edustaa merkintä ( ). • Ennen kvanttorien tarkempaa esittelyä määritellään vapaan ja sidotun tuplamuuttujan käsitteet: • Tuplamuuttujan t esiintymä atomikaavassa F on vapaa. • Tuplamuuttujan t esiintymä loogisin konnektiivein yhdistetyssä kaavassa tyyppiä ( F1ANDF2 ), ( F1ORF2 ), NOT( F1 ) tai NOT( F2 ) on vapaa tai sidottu sen mukaan, millainen sen esiintymä on kaavassa F1 ja F2. On mahdollista, että kaavoissa ( F1ANDF2 ) ja ( F1ORF2 ) tuplamuuttuja voi esiintyä eri osissa eri asemassa ( esimerkiksi F1:ssä sidottuna ja F2:ssa vapaana tai päinvastoin ). • Kaikki kaavassa F esiintyvän tuplamuuttujan t esiintymät ovat sidottuja kvanttori-ilmauksissa F' = ( t )( F ) tai F' = ( t )( F ). Kvanttoria seuraava tuplamuuttuja on aina sidottuna kvanttorin sen vaikutusalueella
Esimerkki:F1: d.OSASTONNIMI = 'TUTKIMUS' F2: ( t )( d.OSASTONUMERO = t.OSASTONUMERO ) F3: ( d )( d.OSASTONJOHTAJA = '333445555' ) • Kaavoissa F1 ja F2 tuplamuuttuja d on vapaa, mutta kaavassa F3 se on sidottu universaalikvanttoriin. • Vastaavasti tuplamuuttuja t on sidottu olemassaolokvanttoriin kaavassa F2. • Olemassaolokvanttorin sisältävä ilmaus on tosi, mikäli ilmauksessa esitetty ehto toteutuu ainakin yhdelle tarkastelun kohteena olevalle tuplalle. • Universaalikvanttorin sisältävä ilmaus on puolestaan tosi silloin ja vain silloin, kun kvanttori-ilmauksen ehto toteutuu kaikille tarkastelun kohteina oleville tuplille.
6.6.4 Olemassaolokvanttorin käyttöesimerkkejä • Kysely 1: Etsitään kaikkien tutkimusosastolla työskentelevien henkilöiden etu- ja sukunimi sekä osoite: Q1: { t.FNAME, t.LNAME, t.ADDRESS | EMPLOYEE ( t ) AND ( d )( DEPARTMENT ( d ) ANDd.NAME = 'Research' ANDd.DNUMBER = t.DNO ) } • Kyselyn ainoa vapaa tuplamuuttuja on t. Sen sijaan tuplamuuttuja d on sidottu olemassaolokvanttoriin. • EMPLOYEE ( t ) ja DEPARTMENT ( d ) määräävät relaatiot, joiden tuplat kelpaavat tuplamuuttujien d ja t arvoiksi. • Ehto d.NAME = 'Research' on kyselyn valintaehto • Ehto d.DNUMBER = t.DNO toimii puolestaan liitosehtona • Yleisestikin tupla-relaatiokalkyylin mukaisessa ilmauksessa kaikki vapaat muuttujat tulisi sijoittaa pystyviivan vasemmalle puolelle.
Kysely 2: Etsitään jokaista Staffordissa käynnissä olevaa projektia kohti projektin numero, sitä kontrolloivan osaston numero ja kyseisen osaston johtajan sukunimi, syntymäaika ja osoite: Q2: { p.PNUMBER, p.DNUM, m.LNAME, m.BDATE, m.ADDRESS | PROJECT ( p ) AND EMPLOYEE ( m ) ANDp.LOCATION = 'Stafford' AND ( ( d )( DEPARTMENT ( d ) ANDp.DNUM = d.DNUMBER ANDd.MGRSSN = m.SSN ) ) } • Kyselyssä on kaksi vapaata tuplamuuttujaa: p ja m. • Kyselyssä asetettuja ehtoja testataan kaikille mahdollisille tuplamuuttujien p ja m kombinaatioille, ja ainoastaan kaikki asetetut ehdot täyttävät tuplat päätyvät tulokseen. • Samaan relaatioon voi viitata tarvittaessa useampikin kuin yksi tuplamuuttuja kerrallaan.
Kysely: Etsitään kunkin työntekijän ja hänen esimiehensä etu- ja sukunimi: Q8: {e.FNAME, e.LNAME, s.FNAME, s.LNAME | EMPLOYEE ( e ) AND EMPLOYEE ( s ) ANDe.SUPERSSN = s.SSN } • Kysely 3': Etsitään niiden työntekijöiden nimi, jotka työskentelevät vähintään yhdessä osastolle 5 kuuluvassa projektissa: Q3': { e.LNAME, e.FNAME | EMPLOYEE ( e ) AND ( x ) ( w ) ( PROJECT ( x ) AND WORKS_ON ( w ) AND x.DNUM =5 ANDw.ESSN = e.SSN ANDx.PNUMBER = w.PNO ) ) } • Kysely 4: Etsitään niiden projektien numerot, joissa joko työskentelee työntekijä nimeltä Smith, tai projektia kontrolloivaa osastoa johtaa 'Smith'-niminen henkilö: Q4: { p.PNUMBER | PROJECT ( p ) AND ( ( ( e ) ( w ) ( EMPLOYEE ( e ) AND WORKS_ON ( w ) ANDw.PNO = p.PNUMBER AND e.LNAME = 'Smith' ANDe.SSN = w.ESSN ) ) OR
( ( ( m ) ( d ) ( EMPLOYEE ( m ) AND DEPARTMENT ( d ) ANDp.DNUM = d.DNUMBER ANDd.MGRSSN = m.SSN ANDm.LNAME = 'Smith' ) ) ) } • Kuten edellisestä esimerkistä nähdään, korvautuu relaatioalgebran unionioperaatio tupla-relaatiokalkyylissä loogisella TAI-operaatiolla. 6.6.5 Muuntosäännöt eri kvanttorityyppien välillä • Predikaattilogiikan sääntöjä käyttäen pystytään olemassaolokvanttorin sisältävä lauseke muuntamaan lausekkeeksi, jossa esiintyy universaalikvanttori ja päinvastoin. • Muunnokselle kvanttorityypiltä toiselle pätevät seuraavat säännöt: • Uutta tyyppiä olevan kvanttorin eteen tulee negaatio NOT, ellei aikaisempi kvanttori sisältänyt negaatiota, muulloin uuden kvanttorin eteen ei tule negaatiota. • Jokainen AND-operaatio muutetaan OR-operaatioksi. • Jokainen OR-operaatio muutetaan AND-operaatioksi. • Jokainen ilmauksen kaava muunnetaan sisällöltään negaatiokseen.
Muuntosäännöt ovat seuraavanlaiset: 1. ( x ) ( P( x )) NOT( x ) ( NOT ( P( x ) ) ) Tulkinta: vasen puoli = "Jokaisella x:llä on ominaisuus P". oikea puoli = "Ei ole sellaista x:ää, jolla ei olisi ominaisuutta P". 2. ( x ) ( P( x )) NOT( x ) ( NOT ( P( x ) ) ) Tulkinta: vasen puoli = "Ainakin yhdellä x:llä on ominaisuus P". oikea puoli = "Ei pidä paikkaansa, ettei millään x:llä ole ominaisuutta P". 3. ( x ) ( P( x ) ANDQ( x )) NOT( x ) ( NOT ( P( x ) ) ORNOTQ( x ) ) Tulkinta: vasen puoli = "Jokaisella x:llä on sekä ominaisuus P että Q". oikea puoli = "Ei ole olemassa x:ää, jolta puuttuu ominaisuus P tai Q". 4. ( x ) ( P( x ) ORQ( x )) NOT( x ) ( NOT ( P( x ) ) ANDNOTQ( x ) ) Tulkinta: vasen puoli = "Jokaisella x:llä on ainakin jompikumpi ominaisuuksista P tai Q". oikea puoli = "Ei löydy sellaista x:ää, joilla ei ole kumpaakaan ominaisuuksista P ja Q".
5. ( x ) ( P( x ) ORQ( x )) NOT( x ) ( NOT ( P( x ) ) ANDNOTQ( x ) ) Tulkinta: vasen puoli = "Ainakin yhdellä x:llä on ominaisuus P tai Q". oikea puoli = "Jokaiselta x:ltä ei puutu molempia ominaisuuksista P ja Q". 6. ( x ) ( P( x ) ANDQ( x )) NOT( x ) ( NOT ( P( x ) ) ORNOTQ( x ) ) Tulkinta: vasen puoli = "Ainakin yhdellä x:llä on sekä ominaisuus P että Q". oikea puoli = "Ei pidä paikkaansa, että jokaiselta x:ltä puuttuu ainakin toinen ominaisuuksista P ja Q". 6.6.6 Universaalikvanttorin käyttöön liittyviä esimerkkejä • Kysely 3: Etsitään työntekijät, jotka työskentelevät kaikissa osaston 5 kontrolloimissa projekteissa: Q3: { e.LNAME, e.FNAME | EMPLOYEE ( e ) AND ( ( x ) ( NOT ( PROJECT ( x ) ) OR NOT ( x.DNUM = 5 ) OR ( ( w ) ( WORKS_ON ( w ) ANDw.ESSN = e.SSN AND x.PNUMBER = w.PNO ) ) ) }
Kyselyä 3 voidaan analysoida pätkimällä se eri komponentteihinsa seuraavasti: Q3: { e.LNAME, e.FNAME | EMPLOYEE ( e ) ANDF' } F' = ( ( x ) ( NOT ( PROJECT ( x ) ) OR F1 ) ) F1 = NOT ( x.DNUM = 5 ) OR F2 F2 = ( ( w ) ( WORKS_ON ( w ) ANDw.ESSN = e.SSN AND x.PNUMBER = w.PNO ) ) } • Koska universaalikvanttoriin sidotun tuplamuuttujan x pitää toteutua kaikille mahdollisille hakuavaruuden tuplille, pitää huomioida, että esitetty vaatimus toteutuu erityisesti silloin, kun x joko ei edusta laisinkaan mielenkiinnon kohteena olevan entiteetin tuplaa, tai sitten x:n viittaaman tuplan valintaehto tietyn attribuutin suhteen ei täyty. • Siten, jos x ei edusta entiteettityyppiä PROJECT, voidaan x jättää huomiotta kokonaan, eli universaalikvanttoriin sidotun väitteen pitää toteutua aina, jos x ei ole projekti-entiteetin esiintymä. Tätä osuutta edustaa kyselyssä TAI-operaattoriin liitetty ensimmäinen kaava NOT ( PROJECT ( x ) ).
Vastaavasti ne projekti-entiteettityypin tuplat, joissa projektista vastaavan osaston numerona on jotain muuta kuin 5, pitää sulkea pois evaluoimalla kaava todeksi TAI-operaattoriin sidotulla kaavalla NOT ( x.DNUM = 5 ). • Nyt on universaalikvanttoriin sidottu väite aina tosi, jos joko x ei ole projekti, tai projektia x kontrolloivan osaston numero ei ole 5. • Jotta työntekijä päätyisi kyselyn vastausrelaatioon, pitää hänen nyt työskennellä kaikissa niissä projekteissa, joita ei vielä ole suljettu pois. Tämä tarkoittaa suomennettuna sitä että "Jokaista tarkastelun kohteena olevaa projektia ( siis sellaista, jota kontrolloi osasto 5 ) kohti pitää löytyä taulusta WORKS_ON tupla, jossa projektinumerot täsmäävät keskenään, ja lisäksi saman työntekijän on työskenneltävä jokaisessa näistä projekteista ( esimerkin 5.6 mukaisessa tietokannassa projekteissa 1, 2 ja 3 )." • Haluttaessa päästä eroon universaalikvanttorin käyttämisestä voidaan kysely Q3 muuntaa kappaleen 6.6.5 muunnossääntöjä käyttäen seuraavanlaiseksi: Q3A: { e.LNAME, e.FNAME | EMPLOYEE ( e ) AND ( NOT ( x ) ( PROJECT ( x ) ) AND ( x.DNUM = 5 ) AND ( NOT ( w ) ( WORKS_ON ( w ) ANDw.ESSN = e.SSN AND x.PNUMBER = w.PNO ) ) ) ) }
Kysely 6: Etsitään niiden työntekijöiden nimet, joilla ei ole perheenjäseniä: Q6: { e.FNAME, e.LNAME | EMPLOYEE ( e ) AND ( NOT ( d ) ( DEPENDENT ( d ) ) AND ( e.SSN = d.ESSN ) ) } Edellinen kysely voitaisiin haluttaessa muuntaa universaalikvanttorin sisältäväksi seuraavanlaisesti: Q6A: { e.FNAME, e.LNAME | EMPLOYEE ( e ) AND ( ( d ) ( NOT DEPENDENT ( d ) ) OR NOT ( e.SSN = d.ESSN ) ) ) } • Kysely 7: Tulostetaan nimet kaikilta sellaisilta osastonjohtajilta, joilla on ainakin yksi perheenjäsen: Q7: { e.FNAME, e.LNAME | EMPLOYEE ( e ) AND ( ( d ) ( p ) ( DEPARTMENT ( d ) AND DEPENDENT ( p ) ) AND ( e.SSN = d.MGRSSN AND p.ESSN = e.SSN ) ) } Kysely on toteutettu käyttämällä tulkintaa "Listaa osastonjohtajat, joita kohti löytyy ainakin yksi perheenjäsen taulusta DEPENDENT".
6.6.7 Turvalliset ilmaukset • Käytettäessä tupla-relaatiokalkyylin ilmauksissa universaali- tai olemassaolokvanttoreita tai predikaattien negaatioita pitää olla tarkkana, että kirjoitettu ilmaus on järkevä, ts. sen voivat toteuttaa ainoastaan haluttua entiteettiä edustavat tuplat. • Ilmauksen sanotaan olevan turvallinen, jos sen vastausrelaatioon kuuluvien tuplien lukumäärä on äärellinen. • Esimerkki: ilmaus { t | NOT ( EMPLOYEE ( t ) ) } ei ole sellaisenaan turvallinen, koska ilmauksessa esitetyn vaatimuksen täyttävät kaikki muut tuplat paitsi työntekijöitä edustavat. • Kirjoitettaessa ilmauksia pitää aina selvittää, mikä on ilmauksen vastausrelaation määrittelyjoukko. Ei ole mielekästä, että vastaukseen voisi kuulua tuplia, jotka edustavat eri entiteettityyppejä.
6.7 Määrittelyjoukkoon perustuva relaatiokalkyyli • Määrittelyjoukkoon perustuva relaatiokalkyyli sai alkunsa IBM:n kehittämästä QBE-kyselykielestä ( tulee sanoista Query By Example ), jota kehitettiin samanaikaisesti SQL:n kanssa, mutta eri toimipisteessä. • QBE-kyselykielen pohjalta esiteltiin myöhemmin teoreettinen tausta määrittelyjoukkoon perustuvalle relaatiokalkyylille. • Toisin kuin tupla-relaatiokalkyylissä, jossa muuttujat viittaavat relaatioiden sisältämiin tupliin, määrittelyjoukkokalkyylissä muuttujat viittaavat attribuuttien saamiin arvoihin. • Määrittelyjoukkokalkyylin yleinen ilmaus on muotoa { x1, x2, ..., xn | EHTO( x1, x2, ..., xn, xn+1, xn+2, ..., xn+m }, missä x1, x2, ..., xn, xn+1, xn+2, ..., xn+m ovat määrittelyjoukkomuuttujia, jotka saavat arvoja yli attribuuttien määrittelyjoukkojen, ja EHTO on puolestaan määrittelyjoukkokalkyylin mukainen kaava.
Kaavan rakenneosina ovat atomit kuten tupla-relaatiokalkyylissäkin, mutta atomien määrittely poikkea hieman tupla-kalkyylin mukaisesta. • 1. Muotoa R( x1, x2, ..., xn ) oleva atomi, jossa R on astetta j olevan relaation tunnus, ja kukin xi, 1 ≤ i ≤ j, on määrittelyjoukkomuuttuja. Atomin tulkintana on, että attribuuttien < x1, x2, ..., xj > arvolistan pitää esiintyä relaatiossa R, jossa jokainen xi on relaation i:nnen attribuutin arvo. • Yleensä määrittelyjoukkokalkyylin ilmauksen ehto esitetään tiivistetysti ilman pilkuilla erottelua tapaan { x1, x2, ... , xn | R( x1 x2 x3 ) } • 2. Atomi voi olla myös muotoa xi < operaattori > xj, missä operaattori on jokin vertailuoperaattoreista { =, <, ≤, >, ≥, ≠ }, ja xi ja xj ovat määrittelyjoukkomuuttujia. • 3. Lisäksi atomi voi olla tyyppiä xi < operaattori > c tai c < operaattori > xj, missä xi ja xj ovat määrittelyjoukkomuuttujia ja c on vakioarvo. • Jokainen atomi saa totuusarvon TOSI tai EPÄTOSI tiettyä atomien arvojoukkoa kohti. Tyyppiä 1 oleva atomi saa arvon TOSI, jos määrittelyjoukkomuuttujien arvot liittyvät relaatioon R. Tyyppiä 2 ja 3 olevat atomit ovat puolestaan tosia, jos muuttujien arvot toteuttavat niille esitetyt ehdot.
Kuten tupla-relaatiokalkyylin yhteydessä, myös määrittelyjoukkokalkyylissä kaavoja muodostetaan yhdistelemällä atomeja, muuttujia ja kvanttoreita. • Tällä kurssilla käytetään määrittelyjoukkomuuttujista pieniä kirjaimia väliltä h, i, j, ..., x, yz. • Kysely 0: Etsitään työntekijän nimeltä 'John B. Smith' syntymäaika ja osoite: Q0: { uv | ( q ) ( r ) ( s ) ( t ) ( w ) ( x ) ( y ) ( z ) ( EMPLOYEE ( qrstuvwxyz ) ANDq = 'John' ANDr = 'B' AND s = 'Smith' ) } • Kyselyssä on kaksi vapaata ja kahdeksan olemassaolokvanttoreihin sidottua määrittelyjoukkomuuttujaa. • Muuttujiin q, r, s, t, u, v, w, x, y ja z sijoitettavien arvojen pitää olla asetetun ehdon mukaisesti peräisin taulun EMPLOYEE tuplista, ja lisäksi muuttujilla q, r ja s on esiinnyttävä arvot 'John' 'B' ja 'Smith' tässä järjestyksessä, jotta tupla tulisi valituksi kyselyn vastaukseen. • Myöhemmissä esimerkeissä kvantifiointi tapahtuu luettavuuden selkeyttämiseksi ainoastaan niiden määrittelyjoukkomuuttujien ylitse, joilla on merkitystä valinta- tai liitosehtoa muodostettaessa ( edellisessä esimerkissä muuttujilla q, r ja s ), vaikka esitystapa ei olekaan formaalisti korrekti. Myöskään pilkkua ei tulla jatkossa käyttämään erotinmerkkinä.
Toinen epästandardi esitysmuoto olisi asettaa valintaehtoina olevat vakiot suoraan muuttujien paikalle. Samalla kaikki pystyviivan vasemmalla puolella esiintymättömät määrittelyjoukkomuuttujat kvantifioidaan implisiittisesti ( siis ilman erillistä mainintaa ) olemassaolokvanttorilla. Q0A: { uv | EMPLOYEE( 'John', 'B', 'Smith', t, u, v, w, x, y, z ) } • Kysely 1: Etsitään kaikkien tutkimusosaston työntekijöiden nimi ja osoite: Q1: { qsv | ( z ) ( l ) ( m ) ( EMPLOYEE ( qrstuvwxyz ) AND DEPARTMENT ( lmno ) ANDl = 'Research' ANDm = z ) } • Edellisessä kyselyssä kahden määrittelyjoukkomuuttujan välinen vertailuoperaatio m = z edustaa liitosehtoa, kun taas vertailu vakioon lausekkeessa l = 'Research' tarkoittaa valintaehtoa. • Kysely 2: Etsitään jokaisen Staffordissa käynnissä olevan projektin numero, projektista vastaavan osaston numero sekä kyseisen osaston johtajan sukunimi, syntymäaika ja osoite: Q2: { iksuv | ( j ) ( m ) ( n ) ( t ) ( PROJECT ( hijk ) AND EMPLOYEE ( qrstuvwxyz ) AND DEPARTMENT ( lmno ) ANDk = mANDn = tANDj = 'Stafford' ) }
Kysely 6: Etsitään niiden työntekijöiden nimet, joilla ei ole perheenjäseniä: Q6: { qs | ( t ) ( EMPLOYEE ( qrstuvwxyz ) AND ( NOT ( l ) ( DEPENDENT ( lmnop ) ANDt = l ) ) ) } • Tämä kysely voidaan muuntaa haluttaessa universaalikvanttorin avulla toteutettavaksi, mikä käy selville seuraavasta esimerkistä: Q6A: { qs | ( t ) ( EMPLOYEE ( qrstuvwxyz ) AND( ( l ) ( NOT ( DEPENDENT ( lmnop ) ORNOT ( t = l ) ) ) ) } • Kysely 7: Etsitään kaikkien niiden osastonjohtajien nimet, joilla on ainakin yksi perheenjäsen: Q7: { sq | ( t ) ( j ) ( l ) EMPLOYEE ( qrstuvwxyz ) AND DEPARTMENT ( hijk ) AND DEPENDENT ( lmnop ) ANDt = jAND l = t ) } • Kuten aikaisemmin jo todettiin, mikä tahansa relaatioalgebralla esitettävissä oleva kysely voidaan yhtäläisesti esittää kummalla tahansa relaatiokalkyylillä. Samoin mikä tahansa tupla- tai määrittelyjoukkokalkyylin turvallinen ilmaus voidaan esittää relaatioalgebran avulla. • Määrittelyjoukkokalkyyliin perustuvan QBE-kyselykielen lyhyt katsaus löytyy oppikirjan liitteestä D.