Andmebaasid IV praktikum Vaated; Tabelite täitmine päringute abil
VAATED
Vaade ehk View Vaade on Select lause, millele on antud nimi ja mida saab võrdselt teiste tabelitega kasutada päringutes Vaade on virtuaalne dünaamiline tabel
Vaadete kasutuskohad Piiramaks andmekasutust põhistruktuure muutmata Lihtsustamaks keerulisi pidevalt vajaminevaid päringuid Maandamaks andmestruktuuride muutuse riski vaatajatele (aruandegeneraatorid, veebiliides info väljastamiseks jms)
Süntaks CREATE VIEW <vaade> [({veerud})] AS {select lause ilma järjestamiseta} DROP VIEW <vaade>
Näiteid Lõige isikutabelist: vaid isikud klubist numbriga 54 CREATE VIEW v_klubi54 AS SELECT * FROM isik WHERE klubi = 54; Lõige isikutabelist: vaid isikute nimed klubist numbriga 54 CREATE VIEW v_klubi54pisi (eesnimi, perenimi) AS SELECT eesnimi, perenimi FROM isik WHERE klubi = 54; Ühendame isikutabelis ja klubitabeli: Klubi nimi, klubi id, isiku nimi ja id CREATE VIEW v_mangija (klubi_nimi, klubi_id, isik_nimi, isik_id) AS SELECT klubi.nimi, klubi.id, isik.perenimi ', ' isik.eesnimi, isik.id FROM isik JOIN klubi ON isik.klubi = klubi.id;
Olemasolevad andmed (tabelid ja vaated)
Kui tahame andmeid tabelitest isik (2x) valgetega ja mustadega mängija nime, klubi (mängijate klubide nimesid) ja partii (partii tulemust), siis võime oma päringut lihtsustada pannes kokku tabeli partii ja vaate v_mangija (2x) CREATE VIEW v_partii (id, turniir, algus, valge_nimi, valge_klubi, valge_punkt, must_nimi, must_klubi, must_punkt ) AS SELECT p.id, p.turniir, p.algushetk, v.isik_nimi, v.klubi_nimi, p.valge_tulemus / 2.0, m.isik_nimi, m.klubi_nimi, p.musta_tulemus / 2.0 FROM partii as p, v_mangija as v, v_mangija as m WHERE p.valge = v.isik_id AND p.must = m.isik_id;
SELECT * FROM v_partii ORDER BY algus; 725 41 2005-01-12 08:02:00 Pustota, Pjotr Musta kivi kummardajad 0,5 Umnik, Toomas Võitmatu Valge 0,5 726 41 2005-01-12 08:04:00 Angervaks, Arvo Musta kivi kummardajad1 Ristik, Anna Ruudu Liine 0 727 41 2005-01-12 09:01:00 Sosnov, Andrei Musta kivi kummardajad1 Angervaks, Arvo Musta kivi kummardajad 0 728 41 2005-01-12 09:03:00 Maakamar, Mihkel Musta kivi kummardajad 0,5 Umnik, Toomas Võitmatu Valge 0,5 729 41 2005-01-12 09:03:00 Maasikas, Malle Võitmatu Valge 1 Hiis, Helina Ruudu Liine 0 730 41 2005-01-12 10:04:00 Umnik, Toomas Võitmatu Valge 1 Hiis, Helina Ruudu Liine 0 731 41 2005-01-12 10:04:00 Hiis, Henno Ruudu Liine 0,5 Hiis, Helina Ruudu Liine 0,5 732 41 2005-01-12 10:05:00 Puhasmaa, Nadja Võitmatu Valge 0,5 Ristik, Anna Ruudu Liine 0,5 733 41 2005-01-12 11:03:00 Maasikas, Malle Võitmatu Valge 1 Hiis, Henno Ruudu Liine 0 734 41 2005-01-12 11:08:00 Sosnov, Andrei Musta kivi kummardajad1 Umnik, Toomas Võitmatu Valge 0 735 41 2005-01-12 12:02:00 Umnik, Toomas Võitmatu Valge 1 Ristik, Anna Ruudu Liine 0 736 41 2005-01-12 12:04:00 Pustota, Pjotr Musta kivi kummardajad0 Hiis, Helina Ruudu Liine 1 737 41 2005-01-12 12:09:00 Angervaks, Arvo Musta kivi kummardajad 0,5 Kivine, Kalle Võitmatu Valge 0,5 738 41 2005-01-12 13:04:00 Maakamar, Mihkel Musta kivi kummardajad0 Hiis, Henno Ruudu Liine 1 739 41 2005-01-12 13:07:00 Sosnov, Andrei Musta kivi kummardajad0 Kivine, Kalle Võitmatu Valge 1 740 41 2005-01-12 13:09:00 Puhasmaa, Nadja Võitmatu Valge 0 Maasikas, Malle Võitmatu Valge 1 741 41 2005-01-12 14:05:00 Sosnov, Andrei Musta kivi kummardajad0 Maasikas, Malle Võitmatu Valge 1 742 41 2005-01-12 14:06:00 Pustota, Pjotr Musta kivi kummardajad1 Kivine, Kalle Võitmatu Valge 0 744 41 2005-01-12 16:02:00 Umnik, Toomas Võitmatu Valge 0,5 Maasikas, Malle Võitmatu Valge 0,5
TABELITE TÄITMINE PÄRINGUTE ABIL
Insert + Select Täidame tabeli päringuga. Tavaliselt ajaloo säilitamiseks või keerukamate andmetöötluste tegemise jaoks. INSERT INTO <tabel> [({VEERUD})] SELECT... FROM... WHERE... jne
Eesnimede esinemise sagedused Loome tabeli eesnimede muutuste jälgimiseks CREATE TABLE eesnimi ( eesnimi varchar(50) NOT NULL, kogus integer NOT NULL, hetk datetime NOT NULL DEFAULT current timestamp, PRIMARY KEY (eesnimi, hetk) ); Lisame andmed veergudesse eesnimi ja kogus INSERT INTO eesnimi (eesnimi, kogus) SELECT eesnimi, count(*) FROM isik GROUP BY eesnimi;
Muudame eesnimesid tabelis isik INSERT INTO isik (eesnimi, perenimi, klubi) VALUES ('Maria', 'Lihtne', 51); UPDATE isik SET eesnimi = 'Toomas' WHERE eesnimi = 'Taivo'; Kordame andmete lisamist tabelisse eesnimi: INSERT INTO eesnimi (eesnimi, kogus) SELECT eesnimi, count(*) FROM isik GROUP BY eesnimi; Vaatame kuidas muutus nimede arv SELECT eesnimi, hetk, kogus FROM eesnimi WHERE eesnimi IN ( 'Maria', 'Toomas', 'Taivo') ORDER BY hetk;
Päringu piiramine kogusega SELECT TOP <mitu> [START AT <esimene>] {veerud}... Kolm esimest nimekirjas SELECT TOP 3 eesnimi, perenimi FROM isik; (järjestus oli juhuslik) Õigem oleks SELECT TOP 3 eesnimi, perenimi FROM isik ORDER BY perenimi, eesnimi; Eelviimane isik (perenimede järjestuses) mängijate nimekirjas SELECT TOP 1 START AT 2 eesnimi, perenimi FROM isik ORDER BY perenimi DESC, eesnimi DESC;
Abitabeli täitmine numbritega CREATE TABLE viis ( nr INTEGER NOT NULL PRIMARY KEY ); INSERT INTO viis SELECT TOP 8 number(*) FROM partii; DELETE FROM viis WHERE nr > 5;
Massiline andmete lisamine Tekitame kõigile tudengitele erinevused tabelisse partii (omad andmed). Selleks: Lisame uue kirje (uue turniiri) tabelisse turniir. Olgu uus turniiri numbriga 47 (id=47) Lisame selle kirje (nn käsitsi) INSERT INTO turniir (id, nimi, toimumiskoht, alguskuupaev, loppkuupaev) VALUES (47, 'Kuldkarikas 2010', 'Elva', '2010-10-14', '2010-10-14'); Muutsime meelt: turniiri nimi olgu Plekkkarikas UPDATE turniir SET nimi = 'Plekkkarikas 2010' WHERE id = 47;
Lisame juurde kõigi mängijate omavahelised partii. (va endaga) ja mängijatega klubist 57, algushetke võtame juhusliku INSERT INTO partii (turniir, algushetk, valge, must) SELECT turniir.id, dateadd(minute,1+rand()*10, dateadd(hour, 8+rand()*10,turniir.alguskuupaev)), v.id, m.id FROM turniir, isik v, isik m WHERE turniir.id = 47 AND v.id <> m.id AND v.klubi <> 57 AND m.klubi <> 57;
Väärtustame (juhuslikult) veerud Lõpphetk ja paneme paika juhuslik võitja UPDATE partii SET lopphetk = dateadd(second, 50+mod(id, 121), dateadd(minute, 19 + mod(id,18) + mod(id,3) - mod(id,13), algushetk)) WHERE turniir = 47; UPDATE partii set valge_tulemus = mod(id+valge-must+turniir, 3) WHERE turniir = 47; UPDATE partii SET musta_tulemus = 2 - valge_tulemus WHERE turniir = 47;
Kustutame need partiid, kus sama turniiri jooksul mängijate paar kordub DELETE FROM partii p WHERE EXISTS ( SELECT * FROM partii q WHERE p.valge =q.must AND q.valge = p.must AND p.id < q.id AND turniir=47) AND turniir = 47;
Kustutame maha ajaliselt kõlbmatud. Pole võimalik alustada uut partiid, kui ühel mängijatest eelmine veel pooleli DELETE FROM partii p WHERE EXISTS ( SELECT * FROM partii q WHERE p.algushetk>= q.algushetk AND p.algushetk <= q.lopphetk AND p.id <> q.id AND (p.valge = q.valge OR p.valge=q.must OR p.must=q.valge OR p.must=q.must) AND q.turniir = p.turniir ) AND turniir = 47;
Vinge viisik Peale koduse ülesande tegemist on võimalik sooritada alljärgnev päring Näha äsja sisestatud turniiri viite paremat SELECT TOP 5 number(*), mangija, punkte FROM v_edetabel WHERE turniir = 47 ORDER BY punkte DESC;
Olemasolevad andmed (tabelid ja vaated)
Ülesanne nr 5 1. Luua vaade v_turniiripartii (turniir_nimi, partii_id, partii_algus, partii_lopp). 2. Luua vaade v_klubipartiikogus (klubi_nimi, partiisid) partiisid = selliste partiide arv, kus kas valge või must mängija on klubi liige. 3. Luua vaade v_punkt (partii, turniir, mangija, varv, punkt), kus oleksid kõigi mängijate kõigi partiide jooksul saadud punktid (viitega partiile ja turniirile) koos värviga (valge (V), must (M)). (Vaata järgnevat näidet).
Näiteks, kui tabelis partii on 2 kirjet: id turniir valge must valge_tulemus musta_tulemus 725 41 71 84 1 1 767 41 84 89 2 0 siis vaade v_punkt peab andma neli kirjet: partii turniir mangija varv punkt 725 41 71 V 0,5 725 41 84 M 0,5 767 41 84 V 1,0 767 41 89 M 0,0 NB! Hilisema kontrolli edukaks läbimiseks jälgida detaile: algtabelis veeru nimi musta_tulemus, Vaates veeru nimi must_punkt (ilma a-ta)!! Näpunäide: union kasutamine oleks abiks.
4. Vaate v_punkt ja vaate v_mangija põhjal teha vaade v_edetabel(mangija, turniir, punkte), kus veerus mangija on mängija nimi (v_mangija.nimi) ja veerus turniir on turniiri ID. Punkte arvutatakse iga turniiri jaoks (mängija punktid sellel turniiril). 5. Leida (teha päring) turniiri Kolme klubi kohtumine (turniiri ID = 41) edetabeli saamiseks (suurema punktiarvuga mängija eespool).