12.07.2015 Views

Andmebaasid I - Teema nr. 5

Andmebaasid I - Teema nr. 5

Andmebaasid I - Teema nr. 5

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar2. Andmemuudatused SQL-keelesAndmemuudatusteks mõeldud SQL keele laused kuuluvad SQLiandmekäitluskeelde (ingl. k. Data Manipulation Language), mis on üks SQLialamkeeltest.Andmebaasisüsteemi ülesanne on kontrollida, kas andmemuudatuse järel onandmebaasis andmed korrektses seisundis (vastavad kõigile kitsendustele).Kui ilmneb, et muudatus põhjustaks vastuolu ühe või rohkema andmebaasisjõustatud kitsendusega, siis lükatakse lause, mille tulemusel vastuolu tekkis,andmebaasisüsteemi poolt tagasi (selle tehtavaid muudatusi ei viidaandmebaasi sisse). Kui selline lause kuulus transaktsiooni e. tehingusse, siislükatakse tagasi kogu transaktsioon.Meenutagem, et relatsiooniline mudel nõuab, et mistahes tüüpi relatsioonilisemuutuja (relvari) R korral peab leiduma operaator, mis võimaldab anda R-ileuue väärtuse. SQLi INSERT, UPDATE, DELETE ja MERGE lausetekasutamine on vaste relatsioonilisele omistamisele (relvaridele uue väärtuseandmisele).2.1 Andmete lisamine tabelitesse – INSERT lauseSelle lausega on võimalik lisada tabelisse ridu.Süntaks:INSERT INTO TabeliNimi [(veergude nimekiri)]VALUES ((väärtuste nimekiri), [(väärtuste nimekiri), ...]);VALUES klauslis sisalduvad konstandid (literaalid) ja selle abilkonstrueeritakse rida. Kui välja jaoks pole väärtus teada, siis võib väärtustenimekirjas kasutada sõna NULL. Kui välja soovitakse lisada sellele väljalevastava veeru vaikimisi väärtust, siis võib väärtuste nimekirjas kasutada sõnaDEFAULT (MS Accessis (2007, 2010) sõna DEFAULT kasutamine ei tööta).INSERT INTO TabeliNimi[(veergude nimekiri)]SELECT...;SELECT lause on suvaline korrektne SELECT lause, mille abil leitud andmedsoovitakse tabelisse lisada. INSERT klauslis ja VALUES või SELECT klauslispeavad klappima nii veergude järjekord, arv kui tüüp. Teiste sõnadega tulebtagada, et tabelisse lisatavad read on sobiva struktuuriga.INSERT klauslis olev veerunimede loetelu võib olla.a) Täielik – siis saavad kõigile veergudele vastavad (rea) väljad ettenähtudväärtuse.b) Osaline – kui veeru nimi loetelust puudub, siis sellele veerule vastavassevälja lisatakse veeru kirjelduses määratud vaikimisi väärtus (DEFAULT).Juhul kui vaikimisi väärtus puudub ja veerg on kohustuslik, siis rea3


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarINSERT INTO Kontakt ( klient_id, kontakt, järjekorranumber )SELECT klient_id, kontakt, järjekorranumberFROM (SELECT klient_id, kontakt1 AS kontakt, 1 AS järjekorranumberFROM Klient_vanaUNION ALL SELECT klient_id, kontakt2, 2FROM Klient_vanaUNION ALL SELECT klient_id, kontakt3, 3FROM Klient_vana) AS virtuaalne_tabel;2.2 Olemasolevate ridade muutmine tabelis – UPDATE lauseUPDATE TabeliNimiSET veeruNimi1= [, veeruNimi2=...][WHERE otsingutingimus]SET klauslis veerule vastavase välja lisatava väärtuse tüüp peab olemaühilduv selle veeru tüübiga. võidakse leida ka skalaarse alampäringu abil.Kui lauses puudub WHERE klausel, siis uuendatakse kõiki antud tabeli ridu.Kui WHERE klausel on olemas, siis uuendatakse ainult selliseid ridu, misrahuldavad WHERE klauslis esitatud otsingutingimust. WHERE klauslisolevale otsingutingimusele kehtivad kõik samad reeglid, mis SELECT lauseotsingutingimusele.Näide: Uue õppeaasta alguses said kõik tudengid ühe kursuse võrra edasi:UPDATE TudengSET kursus = kursus+1;Näide: Reformi tulemusena muutus LDP-suund LAP-suunaks:UPDATE TudengSET suund = 'LDP'WHERE suund ='LAP';Näide: Kati Karu (tudengikoodiga '990999') abiellus ja tema uus nimi onRebane:UPDATE TudengSET enimi='Andres', pnimi='Rebane'WHERE tkood='990999';Tingimused tuleb valida nii, et kogemata ei muudetakse andmeid ridades, kusandmeid tegelikult ei tahetud muuta.6


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäide: Kõigi viiendal kursusel olevate üliõpilaste õppimised muudetaksemitteaktuaalseks.UPDATE OppimSET aktuaalne=falseWHERE tkood IN (SELECT tkood FROM Tudeng WHERE kursus=5);2.3 Ridade kustutamine tabelist – DELETE lauseDELETE FROM TabeliNimi[WHERE otsingutingimus]Selle lause kasutamise tulemusel kustutatakse andmed tabelist, kuid tabel isesäilib. Kui lauses puudub WHERE klausel, siis kustutatakse tabelist kõik read.Kui WHERE klausel on olemas, siis kustutatakse ainult sellised read, misrahuldavad selles esitatud otsingutingimust. WHERE klauslis olevaleotsingutingimusele kehtivad kõik samad reeglid, mis SELECT lauseotsingutingimusele.Näide: Kustutada uue õppeaasta alguses kõik eelmise aasta diplomandid(kursus=5).DELETE FROM Tudeng WHERE kursus=5;Näide: Kustutada tabelist Tudeng selliste tudengite andmetega read, kes poleviimase 1000 päeva jooksul registreerinud ühelegi õppimisele:DELETE FROM TudengWHERE NOT EXISTS (SELECT * FROM Oppim AS O WHERE(Tudeng.tkood=O.tkood) AND (regkuup>Date()-1000));Näide: Kustutada kõik read tabelist Tudeng:DELETE FROM Tudeng;NB! Kui soovitakse kustutada andmeid vaid üksikutest väljadest (read jäävadalles), siis tuleb kasutada UPDATE lauset.Näide: Kustutame kõigi tudengite suuna koodid.UPDATE TudengSET suund=NULL;Ridade lisamise, uuendamise ja kustutamise tulemus ei tohi olla vastuolustabelile deklareeritud kitsendustega – vastasel juhul ei viiandmebaasisüsteem sellist muudatust lõpuni.Näiteks viimase UPDATE lause õnnestumise eelduseks on, et tabeli Tudengveerg suund on mittekohustuslik veerg, kus väärtused võivad puududa.7


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar2.4 MERGE lauseMERGE lause kombineerib INSERT ja UPDATE lause. Kui olemi kohta ei oletabelis andmeid, siis lisatakse tabelisse uus rida. Kui olemi kohta on tabelisandmed, siis vastavat rida muudetakse. Seda tüüpi lause spetsifikatsioonlisati SQL:2003 standardisse. Taoline lause on kasutatav näiteks Oracle (11g)SQLi dialektis.Näide: Leia tabelist Emp andmed ja täienda nende alusel tabelit Salary. Kuitöötaja andmeid ei ole tabelis Salary, siis lisa sellesse tabelisse uus rida. Kuitöötaja andmed on tabelis Salary, siis muuda selle töötaja palka tabelis Salaryvastavalt tabelist Emp leitud palgale.CREATE TABLE Salary (employee_id NUMBER(4) PRIMARY KEY,sal NUMBER(7,2));INSERT INTO Salary (employee_id) VALUES (7369);INSERT INTO Salary (employee_id) VALUES (7499);INSERT INTO Salary (employee_id) VALUES (7521);COMMIT;MERGE INTO Salary DUSING (SELECT empno, sal FROM Emp) SON (S.empno=D.employee_id)WHEN MATCHED THEN UPDATE SET D.sal = S.salWHEN NOT MATCHED THEN INSERT (employee_id, sal)VALUES (S.empno, S.sal);Ilma MERGE lause kasutamiseta tuleb käivitada eraldi UPDATE ja INSERTlaused. Pange tähele, et UPDATE lause SET klauslis kasutataksekorreleeruvat alampäringut.UPDATE SalarySET sal=(SELECT sal FROM Emp WHERESalary.employee_id=Emp.empno);INSERT INTO Salary(employee_id, sal)SELECT empno, salFROM EmpWHERE empno NOT IN (SELECT employee_id FROM Salary);COMMIT;MS Accessis (2007, 2010) ei saa Te kasutada MERGE lauset, ega kaUPDATE lauset, mille SET klauslis on alampäring. MS Accessis tuleks seeülesanne lahendada kasutades lauseid:UPDATE Salary INNER JOIN Emp ON Salary.employee_id=Emp.empnoSET Salary.sal=Emp.sal;8


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarINSERT INTO Salary(employee_id, sal)SELECT empno, salFROM EmpWHERE empno NOT IN (SELECT employee_id FROM Salary);MS Accessi näites toodud UPDATE lause ei tööta jällegi Oracles.3. Transaktsioonid e. tehingudProgrammeerimises mõeldakse transaktsiooni all harilikult infovahetuse jasellega seotud tegevuste jada (näiteks andmebaasi värskendamist), midakäsitletakse ühe tervikuna.Transaktsioon e. tehing SQL andmebaasis (SQL-transaktsioon) on järjestatudhulk operatsioone (SQL lausete käivitamisi), mis on taastamise suhtesatomaarne. Andmebaasi kasutava programmi tööprotsess ontransaktsioonide jada, kus transaktsioonide vahel toimuvad andmebaasikasutamisega mitte seotud tegevused. Et programm saaks andmebaasikasutada, peab andmebaasisüsteem looma SQL-ühenduse ja sellega seosesalgatama SQL-sessiooni ehk SQL-seansi. "Seanss kujutab endast kestvatühendust kasutaja (või kasutaja agendi) ning partneri vahel, kelleks onenamasti server" (Vallaste, 2011). SQL standard näeb SQL ühenduseloomiseks ette käsku CONNECT ja ühenduse katkestamiseks käskuDISCONNECT.CONNECT TO 'some_server' AS 'Connection_1' USER 'bob';Näide: Ühelt kontolt võetakse raha maha ja teisele kantakse juurde. Kui üksSQL lause täita aga teine mitte siis tekib suur probleem!!!START TRANSACTION;UPDATE bankacct SET balance = balance - 100 WHERE acctno = '82021';UPDATE bankacct SET balance = balance + 100 WHERE acctno = '96814';COMMIT; --Transaktsiooni kinnitamineSTART TRANSACTION – selle käsu järel kasutaja edastatavad SQL lausedkuuluvad ühte transaktsiooni.COMMIT – käsk transaktsiooni kinnitamiseks.ROLLBACK – käsk transaktsiooni tühistamiseks.Transaktsioonil võib olla kaks võimalikku tulemust.• Kui transaktsioon lõpeb edukalt, siis andmebaas jõuab uude korrektsesseseisundisse.• Kui transaktsioon katkestatakse, siis tuleb KÕIK selle käigus muudatusedtühistada ja muudetud andmed taastada sellisena, nagu need olid ennetransaktsiooni algust. Öeldakse, et selline transaktsioon pööratakse tagasivõi rullitakse tagasi. Transaktsiooni võib tühistada programmiliselt (käsugaROLLBACK) või see võib katkeda veaolukorra tekkimise tulemusel.9


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarAlusta transaktsiooniTäida transaktsioonikuuluv tegevusAktiivneLõpeta transaktsioonTühistaOsaliseltkinnitatudTühistaEbaõnnestunudKinnitaTühista lõplikultKinnitatudTühistatudJoonis 1 Transaktsiooni seisundidiagramm.Järgnevalt esitatakse seisundite kirjeldused.SeisundinimiAktiivneOsaliseltkinnitatudEbaõnnestunudSeisundi kirjeldusTransaktsioon on aktiivne. Kui andmete muutmisel tekkis tõrge(nt. andmebaasisüsteem leidis vastuolu tabeliga seotudterviklikkuse reeglitega, salvestatud protseduuri täitmineebaõnnestus, käivitunud triger lükkas tabelisse tehtudmuudatused tagasi jne.), siis tuleb transaktsiooni tehtudmuudatused tühistada. Transaktsioon läheb seisundisse "Failed".Transaktsioon on valmis lõplikuks kinnitamiseks. Transaktsioonjõuab sellesse seisundisse peale seda, kui viimanetransaktsioonis sisalduv tegevus on täidetud. Kui tabeliga seotudterviklikkuse reeglite kontroll on lükatud transaktsiooni lõppu, siisvõib selguda, et transaktsiooni muudetud andmed on vastuolusterviklikkuse reeglitega ja transaktsioon tuleb tühistada.Tühistamine võib tuleneda ka sellest, et andmete salvestamineebaõnnestus mingi tehnilise probleemi tõttu. Tühistamisotsusejärel peab transaktsioon minema seisundisse "Failed"(ebaõnnestunud). Kui transaktsioon on edukalt ja probleemidetalõpetanud, siis võib see minna seisundisse "Committed".Transaktsioon on ebaõnnestunud. Transaktsioon jõuab sellesseseisundisse siis, kui transaktsiooni ei saa edukalt lõpetada või onsee täitmise ajal katkestatud. Transaktsiooni täitmist saab kaprogrammiliste vahenditega katkestada. Ebaõnnestunudtransaktsiooni tehtud kõik muudatused andmetes tuleb tühistada.10


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarSeisundinimiTühistatudKinnitatudSeisundi kirjeldusTransaktsioon on tagasi pööratud.Transaktsioon on edukalt lõppenud.3.1 Transaktsioonide omadusedTuntakse ka akronüümina ACID.1. Atomicity (atomaarsus)2. Consistency (terviklikkus)3. Isolation (isoleeritus)4. Durability (püsivus)OmadusenimiAtomaarsusTerviklikkus/konsistentsusOmaduse kirjeldusTransaktsiooni väljakutsuja (klient, rakendus) seisukohalt ontransaktsioon loogiline tervik, mis täidetakse kas täielikult võijäetakse täielikult täitmata. Transaktsioonisisseprogrammeeritud loogika kohaselt võidakse transaktsioonteatud tingimuste täidetuse/mittetäidetuse korral osaliselttagasi rullida ja siis kinnitada (kasutades näitekssalvestuspunkte). Kuid see on transaktsiooni programmeerijateteadlik otsus ja transaktsiooni väljakutsuja seisukohalt onselline transaktsioon endiselt loogiline tervik. Transaktsioonitäitmise käigus erandi tekkimise korral (kui seda erandit eitöödelda) või süsteemi vea tekkimise korral transaktsioonitäitmise käigus peab andmebaasisüsteem transaktsiooniautomaatselt tagasi rullima, nagu seda poleks kunagitoimunud.Transaktsioon peab viima andmebaasi ühest terviklikustseisundist teise terviklikku seisundisse. Andmete terviklikkustähendab üheltpoolt seda, et andmed ei lähe vastuolluandmebaasis jõustatud kitsendustega. Selle tingimusetäidetust kontrollib andmebaasisüsteem. Lisaks peavadtransaktsiooniks koondatud laused tagama, et transaktsioonitulemusena ei lähe andmebaasis olevad andmed vastuollureeglitega, millele vastavaid kontrolle ei saa tänapäevaSQL-andmebaasides deklaratiivseid kitsendusi või trigereidkasutades jõustada. Sellise kontrolli teostamise realiseerimineon juba transaktsioone algatavate programmideprogrammeerijate ülesanne.IsoleeritusKui transaktsioon täidetakse vaid osaliselt, siis muutuvadandmed ebakorrektseks (näide – raha ülekandmisel üheltkontolt teisele võetakse ühelt kontolt summa maha, kuid teiselejuurde ei lisata).Transaktsiooni täitmisel tehtavad muudatused andmebaasispole enne transaktsiooni kinnitamist teistele sama andmebaasikasutajatele ega nende algatatud transaktsioonidele nähtavad.11


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarOmadusenimiPüsivus /jätkuvusOmaduse kirjeldusEdukalt lõppenud transaktsiooni tulemused on andmebaasisalvestatud ja ei tohi sealt kaotsi minna (isegi mitte süsteemivea korral).12


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4. Andmebaasiobjektide haldamine4.1 SissejuhatusAndmekirjelduskeel (ingl. k. Data Definition Language, DDL) on SQLialamkeel, mida kasutatakse SQL objektide loomiseks, modifitseerimiseks jakustutamiseks.• CREATE lause – andmebaasiobjekti loomine.• ALTER lause – andmebaasiobjekti struktuuri/käitumise muutmine.• DROP lause – andmebaasiobjekti kustutamine.• GRANT lause – andmebaasiobjekti suhtes õiguse andmine võikasutaja/rolli määramine rolli.• REVOKE lause – andmebaasiobjekti suhtes õiguse võtmine võikasutajalt/rollilt rolli võtmine.Mõnikord öeldakse ka, et GRANT ja REVOKE laused moodustavad SQLiseraldi alamkeele – andmekontrolli keel (ingl. k. Data Control Language, DCL).Kõikide objektide jaoks on olemas loomise ja kustutamise lause. Mõnedeobjektide jaoks on olemas ka struktuuri/käitumise muutmise lause, agamõnede jaoks mitte (nt. puudub lause vaadete muutmiseks).Objekti loomisel antakse sellele nimi (identifikaator).Joonis 2 SQL objekte ja nende vahelisi seoseid kirjeldav domeenimudel.13


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarJoonis 3 SQL objektide üldistuse domeenimudel (SQL:1999 standardipõhjal).SQL objektide vahel eksisteerivad sõltuvused, st. võib juhtuda, et üks objektei saa eksisteerida ilma teiseta. Näiteks, kui kustutada skeem (SQL-skeem),siis tuleks kustutada kõik selles sisalduvad andmebaasiobjektid. Kuikustutada tabel, siis tuleks kustutada sellega seotud trigerid ja sedakasutavad vaated.Mõned andmebaasiobjektid (näiteks tabelid, vaated) on skeemi objektid –need objektid paigutatakse konkreetsesse skeemi. Mõnedandmebaasiobjektid (näiteks rollid) on aga sellised, mis ei kuulu ühtegiskeemi.14


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarJoonis 4 Tabelite seos teiste SQL objektidega.SQL:1999 standard nimetab Gulutzan ja Pelzer (1999) järgi järgmiseid SQLobjekte, millele tuleb loomisel nimi anda.• Klaster – kataloogide kogum. Klastrist võib mõelda kui andmebaasidekogumist.• Kataloog – skeemide kogum. Kataloogis võib mõelda kui andmebaasist.• Skeem (SQL-skeem) – nime omav skeemi objektide kogum.• Kasutaja identifikaator – andmebaasi kasutajat ja talle antud õigusiidentifitseeriv identifikaator (string).• Roll – andmebaasi kasutajatele antud õiguste kogum.• Tabel e. baastabel – tabel, mis ei ole defineeritud teiste tabelite põhjal.• Vaade e. virtuaalne tabel – tabel, mis on defineeritud teiste tabelite põhjal.• Üldine kitsendus – CHECK kitsendus, mille abil kontrollitakse andmebaasisolevate andmete vastavust mingile reeglile.• Domeen – taaskasutatav veeru omaduste spetsifikatsioon.• Kasutaja-defineeritud tüüp – tüüp, mis on loodud andmebaasiprogrammeerija poolt. Tüüp on nime omav lõplik väärtuste hulk.• Märgistik – ISO2382-04 standard defineerib märgistiku kui "Määratudotstarbeks täielik erinevate märkide lõplik hulk." Määrab märkide hulga,mida võib kasutada andmebaasis sisalduvate andmete esitamiseks.15


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar• Märkide võrdlusreeglistik (ingl. k. collation) – reeglistik (reeglite hulk), mismäärab märkide (ja nendest moodustatud stringide) võrdlemise tulemuse(kas kaks märki on võrdsed või üks on suurem kui teine).• Märkide tõlkereeglistik (ingl. k. translation) – reeglistik, mis seab märgilemärgistikust A vastavusse mingi teise märgi märgistikust B.• SQLi poolt väljakutsutud rutiin (programm) – andmebaasiserveris talletatudprotseduur või funktsioon (alamprogramm kindla ülesande täitmiseks).• Triger – protseduur, mis käivitub mingi andmebaasis toimunud sündmuse(näiteks andmete muutmine) tulemusel.• Moodul (SQL-klient moodul) – SQL lausete kogum, mida käsitletaksetervikuna. Võib koondada näiteks rutiine.Skeemis sisalduvate andmebaasiobjektide nimed peavad olema unikaalsedoma nimeklassi piires. Nimeklassid on järgnevad.• Baastabelid ja vaated• Kitsendused• Märgistikud• Märkide võrdlusreeglistikud• Märkide tõlkereeglistikud• Trigerid• Moodulid• SQLi poolt väljakutsutud rutiinid• RollidSee tähendab, et näiteks ühes skeemis ei saa olla kahte ühenimelistbaastabelit ja/või vaadet. Samas erinevates skeemides võib olla samanimelisitabeleid/vaateid.Andmebaasiobjektid, millest SQL:1999 standardis sõnagi juttu ei ole.• Arvujada generaator (ingl. k. sequence generator).• Indeks (ingl. k. index).• Tabeliruum (ingl. k. tablespace).Arvujada generaatori kui andmebaasiobjekti kirjeldab ametlikult SQLstandardi versioon SQL:2003. Arvujada generaatori poole pöördumiseltagastab süsteem täisarvu. Enamasti kasutatakse seda unikaalsetetäisarvude genereerimiseks ning saadud täisarve kasutataksesurrogaatvõtmete väärtustamiseks.Indeksid ja tabeliruumid on andmebaasi sisemisele (füüsilisele) tasemelekuuluvad objektid. Sellele vaatamata saab neid objekte kasutada vägapaljudes SQL-andmebaasisüsteemides (nende andmebaasisüsteemide SQLdialekt sisaldab lauseid nende objektide haldamiseks).16


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4.2 SQL objektide identifikaatorid SQLisJärgnevalt esitatakse SQL standardi järgi eksisteerivad reeglidandmebaasiobjektide nimetamisele. Nime andmine on teiste sõnadegaobjektile identifikaatori määramine.Eristatakse:• regulaarne identifikaator,• piiritletud identifikaator.4.2.1 Regulaarne identifikaator• Võib sisaldada tähti, numbreid 0..9 ja alakriipsu "_". Tähestiku määrab ärakasutatav märgistik (see ei pea olema tingimata ASCII või Latin1, missisaldavad lääne kultuuriruumis kasutatavaid märke).Latin1 märgistikus sisalduvad tähed:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyzKõik SQL reserveeritud sõnad kasutavad vaid neid tähti. SQL objektidelesüsteemi poolt vaikimisi antud nimed võivad sisaldada nimetatud tähti,numbreid ja alakriipsu.• Võib olla kuni 128 märki pikk. Paljudes andmebaasisüsteemides on lubatudpikkus lühem. Näiteks MS Accessis on identifikaatori maksimaalne pikkus64 märki.• Peab algama tähega, mis ei kuulu mittelubatud märkide hulka.• Ei eristata suuri ja väikesi tähti. YLIOPILANE, Yliopilane ja yliopilane onkõik samaväärsed nimed. Enne, kui ilma jutumärkideta andmebaasiobjektinimi salvestatakse andmebaasi süsteemikataloogis, muudetakse kõik selletähed suurtähtedeks.• Ei tohi sisaldada tühikuid.• Ei tohi olla reserveeritud sõna, nagu näiteks: AND, CREATE, DECIMAL,TABLE jne.4.2.2 Piiritletud identifikaatorErinevalt regulaarsest identifikaatorist on piiritletud identifikaator jutumärkides.• Võib olla kuni 128 märki pikk.• Võib sisaldada tähti, numbreid 0..9, alakriipsu "_" ja tühikuid. Tühik on kamärk ja läheb 128 märgi arvestuses arvesse.• Eristatakse suuri ja väikesi tähti. "Klient" ja "KLIENT" ei ole samaväärsed.• Tohib olla reserveeritud sõna, näit AND, CREATE, DECIMAL, TABLE jne.17


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäiteks ei kõlba sellised nimed.• Kliendi arved – sisaldab tühikut.• Update – SQLi reserveeritud sõna.• 12Kliendi_arved – algab numbrigaSobivad sellised nimed.• "Kliendi arved"• Muudatused• Kliendi_arved_2• "TABLE"• "Update"Soovitused, mis ei tulene SQL standardist.• Tabeli nimedes soovitatakse kasutada ainsuse vormi. Seega "Klient" onparem kui "Kliendid".• Tabeli nimena on mõttekas kasutada antud tabelis olevaid andmeidsisuliselt kirjeldavaid nimesid. Seega "STT_A_F2" ei ole ilmselt hea nimi.• Kasutage nimedes emakeelt (eesti keelt).Andmebaasiobjektide nimetamisel tuleks kasutada ühtset standardit, millestkõik projekteerijad ja programmeerijad kinni peavad!Oletame, et teete päringu:SELECT *FROM IsikWHERE eesnimi="Jaan";SQL standardi kohaselt peab andmebaasisüsteem tõlgendama seda päringutjärgnevalt – leia tabelist Isik sellised read kus veergudele eesnimi ja "Jaan"vastavates väljades on ühesugused väärtused.Igale skeemi objektile võib viidata kujul:kataloogi_nimi.skeemi_nimi.objekti_nimi4.3 Andmetüübid e. tüübidTüüp on nime omav lõplik väärtuste hulk. Igas tabeli veerus on mingit ühtekindlat tüüpi andmed. Veeru tüüp määrab võimalikud väärtused, mis võivadolla selles veerus – need väärtused peavad tulema tüübiga määratudväärtuste hulgast. Näiteid tüüpidest.CHAR – tekstitüüp. Tüüpi kuuluva väärtuse näide: 'Andres'.INTEGER – täisarvutüüp. Tüüpi kuuluva väärtuse näide: 56889.FLOAT – reaalarvutüüp. Tüüpi kuuluva väärtuse näide: 3.1456.DATE – kuupäevatüüp. Tüüpi kuuluva väärtuse näide: '2001-05-03'.BOOLEAN – tõeväärtustüüp Tüüpi kuuluva väärtuse näide: TRUE.18


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarJoonis 5 SQL tüüpide domeenimudel.19


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarAlates SQL:1999 standardi versioonist on lubatud kasutada konstrueeritudtüüpe ja kasutaja-defineeritud tüüpe. Varasemates standardi versioonidessellistest tüüpidest juttu ei olnud. Seda, et SQL ei toetanud varem uutetüüpide loomist, loeti (õigusega) SQLi suureks puuduseks.Igat tüüpi andmetega peab olema võimalik läbi viia vähemalt kaksoperatsiooni (järelikult peavad leiduma ka funktsioonid/operaatorid selliseoperatsiooni läbiviimiseks):• read – loeb andmebaasist väärtuse,• compare – võrdleb sama tüüpi andmeid.Lisaks saab sõltuvalt andmete tüübist andmetega teha täiendavaidoperatsioone.• Aritmeetilised operatsioonid: +;-;*;/• Võrdlusoperatsioonid: =;;• Tõeväärtusoperatsioonid: AND; OR ; NOTNäide:Operandide tüübid Operaator NäideTäisarvud Liitmise operaator (+) 1+2=3StringidStringide ühendamise '1' || '2' = '12'operaator (||)Kuupäevad Liitmise operaator (+) 2003-03-21 + 2003-04-25 =tulemus ei oma mõtetKuupäev ja intervall Liitmise operaator (+) '2003-03-21' + 5 päeva = '2003-03-26'Ühte tüüpi andmetel võib olla mitu erinevat esitusviisi.Näide: BOOLEAN tüüpi andmete võimalikud esitusviisid: 0/1; Yes/No;TRUE/FALSENäide: DATE tüüpi andmete võimalike esitusviiside näide: 27/07/2003;07/27/2003; 2003-07-27, 27. jul 2003, 2003-W30-7Tüüpe saab liigitada mitmel erineval viisil.Liigitus keerukuse järgi.• Lihtsad tüübid. Lihtsate tüüpide puhul ei huvita kasutajat väärtustesisemine struktuur.• Keerukad tüübid. Omavad kasutajale huvipakkuvat sisemist struktuuri.Lihtsus ja keerukus on suhteline. Näiteks tekstistringi saab jagada tähtedeks.Kuupäev koosneb aasta, kuu ja päeva komponendist. Samas loetaksevastavaid tüüpe (kuupäeva ja tekstitüübid) lihtsate tüüpide hulka kuuluvaks.Liigitus looja järgi.• Süsteemi-defineeritud tüüp. Need tüübid on loodudandmebaasisüsteemi arendajate poolt. Sellised tüübid on tavaliselt lihtsadtüübid.• Arendaja poolt loodav tüüp (alates SQL:1999).20


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar• Kasutaja-defineeritud tüüp – arendaja kirjeldab atribuudid ja meetodid(ingl. k. structured type) või loob lihtsa süsteemi-defineeritud tüübipõhjal (ingl. k. distinct type).• Konstrueeritud tüüp – arendaja loob kasutades spetsiaalsettüübikonstruktori operaatorit.Järgnevas tabelis nimetatakse mõningaid SQL standardis kirjeldatud tüüpe.Tegemist on lihtsate süsteemi-defineeritud tüüpidega.TüüpidekategooriatekstitüübidDeklaratsioonidCHARACTER [length] e. CHAR [length]CHARACTER VARYING [length] e.VARCHAR [length]NäidetootajaNr CHAR(4)aadress VARCHAR(30)NCHAR ja NVARCHARbitistringid BIT [VARYING] [length] bitString BIT (4)Väärtuse näide: 1011täisarvud INTEGER (lühend: INT)SMALLINTBIGINT (alates SQL:2003)kümnendmurrudDECIMAL [precision [,scale]] (lühend:DEC, kasutatakse ka NUMERIC) palk DECIMAL (7,2).Väärtuse näide:99 999, 99reaalarvud REAL [precision]kuupäevad jakellaajadintervallidsuured objektidtõeväärtusDOUBLE PRECISIONDATETIME [timePrecision] [WITH TIME ZONE]TIMESTAMP [timePrecision] [WITH TIMEZONE]INTERVAL {{startField TO endField}singleDatetimeField}startField=YEAR| MONTH | DAY | HOUR |MINUTE [(intervalleadingFieldPrecision)]endField= YEAR| MONTH | DAY | HOUR |MINUTE | SECOND[(fractionalSecondsPrecision)]singleDatetimeField= startField | SECOND[(intervalLeadingFieldPrecision [,fractionalSecondsPrecision])]CHARACTER LARGE OBJECT (CLOB)BINARY LARGE OBJECT (BLOB)NATIONAL CHARACTER LARGEOBJECT (NCLOB)BOOLEANINTERVAL YEAR(2) TOMONTHTüüpi kuuluvad väärtused:Vahemik 0 aastat ja 0kuud kuni 99 aastat ja 11kuud.Märkus: large objects ja boolean tüübid kirjeldati SQL:1999 standardis,ülejäänud juba standardi varasemates versioonides.21


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarPidage meeles.• Igal tüübil on üks või rohkem võimalikku esitusviisi, kuidas esitadakasutajatele sellesse tüüpi kuuluvaid väärtuseid.• Igal tüübil on üks või mitu võimaliku viisi, kuidas sellesse tüüpikuuluvaid väärtuseid sisemiselt salvestada.• Igal tüübil on null või rohkem kitsendust, mis piirab sellesse tüüpikuuluvaid väärtuseid.• Igal tüübil on üks või rohkem nime, mida kasutades saab sellele tüübileviidata.4.3.1 Tekstitüübid• CHAR(n) e CHARACTER(n) – tüüpi kuuluvad väärtused on fikseeritudpikkusega stringid (sõned). Uue rea tabelisse lisamisel eraldatakse realeiga seda tüüpi veeru kohta salvestusruum maksimaalse sinna veergumahtuva stringi salvestamiseks. Kui tekst on lühem kui määratud pikkus,siis lisatakse teksti lõppu tühikud. Seda tüüpi on soovitav kasutada, kuiveergu paigutataval stringil on kindel pikkus.- EV isikukood – alati 11 kohta,- soo tähis – alati 1 koht ('M' või 'N'),- õppeaine kood TTÜs – alati 7 kohta.• CHARACTER VARYING(n) e. CHAR VARYING(n) – tüüpi kuuluvadväärtused on muutuva pikkusega sõned e. stringid. Kui sõne on lühem kuimääratud pikkus, siis salvestatakse vaid sisestatud sümbolid. See hoiabkokku salvestusruumi. Samas on sellist tüüpi veergudes andmetemuutmine aeglasem kui CHAR tüüpi veergudes. Uus väärtus võib ollavajalik paigutada mitmesse erinevasse kõvaketta piirkonda, kuna ühtekohta salvestamiseks pole ruumi. Näiteks olgu veerus perenimi väärtusTamm. Veeru tüüp on VARCHAR(30). Kui perenime muudetakse ja uusperenimi on 'Tammepuu', siis on võimalik, et osa perenimest ('epuu') tulebkirjutada teise kõvaketta piirkonda, kui on esimene osa nimest ('Tamm').CHAR tüübi juures seda probleemi ei teki, sest uue rea loomiselreserveeritakse ruum maksimaalse pikkusega perenime jaoks.• NCHAR ja NVARCHAR kasutatakse siis, kui on vaja andmebaasis hoidastringe, mis sisaldavad ka selliseid märke, mis ei sisaldu Euroopa ISOmärgistikus (ISO 8859-1 ehk Windows 1252 ehk Latin 1).4.3.2 Bit• BIT(n) – tüüpi kuuluvad väärtused on fikseeritud pikkusega bitistringid(nullide ja ühtede jada).• BIT VARYING(n) – tüüpi kuuluvad väärtused on muutuva pikkusegabitistringid.22


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNB! MS Accessis on segadus – BOOLEAN tüübi alias on seal BIT. Kuid BITja BOOLEAN pole tegelikult sama tüüp. SQL:2003 standardist on tüübid BITja BIT VARYING eemaldatud.4.3.3 Arvutüübid• DECIMAL(p,s) – tüüpi kuuluvad väärtused on kümnendmurrud. p –numbrikohtade arv. s – skaala e. kohtade arv komast paremal. Näide:Näiteks tüüpi DECIMAL(8,2) oleva arvu näide: 123456.78• SMALLINT – tüüpi kuuluvad väärtused on väikesed täisarvud. Täpsussõltub konkreetsest andmebaasisüsteemist (näiteks vahemikus -32767kuni 32768). Skaala on alati 0.• INTEGER e INT – tüüpi kuuluvad väärtused on suured täisarvud. Täpsussõltub konkreetsest andmebaasisüsteemist. Skaala on alati 0.• REAL e. SMALLFLOAT – tüüpi kuuluvad väärtused on reaalarvud.Täpsus sõltub andmebaasisüsteemist. Näide: 5,2E6, 10E3• FLOAT e. DOUBLE PRECISION – tüüpi kuuluvad väärtused ontopelttäpsusega reaalarvud. Täpsus sõltub andmebaasisüsteemist.Alates SQL:2003 versioonist on nähtud ette, et täisarvu tüüpi veerudefinitsioonile peab saama lisada fraasi "GENERATED ALWAYS ASIDENTITY". See tagab, et sellesse veergu genereeritakse süsteemi pooltunikaalne väärtus. MS Accessis on selle analoogiks tüüp AUTOINCREMENT.4.3.4 Kuupäeva ja kellaaja tüübidKuupäev peab olema korrektne vastavalt Gregoriuse kalendrile. Nõudmisedkuupäevale.• Aprillis, juunis, septembris ja novembris on 30 päeva. Veebruaris on 28päeva, liigaastal 29 päeva. Ülejäänud kuudes on 31 päeva.• Liigaasta on üldjuhul iga 4 aasta järel.• Sajandi viimane aasta ei ole liigaasta, välja arvatud juhul kui aastaarv jagub400-ga. Seega 1700, 1800, 1900, 2100, 2200, 2300 ei ole liigaastad kuid2000 on (sest 2000 jagub täpselt 400-ga).Gregoriuse kalendri alguspunkt 15. oktoober 1582.Ajaandmetega seotud tüübid SQLis.• DATE – kuupäevatüüp. Sisaldab YEAR, MONTH ja DAY komponente.Lubatud kuupäevade vahemik SQLis: '0001-01-01' kuni '9999-12-31'.• TIME [timePrecision] [WITH TIME ZONE] – kellaajatüüp. KasutabHOUR, MINUTE, SECOND välju. timePrecision määrab sekunditenäitamise täpsuse. 0 – sekundi täpsus; 6– mikrosekundi täpsus.• TIMESTAMP [WITH TIME ZONE] – kuupäeva- ja kellaajatüüp.23


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar• INTERVAL – ajaintervalli tüüp.KuupäevInfosüsteemides tuleb arvestada ka kuupäevade ja kellaaegade erinevaesitusviisiga. Segadus võib tekkida näiteks hajusüsteemides, millealamsüsteemid paiknevad erinevates riikides/mandritel/ajavöötmetes.Traditsioonid, kuidas kuupäeva ja kellaaega esitada, on erinevatespiirkondades erinevad.Ameerikas: kuu/päev/aastaSuur-Britannias: päev/kuu/aastaKellajaja esitamisel kasutatakse Ameerikas "12 tunni AM/PM" mõõdustikku,mis võib tekitada segadust. (Nt. 8:00 AM / 8:00 PM). Teistes keeltes pole AM /PM lühendeid.ON VAJA STANDARDIT!Tänapäeval reguleerib esitusviise standard ISO 8601:1988 "Data elementsand interchange formats – Information interchange – Representation of Dateand Time". Selle järgi esitatakse kuupäev kujul YYYY-MM-DD ja kellaaegkujul hh:mm:ss[.nnnnnn] (vt. järgmine alapunkt). See tähendab, etkuupäevas järgneb neljale aastanumbrile kaks kuud tähistavat numbrit(01–12) ja kaks päeva tähistavat numbrit (01–31). Seda nimetakse "Calendardate format" ning sellisel viisil kuupäeva andmete esitamist näeb ette ka SQLstandard. Kuu tähistamiseks ei kasutata tekstilühendit, sest erinevates keeltesvõivad need lühendid olla erinevad.Näide: Kui soovin teha MS Accessis päringu ja esitada selle tulemuseskuupäevad standardses formaadis, tuleb teha päring, mis kasutabsüsteemi-defineeritud Format funktsiooni.SELECT ase_id, nimi, Format(ostmise_kuupaev,"YYYY-MM-DD") ASostmise_kp FROM Ase;KellaaegKellaaega esitatakse ISO 8601 standardi kohaselt (mida järgib ka SQL) kujul:hh:mm:ss[.nnnnnn]hh – keskööst alates täielikult möödunud tundide arv (0–23).mm – täielikult möödunud minutid (0–59).ss – täielikult möödunud sekundid (0–61) (61 liigsekundite tõttu, midakasutatakse aatomikelladel põhineva ajaarvestuse ja maa pöörlemiselpõhineva ajaarvestuse sünkroniseerimiseks).Ajahetke saab esitada ka sekundist täpsemalt: Ajahetke 5.8 ms enne kesköödvõib kirjutada: '23:59:59.9942'.24


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarAjavööndSQL võimaldab kasutada tüüpe TIME WITH TIMEZONE ja TIMESTAMPWITH TIMEZONE.WITH TIME ZONE – Maakera on jaotatud ajavöönditeks. Ajavööndid määrativastavalt raudteeliinidele 27 riigi konverentsil 1884. aastal Washingtonis. Tänapäeval on ajavöötmetehaldamise üle võtnud International Air Transportation Association. Nad annavad kaks korda aastas väljaajavöötmete tabelit, näidates seal ka suveajale/talveajale ülemineku kuupäevad.'2007-03-20 14:00' New Yorgis ja '2007-03-20 14:00' Tallinnas ei ole samalajahetkel.Ajavööndit on eriti oluline teada olukorras, kus isikud ja organisatsioonidtegutsevad rahvusvaheliselt, paljudes riikides ja mandritel. Kuupäeva jakellaaja juures saab esitada kellaaja erinevuse koordineeritud universaalajast.Universaalaja vana standard on GMT – Greenwich Mean Time. Universaalajauuem standard on UTC – Universal Coordinated Time, mis võeti kasutusele1970. aastal.Kui registreeritakse andmed ajahetke kohta koos ajavööndiga, siisregistreeritakse tegelikult ajahetk koordineeritud universaalaja järgi. Ajahetketähistavas literaalis peab lisaks kohalikule ajale olema ka erinevusuniversaalajast. Erinevuse universaalsest ajast võib esitada kui {+ | -} hh:mm,kus hh – tähistab erinevust tundides ja mm tähistab erinevust minutites. +/-on kasutusel, et näidata, kas lokaalne aeg on universaalsest ees või taga.Järgnevad literaalid esitavad sama ajahetke, mis on fikseeritud erinevatesmaakera punktides. London: '2007-03-20 12:00' Tallinn: '2007-03-20 14:00+2:00' (universaalaeg 14:00-2:00) Washington DC: '2007-03-20 07:00-5:00'(universaalaeg 07:00-(-5:00)=>07:00+5:00)Nagu teate on iga tüübi puhul määratud üks või mitu võimalikku esitusviisi, kuidas esitadakasutajatele sellesse tüüpi kuuluvaid väärtuseid. Kuupäevatüüpi väärtust võib esitada kateisel viisil kui kuu, päeva ja aasta tähis. Kasutajale pakutavad kuupäeva formaatimisevõimalused sõltuvad andmebaasisüsteemist. Näiteks andmebaasisüsteemis MS Access saabselleks kasutada funktsiooni Format ja andmebaasisüsteemis Oracle funktsiooni to_char.Näited. aasta + päeva järjenumber aastas (001–366)Näiteks: 3. jaanuar 2003 oleks sellisel juhul 2003-003aasta + nädala järjenumber aastast + päeva järjenumber nädalasNädal <strong>nr</strong>. 1 on defineeritud, kui aasta esimest neljapäeva sisaldav nädal. Aasta esimenenädal võib sisaldada ka eelmise aasta päevi (nt. 2003 aasta esimene nädal sisaldas ka päevi30.detsember 2002 ja 31. detsember 2002). 2003 aasta esimest nädalat võib tähistadanäiteks: 2003-W01Kuupäeva 7. jaanuar 2003 (mis on 2003 aasta teise nädala teisipäev), võib esitada kujul:2003-W02-2 või 2003W02225


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNädalate vahemik võib olla sõltuvalt aastast 01–52 või 01–53.• INTERVAL – iga sellesse tüüpi kuuluv väärtus esitab ajaperioodi, millegikestvuse, mitte fikseeritud ajahetke. Näide:- aasta–kuu intervall. Näiteks perioodi pikkus on 3 aastat ja 2 kuud,- päev–kellaaeg intervall. Näiteks perioodi pikkus on 2 päeva 3 tundi ja 15minutit.Selleks, et hoida andmebaasis andmeid mingi ajaperioodi alguse kohta, võibkasutada:- kahte kuupäeva ja/või kellaja tüüpi veergu, millest ühes on perioodi alguseaeg ja teises perioodi lõpu aeg.alguslõpp28.august 2002 3.september 2002- ühte kuupäeva ja/või kellaja tüüpi veergu ning ühte intervalli tüüpi veergu.algus28.august 2002kestvus8 päevaPaljudes andmebaasisüsteemides pole eraldi intervalli tüüpi. Seal võibintervalli esitamiseks kasutada arvutüüpi veerge.Järgnevalt esitatakse Celcko (1999) põhjal lubatud operatsioonid timestampja interval tüüpidega.- = + = - = * = / = + = + = - = + = 4.3.5 Standardivälised tüübid• MONEY, CURRENCY – raha tüüp. Selle asemel tuleks kasutadaDECIMAL tüüpi koos kitsendustega (näiteks, et rahasumma ei tohi ollanegatiivne).• SERIAL ja AUTOINCREMENT – tuleks kasutada arvujada generaatoreid.• HYPERLINK.26


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4.3.6 Kasutaja-defineeritud tüübidNäide: TTÜ üliõpilaskood koosneb järgnevatest osadest.XXXXXX XXXXmatriklinumberõppesuunakoodJoonis 6 Üliõpilaskoodi komponendid.Kui andmebaasis luua veerg selle väärtuse hoidmiseks, siis esialgne valikvõiks olla tüüp CHAR(10). Samas ei ole mitte iga 10 märgi pikkune stringsobilik üliõpilaskood.LDa212S21 – ebaõige üliõpilaskoodi näide,990321LASM – õige üliõpilaskoodi näide.Seda tüüpi andmetel ei oma mõtet ka kõik tekstitüübiga seotud operatsioonid.Näiteks võrdlemisoperatsioonid on vajalikud, sest võib olla vaja võrreldaerinevaid üliõpilaskoode. Samas stringide liitmise operatsioon ei oma antudjuhul mõtet, sest kasutajatel pole ilmselt vaja sellist operatsiooniüliõpilaskoodidega läbi viia.Tüüp "sõrmejälg" võiks põhineda tüübil "large object" või "binary". Kindlastituleb defineerida operatsioon sõrmejälgede võrdlemiseks.Seega andmebaasisüsteem peaks võimaldama defineerida uusi tüüpe. Needvõivad baseeruda olemasolevatel või olla täiesti nullist loodud.Tüübiga peab saama siduda kitsendusi. Need kitsendused piiravad tüüpikuuluvate väärtuste hulka. Kõik need väärtused peavad rahuldama nimetatudkitsendusi. Näiteks üliõpilaskoodi esimesed kuus märki peavad olema alatinumbrimärgid. Kui üritan mistahes olukorras, kus on vaja kasutada tüüpi Tkuuluvat väärtust (näiteks tabelisse andmete lisamisel, protseduuriväljakutsumisel), kasutada väärtust, mis ei vasta T reeglitele (järelikult eikuulu tüüpi T), siis andmebaasisüsteem katkestab korralduse täitmise jaesitab veateate.4.4 Andmebaasi loomineSQL standardi põhjal eksisteerivad andmebaasiobjektid keskkonnas, miskoosneb ühest või mitmest kataloogist, millest igaüks sisaldab hulka skeeme.Skeem on nime omav üksteisega seotud andmebaasiobjektide kogum, millelon ühine omanik ja mitmeid ühiseid omadusi. Kataloogi loomine ja hävitaminesõltub rakendusest, kuid SQL standard, määrab laused skeemi loomiseks jakustutamiseks.27


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarCREATE SCHEMA [Name | AUTHORIZATION ]; – Skeemi omaniku identifikaator.Näide: Luuakse skeem nimega Opingud ja paigutatakse sellesse tabelTudeng. Tabeli Tudeng pikk nimi oleks Opingud.Tudeng.CREATE SCHEMA OpingudCREATE TABLE Tudeng (tkood CHAR(6),pnimi VARCHAR(30) NOT NULL,enimi VARCHAR(20) NOT NULL,synnip DATE,sugu SMALLINT NOT NULL,kursus INTEGER NOT NULL DEFAULT 1,suund CHAR(4) NOT NULL,CONSTRAINT pk_Tudeng PRIMARY KEY (tkood),CONSTRAINT chk_Tudeng_sugu CHECK (sugu IN (0, 1, 2, 9)));Skeemi kustutamine:DROP SCHEMA Name [RESTRICT | CASCADE]Vaikimisi RESTRICT. Sellisel juhul ei kustutata skeemi, milles on objekte. Kuikasutada CASCADE määrangut, siis kustutatakse ka kõik selles skeemissisalduvad objektid. Kui mõne sellise objekti kustutamine ebaõnnestub, siisebaõnnestub kogu DROP SCHEMA lause täitmine.Iga skeemi objekt (nt. tabel, vaade) paigutatakse mingisse skeemi.Andmebaasi poole pöördudes võib alati selle objekti nime ees esitada skeeminime kujul (skeemi_nimi.objekti_nimi). Näide:SELECT * FROM Opingud.Tudeng;DROP SCHEMA Opingud CASCADE;Kui skeemi objekti (nt. tabeli) loomise lauses pole objekti nimes märgitudskeemi nime, kuhu see paigutada, siis paigutatakse see lauset käivitavakasutaja skeemi.Üks andmebaasi skeemidest peab olema INFORMATION_SCHEMA.INFORMATION_SCHEMA sisaldab vaateid, mis esitavad süsteemikataloogisolevaid andmeid. Süsteemikataloog on piltlikult öeldes andmebaasandmebaasi kohta. Süsteemikataloogi (baas)tabelites on andmedandmebaasiobjektide kohta. Erinevate andmebaasisüsteemide abilloodavates andmebaasides on süsteemikataloogi struktuur erinev. SQLstandard nõuab, et süsteemikataloogi tabelite põhjal peab olema loodudkogum standardse struktuuriga vaateid – need vaated onINFORMATION_SCHEMA skeemis.28


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4.5 TabelidAntud loengus loome SQL laused, mis teevad valmis punktis 1 kirjeldatudtabelid.4.5.1 Tabeli loomineTabeli loomise süntaks ja CREATE TABLE lause. Kõige lihtsamal juhul tulebCREATE TABLE lauses määrata tabeli nimi ja seejärel sulgudes komadegaeraldatuna veeru nime ja selle tüübi paarid.Tabelis on veerud järjestatud vasakult paremale. Veergude järjestuse määrabveeru definitsioonide järjestus tabeli loomise lausetes.Tabel võib olla.• Baastabel e. tabel – tabel, mis ei ole defineeritud teiste tabelite põhjal.• Tuletatud tabel – tabel, mis on defineeritud teiste tabelite põhjal.Baastabel võib olla.• Alaline tabel.• Ajutine tabel.• Globaalne ajutine tabel, loodud lokaalne ajutine tabel. Tabel on pidevaltolemas. SQL-seansi käigus lisatakse sinna andmed. Neid andmeidnäeb ainult sellest SQL-seansist, mille käigus andmed tabelisse lisati.Transaktsiooni või SQL-seansi lõpus (see on määratud tabelidefinitsioonis) need andmed kustutatakse. Globaalses ajutises tabelisolevad andmed on erinevad iga SQL-seansi jaoks. Loodud lokaalsesajutises tabelis olevad andmed on erinevad iga mingis SQL-seansiskasutatava mooduli jaoks.• Deklareeritud lokaalne ajutine tabel. Tabeli deklareerimise lause onmoodulis. Sellele tabelile pääsevad ligi vaid protseduurid, missisalduvad selles moodulis. Tabel luuakse SQL-seansi käigus jakustutatakse SQL-seansi lõpus. Sellist tabelit näeb ainult sellestSQL-seansist, mille käigus see tabel loodi.Nii üksikute veergudega kui ka veergude grupiga võib seostada kitsendusi(ingl. k. integrity constraints). Kitsendus on reegel, mida kõik tabelis olevadandmed peavad täitma. Andmebaasisüsteem jälgib, et andmebaasissisalduvad andmed vastaksid nendele kitsendustele ja lükkab tagasi kõikmuudatused, mille tulemusel läheksid andmebaasis olevad andmed nendekitsendustega vastuollu.Kitsenduste deklareerimine on hädavajalik, sest see aitab parandadaandmebaasis olevate andmete kvaliteeti ning selle kaudu ka otsuste kvaliteeti,mida langetatakse andmebaasis olevate andmete põhjal.Järgnevalt esitatakse näiteid kitsendustest.29


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar1. Andmete kohustuslikkus / mittekohustuslikkus. [NOT] NULL – näitab,kas reas peab veerule vastavas väljas olema väärtus (NOT NULL) võimitte (NULL).2. Lubatud väärtuste hulk. Saab kirjeldada võimalikud väärtused, misvõivad olla veerule vastavates ridade väljades.3. Olemi terviklikkus. PRIMARY KEY – antud veerg või veergudekombinatsioon moodustab primaarvõtme – tabeli T primaarvõtme väärtuspeab olema igas T reas unikaalne ja ei saa olla määramata. Liitvõtmestprimaarvõtmes ei ole lubatud, et mõnes selle veerus väärtus puuduks.UNIQUE – täiendav unikaalsuse kitsendus, mida kasutataksealternatiivvõtmete jõustamiseks.4. Viidete terviklikkus. FOREIGN KEY – antud veerg või veergudekombinatsioon kuulub välisvõtmesse. REFERENCES klausliskirjeldatakse, millise tabeliga seos luuakse.5. Täiendavad ärireeglid. CHECK kitsendus.Eristatakse.• Veerutaseme kitsendused. Veerutaseme kitsenduse abil saab kirjeldadaüht veergu hõlmavat kitsendust.• Tabelitaseme kitsendused. Tabelitaseme kitsenduse abil saab kirjeldadaühte või mitut veergu hõlmavaid kitsendusi.Soovitan kasutada tabelitaseme kitsendusi, sest see muudab SQL lauseloetavamaks ja võimaldab kitsendusi hiljem ära kustutada (nt. asendamiseeesmärgil).30


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarVeerutaseme kitsenduse lihtsustatud süntaks:[CONSTRAINT kitsenduse_nimi]{ [NOT] NULL |{UNIQUE | PRIMARY KEY}I REFERENCES Tabeli_nimi [(veerg)]| CHECK (tingimus)}Tabelitaseme kitsenduse lihtsustatud süntaks:[CONSTRAINT kitsenduse_nimi]{ [NOT] NULL |{UNIQUE | PRIMARY KEY} (veerg [,veerg] …)| FOREIGN KEY (veerg [, veerg] … )REFERENCES Tabeli_nimi [(veerg) [,veerg] … ]| CHECK (tingimus)}Kitsenduse_nimi on kitsenduse identifikaator. Kitsenduse identifikaator võiblauses puududa siis, kui tegemist on veerutaseme kitsendusega. Selliseljuhul annab andmebaasisüsteem kitsendusele ise nime. See nimi on tavaliseltpikk ja sisaldab numbreid ning muudab tülikamaks kitsenduste kustutamise jaandmebaasi süsteemikataloogist kitsenduse kohta andmete otsimise. Seegaoleks parem kitsendusele ise nimi anda.Vaikimisi kontrollitakse andmete vastavust kitsendusele kohe peale SQLlause täitmist. Kui andmed lähevad kitsendustega vastuollu, siis tühistataksekogu lauset sisaldava transaktsiooni (SQL lausete kogumi) käigus tehtudmuudatused.Kitsenduse loomisel saab määrata, kas kasutajal on transaktsioonide korralõigus määrata, millal kitsenduste täidetust kontrollitakse.• NOT DEFERRABLE – kasutajal ei ole õigust lükata kitsenduse kontrollitransaktsiooni lõppu (vaikimisi).• DEFERRABEL – kasutajal on õigus lükata kitsenduse kontrolltransaktsiooni lõppu.Kitsenduse loomisel saab määrata, millal andmebaasisüsteem kontrollibandmete vastavust sellele kitsendusele:• INITIALLY IMMEDIATE – kitsenduse täidetuse kontroll toimub kohe pealeandmete muutmise lause täitmist (vaikimisi).• INITIALLY DEFERRED – kitsenduse k täidetuse kontroll toimub allestransaktsiooni lõppedes. See tähendab, et mingil hetkel transaktsiooni Ttäitmise käigus võivad selle transaktsiooni käigus muudetud andmed ollavastuolus kitsendusega k. Kuid kui transaktsiooni lõpuks on see vastuolukõrvaldatud, siis on kõik korras ja andmemuudatused salvestataksepüsivalt andmebaasis.Kui siduda kitsendus juba olemasoleva tabeliga, siis andmebaasisüsteemkontrollib andmebaasis olevate andmete vastavust sellele kitsendusele. Kuileidub andmeid, mis kitsendusele ei vasta, siis andmebaasisüsteemkitsendust ei loo ja tagastab veateatel.31


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäide:CREATE TABLE Tudeng (tkood CHAR(6),pnimi VARCHAR(30) NOT NULL,enimi VARCHAR(20) NOT NULL,synnip DATE,sugu SMALLINT NOT NULL,kursus INTEGER NOT NULL DEFAULT 1,suund CHAR(4) NOT NULL,CONSTRAINT pk_Tudeng PRIMARY KEY (tkood),CONSTRAINT chk_Tudeng_sugu CHECK (sugu IN (0, 1, 2, 9)));DEFAULT – veeruga seotud vaikimisi väärtus. Kui tabelisse lisatakse uus ridaja veerule vastavasse välja väärtust ei lisata, siis kasutabandmebaasisüsteem vaikimisi väärtus. Vaikimisi väärtuse tüüp peaks olemasama tüüpi kui veerg.Vale:kursus INTEGER NOT NULL DEFAULT '1',Õige:kursus INTEGER NOT NULL DEFAULT 1,CREATE TABLE Aine (akood CHAR(7),nimi VARCHAR(70) NOT NULL,CONSTRAINT pk_Aine PRIMARY KEY (akood),CONSTRAINT ak_Aine_nimi UNIQUE(nimi));CREATE TABLE Oppim (regkuup DATE DEFAULT CURRENT_DATE,aktuaalne BIT NOT NULL,tkood CHAR(6),akood CHAR(7),CONSTRAINT pk_Oppim PRIMARY KEY (tkood,akood, regkuup),CONSTRAINT fk_Tudeng_tkood FOREIGN KEY (tkood)REFERENCES Tudeng (tkood) ON UPDATE CASCADE ON DELETENO ACTION,CONSTRAINT fk_Aine_akood FOREIGN KEY (akood)REFERENCES Aine (akood) ON UPDATE CASCADE ON DELETENO ACTION);Viimases CREATE TABLE lauses kasutati välisvõtmete defineerimisekstabelitaseme kitsendusi, st. kitsenduse definitsioon kirjutati peale veergudedefinitsioone, komaga eraldatud alamosana.Ainult ühele veerule rakenduvad kitsendused võib kirjeldada ka veerutasemekitsendusena.32


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäide:CREATE TABLE Oppim (tkood CHAR(6) CONSTRAINT fk_Tudeng_tkoodREFERENCES Tudeng (tkood) ON UPDATE CASCADE ON DELETENO ACTION,akood CHAR(7) CONSTRAINT fk_Aine_akoodREFERENCES Aine (akood) ON UPDATE CASCADE ON DELETENO ACTION,regkuup DATE DEFAULT CURRENT_DATE,aktuaalne BIT,CONSTRAINT pk_Oppim PRIMARY KEY (tkood,akood, regkuup));Primaarvõtme kitsendus tuli antud juhul panna igal juhul kirja tabelitasemekitsendusena, sest see hõlmas rohkem kui ühte veergu.Kui tabelite loomise laused sisaldavad välisvõtme kitsendustespetsifikatsioone, siis tuleb need laused luua kindlas järjekorras. Kõigepealttuleb luua tabelid kus on ainult primaarvõtmed, kuid pole välisvõtmeid. Tabeli,milles on välisvõtmeid, saab luua alles siis kui on loodud sellega välisvõtmetekaudu seotud tabelid.Järgnevalt kirjeldatakse SQLi tabelite omadusi. Siin on mõeldud tabeleidkõige laiemalt – nii baastabeleid, vaateid kui ka päringu tulemuseks olevaidtabeleid.• SQLi tabelite omadusi – read• SQLis võivad tabelis olla korduvad read.• SQL ei nõua, et baastabelis peab olema alati deklareeritudprimaarvõti.• SQL ei nõua, et baastabelis peab olema alati deklareeritudunikaalsuse kitsendus.• SQL ei eemalda enamasti päringu tulemuseks olevast tabelistautomaatselt korduvaid ridu.• SQLi tabelite omadusi – veerud• SQLi tabelis on veerud vasakult paremale järjestatud.• Vaikimisi on baastabeli veerud mittekohustuslikud (NULL).• Nimega tabelis (baastabel, vaade) ei tohi olla mitu sama nimegaveergu.• Päringu tulemuseks olevas tabelis (nimeta tabelis) võib olla rohkem kuiüks sama nimega veerg.• SELECT perenimi, perenimi FROM Magaja;• Halb stiil!!4.5.2 Kitsendused• Andmebaas on kogum tõeseid väiteid (fakte).• Andmebaasisüsteem ei saa kontrollida, et kõik andmebaasis hoitavadfaktid on tõesed.• Parim, mida andmebaasisüsteem saab teha, on kontrollida, etandmebaasis olevad andmed vastavad kitsendustele (reeglitele,piirangutele).33


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar• Kui andmebaasis sisalduvad ainult tõesed faktid, siis kõik need faktidvastavad ka andmebaasis defineeritud kitsendustele. See, et andmedvastavad kitsendustele, ei tähenda veel, et nad on tõesed.4.5.2.1 Kitsenduste nimetamineTabeli loomisel tuleks kitsendustele anda nimi. Kui kitsendusele nime mitteanda, siis antakse see nimi andmebaasisüsteemi poolt. Selline nimi ontavaliselt pikk ja raskesti meeldejääv. ALTER TABLE lause abil on võimaliktabelist kitsendus ära kustutada, kuid selleks peab teadma kitsenduse nime.SQL-andmebaasi loomisel tuleks kasutusele võtta ühtne kitsendustenimetamise standard. Näiteks primaarvõtme kitsenduse nimi võib olla kujul:TabeliNimi_VeeruNimi_pkTeine kaalutlus kitsenduste nimetamise juures on, et kitsenduste vastueksimisel väljastav veateade sisaldab kitsenduse nime. Seega võiks see nimiolla selline, mille korral vea tekitaja saab aru, millise vea ta tegi. Samutiparandavad sisukad nimed andmekirjelduskeele lauseteloetavust/arusaadavust.4.5.2.2 Kohustuslikkus / mittekohustuslikkusKui kõigis tabeli ridades peab veerule v vastavas väljas olema väärtus, siispeab selle veeru kirjeldamisel panema kirja NOT NULL kitsenduse. Öeldakse,et veerg v on kohustuslik veerg.Näide:pnimi VARCHAR(30) NOT NULLSQLis on tabeli veerg vaikimisi mittekohustuslik, st. sellele vastavates ridadeväljades ei pea alati väärtust olema (seal võib olla NULL). Kuna NULLidtekitavad andmebaasi kasutamisel hulgaliselt probleeme, siis tuleksandmebaas kavandada selliselt, et võimalikult paljud veerud saaksdeklareerida kohustuslikuks.4.5.2.3 Lubatud väärtusedTabeli veeru tüüp määrab ära võimalikud väärtused, mis sellele veerulevastavates ridade väljades võivad paikneda. Lisaks lubab SQL luua täiendavaCHECK kitsenduse, mis piirab veelgi võimalikke väärtusi veerus. Näiteksveerus sugu võivad olla vaid väärtused 0, 1, 2, 9.CREATE TABLE Isik (....CONSTRAINT chk_Tudeng_sugu CHECK (sugu IN (0, 1, 2, 9));Eksisteerib rahvusvaheline standard ISO 5218 - Information technology --Codes for the representation of human sexes.34


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar0 – teadmata1 – mees2 – naine9 – pole võimalik määrataOlgu T tingimus. Siis kitsendus CHECK(T) on vaadeldava rea korralrahuldatud, kui T hindamise tulemus selle rea korral on TRUE võiUNKNOWN.See tähendab, et kui veerg sugu tabelis Isik on mittekohustuslik, siisandmebaasisüsteem lubab isegi kitsenduse chk_Tudeng_sugu olemasolukorral registreerida isiku, kelle sugu puudub (veerule sugu vastavas väljas onNULL).4.5.2.4 Olemi terviklikkusOlemi terviklikkuse (ingl. k. entity integrity) reegel ütleb, et mitte üheskiprimaarvõtmes sisalduv veerus ei tohi mõnes reas olla väärtus määramata.Tabeli loomisel tuleb deklareerida primaarvõti kasutades PRIMARY KEYkitsendust.Näide:CONSTRAINT pk_Tudeng PRIMARY KEY (tkood)Tabelil võib olla null või üks primaarvõti. Primaarvõti võib hõlmata mitutveergu.Näide:CONSTRAINT pk_Oppim PRIMARY KEY (tkood,akood, regkuup)Eelnev kitsenduse definitsioon deklareeris kolme veergu hõlmavaprimaarvõtme (liitvõtme). Kui määrata, et veerg osaleb primaarvõtmes, siissellest tuleneb automaatselt, et see veerg on kohustuslik. Primaarvõtmeväärtus peab olema igas tabeli reas unikaalne.Primaarvõtmeks mitte valitud kandidaatvõtmeid hakatakse nimetamaalternatiivvõtmeteks. Sellise võtme poolt hõlmatud veerud peavad olemakohustuslikud ja neile tuleb deklareerida unikaalsuse kitsendus.Näide:CONSTRAINT ak_Aine_nimi UNIQUE(nimi)4.5.2.5 Viidete terviklikkusSõltuv tabel ("B") – vaadeldava seose kontekstis välisvõtit sisaldav tabel.Primaarne tabel ("A") – vaadeldava seose kontekstis tabel, milles olevalekandidaatvõtmele viidatakse välisvõtme kitsenduse loomisel.35


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarViidete terviklikkuse reegel ütleb, et sõltuva tabeli välisvõtme väärtus peabkas ühtima täielikult primaarse tabeli kandidaatvõtme väärtusega, või olemamääramata (NULL). Enamasti on kandidaatvõtmeks, mille abil seos luuakse,primaarvõti.Näide:CONSTRAINT fk_Aine_akood FOREIGN KEY (akood)REFERENCES Aine (akood) ON UPDATE CASCADE ON DELETENO ACTIONIga välisvõtme loomisel saab määrata, kas ja mida peaksandmebaasisüsteem ette võtma, kui andmed lähevad vastuollu viideteterviklikkuse reegliga. Selliseid tegevusi nimetatakse kompenseerivatekstegevusteks.KäitumisjuhiseNO ACTIONRESTRICTKirjeldusVaikimisi. Süsteem ei teosta eelkontrolli. Kui muudatusetulemusel tekib viidete terviklikkuse reegli rikkumine, siissüsteem ei võta ette kompenseerivat tegevust. Vea tõttutühistatakse kogu muudatus. Tulemus.- Tabelis "A" ei saa kandidaatvõtme väärtust muuta, kuivastaval real on välisvõtmete kaudu seotud ridutabelis "B".- Tabelis "A" ei saa rida kustutada, kui sellel real onvälisvõtmete kaudu seotud ridu tabelis "B".Süsteem kontrollib enne muudatuse tegemist, kasmuudatus võiks tekitada vastuolu viidete terviklikkusereegliga. Kui jah, siis muudatust ei lubata.Lõpptulemus seega sama, kui NO ACTION korral.CASCADE - Kandidaatvõtme väärtuse muutmisel tabelis "A"muudetakse vastavad välisvõtmete väärtused kaseotud tabelis "B".- Tabelis "A" rea kustutamisel kustutatakse kõikvälisvõtmete kaudu seotud read tabelist "B".SET NULL - Kandidaatvõtme väärtuse muutmisel tabeli "A" reaskustutatakse seotud ridade vastavad välisvõtmeteväärtused tabelis "B".- Rea kustutamisel tabelist "A" kustutatakse seotudridade vastavad välisvõtmete väärtused seotud tabelis"B".Märkus: Ei saa kasutada, kui välisvõtmeveerg/veerud on kohustuslikud (NOT NULL).SET DEFAULT - Kandidaatvõtme väärtuse muutmisel tabeli "A" reasasendatakse seotud ridade vastavad välisvõtmeteväärtused tabelis "B" välisvõtme veeru DEFAULTklauslis määratud vaikimisi väärtusega.- Rea kustutamisel tabelist "A" asendatakse seotudridade vastavad välisvõtmete väärtused tabelis "B"välisvõtme veeru DEFAULT klauslis määratudvaikimisi väärtusega.36


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarKäitumisjuhiseKirjeldusMärkus: Ei saa kasutada, kui välisvõtme kõigilveergudel pole defineeritud vaikimisi väärtust.Vaikimisi väärtuse kasutamise järel peavad andmedrahuldama viidete terviklikkuse reeglit.Kui REFERENCES klauslis on määratud MATCH FULL, siis peavad välisvõtitomavas tabelis igas reas välisvõtme väärtused puuduma, või omamaväärtusi, mis rahuldavad viidete terviklikkuse reeglit.Kui REFERENCES klauslis on määratud MATCH PARTIAL või MATCHSIMPLE (nende määrangute erinevused ei ole antud kursuse teema) javälisvõti on liitvõti, siis on lubatud ka sellised read, kus mõnes välisvõtmelevastavas väljas väärtust ei ole.a b c d e fprimaarvõtivälisvõti1 2 8 2 4 7882 4 3432 1 889MATCH SIMPLE määrang on vaikimisi, kuid SQL-andmebaasidisainimisel/realiseerimisel oleks mõistlik kasutada MATCH FULL, kuivälisvõti on liitvõti.37


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4.5.2.6 Tabeliga seotud CHECK kitsendusÄrireeglite defineerimiseks saab CREATE TABLE ja ALTER TABLE lauseteskasutada CHECK kitsendust.CREATE TABLE Leping(reg_kuup DATE NOT NULL,kinnit_kuup DATE,...CONSTRAINT chk_lepingu_kuup CHECK (reg_kuup ((SELECT Count(*) AS tud_arv FROMTudeng)/100));38


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäide: Tabelis Aine hakatakse registreerima ka ainepunkte. Õppeainetekeskmine ainepunktide arv peab olema suurem kui 1.5.CREATE ASSERTION Keskm_ainepunktide_arvCHECK ((SELECT Avg(ainepunkte) AS keskm FROM Aine) >1.5)DEFERRABLE;Näide: Kehtib reegel, et kui õppeaine ainekood algab "I" tähega, siis peabselle õppeaine ainepunktide arv olema suurem või võrdne kui 1.5.Teisisõnu – ei tohi eksisteerida õppeaineid, kus ainekood algab I tähega jaainepunktide arv ei ole suurem või võrdne kui 1.5.CREATE ASSERTION I_ained CHECK( NOT EXISTS ( SELECT * FROM Aine WHERE ainekood LIKE 'I%' ANDainepunkte=1.5Kehtib samaväärsus:IF p THEN q on samaväärne kui (NOT (p) OR q)p ja q on tõeväärtusavaldised – avaldised, mille arvutamise tulemus ontõeväärtus.Sellest tulenevalt on võimalik alternatiivne lahendus, mis põhineb tabeligaseotud CHECK kitsenduse kasutamisel.ALTER TABLE Aine ADD CONSTRAINT chk_aine CHECK(NOT (ainekood LIKE 'I%') OR (ainepunkte>=1.5));NB! SQL kasutab kahte erinevat terminit – "constraint" (otsetõlge kitsendus)ja "assertion". Kuid tegelikult tähistavad mõlemad kitsendusi. Õigem oleksöelda, et tegemist on kahe erineva võimalusega kitsenduste kirja panemiseks.Kahjuks ei ole õppeõud 2012. aasta alguses teadlik ühestkiSQL-andmebaasisüsteemist, mis lubab ASSERTION objekte luua. Sellest onkahju, sest see muudab andmebaasis kitsenduste loomise paljukeerulisemaks kui see võiks olla.39


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4.5.3 Tabeli struktuuri/käitumise muutmineVeeru lisamine.ALTER TABLE Tabeli_nimiADD[COLUMN] veeru_nimi tüüp [NOT NULL] [UNIQUE] [DEFAULTvaikimisi_tingimus] [CHECK (otsingutingimus)]Veeru kustutamine.ALTER TABLE Tabeli_nimiDROP [COLUMN] veeru_nimi [RESTRICT | CASCADE]Tabelitaseme kitsenduse lisamine tabelisse.ALTER TABLE Tabeli_nimiADD [CONSTRAINT kitsenduse_nimi] tabeli_kitsenduse_definitsioonkitsenduse kustutamine tabelist.ALTER TABLE Tabeli_nimiDROP CONSTRAINT kitsenduse_nimi [RESTRICT | CASCADE]Veeruga vaikimisi väärtuse sidumine.ALTER TABLE Tabeli_nimiALTER [COLUMN] veeru_nimi SET DEFAULT vaikimisi_tingimusVeeruga seotud vaikimisi väärtuse kustutamine.ALTER TABLE Tabeli_nimiALTER [COLUMN] veeru_nimi DROP DEFAULTNäide:ALTER TABLE Tudeng ADD COLUMN reg_aeg TIMESTAMP NOT NULL;Näide:ALTER TABLE Tudeng ADD COLUMN isikukood CHAR(11) NOT NULL;Näide: Andmebaasisüsteem loob kitsenduse vaid juhul, kui andmebaasisolevad andmed on selle kitsendusega kooskõlas – kui on registreeritud mitusama isikukoodiga tudengit, siis selle kitsenduse loomine ebaõnnestub.ALTER TABLE Tudeng ADD CONSTRAINT ak_Tudeng_isikukood UNIQUE(isikukood);Näide:ALTER TABLE TudengALTER COLUMN reg_aeg SET DEFAULT CURRENT_TIMESTAMP;Näide:ALTER TABLE TudengALTER COLUMN kursus DROP DEFAULT;40


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäide:ALTER TABLE Tudeng DROP CONSTRAINT ak_Tudeng_isikukood;Näide:ALTER TABLE Tudeng DROP isikukood;4.5.4 Tabeli kustutamineDROP TABLE TabeliNimi [RESTRICT | CASCADE]DROP TABLE lause kustutab tabeli kui andmestruktuuri. Kui soovitaksekustutada tabelis olevad andmed, kuid tabel ise säilitada, tuleb kasutadaDELETE lauset (kui soovite kustutada terved read) või UPDATE lauset (kuisoovite kustutada andmeid üksikutest ridade väljadest).Kui määratakse CASCADE, siis kustutatakse ka kõik sellest tabelist sõltuvadandmebaasiobjektid, st. Objektid, mis viitavad sellele tabelile (ja omakordaneile objektidele viitavad objektid). Väärkasutusest tingitud vea kahju võib ollaväga suur.Kui määratakse RESTRICT ja andmebaasis leidub mõni sellele tabelile viitavobjekt, siis tabeli kustutamist ei toimu. Vaikimisi määranguks on RESTRICT.Sageli kasutatakse DROP TABLE lauset, kui uue tabeli loomise järelavastatakse tabeli struktuuris mõni viga, mida soovitakse parandada. Siis võibtabeli kustutada ja otsast alata.Näide: Kustutame tabeli Aine.DROP TABLE Aine CASCADE;4.5.5 DomeenidRelatsioonilise mudeli kohta käiv "Kolmas Manifest" kasutab termineid"domeen" ja "tüüp" sünonüümidena.SQLis ei ole domeen sama mis tüüp!SQL standard kirjeldab CREATE DOMAIN lauset.CREATE DOMAIN DomeeniNimi [AS] tüüp[DEFAULT väärtus][CHECK (tingimus)]SQLis ei ole "domeen" ja "tüüp" sünonüümid! Sisuliselt on domeen SQLiskorduvkasutatav veeru omaduste spetsifikatsioon. Domeeni loomisel tulebmäärata baastüüp. Piirang: domeenis määratav tüüp saab ollasüsteemi-defineeritud tüüp, aga mitte kasutaja-defineeritud tüüp. Lisaks saabdomeeni kirjelduses määrata vaikimisi väärtuse ja seotud kitsendused.41


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarAndmebaasi programmeerija saab defineerida domeeni üks kord ja kasutadaseda paljude erinevate tabelite veergude defineerimisel.CREATE DOMAIN Kursuse_domeen AS SMALLINTDEFAULT 1 CONSTRAINT chk_kursus CHECK (VALUE BETWEEN0 AND 5)CREATE TABLE Tudeng(tkood CHAR(10) PRIMARY KEY,...kursus Kursuse_domeen);DROP DOMAIN DomeeniNimi [RESTRICT | CASCADE]Vaikimisi on kasutusel määrang RESTRICT. Sellisel juhul ei kustutatadomeeni, millest sõltub mõni andmebaasiobjekt (näiteks baastabel).CASCADE määrang tähendab, et domeen kustutatakse isegi siis, kui sellestsõltub mõni andmebaasiobjekt. Kui kustutatavat domeeni D on kasutatudtabeli T veeru c omaduste kirjeldamiseks, siis c saab domeenis määratudtüübi. Kui c-l ei ole vaikimisi väärtust, siis c vaikimisi väärtuseks saab Dvaikimisi väärtus. Tabeliga T seotakse D-s kirjeldatud CHECK kitsendused.Domeeni kustutamisel kustutatakse kõik SQL rutiinid, vaated ja kitsendused,mis sõltuvad sellest domeenist.Domeenid ei võimalda tugevat tüüpimist. Näiteks on võimalik luua domeenidE_mail ja Isikukood tüübi VARCHAR põhjal. Seejärel saab luua tabeli Isik,milles on veerg e_mail (mille omadusi kirjeldab domeen E_mail) ning veergisikukood (mille omadusi kirjeldab domeen Isikukood). Seejärel saab kasutajakirjutada päringu, milles võrreldakse isikukoode ja e-maile (sisuliselt juvõrreldamatud suurused).SELECT *FROM IsikWHERE e_mail=isikukood;Selline võrdlus on võimalik, sest võrreldakse VARCHAR tüüpi väärtuseid (sestmõlemad domeenid on defineeritud tüübi VARCHAR põhjal). Tugevatüüpimise korral tuleks taolise võrdluse tegemiseks kasutada ühte järgmistestmeetoditest:• sellise võrdluse läbiviimiseks peaks eksisteerima operaator, misvõimaldab võrrelda isikukoode ja e-maile,• enne võrdluse läbiviimist tuleb viia läbi tüübiteisenduse operatsioonid,mis teisendavad väärtused sellisesse tüüpi, mille jaoks eksisteeribvõrdlusoperaator,• mõelda veelkord järgi, kas sellisel võrdlusel on mõte või ei ole ning kuiei ole, siis võrdluse läbiviimisest loobuda.42


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar4.5.6 Deklaratiivne vs. protseduurne terviklikkuse tagamineKitsendused aitavad tagada andmebaasi deklaratiivse terviklikkuse.Andmebaasi deklaratiivne terviklikkus kujutab endast reeglite ja eeskirjadekogumit, millele andmebaasis sisalduvad andmed peavad vastama ja midaon võimalik defineerida (deklareerida) andmebaasi struktuuri kirjelduses(CREATE ja ALTER lausetes).SQL-andmebaasisüsteemides ei ole paraku sageli võimalik jõustadakeerukamaid kitsendusi deklaratiivselt. Põhjuseks on, et nendesandmebaasisüsteemides ei saa kasutada kitsendustes alampäringuid ja eisaa kasutada CREATE ASSERTION lauseid.Sellisel juhul ei jää midagi muud üle, kui tuleb andmebaasis luua andmetekontrollimiseks mõeldud protseduurid, kasutades mõnda protseduursetkeelt. Võimalik on luua protseduure, mis käivituvad mingite andmebaasistoimuvate sündmuste tulemusena. Sellised protseduurid on trigeriprotseduurid. Taoliste protseduuride loomine on alati keerulisem kui oleksvastavate deklaratiivsete kitsenduste loomine. Seetõttu on võimaluse korralsoovitatav kasutada deklaratiivset terviklikkuse tagamist protseduuridekirjutamise asemel.Näide: Andmebaasisüsteem Microsoft SQL Server 7.0 ei võimalda välisvõtmedeklaratsiooni lisada kaskaadse kustutamise reeglit. Probleem tuleblahendada kasutades trigerite abi (protseduurne terviklikkuse tagamine).Tabeliga Aine tuleb siduda triger, mis käivitud juhul kui tabelist Aine mõni ridakustutatakse. Selle peale kustutatakse kustutatava reaga seotud read tabelisOppim.CREATE TRIGGER D_Aine ON dbo.AineFOR DELETEASDELETE Oppim FROM deleted, AINEWHERE deleted.akood=AINE.akood;4.6 VaatedSenimaani on juttu olnud tabelitest, mis ei ole defineeritud teiste tabelitepõhjal. Selliseid tabeleid nimetatakse ka baastabeliteks, et eristada neidtuletatud tabelitest. Tuletatud tabelid defineeritakse teiste tabelite põhjal.Tuletatud tabelid jagunevad omakorda virtuaalseteks tabeliteks e.vaadeteks ja hetktõmmisteks.Virtuaalsel tabelil on nimi (nagu baastabelilgi) ja selle kirjelduse osaks onpäring. Virtuaalses tabelis olevad read leitakse päringu tulemusega kusjuurespäring täidetakse peale seda, kui kasutaja küsib virtuaalsest tabelist andmeid.Andmebaasi kasutaja jaoks ei peaks olema vahet, kas ta kasutab virtuaalsettabelit või baastabelit.43


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar• Vaated on otsekui “aknad”, läbi mille on andmed baastabelites vaadatavadja uuendatavad.• Vaate spetsifikatsioonis sisalduv päring võib viidata baastabelitele võiteistele vaadetele.• Vaate read leitakse päringu täitmise tulemusel baastabelitest. Päringtäidetakse siis, kui keegi küsib vaatest andmeid.• Vaadete kaudu saab andmebaasi andmeid lisada ning olemasolevaidandmeid muuta ja kustutada. Muutused tehakse baastabelites. SQL seabsuuri piiranguid vaadetele, mille kaudu saab andmebaasis andmeidlisada/muuta/kustutada.• Loo vaade kindla eesmärgi saavutamiseks. Vaate eesmärk tuleksdokumenteerida.• Baastabeli struktuuri muutmisel (nt. veeru lisamine) tuleb üle vaadata jamuuta ka baastabelit kasutavad vaated.• Vaated võimaldavad saavutada loogilise andmete sõltumatuse –andmebaasi kontseptuaalses skeemis tehtud muudatus ei mõjutaandmebaasi välist skeemi.SQLi probleem: SQL kasutab terminit "tabel", et viidata baastabelitele jaterminit "vaade", et viidata virtuaalsetele tabelitele. Sellega jäetakse keelekasutajatele mulje, et tabel ja vaade on midagi väga erinevat. Tegelikult on kavaade tabel – virtuaalne tabel.4.6.1 Vaate loomineCREATE VIEW VaateNimi [uus_veeru_nimi [, ...])]AS (SELECT lause) [WITH [CASCADED | LOCAL] CHECK OPTION]Vaade luuakse SQL SELECT lause põhjal. Igale SELECT lause poolt väljatoodavatele veergudele võib CREATE VIEW klauslis soovi korral anda uuednimed. CREATE VIEW klauslis nimetatud veergude arv peab kokku langemaSELECT lause poolt leitud veergude arvuga.Vaadete kaudu saab teatud tingimustel muuta andmeid vaate aluseks olevastabelis. Kui vaate loomisel on kasutatud WITH CHECK OPTION määrangut,siis peavad kõik lisatud/muudetud andmed rahuldama vaadet loonud SELECTlause tingimusi.Horisontaalses vaates näidatakse vaate kasutajale ainult teatud tingimustelevastavaid ridu.CREATE VIEW RebaneAS SELECT *FROM TudengWHERE kursus = 144


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarVertikaalses vaates näidatakse vaate kasutajale vaid andmeid teatudveergudest.CREATE VIEW Rebane_nimiAS SELECT tkood, enimi, pnimiFROM Tudeng;Sama vaate oleks saanud kirjutada ka teisiti.CREATE VIEW Rebane_nimiAS SELECT tkood, enimi, pnimiFROM Rebane;Vaade käitub SELECT lausetes nagu tavaline tabel. Näiteks võib teha sellisepäringu:SELECT *FROM Rebane_nimi;Vaadetes võib kasutada näiteks ka grupeerimist ja tabelite ühendamist.CREATE VIEW Ainete_populaarsus (ainekood, aine_nimi, oppimiste_arv)AS SELECT Aine.akood, Aine.nimi, Count(*)FROM Aine, OppimWHERE Aine.akood=Oppim.ajoodGROUP BY Aine.akood, Aine.nimi;Selles vaates tuleb veergudele anda uued nimed, sest kasutataksegrupifunktsiooni Count. Samaväärne oleks järgnev vaate loomise lause.CREATE VIEW Ainete_populaarsusAS SELECT Aine.akood AS ainekood, Aine.nimi AS aine, Count(*) ASoppimiste_arvFROM Aine, OppimWHERE Aine.akood=Oppim.ajoodGROUP BY Aine.akood, Aine.nimi;Nüüd saab selle vaate põhjal teha juba lihtsamaid päringuid, ilma et oleksvaja teha päringut mitmest tabelist. Seega vaatest võib mõelda kui "makrost",mis kiirendab andmebaasi päringute kirjutamist.Tabel 1Tabel 2 Tabel 3Tabel 4Vaade 1Vaade 3Vaade 2Joonis 7 Vaadete üksteise põhjal loomise näide.45


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarVaate võib luua juba olemasolevate vaadete põhjal.Vaate loomise kood peaks andma võimalikult palju infot. Seega peaksveergude nimed välja tooma.Halvem.CREATE VIEW Keskmisest_erinev_tootaja ASSELECT *FROM TootajaWHERE palk1900 WITH CHECK OPTION;Parem.CREATE VIEW Keskmisest_erinev_tootaja ASSELECT tootaja_kood, perenimi, aadress, registr_kpv, palk,osakonna_<strong>nr</strong>FROM TootajaWHERE palk1900 WITH CHECK OPTION;4.6.2 Vaate spetsifikatsiooni muutmineVaate spetsifikatsiooni ei saa ALTER VIEW lause abil muuta, sest SQLstandard ei kirjelda ALTER VIEW lauset. Vaate spetsifikatsiooni muutmisekstuleb see kustutada ja uuesti luua.4.6.3 Vaate kustutamineDROP VIEW VaateNimi [RESTRICT | CASCADE]See SQL lause põhjustab vaate kustutamise andmebaasist.DROP VIEW Rebased;Kui määratakse CASCADE siis kustutatakse ka kõik sellest vaatest sõltuvadandmebaasiobjektid, st. Objektid, mis viitavad sellele vaatele. Niimoodikustutatakse kõik vaated, mis on selle vaate põhjal loodud.Kui määratakse RESTRICT ja andmebaasis leidub mõni sellele vaatele viitavobjekt siis vaate kustutamist ei toimu. Vaikimisi kasutatakse RESTRICT.4.6.4 Vaate põhjal päringu tegemineVaate põhjal tehtava päringu täitmiseks võib andmebaasisüsteem kasutadaerinevaid meetodeid.• Vaate põhjal päringu tegemisel konstrueerib andmebaasisüsteem kasutajapäringu ja vaate spetsifikatsioonis kirjeldatud päringu põhjal uue päringu(seda protsessi nimetatakse inglise keeles view resolution või viewsubstitution). Uus päring täidetakse seejärel andmebaasisüsteemi poolt.46


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarUue päringu koostamiseks kuluv aeg on nii väike, et päringu tegija seda eitaju.• Vaate põhjal luuakse ajutine tabel ja päring tehakse selle ajutise tabelipõhjal. Seda protsessi nimetatakse vaate materialiseerimiseks.Võimalusel peaks andmebaasisüsteem eelistama vaate ja päringu põhjal uuepäringu koostamist, sest see on kiirem võrreldes vaate materialiseerimisega.Vaate põhjal päringu tegija ei pea teadma midagi sellest, kuidas seda päringuttäidetakse – see keerukus on tema eest peidetud.4.6.4.1 Vaate ja päringu põhjal uue päringu koostamineCREATE VIEW RebaneAS SELECT *FROM Tudeng WHERE kursus = 1Tehes päringuSELECT enimi, pnimiFROM RebaneWHERE pnimi LIKE 'J%';täidetakse tegelikult päring:SELECT enimi, pnimiFROM TudengWHERE kursus = 1 AND pnimi like 'J%';CREATE VIEW Osaliste_arv (kursus, arv)AS SELECT kursus, Count(*)FROM TudengGROUP BY kursus;Tehes päringuSELECT *FROM Osaliste_arvWHERE kursus>2ORDER BY kursus;saadakse tulemuseks päring, mis käivitatakse andmebaasis:SELECT kursus, Count(*) AS arvFROM TudengWHERE kursus>2GROUP BY kursusORDER BY kursus;Tehes aga päringu:SELECT Avg(arv) AS keskmFROM Osaliste_arv;47


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaaroleks töötlemise tulemuseks päring:SELECT Avg(Count(*)) AS keskmFROM TudengGROUP BY kursus;See päring aga on SQL mõttes ebakorrektne ja seda ei saa täita. Seega olekslahenduseks järgmise lause täitmine.SELECT Avg(arv) AS keskmFROM (SELECT kursus, Count(*) AS arvFROM TudengGROUP BY kursus) AS foo;Tehes päringu:SELECT *FROM Osaliste_arvWHERE arv>20;peaks andmebaasisüsteem lõpuks täitma päringuSELECT kursus, Count(*) AS arvFROM TudengGROUP BY kursusHAVING Count(*)>20;Andmebaasisüsteemidel on erinevad strateegiad selliste vaadete põhjalpäringute võimaldamiseks:• Piirata päringuid, mida vaadete põhjal saab käivitada.1. Kui vaates sisalduv veerg põhineb grupifunktsioonil, siis saab sedaveergu kasutada vaid päringute SELECT ja ORDER BY klauslis.Seda ei saa kasutada WHERE klauslis ja ta ei või ollagrupifunktsiooni argumendiks.2. Vaadet, kus on kasutatud grupeerimist, ei saa päringutes ühendada(joinida) enam ühegi teise tabeli või vaatega.• Üritada vaadet materialiseerida (teha selle põhjal ajutine tabel) ja siis tehaedasised päringud juba selle ajutise tabeli põhjal.4.6.4.2 Vaate materialiseerimineAndmebaasisüsteem võib kasutada vaate põhjal tehtava päringu täitmisekska vaate materialiseerimist. Seega tehes päringu:SELECT Avg(arv) AS keskmFROM Osaliste_arv;võib andmebaasisüsteem tegelikult täita sellised laused:CREATE LOCAL TEMPORARY TABLE mingi_nimi (kursus INTEGER, arv INTEGER);48


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarINSERT INTO mingi_nimi (kursus, arv)SELECT kursus, Count(*) AS arvFROM TudengGROUP BY kursus;SELECT Avg(arv) AS kesm FROM mingi_nimi;Ajutise tabeli kasutamine suurendab samas veidi päringu täitmiseks kuluvataega. Andmebaasisüsteem peaks olema piisavalt arukas, et osatalihtsamates olukordades kasutada päringu ja vaate põhjal uue SELECT lausekoostamist ja vajalikel juhtudel lülituda ümber ajutiste tabelite kasutamisele.Vaate materialiseerimist ei saa kasutada vaate kaudu andmete muutmisepuhul, sest eesmärgiks on muuta andmeid baastabelites, aga mitte mingisajutises tabelis.4.6.5 Vaadete kaudu tabelites andmete muutmineLäbi vaadete saab andmeid muuta. Selleks, et vaate kaudu saaks andmeidmuuta, peab andmebaasisüsteem suutma identifitseerida kõik vaadetealuseks olevate read ja veerud vaate aluseks olevates baastabelites.Andmete muutmisele läbi vaadete on SQLis palju piiranguid. Connolly ja Begg(2001) kohaselt kirjutatakse SQL:1992 standardi versioonis, et vaate kauduon võimalik andmeid muuta siis ja ainult siis, kui vaate moodustava SELECTlause korral on täidetud järgmised tingimused.• SELECT klausel ei tohi sisaldada sõna DISTINCT.• SELECT klausel ei tohi sisaldada grupifunktsioonide väljakutseid (Avg(),Min() vms.) ja tuletatud veerge (nt. palk * 1.5).• Päring ei tohi sisaldada tabelite ühendamist (JOIN), ühendi leidmist(UNION), lõike leidmist (INTERSECT), vahe leidmist (EXCEPT). Seetähendab, et vaade peab olema loodud ühe tabeli põhjal.• Vaates ei tohi kasutada korreleeruvat alampäringut.• Päring ei tohi sisaldada GROUP BY või HAVING klauslit.• Oletame, et vaade V luuakse tabeli T põhjal. Kui vaate alampäringuSELECT klauslisse pole valitud kõiki veerge tabelist T, siis uue realisamisel V-sse ei tohi tekkida viga tänu sellele, et mõnele T kohustuslikuleveerule vastavasse välja ei lisata väärtust.• Üksteise põhjal võib defineerida mitu vaadet, kuid need peavad olema kõikühe baastabeli põhjal ja rahuldama eelpool nimetatud tingimusi.Paljud nendest kitsendustest on üleliigsed ja ebaloogilised.CREATE VIEW Keskmisest_erinev_tootaja ASSELECT tootaja_kood, perenimi, aadress, registr_kpv, palk, osakonna_<strong>nr</strong>FROM Tootaja WHERE palk1900;49


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarCREATE VIEW Keskmisest_erinev_tootaja_2 ASSELECT DISTINCT tootaja_kood, perenimi, aadress, registr_kpv, palk,osakonna_<strong>nr</strong>FROM Tootaja WHERE palk1900;CREATE VIEW Keskmisest_erinev_tootaja_3 ASSELECT tootaja_kood, perenimi, aadress, registr_kpv, palk, osakonna_<strong>nr</strong>FROM TootajaWHERE palk1900;Nende vaadete alampäringud annavad sama tulemuse, kuid andmeid saabtabelis Tootaja muuta ainult läbi vaate Keskmisest_erinev_tootaja.Näiteks järgnevad vaated:CREATE VIEW Vana_lapikAS SELECT *FROM TudengWHERE suund='LAP' OR kursus>3;CREATE VIEW Vana_lapik_2AS SELECT *FROM TudengWHERE suund='LAP'UNION SELECT *FROM TudengWHERE kursus>3;on samaväärsed, kuid vaate Vana_lapik kaudu saab SQL:1992 standardi järgiandmeid baastabelis Tudeng muuta, aga vaate Vana_lapik_2 kaudu ei saa.Oluline edasiarendus!SQL:1999 standardi versioonis on laiendatud selliste vaadete ringi, millekaudu saab baastabelites andmeid muuta.• Lubatud on muuta baastabelites sisalduvaid andmeid läbi vaadete, missisaldavad mitmes tabelis olevate andmete ühendamist (JOIN) (Date 2003,lk. 322). Kui tabelid A ja B on seotud 1:1 seosetüübi kaudu, siis saab muutanii tabelit A kui ka B. Kui tabelid A ja B on seotud 1:M seosetüübi kaudu (Bjääb seose mitu poolele), siis saab muuta andmeid ainult tabelis B.• Lubatud on muuta baastabelites sisalduvaid andmeid läbi vaadete, missisaldavad UNION ALL kahe baastabeli põhjal.Vaatesse sisestatud andmed lähevad tegelikult vaate aluseks olnudtabelitesse. Kõik andmemuudatused läbi vaadete peavad rahuldamavaate baastabelitega seotud kitsendusi!Mõnes andmebaasisüsteemis pole üldse vaateid kasutusele võetud (MySQLver. 4) või kui ka vaated on kasutusel, siis ei saa läbi vaadete vaikimisi50


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaarbaastabelites andmeid muuta (PostgreSQL). PostgreSQLis tuleb vaadetegasiduda reeglid, et võimaldada vaadete kaudu andmete muutmist. See nõuabolulist täiendavat programmeerimistööd.Tabel 1andmedSELECT lauseVaadeINSERT (andmed)Joonis 8 Andmete muutmine läbi vaate.Vaate kaudu tehtud muudatused andmetes toimuvad tegelikult baastabelites,mille põhjal vaade on loodud.CREATE VIEW RebaneAS SELECT *FROM TudengWHERE kursus = 1;Kui lisada läbi selle vaate andmebaasi andmed tudengi kohta, kelle kursus=2,siis läheb see rida tabelisse Tudeng, kuid vaates neid andmeid ei näe.Näiteks võib koostada vaate Tööülesanne, milles näidatakse vaid ülesandeid,mille seisund="tegemata". Kui ülesanne on täidetud võib muuta selle seisundit("tehtud") ja läbi vaate seda ülesannet enam ei näe.Andmemuudatuse tulemusena ei tohi andmebaasi sattuda andmed, mis onvastuolus andmebaasis defineeritud kitsendustega. Seega, kui muudetakseandmeid vaates Rebane, siis see muudatus ei tohi minna vastuollu vaategaRebane seotud kitsendustega. Teisisõnu, andmemuudatus vaate kaudu peabrahuldama selle vaate predikaati. Kui uus või muudetud rida ei rahuldatingimust, siis lükatakse uuendus tagasi.Millised on vaatega Rebane seotud kitsendused? Need kitsendused onsamasugused kui tabeliga Tudeng seotud kitsendused. Lisaks kuulubkitsenduste hulka tingimus, et kursus=1. See tähendab, et vaatesse saablisada vaid ridu, mille puhul on täidetud tingimus kursus=1.51


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarSQLis saab määrangut WITH CHECK OPTION kasutada vaadete puhul, millekaudu saab baastabelites andmeid muuta. See määrab, etandmemuudatused selle vaate abil peavad rahuldama vaadet moodustavaalampäringu (SELECT lause) tingimusi.Väga soovitav on kasutada WITH CHECK OPTION määrangut kõigivaadete puhul, mille kaudu saab andmeid muuta.CREATE VIEW RebaneAS SELECT tkood, pnimi, enimi, suund, kursusFROM Tudeng WHERE kursus = 1WITH CHECK OPTION;Tänu WITH CHECK OPTION määrangu kasutamisele ei õnnestu järgnevalause täitmine:INSERT INTO RebaneVALUES ('990999', ‘Maasikas’, ’Mart’, LD, 3);Selle lause täitmine ei õnnestu, sest läbi antud vaate lubatakse lisada vaidesimese kursuse tudengeid (kursus=1). Kui 3 asendada INSERT lauses 1-ga,siis lisatakse tabelisse Tudeng tabelisse uus rida. Vaates esindamataveergudele vastavates väljades on vaikimisi väärtused või NULLid. Samuti eiõnnestu järgneva lause täitmine.UPDATE RebaneSET kursus=2;Järgneva lause täitmine õnnestub.INSERT INTO RebaneVALUES ('990998', ‘Maasikas’, ’Mart’, LD, 1);Idee seisneb selles, et läbi vaate lisatud rida peab peale lisamist läbi vaatenähtav olema ja läbi vaate tehtav muudatus andmetes ei tohi põhjustada reakadumist vaatest.NB! Kui vaate loomisel ei oleks kasutatud WITH CHECK OPTION määrangut,siis saaks lisada ka kolmanda kursuse tudengite andmeid, kuid hiljem ei oleksneed andmed vaate kasutajatele nähtavad (näiteks päring "SELECT * FROMRebane"; – lisatud ridasid ei näita).WITH CHECK OPTION määrangust on tegelikult kaks varianti:• WITH LOCAL CHECK OPTION,• WITH CASCADED CHECK OPTION (vaikimisi).WITH LOCAL CHECK OPTION – Kui lisada või muuta rida läbi vaate, võiselle põhjal defineeritud vaadete, siis see rida peab jääma läbi vaatenähtavaks, kui just rida ei kao vaate aluseks olevast vaatest või tabelist.52


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarTootajatootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>1 Jõgi Tallinn 11.11.2001 1700 1Sõprusepst.34-452 Mets Paide 12.04.2001 1500 2Roheline 73 Kask Tartu Tähe 10.05.2001 1900 1124 Triik Tartu Kase12-4410.03.2001 1800 3Osakondosakonna_<strong>nr</strong> osakonna_nimi1 personaliosakond2 kinnisvaraosakond3 müügiosakond4 lepingute osakondJärgnevalt esitatakse vaadete hierarhia, kus vaade on loodud teise vaatepõhjal.CREATE VIEW Keskmine_palkAS SELECT *FROM TootajaWHERE palk>1600;CREATE VIEW Suur_palkAS SELECT *FROM Keskmine_palkWHERE palk>1800WITH LOCAL CHECK OPTION;CREATE VIEW Osak1_suur_palkAS SELECT *FROM Suur_palkWHERE osakonna_<strong>nr</strong>=1;1. Töötaja <strong>nr</strong>. 3 andmed on nähtavad läbi vaate Keskmine_palk.2. Töötaja <strong>nr</strong>. 3 andmed nähtavad läbi vaate Suur_palk.3. Töötaja <strong>nr</strong>. 3 andmed nähtavad läbi vaate Osak1_suur_palk.UPDATE Osak1_suur_palkSET palk=1750WHERE töötaja_<strong>nr</strong>=3;1. Töötaja <strong>nr</strong>. 3 andmed oleks endiselt nähtavad läbi vaate Keskmine_palk.2. Töötaja <strong>nr</strong>. 3 andmed poleks enam nähtavad läbi vaate Suur_palk.3. Töötaja <strong>nr</strong>. 3 andmed poleks enam nähtavad läbi vaate Osak1_suur_palk.4. UPDATE lause ei õnnestu, sest see tekitaks vastuolu WITH LOCALCHECK OPTION reegliga.53


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarUPDATE Osak1_suur_palkSET palk=5500WHERE töötaja_<strong>nr</strong>=3;1. Töötaja <strong>nr</strong>. 3 andmed poleks enam nähtavad läbi vaate Keskmine_palk.2. Töötaja <strong>nr</strong>. 3 andmed poleks enam nähtavad läbi vaate Suur_palk.3. Töötaja <strong>nr</strong>. 3 andmed poleks enam nähtavad läbi vaate Osak1_suur_palk.4. UPDATE lause õnnestub, sest vastuolu WITH LOCAL CHECK OPTIONreegliga ei teki.WITH CASCADED CHECK OPTION – Kui lisada või muuta rida läbi vaate,või selle põhjal defineeritud vaadete, siis see rida peab jääma läbi vaatenähtavaks. See on vaikimisi omadus. Kui kasutada eelmises näites mainitudvaates Suur_palk WITH CASCADED CHECK OPTION, siis kumbki eelmisesnäites mainitud UPDATE lausetest ei õnnestuks.Miks? Tegelikult täidetakse lause:UPDATE TootajaSET palk=5500WHERE töötaja_<strong>nr</strong>=3 AND palk>1600 AND palk>1800 AND osakonna_<strong>nr</strong>=1;Selline muudatus aga läheks vastuollu WITH CHECK OPTION tingimusega,mille kohaselt palk peab olema suurem kui 1800.4.6.6 Vaadete eelised ja puudusedVaadete eelisedAndmete sõltumatusAjakohasusParanenud julgeolekVähenenud keerukusMugavusKohandatavusAndmete terviklikkusVaadete probleemid (SQLis)Andmete muutmise piirangudStruktuuri piirangud4.6.6.1 EelisedAndmete sõltumatusVaated näitavad kasutajatele terviklikku ja muutumatut pilti andmebaasistruktuurist isegi siis, kui muudetakse selliste tabelite (alustabelite) struktuuri,mille põhjal vaade on defineeritud.Näide: Oletame, et andmebaasis on loodud tabel:Tootaja (tootaja_<strong>nr</strong>, eesnimi, perenimi, telefon, amet, palk)Primaarvõti(tootaja_<strong>nr</strong>)Selle tabeli põhjal on defineeritud vaade tootaja_palk:54


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarCREATE VIEW tootaja_palk ASSELECT tootaja_<strong>nr</strong>, perenimi, palkFROM Tootaja;Kui tabelist Tootaja eemaldatakse veerg telefon või lisatakse sellessetabelisse veerg aadress, siis ei ole vaja muuta vaate tootaja_palkspetsifikatsiooni.Kui olemasolev tabelit muudetakse või lahutatakse mitmeks tabeliks, siis võibolla võimalik defineerida vaade, et kasutaja näeks endiselt vana tabelit. Sedasaab teha siis, kui vana tabeli sisu on võimalik taastada SELECT lausega, misühendab andmed mitmest tabelist.Näide: Tabel:Tootaja (tootaja_<strong>nr</strong>, eesnimi, perenimi, telefon, amet, palk)Primaarvõti(tootaja_<strong>nr</strong>)lahutatakse kaheks:Tootaja_detailid (tootaja_<strong>nr</strong>, eesnimi, perenimi, telefon, a)Primarvõti (tootaja_<strong>nr</strong>)Amet (tootaja_<strong>nr</strong>, amet, palk)Primarvõti (tootaja_<strong>nr</strong>)Kasutajad võivad endiselt näha tabelit Tootaja kui defineerida vaade:CREATE VIEW TootajaAS SELECT T.tootaja_<strong>nr</strong>, T.eesnimi, T.perenimi, T.telefon, A.amet, A.palkFROM Tootaja_detailid T, Amet AWHERE T.tootaja_<strong>nr</strong>=A.tootaja_<strong>nr</strong>Näide 2: Tabel:Isik (isiku_<strong>nr</strong>, isikukood, perenimi)Primaarvõti (isiku_<strong>nr</strong>)CREATE VIEW meesisik ASSELECT isiku_<strong>nr</strong>, perenimiFROM IsikWHERE (Left(isikukood,1)='1') OR (Left(isikukood,1)='3') OR(Left(isikukood,1)='5');Otsustatakse, et isikukoodi enam andmebaasis ei hoita ja tabelit muudetakse:Isik (isiku_<strong>nr</strong>, perenimi, sugu, sünni_aeg)Primaarvõti (isiku_<strong>nr</strong>)55


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarTuleb muuta vaate spetsifikatsiooni.CREATE VIEW meesisik ASSELECT isiku_<strong>nr</strong>, perenimiFROM IsikWHERE sugu=1;Samas vaate kasutaja ei näe mingit muudatust ning vaadet kasutavaidprogramme ei ole vaja seega ümber kirjutada.AjakohasusMistahes muudatus päringu poolt väljatoodavates baastabelite andmetespõhjustab andmete muutumise ka vaates.Paranenud julgeolekVaateid saab kasutada andmebaasile juurdepääsu piiramiseks. Vaadevõimaldab kasutajatele näidata ja lasta neil muuta neid andmeid, mida neil onoma tööks vaja ja peita neid andmeid mille nägemiseks ja kasutamiseks neilei ole volitusi. Kasutajale või kasutajate grupile (rollile) saab anda õigusekasutada ainult vaateid ja mitte pöörduda otse tabelite poole.Vähenenud keerukusVaated võimaldavad kasutajatel teha lihtsaid päringuid tabelite põhjal, mis onomakorda moodustatud keerukaid päringuid kasutades. Keerukate päringutekirjutamine jääb seega andmebaasi arendajate, mitte lõppkasutajate, hooleks.Näiteks võib kasutajale teha vaate mitmest tabelist, kus on kasutatud tabelitesolevate andmete ühendamist ning grupeerimist. Seega väheneb vaatekasutaja jaoks ka päringute kirjutamiseks kuluv aeg. Vaade on seetõttu nagumakro, mis võimaldab kasutajal koostada kiiremini keeruka operatsiooniläbiviimise korralduse.MugavusKasutaja jaoks muutub andmebaas lihtsamaks, sest ta näeb vaid seda osa,mida tal on vaja näha ja peab kasutama lihtsamaid päringuid.KohandatavusVaated võimaldavad kohandada kasutaja vaadet andmebaasile, nii eterinevad kasutajad näevad samu andmeid erineval viisil. Näiteks ühtedelkasutajatele näidatakse kauba hinda eurodes, teistele aga eurodes ja Eestikroonides.Vaadete kasutamine võimaldab kasutajale mingis tabelis olevaid andmeidnäidata nii, et tabeli ja/või veergude nimed on muudetud vastavalt kasutajasoovidele/vajadustele.CREATE VIEW Fyysiline_isik (perekonnanimi, pikkus_meetrites) ASSELECT perenimi, pikkus/100 FROM Isik;56


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarAndmete terviklikkusKui CREATE VIEW lauses kasutatakse WITH CHECK OPTION määrangut,siis tagab andmebaasisüsteem, et läbi vaate ei saa andmebaasi lisadaandmeid, mis lähevad vastuollu vaate alampäringu tingimustega. See tagabvaates näidatavate andmete terviklikkuse. Kõikides vaadetes, läbi mille saabandmeid muuta, peaks kasutama WITH CHECK OPTION määrangut.4.6.6.2 Probleemid SQLisAndmete muutmise piirangudSQL seab suuri piiranguid vaadetele, läbi mille on võimalik muuta andmeidbaastabelites.Struktuuri piirangudKui vaate aluseks olev päring tehakse kujul SELECT * FROM T..., siis "*"viitab tabeli T veergudele, mis olid selles vaate loomise hetkel. Kui tabelisse Tlisati peale vaate loomist veerg v, siis see veerg ei ilmu vaatesse enne, kuivaade on kustutatud ja uuesti loodud.4.6.7 Materialiseeritud vaated e. hetktõmmisedHetktõmmistest SQL standardis juttu ei ole. Üheks andmebaasisüsteemiks,kus hetktõmmiseid saab kasutada on Oracle. Seal on hetktõmmiste loomiseksspetsiaalne käsk CREATE MATERIALIZED VIEW.Iga kord kui keegi vaate poole pöördub, siis leiab andmebaasisüsteem vaateväärtuse pöördumise ajahetke seisuga. Vaate poole pöördumisel peabandmebaasisüsteem tegelikult leidma vastuse päringule. Keeruka päringutäitmine ja kõikide tulemuste väljastamine võib andmebaasisüsteemil võttaküllaltki kaua aega. Kas ei oleks võimalik vaate väärtus korra välja arvutada jakasutada seda siis erinevatele päringutele vastamiseks? Selgub et on küll jaselleks tuleb luua hetktõmmis.Hetktõmmise puhul on hetktõmmise spetsifikatsioonis kirjeldatud päringtäidetud ja tulemused leitud enne, kui kasutaja hetktõmmise poole pöördus.Tüüpiliselt on selle päringu tulemused ka kõvakettale salvestatud. Seegasaab andmebaasisüsteem vastata hetktõmmise põhjal tehtud päringulekiiremini kui vaate põhjal tehtud päringule, sest tulemuse leidmiseks on osatööd juba eelnevalt ära tehtud.Sageli sisaldavad hetktõmmise spetsifikatsioonis kirjeldatud päringudühendamise ja/või grupeerimise operatsioone, sest selliste operatsioonideläbiviimine on andmebaasisüsteemide jaoks üsna töömahukas.57


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarTermini "hetktõmmis" asemel kasutatakse sageli terminit "materialiseeritudvaade". Date (2003) märgib, et "materialiseeritud vaade" ei ole hea termin,sest see on vastuoluline – vaate mõte seisnebki selles, et see ei olematerialiseeritud.Hetktõmmise omadused (Oracle põhjal).• Hetktõmmis aitab parandada päringutele vastamise kiirus – päringutulemus või selle leidmiseks vajalikud vahetulemused on juba eelnevaltleitud.• Juhul, kui hetktõmmise kasutamine aitaks kiiremini päringu vastusenijõuda, võib andmebaasisüsteem SELECT lause enne täitmist nii ümberkirjutada, et see hakkab kasutama hetktõmmist (algne SELECT lause eiviita hetktõmmisele).Joonis 9 Hetktõmmise kasutamine andmebaasisüsteemis Oracle.• Hetktõmmis kulutab salvestusruumi (andmed on salvestatudmitmekordselt – baastabelites ja baastabelite põhjal loodudhetktõmmistes).• Hetktõmmisesse kuuluvaid andmeid tuleb värskendada, kui muutuvadandmed tabelites, mille põhjal tõmmis loodi. Andmebaasisüsteemile saabanda korralduse teha seda automaatselt – kas kohe pealeandmemuudatusi tabelites või perioodiliselt.• Eelnevalt oli juttu, et vaate põhjal tehtud päringu täitmiseks võibandmebaasisüsteem luua ajutise tabeli, mis peale päringu täitmistkustutatakse. Siin jaotises kirjeldatav hetktõmmis on pidevalt eksisteerivtabel, kuhu on koondatud andmed teistest tabelitest.Nagu märgitud, on probleemiks andmete aktuaalsuse tagaminehetktõmmises! Kuna päringu tulemus on nüüd välja arvutatud ja süsteemisfüüsiliselt salvestatud, siis põhjustavad mõned (aga mitte kõik) muudatusedhetktõmmise alustabelites (tabelites, millele viidatakse hetktõmmisespetsifikatsioonis olevas päringus) olevates andmetes olukorra, ethetktõmmises olevad andmed pole enam kooskõlas oma alustabelites olevateandmetega.58


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarSamuti põhjustab hetktõmmise kasutamine andmete dubleerimist jaandmebaasi andmemahtude suurenemist. Kui hetktõmmise aluseks olevatetabelite struktuuris tehakse muudatus (nt. kustutatakse tabelist mõni veerg),siis tuleb vastav muudatus üle kanda ka hetktõmmisesse (tuleb muutahetktõmmise spetsifikatsioonis kirjeldatud päringut).Tootajatootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>1 Jõgi Tallinn 11.11.2001 1400 1Sõprusepst.34-452 Mets Paide 12.04.2001 1500 2Roheline 73 Kask Tartu Tähe 10.05.2001 1600 1124 Triik Tartu Kase12-4410.03.2001 1800 3Osakondosakonna_<strong>nr</strong> osakonna_nimi1 personaliosakond2 kinnisvaraosakond3 müügiosakond4 lepingute osakondKoostame tabeli Tootaja põhjal hetktõmmise Aktiivne_osakond, kusnäidatakse kõiki osakondi, kus töötab vähemalt üks inimeneCREATE MATERIALIZED VIEW Aktiivne_osakond (nimi)AS SELECT DISTINCT O.osakonna_nimiFROM Tootaja T, Osakond OWHERE T.osakonna_<strong>nr</strong>=O.osakonna_<strong>nr</strong>;Hetktõmmise väärtus hetkel andmebaasis olevate andmete põhjal:osakonna_nimipersonaliosakondkinnisvaraosakondmüügiosakondSelgub, et lepingute osakonnas ei tööta praegu kedagi. Kuipersonaliosakonda tuleb uus töötaja ei pea hetktõmmise väärtust uuestiarvutama, sest personaliosakonna kohta käiv rida on juba leitud. Kui agalepingute osakonda võetakse tööle uus töötaja, tuleb arvutada uuesti kahetktõmmise väärtus, sest seal ei töötanud varem kedagi.Kui kustutada tabelist Tootaja töötaja nimega Jõgi, siis ei tule muutahetktõmmise väärtust, sest personaliosakonda jääb endiselt tööle Kask. Kuiaga kustutada tabelist Tootaja töötaja nimega Mets tuleb hetktõmmiseväärtusest kustutada kinnisvaraosakond, sest seal ei tööta enam kedagi.59


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarAndmebaasi administraator peab jälgima hetktõmmiste kasutatavust ja needmida ei kasutata andmebaasist eemaldama.Millal võib andmebaasisüsteem hetktõmmise väärtust värskendada?- Sünkroonselt – kohe, kui hetktõmmise alustabelites toimub mingiandmemuudatus. Eeliseks on hetktõmmises olevate andmete värskus,kuid puuduseks andmemuudatuseks kuluva aja suurenemine. Muudatustei saa lugeda lõppenuks enne, kui on muudetud ka hetktõmmise väärtus.- Asünkroonselt1. Mingi kindla ajaperioodi tagant.2. Kasutaja poolt valitud ajahetkel.Kuidas võib andmebaasisüsteem hetktõmmise väärtust värskendada?- Andmebaasisüsteem leiab hetktõmmise uue väärtuse, täites uuestihetktõmmise spetsifikatsioonis kirjeldatud päringu.- Andmebaasisüsteem võtab hetktõmmise uue väärtuse arvutamiselarvesse ainult peale viimast värskendamist andmebaasis toimunudmuudatused. Eeliseks on, et uue väärtuse arvutamine kiireneb.Puuduseks on, et andmebaasisüsteem peab logima kõik hetktõmmisealuseks olevates tabelites toimunud andmete muutused(andmebaasisüsteem peab selleks kulutama ressursse – aeg,salvestusruum).Tropashko (2006) kirjeldab, kuidas kasutada hetktõmmiseid ärireeglitejõustamiseks andmebaasis. Näiteks võib kasutada hetktõmmiseid tagamaks,et kahes tabelis ei ole ühesuguseid ridu. Oletame, et andmebaasis on loodudkaks tabelit – Osalise_tooajaga_tootaja ja Taieliku_tooajaga_tootaja. Kehtibreegel, et töötaja ei saa olla samaaegselt osalise ja täieliku tööajaga töötaja.Järelikult iga töötaja andmed tohivad olla ainult ühes nendest tabelitest.Vaatame järgnevalt, kuidas oleks võimalik jõustada selline kitsendus Oracleandmebaasis, kasutades hetktõmmiseid.CREATE TABLE Osalise_tooajaga_tootaja(tootaja_kood NUMBER(5) PRIMARY KEY,perenimi VARCHAR(40) NOT NULL,palk NUMBER(8,2) NOT NULL);CREATE TABLE Taieliku_tooajaga_tootaja(tootaja_kood NUMBER(5) PRIMARY KEY,perenimi VARCHAR(40) NOT NULL,palk NUMBER(8,2) NOT NULL);CREATE MATERIALIZED VIEW Osaline_ja_taielikBUILD IMMEDIATEREFRESH COMPLETE ON COMMIT ASSELECT O.tootaja_kood FROM Osalise_tooajaga_tootaja O,Taieliku_tooajaga_tootaja T WHERE O.tootaja_kood=T.tootaja_kood;60


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarALTER TABLE Osaline_ja_taielikADD CONSTRAINT ei_tohi_kattuda CHECK (tootaja_kood IS NULL);INSERT INTO Osalise_tooajaga_tootaja(tootaja_kood, perenimi, palk)VALUES (1, 'Mets', 200);INSERT INTO Taieliku_tooajaga_tootaja(tootaja_kood, perenimi, palk)VALUES (1, 'Mets', 220);COMMIT;ERROR at line 1:ORA-12008: error in materialized view refresh pathORA-02290: check constraint (TUD1.EI_TOHI_KATTUDA) violatedKitsenduse jõustamiseks luuakse hetktõmmis Osaline_ja_taielik. BUILDIMMEDIATE määrab, et hetktõmmis luuakse kohe. REFRESH COMPLETEON COMMIT määrab, et hetktõmmist tuleb värskendada kohe, kuitransaktsioon lõpeb (ON COMMIT). Andmebaasisüsteem leiab hetktõmmiseuue väärtuse, täites uuesti hetktõmmise spetsifikatsioonis kirjeldatud päringu(COMPLETE).Hetktõmmise spetsifikatsioonis kirjeldatud päringu abil ühendatakse tabelitesOsalise_tooajaga_tootaja ja Taieliku_tooajaga_tootaja üle veerutootaja_kood. Eeldame, et töötaja koodi kasutatakse töötajateidentifitseerimiseks ka väljaspool andmebaasi ja tegemist ei ole süsteemipoolt genereeritud väärtusega, mille ainus eesmärk on unikaalsuse tagamine.Kui tabelites Osalise_tooajaga_tootaja ja Taieliku_tooajaga_tootaja on üheja sama koodiga töötaja andmed, siis on hetktõmmise alampäringu täitmisetulemusena moodustuvas tabelis üks või rohkem rida. Samas onhetktõmmisega Osaline_ja_taielik seotud kitsendus (ALTER TABLE lause), etigas hetktõmmise reas peab töötaja kood olema määramata (NULL). Kuisama koodiga töötaja andmed registreerida nii tabelisOsalise_tooajaga_tootaja kui ka Taieliku_tooajaga_tootaja, siis ei olehetktõmmisega Osaline_ja_taielik seotud kitsendus täidetud ningandmemuudatus lükatakse andmebaasisüsteemi poolt tagasi.Taoline lahendus viitab tegelikult SQL-andmebaasisüsteemi puudustele –parem oleks see ülesanne lahendada kasutades ASSERTIONe, kuid parakuei võimalda andmebaasisüsteem neid kasutada.4.7 SELECT ... INTO lauseTegemist on andmebaasisüsteemides MS Access ja MS SQL Serverkasutatava SQL lause tüübiga.SELECT... INTO lause võimaldab luua hetktõmmiseid – päringutulemusimaterialiseerida. Lause täitmise tulemusena loodavas tabelis olevateveergude tüübid leitakse nende tabelite veergude tüüpide põhjal, mille aluselsee hetktõmmis luuakse. Ainsad kitsendused, mis on SELECT ... INTO lauseabil loodud tabelis, on veergude tüübid. Täiendavad kitsendused (näiteks61


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaarvõtmed, veergude kohustuslikkus) tuleb tabelile hiljem ALTER TABLElausega lisada.SELECT .... INTO lause abil loodud tabelisse pannakse kõik need read, milletoob välja lause aluseks olev SELECT lause. Süntaksi erinevus SELECTlausest seisneb SELECT klauslis.SELECT veerg1[, veerg2[, ...]] INTO uus_tabel [IN väline_andmebaas]Tabel. SELECT ... INTO lause osad.OsaKirjeldusveerg1, veerg2Nende veergude nimed, milles olevad andmedkopeeritakse uude tabelisse.uus_tabel Uue tabeli nimi. Peab vastamaandmebaasisüsteemis nimede kohta käivatelereeglitele.väline_andmebaasTee välise andmebaasini.SELECT Aine.akood, Aine.nimi, Count(Oppim.akood) INTOAinete_populaarsusFROM Aine, OppimWHERE Aine.akood=Oppim.akoodGROUP BY Aine.akood, Aine.nimi;SQL standardis on SELECT ... INTO lause kasutusel muutujaväärtustamiseks päringu tulemusel leitud väärtusega. Sellist lauset saabkasutada andmebaasiserveris talletatud rutiinides (protseduurides jafunktsioonides).SELECT ... INTO lauset ei tohi kasutada andmete lisamiseks olemasolevassetabelisse. SELECT .... INTO T lause täitmisel kustutatakse tabel T ja luuaksesee uuesti. Kõik tabeliga T seotud kitsendused, indeksid ja tabelis T ennekustutamist olnud andmed lähevad kaotsi.SQL standard kirjeldab lause CREATE TABLE ... AS .., mida saab kasutadapäringutulemuse materialiseerimiseksNäide:CREATE TABLE Tootaja_koopia AS (SELECT * FROM Tootaja WHEREpalk>1000) WITH DATA;Lisaks näeb SQL standard ette võimaluse luua tabeli struktuuri kirjelduseolemasoleva tabeli struktuuri kirjelduse põhjal.Näide:CREATE TABLE Tootaja (LIKE Tudeng);Tabeli Tudeng põhjal luuakse tabel Tootaja, milles on samad veerud kuitabelis Tudeng. Tabeliga Tudeng seotud kitsendusi uude tabelisse üle eikanta. Samuti ei kanta tabelisse Tootaja üle tabelis Tudeng olevaid andmeid.62


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar5. Query By Example"Teine relatsiooniliste andmebaaside keel, mille põhimõtteid on kasutatudpaljudes andmebaasisüsteemides, on QBE (Query By Example). QBEdkasutav andmebaasisüsteem on interaktiivne: kogu töö tehakse dialoogivormis konsooli (klaviatuuri ja kuvarite vahendusel). Peamine vahend millegasüsteemiga suheldakse on aken; Viimaseid on kahte tüüpi:- skeemi aken;- tingimuste aken.Korraga võib olla avatud mitu akent." (Isotamm, 1996, lk. 146)QBE idee seisneb selles, et kasutaja teeb andmebaasiga suhtlemiseksmõeldud lauset koostades sissekandeid tühja tabelisse.Näide: Leia sellised töötajad, kelle palk on suurem kui 300 eurot JA kestöötavad osakonnas <strong>nr</strong> 1. Näita kõiki veerge.tootaja tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>P. >300 1Näide: Leia selliste töötajate kood ja palk kelle palk on suurem kui 800 eurot.tootaja tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>P. P.>800Näide: Leia sellised töötajad, kelle palk on suurem kui 300 eurot VÕI kestöötavad osakonnas <strong>nr</strong> 1. Näita kõiki veerge.tootaja tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>P. >300P. 1Näide: Leia unikaalsed palga väärtused tabelist Tootaja.tootaja tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>UNQ. P.Näide: Leia töötajate identifikaator ja palk Eesti kroonides (palk on antudeurodes)tootaja tootaja_kood palk palk_eurodesP. _PE P. _PE*15.646663


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarNäide: Kustuta kõik osakonnas <strong>nr</strong>. 1 töötavate töötajate andmed.tootaja tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>D. 1Näide: Leia töötajad, kes töötavad osakonnas nimega "lepingute osakond"tootaja tootaja_kood perenimi aadress registr_kpv palk osakonna_<strong>nr</strong>P. _SXosakonna_<strong>nr</strong>_SXosakonna_nimi"lepingute osakond"Üheks QBE näiteks on MS Accessis kasutatava Query Designer. See onaken, mis koosneb kahest osast.Tabelid ja nende vahelised seosedTabeli veergudega seotud tingimused, korraldused.Joonis 10 QBE aken.64


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar5.1 Ühendamist sisaldava päringu loomine MS Accessiskasutades Query Designeritühendamisoperatsioonigraafiline tähisJoonis 11 Inner Join operatsiooni defineerimine MS Accessi päringutedisaineri abil.Kui kahe tabeli vahel on seos defineeritud (andmebaasis on deklareeritudvälisvõtme kitsendus), siis ilmub ühendamist tähistav joon Query Designeriaknasse automaatselt. Vastasel juhul tuleb ühendamisoperatsioondefineerida, aktiveerides tabeli graafilisel kujutisel soovitud veeru ja lohistadesselle vasakut hiireklahvi all hoides teise tabeli soovitud veeru kohale. Sealtuleb hiireklahv lahti lasta. Disaineri aknas tekib tabelite graafilise esitusevahele joon. Selleks, et valida kas kasutada INNER JOIN või OUTER JOINoperaatorit, tuleb disaineri aknas joon aktiveerida. Tehes hiirega topeltklõpsuavaneb aken, kus saab määrata kasutatava operaatori. Outer join(välisühendamise) operatsiooni defineerimisel tekib Query Designerisühendamise operatsiooni esitava joone otsa nooleke.65


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarInner join operaatorikasutamineOuter join operaatorikasutamine. Operaatorivalimisele aitab kaasa kalisatud tekstiline kirjeldus.Antud juhul on valik, kasnäidata kõiki andmeid tabelistOsakond või Tootaja.Leiab kõik read tabelist Osakond ka siis, kui tabelis Tootaja pole ühtegivastavat rida. Query Designeris avaneb järgnev pilt.Joonis 12 Outer Join operatsiooni defineerimine MS Accessi päringutedisaineri abil.66


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki EessaarLeiab kõik read tabelist Tootaja ka siis, kui tabelis Osakond pole ühtegivastavat rida. Query Designeris avaneb järgnev pilt.Joonis 13 Outer Join operatsiooni defineerimine MS Accessi päringutedisaineri abil.Tabelile Query Designeris aliase andmiseks tuleks disaineris aktiveeridatabelit tähistav ristkülik ja valida parema hiireklahvi alt avanevasthüpikmenüüst Properties. Avaneb aken Field List Properties, kus välja Aliastuleb kirjutada tabeli alias.Joonis 14 Päringus tabeli aliase määramine MS Accessi päringutedisaineri abil.67


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar6. MõistedEesti keelesAndmekäitluskeelAndmekirjelduskeelAndmekontrollikeelTüüpAndmetüüpAndmete terviklikkuse reeglidKitsendused andmeteleNõutud andmedDomeeni kitsendusOlemi terviklikkusViidete terviklikkusÄrireegelTransaktsioonTehingVaadeVirtuaalne tabelVaade, mille kaudu saabbaastabelites andmeid muutaMaterialiseeritud vaadeHetktõmmisVaate ja selle põhjal tehtavapäringu põhjal uue päringukoostamineInglise keelesQuery-By-ExampleData Manipulation Language, DMLData Definition Language, DDLData Control Language, DCLData typeIntegrity constraintsRequired dataDomain constraintEntity integrityReferential integrityBusiness ruleEnterprise constraintTransactionViewVirtual tableUpdatable viewMaterialized viewSnapshotView resolutionView substitution7. Kasutatud materjalid1. Chapell, D. & Trimble, H., 2001. Visual Introduction to SQL. SecondEdition. Wiley Computer Publishing. 291 p.2. Celko, J., 2000. SQL for smarties: advanced SQL programming. 2 nd ed.Academic Press. 553 p.3. Connolly, T. M. & Begg, C. E., 2001. Database systems. A PracticalApproach to Design, Implementation and Management. Third Edition.Pearson Education. 1236 p.4. Data Types Revealed SQL Server Magazine [WWW]http://www.sqlmag.com/Articles/Index.cfm?ArticleID=5219&pg=1(09.01.2003)5. Date, C.J., 2003. An Introduction to Database Systems. Eighth Edition.Addison Wesley. 983 p.6. Date, C.J., 2006. Date on Database. Writings 2000-2006. Apress. 539p.7. Date, C.J., 2009. SQL and Relational Theory. How to Write AccurateSQL Code. O'Reilly. 404 p.68


TTÜ: Andmemuudatused SQLis.SQLi andmekirjelduskeel (2012) © Erki Eessaar8. Date, C. J. Constraints and predicates: a brief tutorial part 3. [WWW]http://www.dbdebunk.com/page/page/622397.htm (08.03.2005)9. Gulutzan, P. & Pelzer, T., 1999. SQL:1999 Complete, Really. MillerFreeman. 1078 p.10.Oracle9i Data Warehousing Guide Release 2 (9.2) Part NumberA96520-01. 8. Materialized Views.11.Muller, R. J., 1999. Database Design for Smarties. Using UML for DataModeling. Morgan Kaufmann Publishers. 442 p.12.Tropashko, V., 2006. SQL Design Patterns. The Expert Guide to SQLProgramming. Rampant Techpress. 254 p.13.Vallaste, H., 2011. e-teatmik. [WWW] http://www.vallaste.ee/(30.03.2011)69

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

Saved successfully!

Ooh no, something went wrong!