10.07.2015 Views

Andmebaasid I - Teema nr. 3 - Tallinna Tehnikaülikool

Andmebaasid I - Teema nr. 3 - Tallinna Tehnikaülikool

Andmebaasid I - Teema nr. 3 - Tallinna Tehnikaülikool

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5.8.3 Laiendamine...................................................................................495.8.4 Piirang............................................................................................505.8.4.1 Võrdluse predikaat..................................................................525.8.4.2 Between predikaat..................................................................535.8.4.3 In predikaat.............................................................................545.8.4.4 Like predikaat..........................................................................545.8.4.5 Similar predikaat.....................................................................555.8.4.6 Is Null predikaat......................................................................565.8.4.7 Overlaps predikaat..................................................................585.8.4.8 Distinct predikaat....................................................................585.8.5 Ridade sorteerimine.......................................................................595.8.6 Tabelite aliased..............................................................................615.9 Funktsioonid..........................................................................................625.9.1 Grupifunktsioonid (SQL:1992)........................................................625.9.2 Igale reale eraldi rakenduvad funktsioonid....................................666. Mõisted.........................................................................................................747. Kasutatud materjalid....................................................................................752


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar1. Eesmärk• Tutvustada relatsioonialgebra operatsioone.• Tutvustada tuletatud relatsioonilisi muutujaid ja nende kasutusvõimalusi.• Tutvustada sissejuhatavalt SQL andmebaasikeelt.• Tutvustada SQLi lihtsamaid SELECT lauseid, mis võimaldavad otsidaandmeid ühest tabelist.2. RelatsioonialgebraRelatsiooniline andmebaas järgib relatsioonilist andmemudelit. Relatsioonilineandmebaas on relatsiooniliste muutujate e. relvaride kogum. Relatsiooniliseleandmemudelile rakendub matemaatika haru, mida nimetatakserelatsioonialgebraks. Relatsioonialgebra on (Isotamm 1996, põhjal)relatsioonide kui operandidega teostatavate operatsioonide kogum.Järgnevalt loetleme relatsioonialgebra operatsioonid, mis pakuti algselt väljarelatsioonilise mudeli autori E. F. Codd poolt (Codd, 1972). Nagu näete, saabneid operatsioone omakorda jagada kaheks.- Hulgateoreetilised operatsioonid• Hulgateoreetiline summa (ingl . k. union)• Lõige (ingl. k. intersection)• Hulgateoreetiline vahe (ingl. k. set difference)• Descartesi ristkorrutis e. otsekorrutis (ingl. k. Cartesian product)- Spetsiaaloperatsioonid• Piirang e. selektsioon (ingl. k. restriction)• Projektsioon (ingl. k. projection)• Ühendamine e. agregeerimine (ingl. k. join)• Jagamine (ingl. k. division)Lisaks eelnimetatud kaheksale operatsioonile on võimalik defineerida veelmistahes hulk täiendavaid operatsioone kasutades juba olemasolevaidoperatsioone.Iga relatsioonialgebra operatsiooni läbiviimiseks läheb vaja operaatorit.Relatsioonialgebra operatsioonide läbiviimist võimaldavad operaatorid onüldised, relatsiooni tüüpi lugemisoperaatorid. "Üldised" tähendab, et needrakenduvad mistahes tüüpi relatsioonidele (operaatori poole pöördumisel võibargumendiks olla mistahes relatsioon). "Relatsiooni tüüpi" tähendab, etoperaatori tagastatav väärtus on relatsioon. "Lugemisoperaator" tähendab, etoperaatori poole pöördumisel tagastatakse väärtus, kuid ei muudetaandmebaasis olevate relatsiooniliste muutujate väärtusi. Samas taolisioperaatoreid võib kasutada selleks, et leida andmebaasist korteeže midasoovitakse muuta.Relatsioonialgebra operatsioonide rakendamisel relatsioonidelesaadakse tulemuseks alati relatsioon. (vt. teema 2). Oluline on pidadameeles, et relatsioonis ei tohi olla mitu ühe nimega atribuuti ja korduvaid3


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarkorteeže. Seega peab ka iga relatsioonialgebra operatsiooni tulemus vastamasellistele tingimustele.Kuna relatsioonialgebra operatsiooni tulemus on relatsioon, siis üheoperatsiooni väljund võib olla teise sisendiks. See võimaldab koostadaavaldisi, kus lähterelatsioonidega viiakse läbi mitmeid operatsioone ningtulemuseks saadakse jällegi relatsioon.Järgnevalt esitatakse Tutorial D andmebaasikeeles kirjutatud avaldise näide.Leia sellise isiku perenimi, kes on õpetaja ja kelle numbriline identifikaator on4.((Isik JOIN Opetaja) WHERE id_isik=4) {perenimi}Operatsioonid: ühendamine, piirang, projektsioon.Isik ja Opetaja on relatsiooniliste muutujate nimed. Antud kontekstistähistavad need muutujate väärtuseid.Järgnevalt esitame kahe relatsioonilise muutuja (Linn1 ja Linn2) konkreetsednäiteväärtused, mida kasutame edaspidi näidetes. Mõlemad muutujad (jaseega ka nende muutujate väärtused) on tüüpi RELATION {kood CHAR,nimi CHAR}.Selles dokumendis esitatavad relatsioonialgebra operatsioonide kirjeldusedpõhinevad peamiselt Connolly ja Begg (2002) pakutud kirjeldustel ning onsuhteliselt mitteformaalsed. Relatsioonialgebra operatsioonide kohta käivatesnäidetes esitatavad avaldised on kirjutatud "algebralises" keeles, midakasutavad ka Isotamm (1996) ning Connolly ja Begg (2002). Täiendavaterelatsioonialgebra operatsioonide kirjeldustes kasutatakse Date (2003) poolttarvitatavat tähistust.Täpselt sellise süntaksiga keelt ei saa kasutada üheski tänapäeval laialttuntud andmebaasisüsteemis. Samas peavad kõik relatsiooniliseksnimetatavad andmebaasisüsteemid võimaldama kasutada andmebaasikeelt,milles kirjutatud avaldiste arvutamise tulemus on sama, kui selles peatükiskirjeldatud operatsioonide tulemus.Linn1Linn2kood nimi kood nimi0784 Tallinn 0795 Tartu linn0795 Tartu linn 0183 Haapsalu linn0625 Pärnu linn 0566 Paide linn0349 Kuressaare linn 0919 Võru linnJoonis 1 Näite relatsioonid.4


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar2.1 Atribuudi ümbernimetamineRelatsioonialgebra operatsiooni tulemuseks on relatsioon. Tuletame meelde,et relatsioonis peab igal atribuudil olema unikaalne nimi. Mis saab siis, kuiühendada ühendamisoperatsiooni (vt jaotis 2.4.2) abil kaks relatsiooni, kuskummaski on sama nimega atribuut? Sellisel juhul peaks tulemuseks saadudrelatsioonis üks nimetatud atribuutidest olema ümber nimetatud. Seetõttuvajame relatsiooni atribuudi ümbernimetamise operatsiooni.Ümbernimetamise (ingl. k. rename) operatsiooni sisendiks on relatsioon javäljundiks on relatsioon, kus üks atribuut on nimetatud uue nimega.Näiteks järgneva avaldise:Linn1 RENAME (kood AS id) tulemuseks on relatsioon, kus atribuut kood onnimetatud ümber atribuudiks id. Atribuudi tüüp ümbernimetamise tulemusenaei muutu. Oluline on silmas pidada, et selle avaldise arvutamise tulemusenaei muutu andmebaasis olev relvar Linn1.Linn1 RENAME (kood AS id)id nimi0784 Tallinn0795 Tartu linn0625 Pärnu linn0349 Kuressaare linnJoonis 2 Operatsiooni RENAME tulemus.2.2 Unaarsed spetsiaaloperatsioonidUnaarsed relatsiooni operatsiooni rakenduvad ühele relatsioonile.2.2.1 Piirang (ingl. k. restriction või selection)σ F (r)Operatsioon piirang σ F (r) defineerib relatsiooni r põhjal uue relatsiooni, missisaldab vaid neid relatsiooni r korteeže, mille puhul loogikaavaldis F onTRUE.Atribuudid, millele loogikaavaldises F viidatakse, võivad olla vaid relatsiooni ratribuudid.Loogikaavaldist F nimetatakse ka piirangu tingimuseks. Piiranguoperatsioonist rääkides kasutatakse ka terminit θ-piirang, sest lihtsamal juhulon piirangu tingimus kujul X θ Y kus X ja Y võivad olla konstandid (väärtusiesitavad literaalid), relatsiooni r atribuudid või avaldised väärtusearvutamiseks. θ on näiteks üks järgmistest võrdlusoperaatoritest(=,=,).5


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarKeerukamaid piirangu tingimusi saab konstrueerida kasutadesloogikaoperaatoreid AND (ja), OR (või) ja NOT (eitus).Piirangu tulemust nimetatakse ka relatsiooni korteežide horisontaalseksalamhulgaks.Saadavad andmedJoonis 3 Piirangu operatsioon.Näide:σ kood='0784' (Linn1)koodnimi0784 TallinnNäide:σ kood='0784' OR kood='0795' (Linn1)kood nimi0784 Tallinn0795 Tartu linnRelatsiooni r identiteedi piiranguks nimetatakse piirangut, mille tulemuseks o<strong>nr</strong>elatsioon, mis on võrdne r-ga.Näide: σ kood=kood (r)2.2.2 Projektsioon (ingl. k. projection)Π a1,...,an (r)Eeldame, et r on relatsioon ning a1,...,an on selle relatsiooni atribuutidealamhulk.Operatsioon projektsioon Πa1,...,an(r) defineerib relatsiooni r põhjal uuerelatsiooni, mis sisaldab vaid atribuute a1, ..., an ning neile vastavaid väärtusi.Projektsiooni tulemuse atribuutide hulk on algse relatsiooni r atribuutidealamhulk. Projektsiooni tulemust nimetatakse ka relatsiooni korteežidevertikaalseks alamhulgaks.6


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSaadavad andmedJoonis 4 Projektsiooni operatsioon.Näide:Π kood (Linn2)kood0795018305660919Näide 2:Tootajatootaja_kood perenimi registr_kpv palk1 Jõgi 11.11.2001 14002 Mets 12.04.2001 14003 Kask 10.05.2001 16004 Triik 10.03.2001 1800Π palk (Tootaja)palk140016001800Nagu näete on tulemuses vaid kolm korteeži, sest relatsiooniline mudel eiluba relatsioonides korduvaid korteeže.Relatsiooni r identiteedi projektsiooniks nimetatakse projektsiooni üle kõigi ratribuutide.Näide: Π kood, nimi (Linn1)7


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarProjektsiooni operatsiooni läbiviimisel võib jätta ka atribuutide alamhulgamääramata.Näide: Π(Linn1)Selle tulemuseks on relatsioon, mille aste on 0. Selliseid relatsioone on kakstükki – TABLE_DEE (aste 0 ja võimsus 1) ja TABLE_DUM (aste 0 ja võimsus0) (vt. teema 2). Operatsiooni tulemuseks on TABLE_DEE kui relatsioonisLinn1 on vähemalt üks korteež. Operatsiooni tulemuseks on TABLE_DUM kuirelatsioonis Linn1 ei ole ühtegi korteeži. Seega aitab esitletud operatsioonsaada vastuse küsimusele – kas leidub mõni Linn1?2.3 Binaarsed hulgateoreetilised operatsioonidBinaarses relatsiooni operatsioonid rakenduvad kahele relatsioonile (nt. r jas). Relatsioonid r ja s peavad olema sama relatsiooni tüübiga (ühilduvad).2.3.1 Hulgateoreetiline summa (ingl. k. union)r U sRelatsioonidele r ja s rakendatud hulgateoreetilise summa leidmiseoperatsioon r U s annab tulemuseks relatsiooni, mille moodustavad kõik kasrelatsiooni r, relatsiooni s või mõlemasse kuuluvad korteežid.rsSAADAVAD ANDMEDJoonis 5 Hulgateoreetilise summa.Operatsiooni tulemuseks olev relatsioon on sama tüüpi kui r ja s.Juhime veelkord tähelepanu, et iga relatsioonialgebra operatsiooni tulemus onsamuti relatsioon. Nii relatsioonis Linn1 kui ka relatsioonis Linn2 onandmed Tartu kohta. Samas järgneval joonisel esitatud operatsioonidetulemuses on Tartu andmetega vaid üks korteež, sest relatsioonis eitohi olla korduvaid korteeže.Näide:Π nimi (Linn1) U Π nimi (Linn2)Näide selle kohta kuidas üherelatsiooni operatsiooni väljund on8


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarnimiTallinnTartu linnPärnu linnKuressaare linnHaapsalu linnPaide linnVõru linnteise sisendiks. Kõigepealt viiakserelatsioonidega Linn1 ja Linn2eraldi läbi projektsiooni leidmiseoperatsioon. Tulemuseks saadudrelatsioonidega viiakse läbihulgateoreetilise summaleidmise operatsioon.Summa leidmise operatsioon on:• idempotentne: r U r = r• kommutatiivne: r U s = s U r• assotsiatiivne: (r U s) U t = r U (s U t)Ühendi leidmise operaator vastab loogikaoperaatorile OR.Näide: Leia relatsiooni Linn1 põhjal linnad, mille nimi on Tallinn või Tartu linn.(Linn1 WHERE nimi='Tallinn') UNION (Linn1 WHERE nimi='Tartu linn')2.3.2 Hulgateoreetiline vahe (ingl. k. difference, minus)r-sRelatsioonidele r ja s rakendatud hulgateoreetilise vahe leidmise operatsioo<strong>nr</strong>-s annab tulemuseks relatsiooni, mis sisaldab korteeže, mis kuuluvadrelatsiooni r, kuid mis ei kuulu relatsiooni s.Operatsiooni tulemuseks olev relatsioon on sama tüüpi kui r ja s.rsSAADAVAD ANDMEDJoonis 6 Hulgateoreetiline vahe.Näide:Π nimi (Linn1) – Π nimi (Linn2)nimiTallinnPärnu linnKuressaare linn9


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarΠ nimi (Linn2) - Π nimi (Linn1)nimiHaapsalu linnPaide linnVõru linnVahe leidmise operatsioon ei ole idempotentneVahe leidmise operatsioon ei ole kommutatiivneVahe leidmise operatsioon ei ole assotsiatiivne2.3.3 Lõige või ühisosa (ingl. k. intersection)r ∩ sRelatsioonidele r ja s rakendatud lõike leidmise operatsioon r ∩ s annabtulemuseks relatsiooni, mis sisaldab ainult neid korteeže, mis on niirelatsioonis r kui ka s.Operatsiooni tulemuseks olev relatsioon on sama tüüpi kui r ja s.rsSAADAVAD ANDMEDJoonis 7 Lõige.Näide:Π nimi (Linn1) ∩ Π nimi (Linn2)nimiTartu linnLõike operatsiooni võib esitada vahe operatsiooni kaudur ∩ s=r-(r-s)Lõike leidmise operatsioon on• idempotentne: r ∩ r = r• kommutatiivne: r ∩ s = s ∩ r10


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar• assotsiatiivne: (r ∩ s) ∩ t = r ∩ (s ∩ t)2.3.4 OtsekorrutisSeda operatsiooni tuntakse ka nime all Descartesi ristkorrutis või Cartesiuseristkorrutis. Need nimevariandid tulenevad selle defineerinud prantsuseteadlase René Descartesi (ladina keeles Renatus Cartesius) nimest(Isotamm, 1996).r x sRelatsioonidele r ja s rakendatud otsekorrutise leidmise operatsioon r x sannab tulemuseks relatsiooni, kus iga relatsiooni r korteež on ühendatud igarelatsiooni s korteežiga.Kui relatsioonil r on i korteeži ja n atribuuti ja relatsioonil s on j korteeži ja matribuuti, siis operatsiooni r x s tulemusena saadav relatsioon sisaldab (i*j)korteeži ja (n+m) atribuuti. Teisisõnu on selle relatsiooni võimsus (i*j) jaaste (n+m).Kui korrutatavates relatsioonides on ühenimelisi atribuute, siis tuleb ennekorrutamist need atribuudid ümbernimetada, sest operatsiooni tulemuseks onsamuti relatsioon ja selles ei tohi ühenimelisi atribuute olla.Näide:Linn1 x Linn2 RENAME (kood AS kood_muudetud, nimiAS nimi_muudetud)kood nimi kood_muudetud nimi_muudetud0784 Tallinn 0795 Tartu linn0784 Tallinn 0183 Haapsalu linn0784 Tallinn 0566 Paide linn0784 Tallinn 0919 Võru linn0795 Tartu linn 0795 Tartu linn0795 Tartu linn 0183 Haapsalu linn0795 Tartu linn 0566 Paide linn0795 Tartu linn 0919 Võru linn0625 Pärnu linn 0795 Tartu linn0625 Pärnu linn 0183 Haapsalu linn0625 Pärnu linn 0566 Paide linn0625 Pärnu linn 0919 Võru linn11


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar0349 Kuressaare linn 0795 Tartu linn0349 Kuressaare linn 0183 Haapsalu linn0349 Kuressaare linn 0566 Paide linn0349 Kuressaare linn 0919 Võru linnKuna operandideks olevates relatsioonides olid ühesuguse nimega atribuudid,siis enne otsekorrutise leidmise operatsiooni tuli viia läbi ümbernimetamise(RENAME) operatsioon. Relatsioonis Linn1 on 2 atribuuti ja 4 korteeži ningrelatsioonis Linn2 on samuti 2 atribuuti ja 4 korteeži. Otsekorrutiseoperatsiooni tulemuseks olevas relatsioonis on 2+2=4 atribuuti ning 4*4=16korteeži.Otsekorrutise leidmise operatsioon on• kommutatiivne: r x s = s x r• assotsiatiivne: (r x s) x t = r x (s x t)2.4 Binaarsed spetsiaaloperatsioonid2.4.1 Täiendavad näite relatsioonidOletame, et meil on relatsioonilised muutujad Tootaja, Osakond ja Palgaaste,mille päised esitavad järgmised predikaadid: Tootaja: Ettevõttes töötab töötaja koodiga TOOTAJA_KOOD,perenimega PERENIMI, elukoha aadressiga AADRESS, kesregistreeriti kuupäeval REGISTR_KPV, saab kuus palka PALK eurotning töötab osakonnas OSAKONNA_NR. Osakond: Osakonnal numbriga OSAKONNA_NR on nimiOSAKONNA_NIMI. Palgaaste: Palgaastmel koodiga ASTME_NR on vahemik (otspunktidkaasa arvatud), mille alguspunkt on VAHEMIKU_ALGUS ninglõpp-punkt on VAHEMIKU_LOPP.Esitame järgnevalt nende relatsiooniliste muutujate näiteväärtused, midakasutame edaspidi näidetes.Tootajatootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>1 Jõgi Tallinn, 11.11.2001 1400 1Pikk 342 Mets Paide, 12.04.2001 1500 2Roheline 73 Kask Tartu, 10.05.2001 1600 1Tähe 124 Triik Tartu,Kase 12-4410.03.2001 1800 312


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarOsakondosakonna_<strong>nr</strong> osakonna_nimi1 personaliosakond2 kinnisvaraosakond3 müügiosakond4 lepingute osakondPalgaasteastme_<strong>nr</strong> vahemiku_algus vahemiku_lopp1 200 5002 501 10003 1001 3000Joonis 8 Relvaride näiteväärtused.Nimetatud relatsiooniliste muutujate võtmeid kirjeldab järgnev spetsifikatsioon:Osakond{osakonna_<strong>nr</strong>, osakonna_nimi}Primaarvõti{osakonna_<strong>nr</strong>}Alternatiivvõti {osakonna_nimi}Tootaja {tootaja_kood, perenimi, aadress, registr_kpv, palk, osakonna_<strong>nr</strong>}Primaarvõti{tootaja_kood}Välisvõti {osakonna_<strong>nr</strong>} Viitab Osakond {osakonna_<strong>nr</strong>}Palgaaste {astme_<strong>nr</strong>, vahemiku_algus, vahemiku_lopp}Primaarvõti {astme_<strong>nr</strong>}Alternatiivvõti {vahemiku_algus, vahemiku_lopp}2.4.2 Ühendamine (ingl. k. join)2.4.2.1 Teeta -ühendamine (θ-ühendamine)Tavaliselt soovime otsekorrutise tulemusest vaid korteeže, mis vastavadteatud tingimusele. Soovitud tulemuse saamiseks tuleb kasutada ühendamiseoperatsiooni. Ühendamise operatsiooni tulemusena saadud relatsioonis onkahest relatsioonist pärit korteežid ühendatud mingi kindla kriteeriumi järgi.r I>


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarVäga sageli tuleb ühendada üksteisega välisvõtmete kaudu seotudrelatsiooniliste muutujate väärtusi. Sellisel juhul on üks võrreldavatestatribuutidest kandidaatvõtme atribuut ja teine välisvõtme atribuut.Keerukamaid loogikaavaldisi saab konstrueerida kasutadesloogikaoperaatoreid AND, OR ja NOT.Väga sageli on θ-ühendamise operatsioonis võrdlusoperaatorina θ kasutuselvõrdsuse kontrolliks mõeldud operaator "=". Ingliskeelses kirjandusesnimetatakse sellist operatsiooni "equijoin".Ühendamise operatsioon on: kommutatiivne: r I>


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar2. Ümbernimetamise operatsiooni tulemusena saadud relatsioon ühendatakserelatsiooniga Osakond: (Tootaja RENAME osakonna_<strong>nr</strong> AS o_<strong>nr</strong>)I>=Palgaaste.vahemiku_algus ANDTootaja.palk


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaartootaja_kood perenimi palk astme_<strong>nr</strong>1 Jõgi 1400 32 Mets 1500 33 Kask 1600 34 Triik 1800 3Käesolevas näites on võrdlusoperaatorina θ kasutusel ">=" ja "


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarkasutada samanimelistest atribuutide kõrvaldamiseks ümbernimetamiseoperatsiooni, eemaldati naturaalühendamise operatsiooni tulemusest ükssamanimelistest atribuutidest automaatselt.Naturaalühendamise operaator vastab loogikaoperaatorile AND.Näide: Leia töötaja, kelle kood on 1 ja perenimi on Jõgi.(Tootaja WHERE tootaja_kood=1) JOIN (Tootaja WHERE perenimi='Jõgi')2.4.3 Jagaminer ÷ sEeldame, et relatsiooni r atribuutide hulk on X ning relatsiooni s atribuutidehulk on Y, kusjuures Y on X alamhulk. Defineerime atribuutide hulga Z=X-Y.kuhu kuuluvad sellised relatsiooni r atribuudid, mis ei sisaldu relatsioonis s.Eeldame, et relatsioonis s on n korteeži.Jagamisoperatsiooni r ÷ s tulemuseks on relatsioon kus on need ja ainultneed atribuudid, mis kuuluvad hulka Z. Korteež {Z z} kantakse jagamisetulemuseks olevasse relatsiooni ainult siis, kui see esineb relatsioonis rvähemalt n korda ning on ühendatud kõigi relatsiooni s kuuluvatekorteežidega.Näide: r1 ÷ r2 = r3 (Isotamm, 1996) põhjal.r1 r2 r3A B C D C D A Ba1 b1 c1 d1 c1 d1 a1 b1a1 b1 c2 d2 c2 d2 a2 b1a2 b1 c1 d1a2 b1 c2 d2a1 b2 c1 d1a4 b2 c3 d3Käesoleva näite alusel kuuluvad atribuutide hulka X atribuudid {A, B, C, D}.Atribuutide hulga Y moodustavad atribuudid {C, D} ning hulka Z kuuluvadatribuudid {A, B}. Nagu näete, on ka operatsiooni tulemuseks olevalrelatsioonil atribuudid {A, B}.Näide:Oletame, et meil on relatsioonid Oppimine ja Oppeaine, mille päised esitavadjärgmised predikaadid: Oppimine: Üliõpilane matrikli numbriga MATRIKLI_NR on <strong>Tallinna</strong>Tehnikaülikoolis õppinud õppeainet ainekoodiga AINEKOOD.17


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarOppeaine: <strong>Tallinna</strong> Tehnikaülikoolis on andmebaaside õpetamiselepühendatud õppeaine ainekoodiga AINEKOOD.Ülesandeks oleks leida selliste üliõpilaste matrikli numbrid, kes on õppinudkõiki TTÜs andmebaaside õpetamisele pühendatud õppeaineid. Jooniselesitatud relatsioonide Oppimine ja Oppeaine korral oleks õigeks vastuseksrelatsioon Tulemus. Ilmneb, et vastuse leidmiseks võime kasutada jagamiseoperatsiooni: Oppimine ÷ Oppeaine = Tulemus.Õppimine Õppeaine Tulemusmatrikli_<strong>nr</strong> ainekood ainekood matrikli_<strong>nr</strong>990999 IDU3381 IDU3381 990999990999 IDU0120 IDU0120 990998990998 IDU0120990998 IDU3381990997 IDU3381990996 HSK3031Käesoleva näite alusel kuuluvad atribuutide hulka X atribuudid {matrikli_<strong>nr</strong>,ainekood}. Atribuutide hulga Y moodustavad atribuudid {ainekood} ning hulkaZ kuuluvad atribuudid {matrikli_<strong>nr</strong>}. Nagu näete, on ka operatsioonitulemuseks oleval relatsioonil atribuudid {matrikli_<strong>nr</strong>}.Relatsioonis Oppeaine on kaks korteeži (n=2). Näiteks relatsioonis Tulemuson korteež TUPLE {matrikli_<strong>nr</strong> 990999}, sest: selline korteež on kahe relatsioonis Oppimine oleva korteeži alamhulk(esineb relatsioonis Oppimine kaks korda). ning selline korteež on relatsioonis Oppimine ühendatud kõigirelatsiooni Oppeaine kuuluvate korteežidega (vastava matriklinumbriga üliõpilane on õppinud kõiki neid õppeaineid).18


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar2.5 Veel relaltsioonialgebra operatsioonide omadusiKõige põhilisemad relatsioonialgebra operatsioonid on:- ümbernimetamine;- piirang;- projektsioon;- otsekorrutis;- hulgateoreetiline summa;- hulgateoreetiline vahe.Ülejäänud operatsioone saab avaldada nende kuue põhioperatsiooni kaudu.Samas mistahes operatsiooni nendest operatsioonidest ei saa ülejäänud viiekaudu avaldada.Ka Codd (1972) poolt esitatud relatsioonialgebra operatsioonid ei moodustaminimaalset relatsioonialgebra operatsioonide hulka, sest mõned sellessekuuluvad operatsioonid saab avaldada teiste operatsioonide kaudu.- Lõige e. ühisosa => r∩s ≡ r- (r-s)- Ühendamine => r I>


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar−−otsekorrutis,ühendamine.Hulgateoreetilise vahe leidmine ei ole kommutatiivne. St. r-s tulemus ei oleüldjuhul sama kui s-r tulemus.Selliste omaduste teadmine lihtsustab avaldiste kirjutamist ja võimaldabavaldisi teisendada kujule, mille korral tulemuse arvutamine toimub kiiremini.Date (2003) esitab mõned teisendusreeglid, mis võimaldavad relatsiooniliseavaldise asendada samaväärse relatsioonilise avaldisega. r tähistab mistahesrelatsiooni. tühi tähistab relatsiooni kus pole ühtegi korteeži kuid mille tüüp onsama kui relatsioonil r. p1 ja p2 on loogikaavaldised. σ p1 OR p2 (r) ≡ σ p1 (r) U σ p2 (r) σ p1 AND p2 (r) ≡ σ p1 (r) ∩ σ p2 (r) σ TRUE (r) ≡ r σ FALSE (r) ≡ tühi Π X, Y, ..., Z (r) ≡ r (juhul, kui X, Y, ..., Z esitab kogu r atribuutide hulka) r I>


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar2.6.1 Vasakpoolne välisühendaminer >


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarpuhul võib mõne korteeži koostamisel tekkida olukord, et atribuudi väärtus onteadmata (antud näites on selline atribuut perenimi). Kasutatav väärtus tulebvalida vastava atribuudi tüüpi kuuluvate väärtuste hulgast (see väärtus võibolla eelmises lõigus mainitud spetsiaalväärtus).2.6.2 Poolühendaminer I> F sRelatsioonidele r ja s rakendatud poolühendamise (inglise keeles semijoin)operatsioon r I> F s defineerib relatsiooni, mis sisaldab selliseid korteežerelatsioonist r, mis osalevad relatsioonide r ja s ühendamise tulemuselsaadavas relatsioonis. Ehk teiste sõnadega – tulemus sisaldab selliseidkorteeže relatsioonist r millele leidub vaste relatsioonis s.Näide: Leida osakonnad, kus vähemalt üks töötaja saab 1700 eurot võirohkem palka.Osakond I> Osakond.osakonna_<strong>nr</strong>=Tootaja.osakonna_<strong>nr</strong> ANDTootaja.palk>=1700Tootajaosakonna_<strong>nr</strong> osakonna_nimi3 müügiosakondVaatleme järgnevalt, kuidas saada sama tulemus juba tuntudrelatsioonialgebra operatsioone kasutades. Nagu näeme, on võimalik samatulemuseni jõuda kasutades naturaalühendamise, piirangu ja projektsioonioperatsioone.(Π osakonna_<strong>nr</strong> (σ palk >=1700(Tootaja)) I>=1700(Tootaja)tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>4 Triik Tartu, Kase12-4410.03.2001 1800 3Seejärel leiame projektsiooni operatsiooni abil osakonnad kus sellisedtöötajad töötavad.Πosakonna_<strong>nr</strong>(σpalk>=1700(Tootaja))osakonna_<strong>nr</strong>3Lõpuks ühendame tulemuse relatsiooniga Osakond kasutadesnaturaalühendamist.(Πosakonna_<strong>nr</strong>(σpalk>=1700(Tootaja)) |>


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarosakonna_<strong>nr</strong> osakonna_nimi3 müügiosakond2.6.3 Poolvahe leidminer SEMIDIFFERENCE sRelatsioonidele r ja s rakendatud poolvahe leidmise (inglise keelessemidifference) operatsioon r SEMIDIFFERENCE s defineerib relatsiooni,milles on kõik korteežid relatsioonist r millele ei leidu vastavat korteežirelatsioonis s.Date (2003) märgib, et poolvahe leidmise operatsioon on võimalik teostadakasutades hulgateoreetilise vahe ja poolühendamise operatsiooni.r SEMIDIFFERENCE s ≡ r – (r I> F s)Näide: Leia osakonnad, kus ei tööta ühtegi töötajat.osakonna_<strong>nr</strong> osakonna_nimi4 Lepingute osakond2.6.4 Koostaminer COMPOSE sRelatsioonidele r ja s rakendatud koostamise operatsioon r COMPOSE sdefineerib relatsiooni, milles olevad korteežid leitakse r ja s ühendamisetulemusena ning mille atribuutide hulka kuuluvad ainult atribuudid, mis ei ole rja s jaoks ühised.Darwen (2009) märgib, et koostamise operatsioon on võimalik teostadakasutades ühendamise ja projektsiooni operatsiooni.23


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNäide: Tootaja COMPOSE OsakondTulemuses ei ole ühist atribuuti – osakonna_<strong>nr</strong> INTEGER. Relatsioonile r ja sühine atribuut on atribuut, millel on samasugune nimi ja tüüptootaja_koodperenimi aadress registr_kpv palk osakonna_nimi1 Jõgi Tallinn,Pikk 3411.11.2001 1400 personaliosakond2 Mets Paide,Roheline12.04.2001 1500 kinnisvaraosakond73 Kask Tartu, 10.05.2001 1600 personali-Tähe 124 Triik Tartu,Kase 12-44osakond10.03.2001 1800 müügiosakond2.6.5 LaiendamineLaiendamise operatsioon (ingl. k. extend) võimaldab relatsiooni r põhjal luuauue relatsiooni kus on võrreldes relatsiooniga r täiendavaid atribuute, milleväärtus arvutatakse mingi arvutusreegli järgi.Näited:• Leia töötaja kood, perenimi, palk eurodes (EUR) ja palk Eesti kroonides(EEK).• Palk Eesti kroonides arvuta eurodes makstava palga põhjal, kasutadesvahetuskurssi 1EUR=15.64664EEK.• Palk Eesti kroonides tuleb ümardada ühe kohani peale koma kasutadesoperaatorit Round, mille esimese parameetri väärtus on ümardatav väärtusning teise parameetri väärtus on kohtade arv peale koma.Nagu näete järgnevast avaldisest, rakendatakse kõigepealt relatsioonileTootaja projektsiooni operatsioon. Projektsiooni operatsiooni tulemuseksolevas relatsioonis on atribuudid tootaja_kood, perenimi ja palk. Tulemusekssaadud relatsiooni laiendatakse, lisades sinna uue atribuudi palk_eurodes.EXTEND Π tootaja_kood, perenimi, palk (Tootaja) ADD (Round(palk*15.6466,1) ASpalk_kroonides)tootaja_kood perenimi palk palk_kroonides1 Jõgi 1400 21905,22 Mets 1500 23469,93 Kask 1600 25034,64 Triik 1800 28163,924


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar2.6.6 Kokkuvõtmine (ingl. k. summarize)Kokkuvõtmise operatsioon võimaldab relatsioonis olevate korteežidegrupeerimist ja iga grupi kohta mingi väärtuse arvutamist.Näide: Vaatleme näitena ülesannet, kus tuleb leida iga osakonna kohta, kustöötab vähemalt üks töötaja, selles töötavate töötajate keskmine palk.Nagu näete avaldisest, rakendatakse kõigepealt relatsioonile Tootajaprojektsiooni operatsioon. Projektsiooni operatsiooni tulemuseks olevasrelatsioonis on atribuudid osakonna_<strong>nr</strong> ja palk. Tulemuseks saadudrelatsioonile rakendatakse kokkuvõtmise operatsioon. Keskmise palgaleidmiseks kasutatakse operaatorit AVG. AVG on grupioperaator, misvõimaldab mingi atribuudi erinevates korteežides olevate väärtuste põhjalarvutada ühe skalaarse väärtuse. Grupioperaatorid on ka näiteks COUNT(atribuudi väärtuste loendamine), SUM (atribuudi väärtuste summeerimine),MIN (väikseima atribuudi väärtuse leidmine), MAX (suurima atribuudi väärtuseleidmine).SUMMARIZE Π osakonna_<strong>nr</strong>, palk (Tootaja) PER Tootaja (osakonna_<strong>nr</strong>) ADDAVG(palk) AS keskmineosakonna_<strong>nr</strong> keskmine1 15002 15003 1800Kuidas sellise tulemuseni jõuti? Relatsioonis Töötaja olevad korteežid jaotatigruppidesse vastavalt relatsiooni Osakond atribuudi osakonna_<strong>nr</strong> väärtustele.Iga osakonna numbri kohta moodustus üks grupp. Iga grupi kohta leitiatribuudi palk väärtuste põhjal keskmine palk.2.6.7 GrupeerimineJuba Codd (1972) mainib pesastamise (ingl. k. factoring, nesting)operatsiooni, mis võimaldab andmete parema esitamise huvides luuarelatsiooni põhjal uus relatsioon kus mõne atribuudi väärtusteks on väärtustehulk. Date (2003) tutvustab grupeerimise operatsiooni.Grupeerimise (ingl. k. group) operatsioon võimaldab luua relatsiooni, missisaldab relatsiooni tüüpi atribuuti.25


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNäide: Relatsiooni Tootaja atribuutidele tootaja_kood, perenimi, aadress,registr_kpv, palk rakendatav grupeerimise operatsioon annab tulemuseksrelatsiooni, kus on kaks atribuuti.Tootaja GROUP ({tootaja_kood, perenimi, aadress, registr_kpv, palk} AStootajad);osakonna_<strong>nr</strong>tootajad1Jõgi Tallinn, Pikk3411.11.2001 14001 33 42 2KaskTriikMetsTartu, Tähe12Tartu, Kase12-44Paide,Roheline 710.05.2001 160010.03.2001 180012.04.2001 1500Atribuut tootajad on relatsiooni tüüpi. Selle atribuudi iga väärtus esitab mingisosakonnas töötavate töötajate andmeid. Iga selle atribuudi väärtus o<strong>nr</strong>elatsioon.Kuna relatsiooni atribuut võib olla korteeži või relatsiooni tüüpi, siis on ka seerelatsioon normaliseeritud. Lisaks grupeerimise operaatorile on kadegrupeerimise operaator (ingl. k. ungroup), mis võimaldab relatsiooni tüüpiatribuute sisaldavaid relatsioone "tasandada" – taastada olukord, kusrelatsiooni tüüpi atribuut puudub.2.6.8 MässimineDate (2003) tutvustab mässimise operatsiooni.Mässimise (ingl. k. wrap) operatsioon võimaldab luua relatsiooni, mis sisaldabkorteeži tüüpi atribuuti.Näide: Relatsiooni Tootaja atribuutidele osakonna_<strong>nr</strong>, tootaja_kood,perenimi, aadress, registr_kpv, palk rakendatav mässimise operatsioon annabtulemuseks relatsiooni, kus on üks atribuut.26


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTootaja WRAP ({osakonna_<strong>nr</strong>, tootaja_kood, perenimi, aadress, registr_kpv,palk} AS tootajad);1 Jõgi Tallinn,Pikk 342 Mets Paide,Roheline 73 Kask Tartu, Tähe124 Triik Tartu, Kase12-44tootajad11.11.2001 1400 112.04.2001 1500 210.05.2001 1600 110.03.2001 1800 3Atribuut tootajad on korteeži tüüpi. Selle atribuudi iga väärtus esitab ühetöötaja andmeid.Kuna relatsiooni atribuut võib olla korteeži või relatsiooni tüüpi, siis on ka seerelatsioon normaliseeritud. Lisaks mässimise operaatorile on ka"lahtimässimise" operaator (ingl. k. unwrap), mis võimaldab korteeži tüüpiatribuute sisaldavaid relatsioone "tasandada" – taastada olukord, kus korteežitüüpi atribuut puudub.2.7 Milleks relatsioonialgebrat vaja lähebDate (2003, lk. 192–193) loetleb relatsioonialgebra vajalikkuse põhjuseid.Relatsioonialgebra võimaldab kirjutada relatsioonilisi avaldisi. Relatsioonilineavaldis on avaldis mille tulemus on relatsioon. Relatsioonilisi avaldisi saabkasutada:− Andmete otsimiseks. Avaldis kirjeldab andmed, mida soovimeandmebaasist leida.− Andmete muutmiseks. Avaldis kirjeldab andmed, mida soovimeandmebaasi lisada, andmebaasis muuta või andmebaasist kustutada.− Andmebaasis olevate andmete terviklikkuse tagamiseks. Avaldis kirjeldabtingimusi, millele peavad andmebaasis olevad andmed vastama.− Tuletatud relatsiooniliste muutujate kirjeldamiseks. Avaldis kirjeldabtuletatud muutuja võimalikke väärtusi (vt. peatükk 4).− Stabiilsuse tagamiseks. Avaldis kirjeldab andmeid, mille suhtes rakendubandmebaasis mingi andmete mitme kasutaja poolt samaaegset kasutamistvõimaldav meetod.− Turvalisuse tagamiseks. Avaldis kirjeldab andmeid, mille suhtes kasutajaleantakse õigused.− Kuna sageli saab sama tulemuseni jõuda mitme erineva avaldise abil (kuson kasutatud erinevaid operatsioone), siis annab see võimaluseandmebaasisüsteemil avaldisi optimeerida (viia avaldis teiselesamaväärsele kujule), et leida kõige kiirem viis kasutaja soovide täitmiseks.Öeldakse, et andmebaasikeel on relatsiooniliselt täielik kui see on vähemaltsama võimas kui relatsioonialgebra (Date, 2003). Teisisõnu, andmebaasikeel27


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarL on relatsiooniliselt täielik kui kõiki relatsioone, mida saab kirjeldadakasutades relatsioonialgebra avaldisi, saab kirjeldada ka keeles L kirjutatudavaldiste abil.2.8 Mudel vs realisatsioonOluline on eristada mudelit ja selle mudeli realisatsiooni. Relatsioonilinemudel ei kirjuta ette, kuidas leida relatsioonialgebra operatsioonidetulemused. Andmebaasisüsteemide loojad võivad valida kõige sobivamameetodi. Näiteks ühendamise operatsiooni läbiviimiseks võibandmebaasisüsteem kasutada erinevaid meetodeid:• nested loop join,• merge join,• hash join./*Nested loop join näide*/for (each tuple in r) {/*Väline tsükkel*/for (each tuple in s) {/*Sisemine tsükkel*/if (r join attribute value matches s join attribute value) thenelseend if;}}passfailKokkuvõttes lihtsustab see andmebaasi kasutamist ning suurendabandmebaasi kasutajate tööviljakust. Andmebaasi kasutajad peavad koostamasobiva relatsioonialgebra avaldise. Samas ei pea nad mõtlema selleleKUIDAS sellele avaldisele vastavad andmed süsteemi poolt leitakse.3. Tuletatud relatsioonilised muutujadRelatsiooniline andmebaas on relatsiooniliste muutujate (relvaride) kogum.Relatsioonilises andmebaasis sisalduvaid relatsioonilisi muutujaid võibliigitada (Date, 2006):Relatsiooniline baasmuutuja (baasrelvar).Tuletatud relatsiooniline muutuja (tuletatud relvar).28


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTuletatud muutuja on relatsiooniline muutja, mis on defineeritud teisterelatsiooniliste muutujate kaudu. Baasmuutuja on relatsiooniline muutuja, misei ole defineeritud teiste relatsiooniliste muutujate kaudu.Tuletatud muutujaid võib liigitada: Virtuaalne relatsiooniline muutuja e. vaade (ingl. k. view). Hetktõmmis (ingl. k. snapshot).Siiani oleme me relatsiooniliste muutujate all pidanud silmas baasmuutujaid.Mille poolest erinevad tuletatud muutujad baasmuutujatest? Täpselt nagubaasmuutujal on ka tuletatud muutujal nimi. Kuid erinevalt baasmuutujastpeab andmebaasi arendaja tuletatud muutuja loomisel kirjeldamarelatsioonilise avaldise, mille alusel leitakse selle muutuja väärtus.Relatsiooniline avaldis on avaldis mille arvutamise tulemus on relatsioon.Relatsioonilises avaldises võidakse pöörduda relatsioonialgebra operaatoritepoole.Vaade on tuletatud muutuja, mille väärtuseks olev relatsioon moodustatakseselle poole pöördumise hetkel selle spetsifikatsioonis kirjeldatud relatsiooniliseavaldise arvutamise tulemusena. Teisisõnu, iga kord kui mõni andmebaasikasutaja soovib teada mingi vaate väärtust peab andmebaasisüsteem leidmaselle vaate kirjelduses määratud relatsioonilise avaldise tulemuse. Loomulikultvõtab avaldise tulemuse leidmine mingil määral aega.Kui tuletatud muutuja väärtus on korra leitud, siis kas seda väärtust ei saakskasutada erinevate kasutajate päringutele vastamiseks? Selgub, et saab küllning selleks tuleb andmebaasis luua hetktõmmis.Hetktõmmis on tuletatud muutuja, mille väärtuseks olev relatsioon leitakserelatsioonilise avaldise arvutamise tulemusena juba mingil ajahetkel enneseda kui kasutaja küsib selle muutuja väärtust. Juhul, kui muutuvad nendemuutujate väärtused mille põhjal hetktõmmis on loodud, kuid ei muutuvastava hetktõmmise väärtus, siis esitab hetktõmmise väärtus vananenudandmeid. See tähendab, et hetktõmmise väärtust tuleb kas kasutaja soovikorral või perioodiliselt värskendada (st. leida muutuja kirjelduses esitatudrelatsioonilise avaldise tulemus ning anda tulemuseks saadud väärtusmuutujale). Sageli kasutatakse termini hetktõmmis asemel terminitmaterialiseeritud vaade.Kordame, et relatsiooniline mudel ei ütle midagi selle kohta kuidas andmeidfüüsilisel tasemel organiseerida. Siiski võib tõdeda, et olemasolevadandmebaasisüsteemid salvestavad tüüpiliselt baasmuutujate ja hetktõmmisteväärtused füüsilisel tasemel failidesse, samas kui vaadete väärtusedarvutatakse relatsiooniliste avaldiste põhjal ning neid väärtusi füüsiliseltasemel failidesse ei salvestata.Esitame järgnevalt vaate näite. Vaate loomise lause on kirjutatud Tutorial Dkeeles. Vaate nimeks on Korge_palk ja väärtuseks on relatsioon, mis esitabüle 1500 euro palka saavate töötajate koodi, perenime ja palga.VAR Korge_palk VIEW (Tootaja WHERE palk>1500) {tootaja_kood, perenimi,palk}29


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNagu näete on tuletatud muutuja (vaade) Korge_palk defineeritudrelatsioonilise muutuja Tootaja kaudu. Võrdluseks, Tootaja on baasmuutuja,mis ei ole defineeritud teiste muutjate kaudu ning mille loomise lause onTutorial D keeles:VAR Tootaja BASE RELATION {tootaja_kood CHAR, perenimi CHAR,aadress CHAR, registr_kpv DATE, palk INTEGER, o_<strong>nr</strong> INTEGER} KEY{tootaja_kood};Kui kasutaja soovib teada vaate väärtust, siis leiab andmebaasisüsteem vaatespetsifikatsioonis esitatud relatsioonilise avaldise "(Tootaja WHEREpalk>1500) {tootaja_kood, perenimi, palk}" väärtuse. Selles avaldisespöördutakse piirangu ja projektsiooni arvutamise operaatorite poole.Järgnev joonis esitab halliga relatsioonis Tootaja asuvad andmed, mis onnähtavad vaate Korge_palk kasutajale. Alamosa b) esitab vaate Korge_palkvõimaliku väärtuse näite.a)tootaja_kood perenimi aadress registr_kpv palk o_<strong>nr</strong>1 Jõgi Tallinn,Pikk 342 Mets Paide,Roheline 73 Kask Tartu,Tähe 124 Triik Tartu,Kase 12-4411.11.2001 1400 112.04.2001 1500 210.05.2001 1600 110.03.2001 1800 3b)tootaja_kood perenimi palk3 Kask 16004 Triik 1800Relatsioonilises andmebaasis kehtib baasmuutujate ja vaadete eristamatuseprintsiip. Selle printsiibi kohaselt ei ole vaja teha meelevaldset ning tarbetutvahet baasmuutujate ja vaadete vahel. Andmebaasi kasutaja jaoks peaksidbaasmuutujad ja vaated paistma ning tunduma ühesugused. Kasutaja ei peatingimata teadma kas ta kasutab parajasti baasmuutujat või vaadet. Seeomakorda tähendab, et baasmuutujate ja vaadete käitumine relatsioonilisteoperatsioonide kontekstis peab olema ühesugune. Sellest tulenevalt peaksläbi kõigi vaadete saama muuta andmebaasis olevaid andmeid (eeldusel, etmuudatus ei lähe vastuollu andmebaasis jõustatud kitsendustega). Kuiandmebaasi kasutaja muudab vaate väärtust, siis andmebaasisüsteem peabmuutma selle vaate aluseks olevate baasmuutujate väärtusi.30


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarParaku tänapäeva SQL-andmebaasisüsteemides on võimalused vaadetekaudu andmete muutmiseks üsnagi piiratud. Juba SQL standard (Melton,2003) seab vaadete kaudu andmete muutmisele palju piiranguid ningkonkreetsetes andmebaasisüsteemides on neid piiranguid veelgi rohkem.Andmebaasi kasutaja jaoks on oluline, et ta saaks kasutada õigeid ja värskeidandmeid (mis võimalikult täpselt peegeldavad reaalset maailma). Seetõttupeab andmebaasi kasutaja kindlasti teadma kas ta kasutab hetktõmmist, sestsellise muutuja väärtus võib esitada vananenud andmeid. Kui langetadaotsuseid veidi vananenud andmete põhjal, võib (aga ei pruugi) see viiahalbade tagajärgedeni (kõik sõltub sellest kui palju need andmed onvananenud ning mis otsuste langetamiseks neid kasutatakse). Andmebaasikasutaja peab olema teadlik hetktõmmise kasutamisest, sest sellisel juhuloskab ta arvestada võimalike probleemidega (mitte kõige värskemadandmed) ja eelistega (paranenud töökiirus).Samas ei pea andmebaasi kasutaja teadma kas ta kasutab baasmuutujaid võivaateid, sest nende väärtused esitavad "värskeid" andmeid. Andmebaasikasutaja ei pea sellisel juhul tingimata teadma kuidas see väärtus on temajaoks moodustatud ning andmebaasisüsteemi poolt füüsilisel tasemelsalvestatud.Millised on vaadete kasutamise eesmärgid?Vaade võimaldab kasutajal relatsioonilise avaldise lühemalt kirja panna.Vaade on seetõttu nagu makro, mis võimaldab kasutajal keerukatoperatsiooni kiiremini läbi viia. Näiteks kui kasutaja koostab andmete otsimiselause kus ta kasutab vaate nime, siis lause täitmisel asendatakse lauses seenimi vaate kirjelduses määratud avaldisega. Järelikult ei pea kasutaja iseoskama sellist avaldist kirjutada. See võimaldab jätta keerukate avaldistekoostamise andmebaasi arendajate hooleks.Vaated võimaldavad esitada erinevat tüüpi kasutajatele andmeid erineval viisilvormindatuna ja töödelduna. Oletame, et ühte tüüpi kasutaja soovib nähapalka eurodes (nii nagu need on ka andmebaasis salvestatud), teist tüüpikasutaja aga teisendatuna Eesti kroonidesse. Sellisel juhul tuleb nendelekasutajatele luua erinevad vaated. Vaated on nagu aknad, mille kaudukasutajad saavad andmebaasi sisse vaadata. Iga kasutaja näeb talle vajalikkeandmeid talle sobivas formaadis. Võib öelda, et see muudab andmebaasikasutamise mugavamaks.Vaateid saab kasutada andmebaasi turvalisuse tagamiseks. Vaadete abil onvõimalik anda kasutajatele ligipääs andmetele, mida neil on oma tööks vaja jasamas peita nende eest andmeid mille kasutamiseks neil ei ole volitusi.Andmebaasis kasutajatele või kasutajate gruppidele saab anda õigusedlugeda ja muuta vaadete väärtusi kuid mitte lugeda ja muuta baasmuutujateväärtusi.Vaate väärtus leitakse dünaamiliselt. See tähendab, et vaate aluseks olevatebaasmuutujate väärtuse muutumine on koheselt nähtav ka vaate kasutajatele.31


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarVaated võimaldavad kasutajate eest peita andmebaasi struktuuri muutumise.Näiteks võib andmebaasi arendaja asendada relatsioonilise baasmuutuja Rkahe eraldi baasmuutujaga kusjuures uued muutujad rahuldavad kadudetaühendamise tingimust. Relvari R projektsioon relvarideks R1, R2, ..., R<strong>nr</strong>ahuldab kadudeta ühendamise tingimust, kui R võrdub R1, R2, ..., Rnühendamise tulemusega (st. protsess on pööratav).Sellisel juhul võib andmebaasi arendaja luua ka vaate mille väärtus on samakui esialgsel baasmuutujal R. Andmebaasi kasutajad kes kasutasid muutujatR ei tohiks märgata mingit erinevust. Oletame, et meil on baasmuutujaTootaja, mille predikaat on: Organisatsioonis töötab töötaja keda identifitseerib KOOD, kellel onperenimi PERENIMI, kes töötab ametis AMET ja saab selle eest kuuspalka PALK eurot.Oletame, et selle baasmuutuja asemel võetakse kasutusele baasmuutujadIsik ja Amet mille predikaadid on: Isik: Organisatsioonis töötab töötajana isik keda identifitseerib KOOD,kellel on perenimi PERENIMI ning kes töötab ametis AMET. Amet: Organisatsioonis on ametikoht mida identifitseerib ametinimetusAMET ja mille eest makstakse kuus palka PALK eurot.Järgnev joonis esitab baasmuutujate Tootaja, Isik ja Amet võimalike väärtustenäited.Tootajakood perenimi amet palk1 Kask projektijuht 14002 Lepp disainer 15003 Tamm disainer 1500IsikAmetkood perenimi amet amet palk1 Kask projektijuht projektijuht 14002 Lepp disainer disainer 15003 Tamm analüütikJoonis 9 Vaadete kasutamine andmebaasi struktuuri muudatuste peitmiseks.Kui soovime peale baasmuutuja Tootaja asendamist baasmuutujatega Isik jaAmet pakkuda kasutajatele endiselt relatsioonilist muutujat Tootaja, siis võimeluua vaate. Järgnev vaate loomise lause on kirjutatud Tutorial D keeles.VAR Tootaja VIEW (Isik JOIN Amet);32


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarCelko (2008) rõhutab, et iga vaate (ja ka hetktõmmise) loomiseks peab olemakonkreetne põhjendus – nõudmine, mida sellise muutuja loomine aitabrahuldada. Need põhjused tuleb andmebaasi projekteerimise käigusdokumenteerida. Celko (2008) hoiatab, et vaadete kontrollimatu jajärelemõtlematu loomine põhjustab suure hulga vaadete loomise. Seemuudab vaadete haldamise ja vaadetest ülevaate saamise raskeks.Kui muudetakse mõne relatsioonilise muutuja struktuuri tuleb analüüsida kakõiki sellest muutujast sõltuvaid tuletatud muutujaid ning vajadusel tehanendes muudatusi. Näiteks kui muudetakse relatsioonilist muutujat Amet (vtJoonis 47), nimetades atribuudi amet ümber atribuudiks ameti_nimetus, siistuleks muuta ka hetktõmmise Aktiivne_amet (vt Joonis 48) spetsifikatsioonisolevat relatsioonilist avaldist.33


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar4. Relatsioonilise mudeli lühikokkuvõteEelised.• Baseerub formaalsel teoreetilisel mudelil. Seda mudelit on laialdaseltuuritud ja kuna see põhineb matemaatilistel mudelitel, siis on ka selleheadust tõestatud.• Pakub andmetele abstraktse vaate ja vabastab andmete kasutajakohustusest pöörduda otse andmefailide poole.• Pakub välja deklaratiivse keele andmete manipuleerimiseks.Probleemid.• Relatsioonilise mudeli põhjal on loodud SQL andmebaasikeel, kuid seekeel pole relatsioonilise mudeliga hästi kooskõlas.• Relatsiooniliste andmebaaside teemal on väga palju kirjandust, kuidpaljudel kirjutajatel, rääkimata siis tavakasutajatest ei ole sellest teemasttäpset ja korrektset arusaamist.Kiputakse panema võrdusmärki SQLi ja relatsioonilise mudeli vahele ningajama SQL puudused relatsioonilise mudeli kaela. Tegelikult on see vale jaSQL on relatsioonilise mudeli suhteliselt ebaõnnestunud realisatsioon.Relatsiooniline mudel ei võrdu SQL34


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5. Structured Query LanguageMadalkeel.• Esimese generatsiooni programmeerimiskeel (1GL). Masinakeel. Kõiklaused esitatud 0-de ja 1-de jadana.• Teise generatsiooni programmeerimiskeel (2GL). Assemblerkeel."Sama struktuur ja käsustik, mis masinakeeltel, kuid igale käsule on antudoma nimi." (Vallaste, 2001-2004, http://www.vallaste.ee/).Kõrgkeeled• Kolmanda generatsiooni programmeerimiskeel (3GL). Näiteks: Pascal,C, Java, Python.Me võime vaadelda relatsioonialgebrat kui formaalset keelt, mille abil saabrelatsioonidega töötada. Selle põhjal on loodud teisi kõrgtaseme keeli.• Neljanda generatsiooni programmeerimiskeeled (4GL) ehkprobleemorienteeritud keeled. Sellistes keeltes on hulk väiksemaidoperatsioone koondatud üheks suuremaks kõrgtaseme operatsiooniks. Seevõimaldab programmeerijal suhteliselt väikese vaevaga kombineeridakõrgtaseme operatsioone ja saada niimoodi vajalik programm valmis.Enamasti on neil vahendid ülesande kirjeldamiseks, mitte (täpse)lahendusalgoritmi esitamiseks. Relatsioonilisest andmebaasist andmeteotsimise keel kuulub just seda tüüpi keelte alla, sest otsija peab kirjeldamaoodatava tulemuse, aga mitte täpset algoritmi, kuidas füüsilisel tasemel(failidest) andmeid otsitakse.• Viienda generatsiooni programmeerimiskeeled (5GL). Programmkasutab limiteeritud versiooni loomulikust keelest. Sellise keele näiteks onpäringukeel ConQuer.Mida "kõrgema" taseme keelega on tegu, seda lähedasem on selle keelestruktuur inimkeelele. Lõppkokkuvõttes tuleb mistahes keeles kirjutatud keeltõlkida ikkagi masinakeelde, et arvuti sellest aru saaks ja täita oskaks.5.1 SissejuhatusRelatsioonilise mudeli väljamõtlejaks võib pidada dr. Edgar. F. Coddi, kesesitas esimesena relatsioonilise andmebaasi põhimõisted 1969 ja 1970 a.ilmunud artiklites. Sellel ajal oli ta IBMi kaastööline. E. F. Codd töötas ka väljaandmebaasikeele nimega ALPHA (Codd, 1971), mis jälgis relatsioonilisemudeli põhimõtteid. Seda keelt ei võetud küll kunagi üheskiandmebaasisüsteemis kasutusele kuid see avaldas mõju teisteandmebaasikeelte (QUEL ja SQL) loomisele.1970-ndate keskel loodi IBMi uurimislaboris Suur-Britannias relatsiooniliseandmebaasisüsteemi prototüüp Peterlee Relational Test Vehicle (PRTV),mis kasutas Information Systems Base Language (ISBL) keelt.35


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar1970-ndate keskel loodi IBMi uurimislaboris USAs relatsiooniliseandmebaasisüsteemi prototüüp System R. Andmetega töötamiseks kasutatiselles SEQUEL (Structured English Query Language) keelt (Chamberlin &Boyce, 1974). Sellele keelele anti hiljem uus nimi – SQL (Structured QueryLanguage). SEQUEL ja SQL ei järgi kõiki relatsioonilise mudeli põhimõtteid.SQL ei ole ainuvõimalik andmebaasikeel. 1974 nägi Berkeley ülikoolisilmavalgust mitte-kommerts, mitte-SQL, relatsioonilise andmebaasisüsteemiIngres (INteractive Graphics REtrieval System) esimene prototüüp. Seesüsteem pakkus kasutajatele relatsioonilist andmebaasikeelt QUEL.Nimetatud projekti jätkuna toimus 1986–1994 POSTQUEL andmebaasikeeltkasutava Postgres (PostIngres) andmebaasisüsteemi arendamine. Aastal1995 asendati selles andmebaasisüsteemis POSTQUEL keel SQLiga ningandmebaasisüsteem sai nimeks PostgreSQL.POSTQUEL keelse päringu näide (Malamud, 1989): Leia teisipäeval töölevõetud töötajate nimed. day_of_week on kasutaja-defineeritud funktsioon, misetteantud kuupäeva alusel leiab sellele vastava nädalapäeva.retrieve (E.name)from E in empwhere day_of_week (E.hired_date)="Tuesday"Veel ühe näitena võib mainida, et 1978-1982 arendati IBMis relatsioonilistandmebaasisüsteemi Business System 12 (Darwen, 2011), milles samuti eikasutatu SQLi.Esimene laiatarbe kasutusse tulnud SQLi kasutamist võimaldav kommertsandmebaasisüsteemoli 1979 Relational Software Inc. (nüüd Oracle) pooltloodud Oracle andmebaasisüsteem. 1981 tuli turule IBMi esimene SQLikasutamist võimaldav kommerts-andmebaasisüsteem – SQL/DS (StructuredQuery Language/Data System).80-ndatel asuti SQLi standardiseerima. Standardi koostamine algas 1982.Olulisemad verstapostid SQL standardi arengus.• 1987 – ISO (International Organisation for Standardization) kinnitas SQLstandardi esimese versiooni.• 1989 – SQL:89 (väike täiendus).• 1992 – SQL standardi esimene suurem täiendus. Seda nimetatakse SQL2või SQL-92 või SQL:1992.• 1999 – SQL standardi teine suurem täiendus. SQL-99, SQL:1999 võiSQL3. Mõned olulised lisandused – kasutaja defineeritud tüübid, reatüübid, viite tüübid, kollektsiooni tüübid, trigerid, salvestatud protseduuridja salvestatud protseduuride keel. Alates sellest standardi versioonistöeldakse, et standardis kirjeldatud keel on objekt-relatsiooniline keel.• 2003 – SQL:2003. Mõned olulised lisandused – arvujadade genereerimisevõimaldamine, XML andmetüüp, funktsioonid SQL-andmebaasist loetudandmete põhjal XML dokumentide koostamiseks.• 2006 – SQL:2006. Täiendati võimalusi XML formaadis andmetetöötlemiseks.36


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar• 2008 – Avaldati hetkel kehtiv standardi versioon – SQL:2008.Standardisse lisandusid näiteks INSTEAD OF trigerite ja TRUNCATElause kirjeldus.Mõnikord kohtab kirjanduses termineid "ISO SQL" ja "ANSI SQL". SQLstandardi on kiitnud heaks nii American National Standard Institute (ANSI) kuika International Organization for Standardization (ISO). Sellest tulenevad katerminid, kuid mingit sisulist erinevust neil ei ole.Iga järgmine standardi versioon täpsustab eelmist standardi versiooni. Igasseuude standardi versiooni on lisatud ka uusi keelekonstruktsioone ja antudsellega suuremaid võimalusi andmebaasi projekteerijatel/programmeerijatele.21. sajandi esimese kümnendi alguses on andmebaasisüsteemide turulvaldavad andmebaasisüsteemid, mis kasutavad SQL (Structured QueryLanguage) keelt, mis omakorda põhineb (aga mitte kõiki Coddi ettepanekuidarvesse võttes) Edgar F. Coddi esialgsel relatsioonilise mudeli kirjeldusel.Kriitikud (Näiteks. Database Debunkings – http://www.dbdebunk.com, C. J.Date, Fabian Pascal) ütlevad (ja antud loengu pidaja on nendega nõus), etSQLil on palju puuduseid ja selle alusel loodud andmebaasid ei ole tegelikultrelatsioonilised andmebaasid. Seetõttu eristavad nad:• Relatsiooniline andmebaasisüsteem.• SQL-andmebaasisüsteem. Kasutab andmebaasi ja andmete haldamiseksSQL andmebaasikeelt.Samasugust eristamist kasutatakse ka antud kursuses.SQL-andmebaasisüsteemid on 21 sajandi algul domineerivadandmebaasisüsteemid. Neid müüakse umbes 20 miljardi USD dollari eestaastas. Müügi kasv on kuni 25% aastas.SQLidialektSQLstandardAndmebaasisüsteemipoolt pakutavstandardiseerimatalaiendusJoonis 10 SQL standard.Edaspidi mõtlen SQL standardi all SQL:2008 standardit, kui ei ole öeldudteisiti.Kahetsusväärne tõsiasi on, et SQL-andmebaasisüsteemid realiseerivad SQLstandardit osaliselt ja omapoolsete (standardiseerimata) täiendustega.Näiteks andmebaasisüsteemis MS Access kasutatavat SQL dialekti37


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarnimetatakse mõnikord lähtuvalt MS Accessi andmebaasimootori(andmebaasisüsteemi tuumaks oleva tarkvara) nimest Jet SQLiks.Praktikas ei toeta enamik SQL-andmebaasisüsteeme isegi veel mitte koguSQL:1992 standardi versiooni (mis on praeguseks vananenud), rääkimata siisSQL:1999, SQL:2003 või SQL:2008 standardi versioonidest. Raskusi SQLitäieliku ülevõtmisega võib ka mõista, sest standard on väga mahukas (näiteksSQL:2003 kõik osad annavad kokku peaaegu 2000 lehekülge). NäiteksMS Access 2007 pakutav SQLi dialekt vastab üldiselt SQL:89 tasemele 1 ningon võimalik määrata, et see vastaks SQL:1992. MS Access siiski ei realiseerimõningaid SQL standardis (SQL:89) kirjeldatud võimalusi ning samas pakubka võimalusi, mida SQL standard ei kirjelda.Võib täheldada ka teistsugust tendentsi – suure turupositsioonigaandmebaasisüsteemi tootjad lisavad SQLi omapoolseid täiendusi ningseejärel üritavad enda tehtud laiendusi standardisse suruda.Keelt, mis võimaldab luua kõiki relatsioone, mida saab luua karelatsioonialgebra abil, nimetatakse relatsiooniliselt täielikuks (ingl. k.relationally complete). SQL on relatsiooniliselt täielik keel. SQL võimaldablisaks veel täiendavaid operatsioone nt. sorteerimine, andmestruktuurideloomine jne.SQLi standard kasutab mõisteid tabel, rida ja veerg (mitte relatsioonilinemuutuja, relatsioon, atribuut ja korteež nagu relatsioonilise andmemudelikirjeldus). Seetõttu kasutatakse edaspidi SQLi kirjeldades standardiskasutatavaid termineid.5.2 SQLi üldiseloomustus1. SQLi alamosa Data Manipulation Language (DML) on mitteprotseduurnekeel, sest- töödeldakse ridade hulki, mitte üht rida korraga.- juurdepääs (ingl. k. navigation) andmetele on automaatne. DML ei nõuakasutajalt juurdepääsuviisi teadmist (nt. andmete leidmine indeksi abil,andmete leidmine kogu tabeli läbivaatamise tulemusena). SQL kasutabolemasolevaid indekseid automaatselt. Kasutaja määrab vaid milliseidandmeid ta soovib.2. SQL standard kirjeldab alates SQL:1999 versioonist ka andmebaasisalvestatud protseduuride loomiseks mõeldud protseduurset keelt.3. SQLi alamosa Data Manipulation Language (DML) on osaliseltdeklaratiivne keel. Deklaratiivses keeles kirjeldab kasutaja programmiltsoovitud tulemuse aga mitte protseduuri, kuidas tulemuseni jõuda. SQL onosaliselt deklaratiivne selles mõttes, et ühe ja sama tulemuseni võib jõudamitme erineva SQL’is kirjutatud lause abil. Kuid nende lausete täitmisekiirus võib olla vägagi erinev. Seega oodatakse kasutajalt ikkagi teadmisi,kuidas SQL lauseid ümber kirjutada, nii et töökiirust paranda ning tegemistpole puhtalt deklaratiivse keelega. Kasutajad peavad andmebaasi38


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarefektiivseks kasutamiseks olema kursis andmebaasisüsteemipeensustega.4. SQLi alamosa Data Manipulation Language (DML) on teisenduseleorienteeritud keel, sest selle päringute sisendiks on tabelid, millelerakendatakse teisendusoperatsioone ning mille tulemuseks on samutitabelid.5. Kasutajate ring on väga lai.- Süsteemi administraatorid.- Andmebaasi administraatorid.- Andmekaitse administraatorid.- Andmebaasi kasutavate programmide programmeerijad.- Kõikvõimalikud lõppkasutajad.6. Ühtne keel.- Päringute esitamiseks (st. andmete otsimiseks).- Andmete lisamiseks, kustutamiseks, uuendamiseks.- Andmebaasi objektide (tabelid, indeksid...) loomiseks, eemaldamiseks,muutmiseks.- Juurdepääsuõiguste kontrollimiseks.- Andmebaasi terviklikkuse tagamiseks.7. Võimalik kasutada protseduursete keelte sees (manustatud SQL e.embedded SQL), nagu Ada, C, COBOL, Fortran, Pascal, PL/1, VisualBasic, Java.SQL koosneb alamkeeltest.• Andmekirjelduskeel – Data Definition Language (DDL). Keel, misvõimaldab kirjeldada andmebaasi struktuuri ja kontrollida juurdepääsuandmetele. See keel sisaldab järgmiseid lausete tüüpe.- Andmekirjelduse laused (ingl. k. data definition statements) –defineerivad andmebaasistruktuuri. Nendega luuakse kõikandmebaasiobjektid – tabelid, vaated, indeksid, kasutajad, trigerid jne.“CREATE”, “ALTER”, “DROP” laused.- Andmetele juurdepääsu kontrolli laused (ingl. k. data controlstatements) – kasutajatele privileegide ja andmete kasutamise õigustejagamine ja õiguste äravõtmine. “GRANT” ja "REVOKE" laused. Osadautorid loevad andmekontrolli keelt (Data Control Language, DCL)eraldi alamkeeleks.• Andmekäitluskeel – Data Manipulation Language (DML). Keelandmete otsimiseks ja muutmiseks. See keel sisaldab järgmiseidlausete tüüpe.- Päringud (ingl. k. queries) andmete küsimiseks andmebaasist.“SELECT” lause. Päringulauses spetsifitseeritakse millistest tabelitestmilliseid andmeid vajatakse. Päringus määratakse soovitud tabelid,veerud ja valiku kriteeriumid.- Andmete töötlemise laused e. andmete käitlemise laused (ingl. k. datamanipulation statements) – muudavad andmeid andmebaasis. Nadlisavad, muudavad ja kustutavad andmeid. “INSERT”, ”UPDATE”,”DELETE”, "MERGE" laused.39


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar• Protseduuride keel – Data Procedural Language (DPL). Protseduurnekeel andmebaasiserveris talletatud rutiinide (protseduuride, funktsioonidening tüüpidega seotud meetodite) loomiseks. Protseduurne keel töötlebridu ükshaaval. Deklaratiivne keel töötab ridade hulkadega.5.3 SQLi näideTabeli loomine:CREATE TABLE Tootaja (tootaja_kood INTEGER,perenimi VARCHAR(100) NOT NULL,aadress VARCHAR(100),registr_kpv DATE NOT NULL,CONSTRAINT pk_Tootaja PRIMARY KEY(tootaja_kood));Tabelisse andmete lisamine:INSERT INTO TootajaVALUES (1,'Jõgi', 'Tallinn Sõpruse pst.34-45','2001-11-11');INSERT INTO TootajaVALUES (2,'Mets', 'Paide Roheline 7','2001-04-12');INSERT INTO TootajaVALUES (3,'Kask', 'Tartu Tähe 12','2001-05-10');INSERT INTO TootajaVALUES (4,'Triik', 'Tartu Kase 12-44','2001-03-10');INSERT INTO TootajaVALUES (5,'Triik''s', 'Tartu Kase 12-44','2001-03-10');Tabelist andmete otsimine:SELECT perenimi FROM Tootaja;perenimiJõgiMetsKaskTriikSELECT * FROM Tootaja WHERE tootaja_kood=1;tootaja_kood perenimi aadress registr_kpv1 Jõgi Tallinn Sõpruse pst.34-45 11.11.200140


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTabelile juurdepääsuõiguste andmine:GRANT ALL ON Tootaja TO "Administraator";GRANT SELECT ON Tootaja TO “Taavi”;5.4 SQLi lausendite tüübidSQL tegeleb puhtalt andmetega manipuleerimisega kõige kõrgemal loogiliseltasemel puhta andmetöötlusega. SQLis on lausendid võimalikult lihtsustatud,ainult andmetega tegelevad lausekonstruktsioonid. Need on loomuliku keelemõnevõrra organiseeritud ja reeglistatud lausendid.SQL lausete süntaksi üleskirjutamiseks kasutatakse Backus-Nauri Formaati(BNF).Suured tähed: võtmesõnadVäikesed tähed: kasutaja defineeritud sõnad| – valik alternatiivide vahel. Vaikimisi valik on alla joonitud.{} – nõutud element { BEFORE | AFTER }[] – element, mille võib, kuid ei pruugi valida [DISTINCT | ALL](....) – võimalik kordusNäide. {a|b} (,c....)a-le või b-le järgneb null või rohkem c-d, mis on üksteisest komadegaeraldatud.5.5 SQLi elemendidSQL lause elemendid:• Literaal (väärtuse esitus).• Võtmesõna, mis omab SQL parseri (süntaksianalüsaatori) jaokseritähendust. Parseri "sisendiks on lähteprogrammi käskude jada,interaktiivsed onlain-käsud, märgendid või mingi muu defineeritud liides.Parser jaotab need süntaksielementideks, näiteks nimisõnad (objektid),tegusõnad (meetodid) ja nende atribuudid või fakultatiivid (suvandid),misjärel neid saab edasi töödelda teiste programmidega" (Vallaste,2000-2011, http://www.vallaste.ee/)• Identifikaator (andmebaasi objekti nimi).• SQL spetsiaalmärk: tühik ( ) " ' % & * / + -, . : ; < > ? [ ] _ | = { } ^SELECT * FROM Tootaja WHERE tootaja_kood=1;• Literaal: 1• Võtmesõnad: SELECT, FROM, WHERE• Identifikaatorid: Tootaja, tootaja_kood• SQL spetsiaalmärgid: * ja = ja ;41


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5.5.1 LiteraalidLiteraal on väärtuse esitus. Näited:- Tekst (string, sõne): 'Hello', 'John''s pen', '01.05.95', ''Tekstitüüpi väärtused tuleb esitada ülakomade vahel. Pange tähele, et stringissisalduva ülakoma ees on paomärgina teine ülakoma.- Täisarv: 0, 123, -4000- Kümnendmurd: 0.5, 1.3- Reaalarv: 20e-02- Kuupäev: '2003-04-02' (MS Accessis: #MM/DD/YYYY#Näide: #04/02/2003#)- Kellaaeg: '15:30:04'- Kuupäev+kellaaeg: '2004-02-01 16:00:02'- Intervall (aasta ja kuu): '150-05' (150 aastat ja 5 kuud)- Intervall (päev ja aeg): '3 11:05:03' (3 päeva, 11 tundi 5 minutit ja 3sekundit)- Tõeväärtus: SQLi tõeväärtustüüpi BOOLEAN kuuluvad väärtused TRUEja FALSE. Kuna SQLis on kasutusel kolmevalentne loogika, siis peabolema võimalik kasutada tõeväärtust UNKNOWN. SQLis on tõeväärtuseUNKNOWN esitamiseks kasutusel väärtuse puudumist esitav markerNULL.• Andmete otsingutingimustes (WHERE või HAVING klauslis) kasutatavatesliteraalides eristatakse suur- ja väiketähti.SELECT * FROM Tootaja WHERE linn='TALLINN';SELECT * FROM Tootaja WHERE linn='Tallinn';5.5.2 VõtmesõnadSQL standard loetleb nimekirja võtmesõnadest, mida kasutatakse SQLlausetes. Näiteks: ALTER, ANY, FALSE, GROUP, SELECT, TABLE,BOOLEAN, NEW, OLD, PARAMETER, RECUSIVE, ROLE, SAVEPOINT,TRIGGER, SEQUENCE.Võtmesõnad jagunevad reserveeritud sõnadeks (näiteks SELECT) jamittereserveeritud sõnadeks (näiteks SEQUENCE SQL:2008 korral).Reserveeritud sõna ei saa kasutada identifikaatorina. Mittereserveeritudsõnadel on eritähendus ainult teatud kontekstis ning neid võib kasutadaidentifikaatorina mõnes teises kontekstis. Samas pole nende identifikaatorinakasutamine kõige parem mõte. Näiteks võib juhtuda, et sõna, mis oli SQLstandardi vanemas versioonis mittereserveeritud on uuemas versioonisreserveeritud (või vastupidi).SQL standard lubab andmebaasisüsteemidel võtta kasutusele täiendavaidreserveeritud sõnu. See raskendab ühelt andmebaasisüsteemilt teisele üle42


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarminekut, sest sõna mis ühes andmebaasisüsteemi ei olnud reserveeritudsõna võib teises seda olla.SQL võtmesõnu võib SQL lauses kirjutada nii suur- kui väiketähtedega – needon tõstutundetud (ingl. k. case insensitive). Seega on samaväärsed:SELECT, Select, select, SeLeCT jne. Loetavuse huvides võiksid võtmesõnadolla kirjutatud suurtähtedega.5.5.3 IdentifikaatoridStringid, mis identifitseerivad andmebaasi moodustavaid objekte (skeem,tabelid, vaated jne.). Identifikaatoritele kehtivad järgnevad reeglid.• Regulaarne identifikaator. Võib olla kuni 128 märki pikk. Esimene märkpeab olema täht kasutatavas märgistikus. Nt. Latin1 märgistikus: (a..z,A..Z). Edasi võivad tulla tähed kasutatavas märgistikus, numbrid (0..9) võialakriips. Identifikaator ei tohi sisaldada tühikut. Identifikaatoris ei eristatasuur- ja väiketähti. Identifikaator ei tohi olla reserveeritud sõna.• Piiritletud identifikaator. Identifikaator on jutumärkide vahel. Võib ilmaümbritsevate jutumärkideta olla kuni 128 märki pikk. Kaks järjestikustjutumäki "" identifikaatori sees loetakse kokku üheks märgiks. Võibkasutada mistahes märke, sh. tühikuid ja ka reserveeritud sõnu.Eristatakse suur- ja väiketähti. Näide: "&%%!", "TABLE", "3VIEw".SQL kirjeldab reeglid, mille alusel kontrollida identifikaatorite võrdsust. Ennevõrdluse tegemist teisendatakse regulaarses identifikaatoris kõik tähedsuurtähtedeks. Piiritletud identifikaatori korral kasutatakse võrdlemiseks ainultpiiritlevate jutumärkide vahele jäävat osa.Gulutzan ja Pelzer (1999) toovad näite, et regulaarsed identifikaatoridP_TABLE ja p_table on võrdsed ning mõlemad on võrdsed piiritletudidentifikaatoriga "P_TABLE". Samas pole kumbki nendest regulaarsetestidentifikaatoritest võrdne identifikaatoriga "p_table".5.5.4 KommentaaridKuidas esitada kommentaare?-- Lihtne üherealine kommentaar/* pikem kommentaarmitmel real */MS Accessi (2007) Query Designeris neid kasutada ei saa.5.5.5 SQL lause loetavus43


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSQL lause puhul ei oma ka tähtsust, kas lause on kirjutatud ühele võimitmele reale. Kuid lause muutub loetavamaks, kui iga klausel algab uueltrealt. Näide:Halvasti formaaditud SQL lausecreate table Tootaja (tootaja_kood integer, perenimi varchar(100) not null,aadress varchar(100), registr_kpv date not null, constraint pk_tootaja primarykey(tootaja_kood));ja loetavamalt kirjutatud SQL lause:CREATE TABLE Tootaja (tootaja_kood INTEGER,perenimi VARCHAR(100) NOT NULL,aadress VARCHAR(100),registr_kpv DATE NOT NULL,CONSTRAINT pk_Tootaja PRIMARY KEY(tootaja_kood);44


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5.6 Operaatorid ja tehted, mida nende abil saab teha (näiteid)Andmeväärtuse andmetüüp määrab ära, milliseid operatsioone saab sellegateha. St. see määrab võimalikud operaatorid mida antud tüüpi andmete puhulkasutada ja funktsioonid, mida saab antud tüüpi andmetele rakendada.Tegelikult on ka iga operaatoriga seotud funktsioon. Operaatori kasutaminevõimaldab mugavama süntaksi abil selle funktsiooni poole pöörduda (võrdle1+2 vs. Sum(1,2)).Matemaatilisi operaatoreid:• liitmine (+),• lahutamine (-),• korrutamine (*),• jagamine (/),• astendamine (^),• täisarvulise jagamise jääk (MOD).Stringide töötlemiseks mõeldud operaatoreid:• stringide ühendamine e. sidurdamine e. konkatenatsioon (||)NB! Andmebaasisüsteemis MS Access on konkatenatsiooni operaatorid "&"ja "+". Nende operaatorite vahe tuleb välja, kui üks ühendatavatest onNULL.• NULL + 'tekst' => NULL• NULL & 'tekst' => 'tekst'Võrdlusoperaatoreid:• võrdne (=),• mittevõrdne (),• väiksem kui (),• suurem või võrdne kui (>=),• väiksem või võrdne kui (


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTehteid kuupäeva, kellaaja ja intervalliga:Tehekuupäev - intervallkuupäev + intervallintervall + kuupäevkuupäev - kuupäevkellaaeaeg + intervallintervall + kellaaegkuupäev ja kellaaeg + intervallintervall + kuupäev ja kellaaegkuupäev ja kellaaeg - intervallkellaaeg - kellaaegkuupäev ja kellaaeg - kuupäev ja kellaaegintervall * numbernumber * intervallintervall / numberaasta ja kuu intervall + aasta ja kuu intervallaasta ja kuu intervall - aasta ja kuu intervallpäev ja aeg intervall - päev ja aeg intervallTulemuskuupäevkuupäevintervallkellaaegkuupäev ja kellaaegkuupäev ja kellaaegintervallintervallintervallintervallaasta ja kuu intervallaasta ja kuu intervallpäev ja aeg intervallFunktsioonid: (vt. punkt 4.8)5.7 AndmebaasEsitame järgnevalt SQL-andmebaasi struktuuri kirjelduse.Osakond(osakonna_<strong>nr</strong>, osakonna_nimi)Primary Key(osakonna_<strong>nr</strong>)Alternate Key (osakonna_nimi)Tootaja (tootaja_kood, perenimi, aadress, registr_kpv, palk, osakonna_<strong>nr</strong>)Primary Key(tootaja_kood)Foreign Key (osakonna_<strong>nr</strong>) References Osakond (osakonna_<strong>nr</strong>)Palgaaste (astme_<strong>nr</strong>, vahemiku_algus, vahemiku_lopp)Primary Key(astme_<strong>nr</strong>)46


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTootajatootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>1 Jõgi Tallinn, Pikk 11.11.2001 1400 1342 Mets Paide, 12.04.2001 1500 2Roheline 73 Kask Tartu, Tähe 10.05.2001 1600 1124 Triik Tartu, Kase 10.03.2001 1800 312-445 Tali Põlva, Vase310.05.2001 100Osakondosakonna_<strong>nr</strong> osakonna_nimi1 personaliosakond2 kinnisvaraosakond3 müügiosakond4 lepingute osakondPalgaasteastme_<strong>nr</strong> vahemiku_algus vahemiku_lopp1 200 5002 501 10003 1001 30005.8 SELECT lauseSELECT lauset kasutatakse andmete otsimiseks. SELECT lausetnimetatakse ka päringuks. SELECT lause täitmise tulemuseks on tabel.Lihtsustatud süntaks:SELECT [DISTINCT | ALL] {* | [veeru avaldis [[AS] alias]] [,...]}FROM {tabeli nimi [[AS] alias] | vaate nimi [[AS] alias] | alampäring AS alias |tabelite ühendamine} [,...][WHERE tingimus][GROUP BY veergude nimekiri][HAVING tingimus][ORDER BY {veeru nimi [ASC | DESC], [,...] }]SELECT lause osad on järgnevad.• SELECT klauslis kirjeldatakse veerud, mis on päringu tulemuseks olevastabelis.• FROM klauslis määratakse tabelid, kust andmed valitakse. FROM klauslisvõib alates SQL:1992 standardi versioonist sisalduda ka alampäring.• WHERE klauslis piiratakse väljastatavaid ridu mingi tingimuse alusel.47


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar• GROUP BY klauslis formeeritakse erinevates ridades samas veerusolevate ühesuguste väärtuse alusel ridade grupid.• HAVING klauslis piiratakse grupeerimise tulemusel saadud ridu mingitingimuse alusel.• ORDER BY klauslis määratakse, et päringu tulemuses tuleb sorteeridaread ühes või mitmes veerus olevate väärtuste alusel.SELECT lausesse kuuluvate täitmise (rakendamise) järjekord on:- FROM,- WHERE,- GROUP BY,- HAVING,- SELECT,- ORDER BY.5.8.1 ProjektsioonLeia kõik andmed tabelist Tootaja. See on identiteedi projektsiooni jaidentiteedi piirangu leidmise operatsioon tabeli Tootaja põhjal.SELECT *FROM Tootaja;NB! Mõelge läbi, millises veerus olevaid andmeid Te tegelikult vajate jaküsige vaid neid. Muidu peab süsteem nende andmete otsimiseks,väljastamiseks ja teile edastamiseks asjatut tööd tegema.Leia kõik andmed tabeli Tootaja veerust tootaja_kood.SELECT tootaja_koodFROM Tootaja;See päring on samaväärne kui:SELECT Tootaja.tootaja_koodFROM Tootaja;Tabeli nime kasutamine veeru identifikaatoris (Tootaja.tootaja_kood) onkohustuslik ainult siis, kui tehakse päring mitmest tabelist kus onühenimelisi veerge.Relatsioonialgebra projektsiooni operatsioonist eristab SELECT klauslitasjaolu, et tulemusest ei eemaldata korduvaid ridu. Näiteks järgneva päringutulemuses võib olla mitu ühesugust palka.SELECT palkFROM Tootaja;Kui soovitakse tulemusest kordused eemaldada, tuleb kasutada eraldi48


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarmärksõna DISTINCT.SELECT DISTINCT palkFROM Tootaja;Sellise päringu tulemus vastaks relatsioonialgebra operatsiooni "projektsioon"tulemusele.SQL ei luba baastabelites ja vaadetes mitut sama nimega veergu. Samas onlubatud päringud (SELECT laused) mille tulemuses on rohkem kui üks samanimega veerg. See on võimalik tänu sellele, et SQLis on igal veeruljärjekorranumber (vasakult paremale lugedes) ja selle alusel saab tabeliveerge üksteisest eristada.SELECT palk, palk FROM Tootaja;Soovitus – ärge kunagi selliseid päringuid kirjutage ning vajadusel andkepäringu tulemuses veerule uus nimi (vaata järgmine jaotis).5.8.2 ÜmbernimetamineVõimalik on anda päringu tulemusena moodustatavas tabelis olevateleveergudele uued nimed.SELECT palk AS vana_palkFROM Tootaja;5.8.3 LaiendamineSELECT lauses võib olla tehteid.SELECT tootaja_kood, palk*1.5 AS uus_palk, palk/15.6 AS palk_eurodesFROM Tootaja;SELECT tootaja_kood, perenimi || ' ' || aadress AS tootaja,CURRENT_DATE - registr_kpv AS tootamise_pikkusFROM Tootaja;CURRENT_DATE on funktsioon, mis tagastab hetke kuupäeva.CURRENT_DATE - registr_kpv on avaldis, mille abil leitakse kui palju aegaon möödunud töötaja registreerimisest.MS Accessis:SELECT tootaja_kood, perenimi & ' ' & aadress AS tootaja, Date()-registr_kpvAS tootamise_pikkusFROM Tootaja;49


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5.8.4 PiirangWHERE klausel sisaldab loogikaavaldist (otsingutingimust).Loogikaavaldiseks võib olla atomaarne tingimus või atomaarsetesttingimustest loogikaoperaatorite (AND, OR, NOT) abil moodustatudliittingimus.SELECT tootaja_kood, perenimi, registr_kpvFROM TootajaWHERE palk>500;Avaldise koostamisel pidage silmas.- Sulgudes olevad alamavaldised arvutatakse enne.- NOTe käsitletakse enne kui ANDe ja ORe- ANDe käsitletakse enne ORe.- Operaatorit AND ja OR on kommutatiivsed. Järelikult avaldised p AND q jaq AND p on samaväärsed. Samuti on samaväärsed avaldised p OR q jaq OR p. q ja p on predikaadid.Date (2009) märgib, et näiteks järgmise SQL lause puhul ei pruugi ollavälistatud erandolukorra tekkimine negatiivse x väärtuse korral, sestandmebaasisüsteem võib leida ruutjuure (funktsiooni Sqrt abil) enne, kuikontrollib tingimuse x>=0 täidetust.SELECT ...FROM ...WHERE x>=0 AND Sqrt (x) ...WHERE klauslis olev loogikaavaldis on tegelikult predikaat. Predikaat ontõeväärtusfunktsioon, millel on null või rohkem parameetrit. Näiteks eelnevaslauses on loogikaavaldis palk>500 ja parameeter on palk. Tegemist onlihtpredikaadiga. Lihtpredikaatidest saab loogikaoperaatorite abil moodustadaliitpredikaate (liitpredikaadi näide: palk>500 OR palk IS NULL). Predikaati,millel on null parameetrit, nimetatakse väiteks e. lauseks (proposition). Sellisepredikaadi "väljakutsumine" annab alati tulemuseks ühe ja sama tõeväärtuse.Kui me anname kõigile predikaadi parameetritele mingi väärtuse, siistulemuseks saame väite, mis on tõene (TRUE) või väär (FALSE). Kuna SQLkasutab NULLe ja kolmevalentset loogikat, siis on võimalik, et mõne väitepuhul ei ole teada kas see väide on tõene või väär (UNKNOWN). Kui anname parameetrile palk väärtuse 300, siis saame väite 300>500,mis on väär (FALSE). Kui anname parameetrile palk väärtuse 1000, siis saame väite1000>500, mis on tõene (TRUE). Kui parameetril palk väärtus puudub (NULL), siis saame väiteNULL>500, mille kehtivus on teadmata (UNKNOWN).SQL lause täitmisel moodustab andmebaasisüsteem reas olevate andmetepõhjal predikaadist väite ja otsustab kas see väide on TRUE, FALSE võiUNKNOWN. Päringu tulemusse kuuluvad vaid sellised read, mille korral väite50


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaartäidetuse kontroll annab tulemuseks TRUE. Kui otsus on FALSE võiUNKNOWN, siis rida tulemusse ei lisata.Järgnevalt loetletakse (Gulutzan ja Pelzer, 1999) põhjal SQL:1999 standardisnimetatud 14 predikaatide tüüpi ja tuuakse nende kohta näiteid.NimiTähistus SQLlauses>; >= ; = ;


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarOsa predikaate kasutatakse enamasti koos alampäringutega ja nendest tulebpikemalt juttu järgnevas teemas.5.8.4.1 Võrdluse predikaatVõrdluse predikaat võimaldab võrrelda kahe avaldise väärtust kasutadesvõrdlusoperaatoreid: =; ; >; < >=; suurem kui tähestiku põhjal hiljem hiljem kuikui= suurem või võrdne kui võrdne või tähestikupõhjal hiljem kuisamal ajal või hiljem kuiMärkus: Mitmed andmebaasisüsteemid võimaldavad mittevõrduseoperaatorina kasutada ka "!=". MS Access seda ei luba.Näide: Leia töötajad, kelle kood on väiksem kui 3.SELECT tootaja_kood, perenimiFROM TootajaWHERE tootaja_kood < 3 ;tootaja_kood perenimi1 Jõgi2 MetsNäide: Leia töötajad, kelle perenimi on "Jõgi".SELECT tootaja_kood, perenimiFROM TootajaWHERE perenimi = 'Jõgi';tootaja_kood perenimi1 JõgiNäide: Leia töötajad, kelle nimed on tähestikus hiljem kui JõgilSELECT tootaja_kood, perenimiFROM TootajaWHERE perenimi>'Jõgi';52


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNB! Stringide võrdluse tulemus sõltub andmebaasisüsteemi pooltkasutatavast märkide võrdlusreeglistikust (ingl. k. collation). Erinevateskeeltes (nt. eesti keel, saksa keel, inglise keel) on sellised võrdlusreegliderinevad ja ka kasutatavad tähemärgid osaliselt erinevad.Võrdlusreeglistiku saab SQL standardi järgi määrata tabeli veeru loomisel võika WHERE klauslis. Kui võrdlusreeglistikku pole eraldi määratud, kasutabandmebaasisüsteem vaikimisi reeglistikku (mida saab andmebaasisüsteemihäälestamisel määrata).SQLis töötab näiteks ka järgnev päring:SELECT * FROM Tootaja WHERE 1=1;See päring teisendatakse kõigepealt kujule:SELECT * FROM Tootaja WHERE TRUE;Mis on samaväärne kuiSELECT * FROM Tootaja;5.8.4.2 Between predikaatBetween predikaat võimaldab kontrollida, kas avaldise väärtus paikneb mingisväärtuste vahemikus. Kontrollimisel võetakse arvesse ka vahemikuotspunktid.::=[NOT] BETWEEN AND Näide: Leia töötajad, kelle kood on vahemikus 1 ja 3 (otspunktid kaasaarvatud).SELECT tootaja_kood, perenimiFROM TootajaWHERE tootaja_kood BETWEEN 1 AND 3 ;Sama tulemuse annaks päringSELECT tootaja_kood, perenimiFROM TootajaWHERE tootaja_kood>=1 AND tootaja_kood


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSama tulemuse annaksid ka järgnevad päringud:SELECT tootaja_kood, perenimiFROM TootajaWHERE NOT (palk BETWEEN 1000 AND 3000);SELECT tootaja_kood, perenimiFROM TootajaWHERE NOT palk BETWEEN 1000 AND 3000;5.8.4.3 In predikaatIn predikaat võimaldab kontrollida, kas avaldise väärtus võrdub mõne hulkakuuluva väärtusega.::= [NOT] IN ::= | ::= [{ } ...]Näide: Leia andmed selliste osakondade kohta, mille number on kas 1 või 3.SELECT *FROM OsakondWHERE osakonna_<strong>nr</strong> IN (1,3);Sama ülesande lahendab ka päring:SELECT *FROM OsakondWHERE osakonna_<strong>nr</strong>=1 OR osakonna_<strong>nr</strong>=3;5.8.4.4 Like predikaatLike predikaat võimaldab kontrollida, kas stringi avaldise väärtus vastabmääratud mustrile.::= [NOT] LIKE [ESCAPE ]::= – peale seda sümbolit, käsitletakse mustri sümbolit (nt. %või _) kui tavalist sümbolit, mida mustrile vastav string peab sisaldama.54


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNäide: Leia töötajad, kelle perenimi algab tähega "J" ja eelviimane täht on "g".SELECT tootaja_kood, perenimiFROM TootajaWHERE perenimi LIKE ‘J%g_’;Leitakse töötajad, kelle perenimi on nt.: Jõgi, Joogi, JäämägiEi leita töötajaid, kelle perenimi on nt.: Jaanek, Kanged, KangMustri komponendid:Standard SQLisMS Accessis ((kui polejõustatud SQL:1992 süntaks)% – null või rohkem suvalist märki * – null või rohkem suvalist märki_ – täpselt üks suvaline märk ? – täpselt üks suvaline märk5.8.4.5 Similar predikaatSimilar predikaat võimaldab kontrollida, kas stringi avaldise väärtus vastabregulaaravaldisega määratud mustrile.::= [NOT] SIMILAR TO [ESCAPE ]::= – peale seda sümbolit, käsitletakse mustri sümbolit (nt. %või _) kui tavalist sümbolit, mida mustrile vastav string peab sisaldama. Paljudandmebaasisüsteemid (ka MS Access) “ESCAPE” süntaksi ei toeta.Näide: Leia töötajad, kelle perenime alguses on järjest üks või rohkem "A"tähte ning kelle perenime viimased tähed on "S", "V" või "M".SELECT tootaja_kood, perenimiFROM TootajaWHERE perenimi SIMILAR TO ‘A+%[SVM]’;Näide: Leia kõik read tabelist Tootaja, kus veerus aadress olev väärtus algabsuure tähe ja kahe numbriga ning lõpeb Latin1 märgistikku kuuluva suur- võiväiketähe või numbriga.SELECT *FROM TootajaWHERE aadress SIMILAR TO '[:UPPER:][:DIGIT:][:DIGIT:]%[:ALNUM:]';55


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNäide: Leia kõik töötajad, kelle perenimi ei alga tähtedega A või B või C või Dvõi E.SELECT *FROM TootajaWHERE perenimi SIMILAR TO '[^A-E]%';5.8.4.6 Is Null predikaatNULL ei ole sama mis arv null (0) või tühi string (''). NULL tähistabväärtuse puudumist samas kui 0 ja '' on väärtused.::= IS [NOT] NULLSQL kasutab kolmevalentset loogikat! Väite kontrolli tulemus võib olla:- TRUE- FALSE- UNKNOWNNäiteks tehakse päring, et leida töötajate perenimed, kelle palk on üle 1500euro. Päringu tulemusel vaatab andmebaasisüsteemi programm läbi kõiktabeli Töötaja read. Iga rea puhul otsustatakse, kas see rahuldab tingimust võimitte.- TRUE. Kui töötajal on palk määratud ja see on üle 1500 euro, siis tulebtöötaja andmed väljastada.- FALSE. Kui töötajal on palk määratud ja see on 1500 eurot või kõrgem,siis töötaja andmeid ei väljastata.- UNKNOWN. Kui töötaja palga suurust ei ole registreeritud, siis ei oleteada, milline tema palk tegelikult on. Töötaja andmeid ei väljastata.Päringu tulemusse kuuluvad ainult sellised read, mille korral WHEREklauslis esitatud otsingutingimus on täidetud (TRUE). Kuiotsingutingimus on täitmata (FALSE) või selle täidetus pole teada(UNKNOWN), siis rida päringu tulemuses ei esitata.Näide: Leia töötajad, kellel pole palk määratud.SELECT *FROM TootajaWHERE palk IS NULL;Näide: Leia töötajad, kellel on palk määratud.SELECT *FROM TootajaWHERE palk IS NOT NULL;56


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNäide: Leia töötajad, kelle perenimi on kindlasti või VÕIBOLLA “Mets”. St., ettuleb otsida töötajaid, kelle perenimi on “Mets” või kellel pole perenimemääratud (st. võibolla nende perenimi on “Mets” aga võibolla ei ole).SELECT *FROM TootajaWHERE perenimi='Mets' OR perenimi IS NULL;SQL standardi järgi pole õiged järgmised päringud (mis aga ei tähenda, etnad ei pruugi mõnes andmebaasisüsteemis töötada). Põhjus – NULL poleväärtus vaid tähistab väärtuse puudumist. Seega ei saa kasutada väärtustevõrdlemiseks kasutatavaid operaatoreid.SELECT * FROM Tootaja WHERE palk = NULL;SELECT * FROM Tootaja WHERE palk NULL;Näide: Leia töötajad kelle perenimi on tühi string:SELECT tootaja_kood, perenimi, osakonna_<strong>nr</strong>FROM TootajaWHERE perenimi='';NULL ei ole tühi string!SQL kirjeldab tõeväärtuse operaatorit, mille abil saab kontrollida avaldisetõeväärtust. Võimaldab taandada kolmevalentse loogika kolm võimalikkutõeväärtust kahele tõeväärtusele – true või false. IS [NOT] TRUE | FALSE | UNKNOWNNäide: Leia selliste töötajate andmed, kelle puhul pole teada, kas nende palkon 500 eurot.SELECT *FROM TootajaWHERE palk=500 IS UNKNOWN;Näide: Leia töötajate andmed, kelle puhul pole välistatud, et nende palk on500 eurot.SELECT *FROM TootajaWHERE palk=500 IS NOT FALSE;Päringu tulemuses on read, kus tingimus "palk=500" kehtib (TRUE) või poletingimuse "palk=500" kehtivust võimalik kindlaks teha, sest vaadeldavas reaspole palga andmed määratud (UNKNOWN).57


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5.8.4.7 Overlaps predikaatOverlaps predikaat võimaldab teha kindlaks, kas kaks ajavahemikku (mis onmääratud alguse ja lõpu aja kaudu) kattuvad või mitte.Näide: Leia tegevused, mille toimumise periood kattub osaliselt või täielikultperioodiga 1. aprill 2003 – 10. aprill 2003.SELECT *FROM TegevusWHERE (algus, lopp) OVERLAPS ('2003-04-01', '2003-04-10');5.8.4.8 Distinct predikaatDistinct predikaat võimaldab kontrollida, kas kahe avaldise tulemused onühesugused või mitte.::= avaldis1 IS DISTINCT avaldis2Näide: Leia töötajad, kes kindlasti või võibolla ei tööta osakonnas <strong>nr</strong>. 1SELECT tootaja_kood, perenimi, osakonna_<strong>nr</strong>FROM TootajaWHERE osakonna_<strong>nr</strong> IS DISTINCT FROM 1;Tulemus:tootaja_kood perenimi osakonna_<strong>nr</strong>2 Mets 24 Triik 35 TaliVõrrelge päringuga:SELECT tootaja_kood, perenimi, osakonna_<strong>nr</strong>FROM TootajaWHERE osakonna_<strong>nr</strong>1;Tulemus:tootaja_kood perenimi osakonna_<strong>nr</strong>2 Mets 24 Triik 3NULL IS DISTINCT FROM 1 => TRUE => rida tulemusseNULL1 => UNKNOWN => rida tulemusest väljaEsimese näitega samaväärne oleks päring:58


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSELECT tootaja_kood, perenimi, osakonna_<strong>nr</strong>FROM TootajaWHERE osakonna_<strong>nr</strong>1 OR osakonna_<strong>nr</strong> IS NULL;DISTINCT predikaat võimaldab ka näiteks teha kindlaks, kas kaks rida onühesugused või mitte.5.8.5 Ridade sorteerimineRelatsioonis on korteežid järjestamata. Kasutajale võib andmed esitadasorteeritult. Sorteerimine ei ole relatsiooniline operatsioon.Mitterelatsioonilisedoperatsioonid(nt. sorteerimine)Relatsioonilisedoperatsioonid(nt. piirangu leidmine,ühendamine)Joonis 11 Päringus sisalduvad operatsioonid.Kasutaja saab muuta päringu tulemuses talle väljastatavate ridade järjekorda,andes ette sorteerimiseeskirja. Sorteerimiseeskiri määrab veerud, millesolevate väärtuste järgi tuleb read sorteerida ja sorteerimise järjekorra (ASC –kasvavalt, DESC – kahanevalt). Sorteerimiseeskiri esitatakse ORDER BYklauslis.SELECT perenimi, aadressFROM TootajaORDER BY perenimi;Sorteerimise näited:- väiksemad numbrilised väärtused ettepoole,- varasemad kuupäevad ettepoole,- sorteerimine tekstiliste väärtuste alusel tähestikulises järjekorras.Võib kasutada ka mitme veeru järgi korraga sorteerimist. Sellel on mõtet, kuiesimesena sorteeritav veerg ei sisalda unikaalseid väärtusi. Vaikimisisorteeritakse kasvavas järjekorras.SELECT osakonna_<strong>nr</strong>, perenimi, aadressFROM TootajaORDER BY osakonna_<strong>nr</strong>, perenimi DESC;59


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarAndmebaasisüsteem leiab sorteerimisjärjekorra lugedes ORDER BY klauslitvasakult paremale.Seetõttu sorteeritakse kõigepealt päringu tulemus osakonna numbri järgi.Ühte osakonda kuuluvad inimesed sorteeritakse perenime järgi tähestikuliselejärjekorrale vastupidises järjekorras. Alates SQL:1999 standardist võivadORDER BY klauslis olla veeru nimed, mis ei esine SELECT klauslis:SELECT perenimiFROM TootajaORDER BY palk;SELECT lause tulemuse võib ka sorteerida kahanevas järjekorras. Sellekstuleb ORDER BY klauslis veeru nime järel kasutada DESC märksõna.SELECT perenimiFROM TootajaORDER BY palk DESC;Kui sorteerimise klauslit ei määrata, väljastatakse read mingis juhuslikusjärjekorras (järjekord sõltub andmebaasisüsteemist ja pole SQL standardipoolt ette kirjutatud).Kuidas sorteerida ridu kui sorteerimise aluseks olevas veerus puuduvadväljades väärtused? SQL standard nõuab, et andmebaasisüsteemi loojadpeavad ise otsustama kas esitada read kus sorteerimisel kasutatavadväärtused puuduvad kõige esimeste või kõige viimastena. Enamikandmebaasisüsteeme lähtub sorteerimisel reeglist NULL on suurem kui NOTNULL väärtused.Teisest küljest on see ebaloogiline, sest NULLi käsitletakse kui väärtust mison siis kas suurem või väiksem teistest väärtustest. Tegelikult aga tähistabNULL väärtuse puudumist.NB! Stringidel põhineva sorteerimise tulemus sõltub kasutatavast märkidevõrdlusreeglistikust (ingl. k. collation). Kui seda sorteerimise klauslis eimäärata, siis kasutab andmebaasisüsteem vaikimisi reegleid. Kuid SQLstandard lubab ORDER BY klauslis määrata kasutatava võrdlusreeglistiku.Näide: Tehke päring töötajate kohta ja sorteerige tulemus saksa keele reeglitejärgi, mis on määratud reeglistikuga "latin1_german1_ci".SELECT *FROM TootajaORDER BY perenimi COLLATE latin1_german1_ci;03. märtsil 2011 Delfi artikkel kirjeldab probleemi, mis tekkis ilmselt valevõrdlusreeglistiku kasutamise tulemusena."Valijanimekirjades kasutatakse eesti tähestiku asemel rahvusvahelistalfabeeti, mistõttu on tavalisest keerulisem neist nimesid üles leida.60


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarERRile saabunud vihje kohaselt avastati eelvalimistel, et valijanimekirjadeskasutatav tähestik erineb tavapärasest alfabeedist. Nii on näiteks Š ja Ž tähtpaigutatud tähestiku lõppu, mitte õigele kohale S-tähe järel.Siseministeeriumi rahvastiku toimingute osakonna nõunik Mairis Kunglakinnitas ERRi uudisteportaalile, et selline viga tõepoolest tehti.AS Andmevara reastas tema sõnul valijate nimekirjad arvutiprogrammideskasutatava rahvusvahelise tähestiku alusel, mis erineb veidi eesti tähestikust."("Valijanimekirjad", 03.03.2011)5.8.6 Tabelite aliasedTabelitele võib päringus anda aliase (ingl. k. correlation name). See tähendab,et tabelile viidatakse selles konkreetses päringus uue nimega.SELECT T.tootaja_kood, T2.tootaja_kood AS tootaja_kood2FROM Tootaja AS T, Tootaja AS T2;SELECT T.tootaja_kood, T2.tootaja_kood tootaja_kood2FROM Tootaja T, Tootaja T2;Milleks tabelite aliasi kasutada? Tabeli aliased on hädavajalikud, kui päringus pöördutakse sama tabelipoole mitmekordselt. Antud näites leitakse kõikvõimalikud töötajatekoodide paarid. Päringus viidatakse kaks korda tabelile Tootajakasutades erinevaid aliasi, ning seega toimuks nagu pöördumine kaheeraldi (virtuaalse) tabeli poole (T1 ja T2). Date (2009) märgib, et T1 jaT2 on muutujad (ingl. k. range variables), mille lubatud väärtusteks ontabelis Tootaja olevad read. Tabeli aliase kasutamist võib kaaluda, kui tabeli nimi tundubmitmekordseks väljakirjutamiseks liiga pikk. Siis aitab tabeli alias SQLlause kompaktsemaks muuta. Tabeli aliase kasutamist võib kaaluda, kui andmebaasis oleva tabelinimi on halvasti valitud ning ei kirjelda tabelis olevate andmetetähendust. Siis aitab tabeli alias parandad SQL lause arusaadavust.Date (2009) märgib, et SQLis on päring:SELECT * FROM Tootaja;lühendatud versioon päringust:SELECT * FROM Tootaja AS Tootaja;Tootaja – on muutuja nimi ja rangelt võttes täidetakse päring selle muutujapõhjal.61


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar5.9 FunktsioonidFunktsiooni all mõistetakse "eeskirja", mis seab igale antud sisendilevastavusse üheselt määratud väljundi.Programmeerimises nimetatakse funktsiooniks programmi osa, mis teostabmingit konkreetset tegumit. Tegum on loogiliselt tervikliku otstarbega,iseseisvana täidetav programm või selle osa, opsüsteemi ressursse tarbivtöötlusüksus (Vallaste, 2000–2009, http://www.vallaste.ee).Funktsioonil on null või rohkem parameetrit ja see tagastab ühe väärtuse. Igaparameeter on kindlat tüüpi. Funktsiooni poole pöördumisel tuleb anda igaleparameetrile väärtus. Parameetri väärtus peab kuuluma parameetri tüübigamääratud väärtuste hulka. Parameetrile antavat väärtust nimetatakseargumendiks. Funktsiooni tagastatav väärtus kuulub tüüpi, mida nimetataksefunktsiooni deklareeritud tüübiks.SQLis võib funktsioone liigitada.• Grupifunktsioonid, mis leiavad väärtuse ridade grupi kohta (ingl. k.group functions, set functions). Nendele funktsioonidele viitamisekskasutatakse ka terminit kokkuvõttefunktsioonid (ingl. k. aggregatefunctions), sest nad aitavad koostada kokkuvõtteid/statistikat.• Ühe rea funktsioonid, mis annavad väärtuse iga päringu (tabeli) reakohta (ingl. k. single row functions).5.9.1 Grupifunktsioonid (SQL:1992)Järgnevalt esitatakse grupifunktsioonid, mis on kirjeldatud SQL:1992standardis. Veeru avaldis võib olla:− viit veerule (veeru nimi),− konstant (väärtust esitav literaal),− skalaarse funktsiooni väljakutse (funktsioon tagastab skalaarseväärtuse),− skalaarne alampäring (Alampäring, mille tulemuseks olevas tabelis onüks veerg ning null või üks rida. Tulemus teisendatakse alampäringudeklareeritud tüüpi olevaks skalaarseks väärtuseks. Kui tulemuses onnull rida, siis teisendatakse alampäringu tulemus NULLiks),− aritmeetiline avaldis.Veeru avaldise arvutamise tulemus on veerg. Veeru avaldis ei või antudkontekstis olla mitteskalaarne alampäring või teise grupifunktsiooni väljakutse.ALL – võetakse arvesse kõik väärtused; NULLe ei arvestata. See on vaikimisivalik ja seda ei pea päringu kirjutamisel määrama.DISTINCT – võetakse arvesse ainult erinevad väärtused. NULLe ei arvestata!Avg([ALL | DISTINCT] veeru avaldis) – aritmeetiline keskmise leidmine. Kuiveeru avaldiseks on viit veerule (veeru nimi), siis leitakse aritmeetilinekeskmine sellele veerule vastavates väljades olevatest väärustest. Veergpeab olema arvu tüüpi või intervalli tüüpi. Tulemuse arvutamisel ei arvestata62


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaarvälju, kus väärtus puudub (NULL). Avg(veerg) ja Avg(ALL veerg) onsamaväärsed. Avg(DISTINCT veerg) leiab aritmeetilise keskmise unikaalseteväärtuste põhjal, mis on veerus veerg.Sum([ALL | DISTINCT] veeru avaldis) – väärtuste summa leidmine. Kuiveeru avaldiseks on viit veerule (veeru nimi), siis leitakse sellele veerulevastavates väljades olevate vääruste summa. Veerg peab olema arvu tüüpivõi intervalli tüüpi. Tulemuse arvutamisel ei arvestata välju, kus väärtuspuudub (NULL). Sum(veerg) ja Sum(ALL veerg) on samaväärsed.Sum(DISTINCT veerg) leiab summa unikaalsete väärtuste põhjal, mis onveerus veerg.Max([ALL | DISTINCT] veeru avaldis) – maksimaalse väärtuse leidmine. Kuiveeru avaldiseks on viit veerule (veeru nimi), siis leitakse maksimaalneväärtus sellele veerule vastavates väljades olevate väärtuste hulgast.Tulemuse arvutamisel ei arvestata välju, kus väärtus puudub (NULL).Max(veerg), Max(ALL veerg) ja Max(DISTINCT veerg) on samaväärsed.Min([ALL | DISTINCT] veeru avaldis) – minimaalse väärtuse leidmine. Kuiveeru avaldiseks on viit veerule (veeru nimi), siis leitakse minimaalne väärtussellele veerule vastavates väljades olevate väärtuste hulgast. Tulemusearvutamisel ei arvestata välju, kus väärtus puudub (NULL). Min(veerg),Min(ALL veerg) ja Min(DISTINCT veerg) on samaväärsed.Count([ALL | DISTINCT] veeru avaldis) – leitakse selliste ridade arv tabelis,mille korral ei ole veeru avaldise arvutamise tulemus NULL. Kui veeruavaldiseks on viit veerule (veeru nimi), siis leitakse ridade arv, kus veerulevastav väärtus on olemas (ei ole NULL). Kui argumendiks onprimaarvõtmesse kuuluv veerg, siis tulemus on sama, mis Count(*)funktsiooni kasutamisel. Põhjuseks on, et primaarvõtme väärtus ei tohi üheskireas puududa. Count(veerg) ja Count(ALL veerg) on samaväärsed.Count(DISTINCT veerg) leiab unikaalsete väärtuste arvu veerus veerg.Count(*) – ridade arv tabelis. Count on ainuke SQLi grupifunktsioon, milleargumendi positsiooni võib kirjutada tärni ("*"). * tähistab tervet tabelirida. Count on ka nimetatud grupifunktsioonidest ainuke grupifunktsioon, mistagastab tühjale tabelile (tabelile, kus ei ole ühtegi rida) rakendatuna väärtuse0.Eelnimetatud grupifunktsioonid on tänapäeva andmebaasisüsteemides kõigerohkem levinud. SQL standardi uuemad versioonid kirjeldavad täiendavaidgrupifunktsioone, kuid neid ei pruugi olla võimalik kõigisandmebaasisüsteemides kasutada.Näiteid täiendavatest grupifunktsioonidest (lisandusid SQL:1999).Every([ALL | DISTINCT] veeru avaldis) – rakenduvad veerule, kus ontõeväärtused. Tagastab TRUE, kui ükski tõeväärtus grupis ei olnud FALSE.Tagastab FALSE, kui kasvõi üks tõeväärtus grupis oli FALSE. Every(veerg),Every(ALL veerg) ja Every(DISTINCT veerg) on samaväärsed.Any([ALL | DISTINCT] veeru avaldis) – rakenduvad veerule, kus ontõeväärtused. Tagastab TRUE, kui kasvõi üks tõeväärtustest oli TRUE.63


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTagastab FALSE kui ükski tõeväärtustest polnud TRUE. Any(veerg), Any(ALLveerg) ja Any(DISTINCT veerg) on samaväärsed.Veel hilisemates SQLi versioonides on lisandunud näiteks kagrupifunktsioonid dispersiooni ja standardhälbe arvutamiseks.Näide: Leia töötajate arv (ridade arv tabelis Tootaja).SELECT Count(*) AS ridade_arvFROM Tootaja;SELECT Count(1) AS ridade_arvFROM Tootaja;NB! SQL lubab kirjutada ka päringu:SELECT Count(*)FROM Tootaja;Selle päringu tulemuseks olevas tabelis on üks veerg kuid selle veeru nimi o<strong>nr</strong>ealisatsioonist (andmebaasisüsteemist) sõltuv. Andmebaasisüsteemideloojatel sellise veeru nimetamise osas vabad käed, ning nad ei ole kohustatudoma valikut isegi dokumenteerima. Hea praktika on, et päringu kirjutajadannavad sellistele veergudele ise nimed.Juhul, kui tabelis Tootaja on ühe töötaja andmed mitmekordselt, siistulemuseks ei ole töötajate arv. See päring kogub andmeid tabeli kõikidestridadest, kuid väljastab ainult ühe rea – ridade arvu. Kui see päring teha tühjatabeli (tabel kus pole ühtegi rida) põhjal, siis tulemuseks on "0".Täpsemalt öeldes on päringu tulemuseks tabel, kus on üks rida ja üks veergning selle tabeli ainsas väljas on väärtus 0.Mõnikord väidetakse, et järgnevad kaks päringut on samaväärsed:SELECT Count(*) AS ridade_arv FROM Tootaja;SELECT Sum(1) AS ridade_arv FROM Tootaja;See ei ole õige väide. Vaatleme piirjuhtu. Kui tabelis Tootaja on 0 rida, siis onCount funktsiooni kasutava päringu tulemuseks väärtus 0. Samas Sumfunktsiooni kasutav päring annab tulemuseks NULL.Date (2009) märgib, et SQL standardi kohaselt on järgnevad kaks päringutsamaväärsed.SELECT Count(*) AS ridade_arv FROM Tootaja;SELECT Count(*) AS ridade_arv FROM Tootaja GROUP BY ();Date (2009) kohaselt märgitakse SQL standardi kirjelduses, et GROUP BYklausel, kus ei ole nimetatud ühtegi veergu, on samaväärne GROUP BYklausli ärajätmisega.64


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNäide: Leia erinevate palkade arv.SELECT Count(DISTINCT palk) AS palkade_arvFROM Tootaja;Näiteks kui tabeli Tootaja veerus palk on 6 erinevat palgasummat ja lisakssellele on kahel töötajal palk määramata, siis tagastab päring väärtuse 6, sestNULLe ei võeta arvesse.MS Accessis (2007) ALL ja DISTINCT sellisel viisil kasutada ei saa. Eelmiseülesande lahendamiseks võib kasutada alternatiivset võimalust:SELECT Count(*) AS palkade_arvFROM (SELECT DISTINCT palk FROM Tootaja WHERE palk IS NOT NULL)AS foo;Nagu näete, võib FROM klauslis sisalduda ka alampäring. Alampäringuletuleb anda alias.Näide: Leia töötajate arv, kellel on palk määratud.SELECT Count(palk) AS palgaga_töötajaFROM Tootaja;Näide: Leia töötajate palgakulude summa.SELECT Sum(palk) AS palgasummaFROM Tootaja;Näide: Leia keskmine palk.SELECT Avg(palk) AS keskmine_palkFROM Tootaja;tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>1 Jõgi Tallinn, Pikk 11.11.2001 1400 1342 Mets Paide, 12.04.2001 1500 2Roheline 73 Kask Tartu, Tähe 12 10.05.2001 1600 14 Triik Tartu, Kase 10.03.2001 1800 312-445 Tali Põlva, Vase 3 10.05.2001 1006 Kall Tallinn, Karu 2 11.06.2002 3Sum(veeru nimi)/Count(*) pole sama mis Avg(veeru nimi), sest Sum(veerg)ei võta arvesse NULLe kuid Count(*) võtab.65


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSELECT Sum(palk)/Count(*) AS keskmine_palk1FROM Tootaja;Tulemus: 1066,7SELECT Avg(palk) AS keskmine_palk2FROM Tootaja;Tulemus: 1280SQL standardi seatud piirangud seoses grupifunktsioonidega.Grupifunktsiooni argument ei või olla teise grupifunktsiooni väljakutse(nt. Sum(Avg(x)). Kui sellist päringut soovitakse teha, siis kõigepealttuleb luua vaade, milles on kasutatud ühe grupifunktsiooni ning siisteha selle vaate põhjal päring.Grupifunktsiooni argument ei või olla mitteskalaarne alampäring (nt.Avg(SELECT veerg1 FROM Tabel1 WHERE ...). Seega ei saa järgmistpäringut kasutada, leidmaks töötajate keskmist palka:SELECT Avg(SELECT palk FROM Tootaja);5.9.2 Igale reale eraldi rakenduvad funktsioonidMõned näited.Upper(string) – teisendab stringis kõik tähed suurtähtedeks.Lower(string) – teisendab stringis kõik tähed väiketähtedeks.SELECT Upper(perenimi) AS uus_nimiFROM Tootaja;perenimiJÕGIMETSKASKTRIIKNagu näete, saab funktsiooni väljakutsel kasutada argumendina veeru nime.Iga käsitletava rea korral võetakse argument sellele veerule vastavast väljast.Funktsioone võib kasutada ka predikaatides. Järgnevalt otsitakse töötajat,kelle perenimi on Kask, kusjuures suur- ja väiketähti ei eristata.Näide:SELECT *FROM TootajaWHERE Upper(perenimi)='KASK';Võib ka nii:SELECT *FROM TootajaWHERE Lower(perenimi)='kask';66


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarJärgnevalt esitame mõned SQL:1992 standardis kirjeldatud funktsioonid.Võrdlusena esitame analoogilised funktsioonid töölaua andmebaasisüsteemisMS Access. Mõnikord võib funktsioonile ka vaste puududa. Kõiki neidfunktsioone saab kasutada SQL lausetes.SQL standardi poolt defineeritudfunktsioonMatemaatikafunktsioonidMS Accessis defineeritud funktsioonJärgnevalt esitatavadmatemaatikafunktsioonid pole küll SQLstandardis määratud, kuid Celko (2000)sõnul, on esindatud enamikesandmebaasisüsteemide.Abs(x) Tagastab x absoluutväärtuseAbs(-1) = 1Sgn(x) Määrab x märgi. -1 negatiivnearv; 0 võrdne nulliga; 1 positiivne arvSgn(-4) = -1Log(x) Leiab x naturaallogaritmi.Round(x) Tagastab väärtuse, missaadakse x ümardamisel lähimakstäisarvuks.Round(8.4)=8Round(-8.4)=-8Round (x, d) Tagastab väärtuse, missaadakse x ümardamisel teatava arvu (d)kohtadeni peale koma.Round(15.64664,2) = 15.65Sqr(x) Tagastab ruutjuure x-ist.Sqr(4) = 2Int(x)Funktsioon leiab x täisarvu osa.Negatiivse arvu puhul tagastab Intesimese negatiivse täisarvu, mis onväiksem või võrdne kui argumendiks olevarv.Int(-8.4)=9Int(8.4) =8Fix(number)Funktsioon leiab x täisarvu osa.Negatiivse arvu puhul tagastab Fixesimese täisarvu, mis on suurem võivõrdne kui argumendiks olev arv.Fix(-8.4)=867


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSQL standardi poolt defineeritudfunktsioonMS Accessis defineeritud funktsioonFix(8.4) =8Ajaga seotud funktsioonidCURRENT_DATETagastab hetke kuupäeva (arvutikella alusel).CURRENT_TIMEDate()Näide: Leia magajate sünniaeg päevadesSELECT perenimi, Date()-sünni_aeg AS[vanus päevades]FROM MagajaTime()Tagastab hetke kellaaja.Näide:CURRENT_TIME(6) – mikrosekunditäpsusCURRENT_TIMESTAMPNow()Tagastab hetke kellaaja ja kuupäeva.Näide:CURRENT_TIMESTAMP –mikrosekundi täpsusCURRENT_TIMESTAMP(0) –sekundi täpsusEXTRACT ({year | month | day |hour | minute | second |timezone_hour | timezone_minute}from {datetime value expression> | })Kuupäevast ja kellaajastalamkomponentide (aasta, kuu jne.)eraldamine.Year(date)Month(date)Day(date)Hour(time)Second(time)Näide: Leia magaja nimi ja sünniaasta.SELECT perenimi, Year(sünni_aeg) ASsünniaastaFROM Magaja;Näide: Tee statistikat magajatesünnikuude kohta. Leia sünnikuuidentifikaator ja magajate arv, kes igalkuul on sündinud.SELECT Month(sünni_aeg) AS sünnikuu,Count(*) AS [sündinute arv]FROM magajaGROUP BY Month(sünni_aeg)68


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSQL standardi poolt defineeritudfunktsioonMS Accessis defineeritud funktsioonORDER BY Month(sünni_aeg);Näide: Leia hetke kuupäeva ja kellaajaalamkomponendid.SELECT Year(Now()) AS aasta,Month(Now()) AS kuu,Day(Now()) AS päev,Hour(Now()) AS tund,Minute(Now()) AS minut,Second(Now()) AS sekund;DateDiff(interval, date1, date2[,firstdayofweek[, firstweekofyear]])Leiab ajaühikute arvu kahe kuupäevavahel.Interval – 'd' määrab, et ajaühikud onpäevad.Interval – 'yyyy' määrab, et ajaühikud onaastad.Näide: Leia magajate vanus päevades.SELECT magaja_id,DateDiff('d', synni_aeg, date()) ASvanus_päevadesFROM Magaja;Stringitöötluse funktsioonidSUBSTRING( from to)Eraldab stringist alamstringi – uuritav string – alamstringi alguse positsioon – alamstringi pikkusMid(string, start[, length])string – string, millest alamstringiotsitakse.start – sümboli positsioon millest alatesalamstring eraldatakse.length – alamstringi pikkus.Näide: Leia magajate nimed. Esita needkujul: eesnime esimene täht + punkt +tühik + perenimi;SELECT Mid(eesnimi,1,1) + '. ' +perenimiFROM Magaja;Left(string, length)Right(string, length)Leiavad alamstringi pikkusega length kas69


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSQL standardi poolt defineeritudfunktsioonTRIM ([{leading | trailing | both}][] from [])Eemaldab stringi otstest sümboleid.Kui sümbolit ei määrata on vaikimisisümboliks tühik.leading – eemaldatakse sümbolidstringi algusest;trailing – sümbolid stringi lõpust;both – sümbolid stringi mõlemastotsast.TRIM( leading '*' from '***error*')Tulemus: 'error*'TRIM(' TITLE ')MS Accessis defineeritud funktsioonstringi vasakust (left) või paremast (right)otsast.Trim(string) – eemaldab stringialgusest ja lõpust tühikud.LTrim(string) – eemaldab tühikud stringialgusest.RTrim(string) – eemaldab tühikud stringilõpust.Näide: Leia magajate perenimed, kust oneemaldatud algusest ja lõpust tühikud.SELECT Trim(perenimi) AStrimmitud_perenimiFROM Magaja;See funktsioon võimaldab eemaldadavaid tühikuid.Tulemus: 'TITLE'TRANSLATE (USING )Tõlke tegemine ühest keelest teise.Eeldab, et andmebaasis on loodudspetsiaalne objekt – tõlge, missisaldab reegleid tõlke tegemiseks.CHARACTER_LENGTH(string) võiCHAR_LENGTH (string)Leiab stringi kuuluvate sümbolitearvu.BIT_LENGTH()Len(string)Näide: Leia magajad, kelle perenimisisaldab rohkem kui 10 tähte.SELECT *FROM MagajaWHERE Len(perenimi)>10;Stringi pikkus bittides. Tulemusekstäisarv.OCTET_LENGTH()Stringi pikkus oktettides (1 oktett=8bitti). Tulemuseks täisarv.POSITION ( IN )Tagastab ühe stringi positsiooni teiseInStr([start, ]string1, string2[,compare])start – valikuline. Määrab sümbolipositsiooni stringis, millest alates otsingut70


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarSQL standardi poolt defineeritudfunktsioonstringi sees.POSITION('ar' in 'Gerard')Tulemus: 4MS Accessis defineeritud funktsioonalustatakse.string1 – string, millest otsitakse.string2 – string, mida otsitakse.compare – valikuline. Määrab, kuidasvõrdlust läbi viia. Võimalikud väärtused:0 – otsingul eristatakse suur- javäiketähti.1 – otsingul ei eristata suur- ja väiketähti(vaikimisi).Stringivõrdluste tüüp.InStr(1, 'Gerard', 'ar', 1)UPPER(string)Leiab sisendiks oleva stringi põhjaluue stringi, kus kõik tähed onsuurtähed.LOWER(string)Leiab sisendiks oleva stringi põhjaluue stringi, kus kõik tähed onväiketähed.Tüübiteisenduse funktsioonidSQL standard räägib CASToperaatorist, mis võimaldabteisendada andmed ühest tüübistteisecast( AS ) – väärtus või avaldisväärtuse leidmiseks – andmetüüp kuhuteisendada.Tulemus: 4Alamstring "ar" algas stringis "Gerard"neljandast positsioonist.UCase(string)Näide: Leia magajate perenimed ja esitaneed suurtähtedega.SELECT UCase(perenimi) ASsuured_tähedFROM Magaja;LCase(string)Näide: Leia magajate perenimed ja esitaneed väiketähtedega.SELECT LCase(perenimi) ASväikesed_tähedFROM Magaja;CBool(expression)CByte(expression)CCur(expression)CDate(expression)CDbl(expression)CDec(expression)CInt(expression)CLng(expression)CSng(expression)CVar(expression)CStr(expression)71


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarTingimuslause (Cannan et al., 1992)CASEWHEN THEN [,WHEN THEN ...]ELSE iif(expr, truepart, falsepart)Kui avaldise expr hindamise tulemus onTRUE, siis tagastab funktsioon truepart,vastasel juhul falsepart.Tingimuslause kasutamine.Leidke töötaja number ja tema palgahinnang. Kui palk on väiksem võivõrdne kui 1000, siis näidataksehinnanguna sõna Väike, vastaseljuhul sõna Suur.SELECT tootaja_<strong>nr</strong>,CASE WHEN palk


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarNULLide asendamisega seotudfunktsioonidCOALESCE(, ... , )Tagastab argumentide hulgastvasakult lugedes esimese, mis eiole NULL.Nz(variant[, valueifnull])Juhul, kui on täidetud tingimusvariant IS NULL, siis on tulemuseksvalueifnull poolt määratud väärtus.Leia iga töötaja palga ja lisatasusumma. Kui töötajal pole palk võilisatasu määratud, siis arvesta naguoleks palk või lisatasu 0.SELECT tootaja_<strong>nr</strong>,(COALESCE(palk, 0.00) +COALESCE(lisatasu, 0.00))FROM Tootaja;SELECT tootaja_<strong>nr</strong>, (Nz(palk, 0.00) +Nz(lisatasu, 0.00))FROM Tootaja;Töötajal võib palk või lisatasu ollamääramata ja liitmisoperatsioonitulemus oleks NULL. Seda saabvältida COALESCE funktsiooni abil.COALESCE(v1, v2) on samaväärnekui:CASE WHEN v1 IS NOT NULLTHEN v1ELSE v2 ENDNULLIF(v1, v2)Juhul, kui v1=v2, siis võrdlusetulemuseks on NULL, vastasel juhulv1.SELECT palk/(NULLIF (lisatasu,0) )FROM Tootaja;salary / NULL => NULLsalary / 0 => vigaSee päring vältis nulliga jagamistNULLIF(v1,v2) on samaväärne kui:CASE WHEN v1=v2 THEN NULLELSE v1 END;73


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarMilliseid funktsioone saab mingis andmebaasisüsteemis kasutada, tuleb igalkonkreetsel juhul eraldi üle vaadata! Järgnevalt on esitatud mõned eelnevaltmitte mainitud funktsioonid, mis Joe Celko andmeil on sageliandmebaasisüsteemides olemas.MatemaatikafunktsioonidPower(x, n) – tõstab arvu x astmesse n.Floor(x) – suurim täisarv, mis on väiksem või võrdne kui x.Ceiling(x) – väikseim täisarv, mis on suurem või võrdne kui x.StringifunktsioonidReverse(string) – muudab sümbolite järjekorda stringis.Flip(string, sümbol) – otsib stringist sümboli. Kõik sellest vasakule jäävadsümbolid tõstetakse stringi lõppu ja sümbol kustutatakse.Näide: Flip('Juurikas, Juhan', ',') => 'Juhan Juurikas'SQL lubab ka luua kasutaja-defineeritud funktsioone. Kasutajateks, kesselliseid funktsioone loovad on andmebaasi arendajad.6. MõistedEesti keelesPiirangProjektsioonHulgateoreetiline summaÜhendHulgateoreetiline vaheLõige e. ühisosaDescartesi ristkorrutisHulkade ristkorrutisOtsekorrutisÜhendamineTeeta-ühendamineNaturaalühendamineVasakpoolne välisühendaminePoolühendaminePoolvahe leidmineJagamineBaasrelatsionTuletatud relatsioonVirtuaalne relatsioonVaadeRelvaride Eristamatuse PrintsiipTeisendusele orienteeritud keelGraafiline keelNeljanda generatsiooni keelViienda generatsiooni keelRelatsiooniliselt täielik keelInglise keelesSelectionRestrictionProjectionUnionSet differenceIntersectionCartesian productU<strong>nr</strong>estricted joinJoinTheta joinNatural join(Left) Outer joinSemijoinSemidifferenceDivisionBase relationDerived relationVirtual relationViewThe Principle of InterchangeabilityTransform-oriented languageGraphical languageFourth-generation languageFifth generation languageRelationally complete language74


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki EessaarEesti keelesPäringAndmekirjelduskeelAndmekäitluskeelSalvestatud protseduuride keelAndmekirjelduslausedAndmetöötluslaused e.andmekäitluslausedAndmetele juurdepääsu kontrollilausedGrupifunktsioonLoendusfunktsioonKeskmise leidmise funktsioonÜhe rea funktsioonidVõtmesõnaReserveeritud sõnaKinnissõnaMittereserveeritud sõnaInglise keelesQueryData Definition Language (DDL)Data Manipulation Language (DML)Data Procedural Language (DPL)Data definition statementsData manipulation statementsData-control statementsGroup functionAggregate functionSet functionCount functionTallyArithmetic mean functionAverageSingle row functionsKey wordReserved wordNon-reserved word7. Kasutatud materjalid1. Andmebaasisüsteemi MS Access abifailid.2. Cannan, S.J. & Otten, G.A.M., 1992. SQL - The Standard Handbookbased on the new SQL standard (ISO 9075:1992(E)).3. Chamberlin, D.D. & Boyce, R.F., 1974. SEQUEL: A Structured EnglishQuery Language. Proc. ACM SIGMOD Workshop on Data Description,Access and Control, Ann Arbor, Michigan (May 1974) pp 249-264.4. Celko, J., 2000. SQL for smarties: advanced SQL programming. 2 nd ed.Academic Press. 553 p.5. Celko, J., 2008. Joe Celcko's Thinking in Sets. Auxiliary, Temporal, andVirtual Tables in SQL. Morgan Kaufmann Publishers.6. Codd, E. F., 1971. A Data Base Sublanguage founded on the RelationalCalculus., IBM Research Report RJ893 (July 26th, 1971).7. Codd, E. F., 1972. Relational Completness of Data Base Sublanguages inRandall J. Rustin (ed.), Data Base Systems, Courant Computer ScienceSymposia Series 6. Englewood Cliffs, N.J.: Prentice Hall.8. Darwen, H., 2009. An Introduction to Relational Database Theory. VentusPublishing ApS.9. Darwen, H., 2011. Business System 12. TTM Implementers’ Workshop,University of Northumbria, 2-3 June, 2011. [WWW]http://www.northumbria.ac.uk/static/5007/ceispdf/1937017/h_darwen1(12.03.2012)10.Date, C. J. & Darwen, H., 1997. The SQL Standard. Fourth Edition.Pearson Education. 522 p.11.Date, C. J., 2003. An Introduction to Database Systems. Eighth Edition.Addison Wesley. 983 p.75


TTÜ: Relatsioonialgebra. Sissejuhatus SQL keelde (2012) © Erki Eessaar12.Date, C. J., 2009. SQL and Relational Theory. How to Write Accurate SQLCode, O'Reilly. 404 p.13.Faroult, S. & Robson, P., 2006. The Art of SQL. O'Reilly.14.Gulutzan, P. & Pelzer, T., 1999. SQL-99 Complete, Really. MillerFreeman. 1078 p.15.Halpin, T., 2001. Information Modeling and Relational Databases. FromConceptual Analysis to Logical Design. San Francisco : Morgan KaufmanPublishers.16.IBM Peterlee Relational Test Vehicle (PRTV)http://en.wikipedia.org/wiki/IBM_Peterlee_Relational_Test_Vehicle_%28PRTV%29(14.03.2010)17.Isotamm, A., 1996. Andmed, andmemudelid ja päringukeeled. TartuÜlikooli Kirjastus, 1996. 161 lk.18.Kaasik, Ü., 1992. Matemaatika-leksikon. Eesti Entsüklopeediakirjastus.296 lk.19.Lepik, T. Operaatorid [WWW]http://www.cs.ut.ee/~toomas_l/operaatorid.html (01.03.2004)20.Malamud, C., 1989. INGRES. Tools for Building an InformationArchitecture. Van Nostrand Reinhold, New-York.21.Oja, P., 2002. Hulgateooria. Tartu : Tartu Ülikooli Kirjastus.22.Puusemp, P., 2000. Diskreetne matemaatika. Loengukonspekt. Tallinn.23.Puusemp, P., 2002. Üldalgebra alused. Tallinn : <strong>Tallinna</strong> Tehnikaülikool.164 lk.24.Tropashko, V., 2006. SQL Design Patterns. The Expert Guide to SQLProgramming. Rampant Techpress.25.Valijanimekirjad eiravad eesti tähestikku. Delfi. [WWW]http://www.delfi.ee/news/paevauudised/eesti/valijanimekirjad-eiravad-eesti-tahestikku.d?id=41355359(03.03.2011)76

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!