perusteita - relaatiokalkyylit perusteita - relaatiokalkyylit Relaatioalgebra on luonteeltaan proseduraalinen tapa käsitellä tietoa. Tiedon haetaan sarjaksi järjestettyjen operaatioiden avulla. Edellä todettiin, että operaatiot voidaan järjestää eri tavoin ja saada sama tulos. Operaatiosarjan muodostus on aika vaikeaa Kyselyn tuloksen määrittelyyn laskentajärjestystä kiinnittämättä on teoreettiseksi pohjaksi kehitetty relaatiokalkyylejä Kalkyyleissä esitetään määritelmällisesti (declarative), millainen tulos täyttää halutun tietotarpeen Relaatiomallin kyselykielten teoriapohjaksi on tarjottu kahta erityyppistä relaatiokalkyyliä: Rivimuuttujiin pohjautuvaa rivikalkyyliä (tuple relational calculus) ja Sarakemuuttujiin perustuvaa sarakekalkyyliä (domain relational calculus) Kummankin pohjalta on kehitetty käytännön kyselykieliä Kumpikin perustuu predikaatilogiikkaan 1 2 Rivikalkyylissä kyselykielen keskeisiä rakenneosia ovat rivimuuttujat (tuple variable) Rivimuuttujan arvoalue on jokin relaatio, ts se voi saada arvokseen minkä tahansa kyseisen relaation rivin Tyypillinen rivikalkyylin kysely on muotoa {t cond(t)} eli tuloksen muodostavat ehdon cond täyttävät monikot. Ehdossa esitellään, minkä relaation monikosta on kyse. Lisäksi voidaan antaa muita vaatimuksia. Esimerkiksi Hae kaikki Teokset, jotka on painettu vuonna 2006 esitettäisiin {t Teos(t) and t.painovuosi=2006} (Huom: tässä käytetään teoksen Elmasri&Navathe käyttämää esitystapaa Silberschatz:in tapa on vähän monimutkaisempi) Ehto Teos(t) määrittelee muuttujan t arvoalueeksi (range) relaation Teos Ehto t.painovuosi=2006 antaa lisäehdon t.painovuosi viittaa attribuutin painovuosi arvoon rivillä t 3 4 Jos halutaan mukaan tulokseen vain osa relaation attribuuteista, nämä voidaan luetella {t.nimi, t.kustantaja Teos(t) and t.painovuosi=2006} (* Silberschatzin käyttämässä tavassa ei voida luetella *) Kyselyn tuloksen muodostavat niiltä riveiltä poimitut arvot, joiden kohdalla annettu ehto on tosi. Rivikalkyylin kyselyn yleinen muoto on {t 1.A 1,t 2.A 2,,t n.a n Cond(t 1,t 2,,t n,t n+1, t n+m )} t 1,t 2,,t n,t n+1, t n+m ovat rivimuuttujia Kukin A i on t i :n viittaaman relaation attribuutti 5 6 Harri Laine 1
Cond on kaava, jonka atomeja ovat. Muuttujaesittelyt R(t i ) : tosi, jos muuttujan arvona R:n monikko Vertailut t i.a i Θ t j.a j tai t i.a j Θ c, missä Θ on vertailuoperaattori <,>,<=,>=,!= ja c on jokin vakio Kaava muodostuu yhdestä tai useammasta atomista, jotka on liitetty toisiinsa loogisilla operaattoreilla and, or ja not (,, ) Kaavaan voi lisäksi sisältyä kvanttoreita: Olemassaolokvanttori ( t) (on olemassa t) ja Universaalikvanttori ( t) (kaikille t) Jos F on kaava, jossa t on vapaa muuttuja, niin ( t) (F) on kaava, joka on tosi, jos kaava F on tosi kun t:n arvoksi on sijoitettu jokin tietokannan monikko. 7 8 Jos F on kaava, jossa t on vapaa muuttuja, niin ( t)(f) on kaava, joka on tosi, jos kaava F on tosi kaikilla t:n arvoksi kelpaavilla monikoilla. Muuttuja t on vapaa (free) ellei sitä ole sidottu (bound) millään kvanttorilla k.nimi= Database design [k on vapaa] ( k) (k.teosnumero=h.teostunnus) [k on sidottu, h on vapaa] Kurssi(knro,kurssinimi,taso, ) Materiaali(kurssi->Kurssi,kirjanro->Teos, tyyppi, ) Kurssin Kyselykielet oheishakemistona käytettävien kirjojen tunnukset? {m.kirjanro Materiaali(m) and ( k) (Kurssi(k) and m.kurssi=k.knro and m.tyyppi= oheislukemisto and k.kurssinimi= Kyselykielet )} 9 10 Rivikalkyylin lausekkeessa kaikkien vapaiden muuttujien pitää esiintyä tulostietomäärittelyssä ( palkin vasemmalla puolella). Millä kurssilla ja mihin tarkoitukseen käytetään Database Management nimistä teosta? {k.kurssinimi, m.tyyppi Kurssi(k) and Materiaali(m) and m.kurssi=k.knro and (( t) (Teos(t) and t.kirjanro=m.kirjanro and t.nimi= Database Management ))} Kyselyssä voi olla useita rivimuuttujia, jotka viittaavat saman relaation monikoihin {p.nimi Työntekijä(p) and ( a) (Työntekijä(a) and a.pomo=p.ttnro and a.ttnro=190)} Luettele kirjat, joita käytetään jollain aineopintotason kurssilla {t.nimi Teos(t) and (( k) ( m) (Kurssi(k) and Materiaali(m) and m.kurssi=k.knro and m.kirjanro=t.kirjanro and k.taso= aineopinnot ))} 11 12 Harri Laine 2
Anna niiden teosten tunnukset, joita ei käytetä millään kursseilla {t.knro Teos(t) and not (( m) (Materiaali(m) and m.kirjanro=t.knro)) } (= Ei ole olemassa materiaaliriviä, jossa esiintyisi) Toisin: {t.knro Teos(t) and (( m)(not(materiaali(m)) or not (m.kirjanro=k.knro)))} Universaalikvanttori on vaikea käytettävä toisaalta myös tarpeeton Muunnossääntöjä: ( x)(p(x)) = not ( x)(not (Px)) ( x)((px)) = not ( x)(not P(x)) ( x)(p(x) and Q(x)) = not( x)(not (P(x)) or not (Q(x))) muitakin on.. 13 14 Käytettäessä kvanttoreita ja negaatiota pitää varmistua siitä, että lausekkeet ovat järkeviä Turvallinen lauseke (safe expression) tuottaa tarkoin määritellyn äärellisen joukon monikkoja tulokseksi {t not Kurssi(t)} ei ole turvallinen karkaa Kurssi relaation ulkopuolelle eikä tulos ole äärellinen On osoitettu, että relatioalgebra ja rivikalkyyli ovat ilmaisuvoimaltaan samat eli mikä tahansa kysely joka voidaan esittää relaatioalgebralla voidaan esittää rivikalkyylillä ja päinvastoin. Kieltä, jonka ilmaisuvoima on vähintään relaatioalgebran tasoa kutsutaan relationaalisesti täydelliseksi (relationally complete) 15 16 SQL-kielen teoriaperustana on rivikalkyyli Tulostiedot määritellään kuten kalkyylissä From-osassa esitellään vapaat ja olemassaolokvantifioidut muuttujat Explisiittisesti muutujan saa näkyviin käyttämällä muotoa from table as alias, muuten taulun nimi toimii samalla rivimuuttujana Where-osa vastaa kalkyylin ehto-osaa SQL ei kuitenkaan ole puhdas rivikalkyylin toteutus mukana algebran operaatioita, alikyselyt, yhteenvedot, yms. aikanaan SQL:n kilpailijana ollut QUEL (Ingres) oli puhtaampi rivikalkyylikieli Sarakekalkyyli (domain relational calculus) on vaihtoehtoinen formaali malli relaatiomallin määritelmälliselle kyselykielelle. Sarakekalkyyli kehitettiin käytännön kyselyympäristön (Query By Example, QBE) pohjalta 70-80 luvuilla julkaistiin paljon vertailututkimuksia, joissa QBE ja sarakekalkyyli todettiin helppokäyttöisemmäksi kuin SQL ja rivikalkyyli. Kummatkin päihittivät tässä suhteessa relaatioalgebran. 17 18 Harri Laine 3
Sarakekalkyylissä perusero rivikalkyyliin on sarakemuuttujien käyttö (domain variable) Sarakemuuttuja saa arvokseen yksittäisiä sarakkeen arvojoukkoon kuuluvia arvoja. Sarakekalkyylin kyselylauseke on muotoa {x 1,x 2,,x n Kaava muodostuu atomeista, joita ovat riviesittelyt R(x 1,x 2,,x j ), missä R on relaation nimi ja x i :t sarakemuuttujia.tämä on tosi, jos monikko <x 1,x 2,,x j > kuuluu relaatioon R Vertailut x i Θ x j tai x i Θ c, missä Θ on vertailuoperaattori <,>,<=,>0,!= ja c on jokin vakio Cond(x 1,x 2,,x n,x n+1,x n+2,,x n+m )} x i ovat sarakemuuttujia ja cond on kaava 19 20 Kuten rivikalkyylissä voi sarakekalkyylissä yhdistää atomeja loogisilla operaattoreilla ja käyttää kvanttoreita. Teos(kirjanro,nimi,painovuosi,kustantaja) Kurssi(knro,kurssinimi,taso) Materiaali(kurssi->Kurssi,kirjanro->Teos, tyyppi) Kurssin Kyselykielet oheishakemistona käytettävien kirjojen tunnukset? {m ( k)(( t)(( i) (( n) (( y) (Materiaali(k,m,t) and Kurssi(i,n,y) and k=i and t= oheislukemisto and n= Kyselykielet )))))} usein käytetään erilaisia lyhennemerkintojä lausekkeen luettavuuden helpottamiseksi 21 22 {m ( k,t,i,n,y) (Materiaali(k,m,t) and Kurssi(i,n,y) and k=i and t= oheislukemisto and n= Kyselykielet )} (Silberschatz: Jätetään olemassaolokvanttori toistamatta) Käytetään ei väliä (esim _ ) muuttujia ilman esittelyä, jos muuttujat eivät osallistu vertailuihin {m ( k,t,i,n) (Materiaali(k,m,t) and Kurssi(i,n,_) and k=i and t= oheislukemisto and n= Kyselykielet )} Muuttujina voi toki käyttää luettavampia nimiä, esimerkiksi sarakenimiä {kirjanro ( kurssi,tyyppi,knro,nimi) (Materiaali(kurssi,kirjanro,tyyppi) and Kurssi(knro,nimi,_) and kurssi=knro and tyyppi= oheislukemisto and nimi= Kyselykielet )} 23 24 Harri Laine 4
Millä kurssilla ja mihin tarkoitukseen käytetään Database Management nimistä teosta? {knimi, tyyppi ( knro,taso,kurssi,kirja, tnro,tnimi,pv,kust nimi) (Kurssi(knro,knimi,taso) and Materiaali(kurssi,kirja,tyyppi) and kurssi=knro and Teos(tnro,tnimi,pv,kust) and tnro=kirja and tnimi= Database Management )} Tyontekijä(ttnro, nimi, pomo, muuta) {ttnimi, pomonimi ( joku,ttnro, pomo, isopomo, muuta, else) (Työntekijä(joku,ttnimi,pomo,muuta) and Työntekija(ttnro,pomonimi,isopomo, else) and pomo=ttnro)} 25 26 Anna niiden teosten tunnukset, joita ei käytetä millään kursseilla {tunnus ( nimi,pv,kust) (Teos(tunnus,nimi,pv,kust) and not (( k,m,t) (Materiaali(k,m,t) and tunnus=m))) } (= Ei ole olemassa materiaaliriviä, jossa esiintyisi) Toisin: {tunnus ( nimi,pv,kust) (Teos(tunnus,nimi,pv,kust) (( kirja,kurssi,tyyppi) (not(materiaali(kurssi,kirja,tyyppi)) or not (tunnus=kirja)))} Sarakekalkyyliin perustuvista kielistä tunnetuin on Query By Example, jonka pohjalta sarakekalkyyli kehitettiin sille teoriataustaksi QBE on graafinen kieli. Se perustuu taulupohjien (skeleton) käyttöön Taulupohja on taulukko, jossa näkyvät taulun sarakkeet 27 28 Esimerkiksi Hae kaikki Teokset, jotka on painettu vuonna 2006. Tulosta kirjanumero ja nimi. P. P. 2006 Vakioarvoihin peustuvat ehdot suoraan pohjalle oikeaan sarakkeeseen (2006) tulostusvaatimus P. tuplat voidaan jättää lisämääreellä ALL. (P.ALL.) 29 30 Harri Laine 5
Tulosta koko rivi: P. 2006 yhdistäminen muuttujilla (kurssit, jotka ovat samalla tasolla kuin Kyselykielet) Kyselykielet P. Kyselykielet P. oheishakemisto Kurssin Kyselykielet oheishakemistona käytettävien kirjojen tunnukset? 31 32 _y Database Management _kn Perus tai aineopintokurssit P. _y _tp Result kurssinimi tyyppi P. _kn _tp tulostaulu conditions =perus or =aine Millä kurssilla ja mihin tarkoitukseen käytetään Database Management nimistä teosta? 33 34 Anna niiden teosten tunnukset, joita ei käytetä millään kursseilla Kirja josta on vähintään 2 painosta P._y _y P. _y _y 35 36 Harri Laine 6