59
1 Laboratorijske vaje VSP-Sežana Splošni podatki: asistent: AZ govorilna ura: na vajah, konzultacije na zadnjih vajah, govorilna ura v Ljubljani v SREDO ob 10h vse informacije o predmetu: http://baze.fri.uni-lj.si Vsebina vaj: relacijska algebra, koncepti, vaje, SQL DML osnovni SQL stavek, povezava z relacijsko algebro, delo z množicami, operatorji v SQL, razširjeni SQL stavek, DDL kreiranje tabel, podatkovni tipi, integritetne omejitve, indeksiranje (B, B+ drevesa, sintaksa v SQL), pogledi, Sočasna uporaba PB: zaklepanje, časovno označevanje, Obnavljanje PB: teorija, dnevniki (naloge) Seminarska naloga: Navodila za seminarsko nalogo se nahajajo na spletni strani. Potrebno je izdelati poizvedbe z uporabo SQL stavkov in 10 od njih realizirati z uporabo relacijske algebre. Ocenjevanje: Na podlagi ocene seminarske naloge se izračunajo dodatne točke, ki se dodajo k točkam izpita. Ocena vaj lahko dvigne pisno oceno izpita na naslednji način: Ocena vaj Dodatne točke pisnega izpita 6 0 7 2 8 3 9 4

Laboratorijske Vaje PB1 VSP-Sezana v02

Embed Size (px)

Citation preview

Page 1: Laboratorijske Vaje PB1 VSP-Sezana v02

1

Laboratorijske vaje VSP-Sežana

Splošni podatki: asistent: AZ govorilna ura: na vajah, konzultacije na zadnjih vajah, govorilna ura v Ljubljani v

SREDO ob 10h vse informacije o predmetu: http://baze.fri.uni-lj.si

Vsebina vaj: relacijska algebra,

• koncepti, • vaje,

SQL DML

• osnovni SQL stavek, povezava z relacijsko algebro, • delo z množicami, • operatorji v SQL, • razširjeni SQL stavek,

DDL • kreiranje tabel, • podatkovni tipi, • integritetne omejitve, • indeksiranje (B, B+ drevesa, sintaksa v SQL), • pogledi,

Sočasna uporaba PB: • zaklepanje, • časovno označevanje,

Obnavljanje PB: • teorija, • dnevniki (naloge)

Seminarska naloga: Navodila za seminarsko nalogo se nahajajo na spletni strani. Potrebno je izdelati poizvedbe z uporabo SQL stavkov in 10 od njih realizirati z uporabo relacijske algebre.

Ocenjevanje: Na podlagi ocene seminarske naloge se izračunajo dodatne točke, ki se dodajo k točkam izpita. Ocena vaj lahko dvigne pisno oceno izpita na naslednji način: Ocena vaj

Dodatne točke pisnega izpita

6 0 7 2 8 3 9 4

Page 2: Laboratorijske Vaje PB1 VSP-Sezana v02

2

10 5 POZOR: Dodatne točke iz seminarske naloge se upošteva izključno, če na pisnem izpitu dosežete 50 ali več točk!

Pisni izpit pogoj za opravljanje pisnega izpita je narejena seminarska naloga, izpit sestavlja 4-5 nalog, trajanje izpita: običajno 60 minut.

Ustni izpit Opravljen pisni izpit je pogoj za pristop na ustni izpit.

Programska oprema

Netmeeting • Start Run conf • študenti se prijavijo na računalnik za prikaz.

Predstavitev orodja TOAD • TOAD predstavlja programsko orodje za delo s podatkovno bazo ORACLE. • Če hočemo orodje TOAD uporabljati z bazo ORACLE, moramo na računalnik

predhodno namestiti odjemalec ORACLE za delo s podatkovno bazo, ker TOAD uporablja določene knjižnice za delo s povezavo z bazo in konfiguracijsko datoteko tnsnames.ora.

• TNSNAMES.ORA je tekstovna datoteka, ki vsebuje opis povezav s podatkovnimi strežniki ORACLE in je nujno potrebna za vzpostavljanje povezave s podatkovno bazo.

Delovno okolje • Uporabljali bomo del podatkovne baze SKLADISCE. • Vsak študent ima v bazi ORACLE definirano svojo uporabniško shemo, v okviru

katere lahko kreira svoje objekte (tabele, indekse, constraint-e, trigger-je, poglede itd.) • Uporabniška shema se veže na določenega uporabnika, ki je v bazi ORACLE

opredeljen z uporabniškim imenom in geslom. • Vsako tabelo iz sheme vpis je mogoče kreirati v drugi uporabniški shemi, problemi se

pojavijo s constraint-i, zato bomo začetne poizvedbe izvajali kar nad shemo VPIS.

Vzpostavitev povezave s podatkovno bazo ORACLE • Vpisati je potrebno uporabniško ime in geslo in povezovalni niz: SKLADŠČE. S

povezovalnim nizom se preko datoteke tnsnames.ora vzpostavi povezava na podatkovno bazo.

Page 3: Laboratorijske Vaje PB1 VSP-Sezana v02

3

Windows XP Sežana: VSP študenti login: Ime Priimek password: prazno, potem si ga določijo OPOMBA: prijavijo se v domeno SEZANA ASISTENT login: azrnec password: 123 OPOMBA: prijavi se v domeno UCILNICE Podatkova baza ORACLE 10g: ŠTUDENTI: l: vpisna številka p: pb ASISTENT: l: azrnec p: pb vaje tnsnames.ora SKLADISCE = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = EDABARAN.FRI.UNI-LJ.SI)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = sklad) ) ) CREATE TABLE <ime tabele> AS SELECT…..;

Predstavitev komponent TOAD, potrebnih za delo • Predstavitev Shema Browserja. • Predstavitev objektov sheme. • Izvajanje poizvedb. • Izvajanje skripta. • Izvajanje skriptne datoteke. • Prikaz rezultatov. • Prikaz časa za izvedbo poizvedbe, od česa je čas odvisen.

Page 4: Laboratorijske Vaje PB1 VSP-Sezana v02

4

ORACLE Database 10g Release 2 (10.2.0.1) vir: http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.html PB namestite lokalno. Med inštalacijo vnesete geslo za system uporabnika. Do instance podatkovne baze dostopate preko spletnega vmesnika. Če hočete dostopati do PB z drugega računalnika, je potrebno omogočiti http dostop do podatkovne baze.

Page 5: Laboratorijske Vaje PB1 VSP-Sezana v02

5

Relacijski podatkovni model in relacijska algebra Temelje relacijskega podatkovnega modela je postavil E. Codd (1970). V okviru relacijskega podatkovnega modela so podatki logično strukturirani v relacije (tabele). Osnovni koncepti (gradniki) relacijskega podatkovnega modela:

• relacija, • atribut, • vrednostna množica (območje atributa - domena), • relacijska shema, • odvisnosti med atributi.

RELACIJA: Relacijo si lahko predstavljamo kot dvodimenzionalno tabelo s stolpci in vrsticami. Velja za logično strukturo podatkovne baze in ne za fizično.

ATRIBUT: Predpostavimo, da vsaka n-terica (tuple) v relaciji predstavlja določen objekt. Vsak objekt lahko okarakteriziramo z njegovimi lastnostmi, ki jih imenujemo atributi. Atribut predstavlja preslikavo objektov O v pripadajočo domeno Di: Ai: O Di Atribut je poimenovani stolpec relacije.

DOMENA: Domena je množica dovoljenih vrednosti enega ali več atributov, ki so vključeni v to domeno.

Ime Starost (v letih)

Teža (v kg)

Tine 15 50

Meta 20 45

Jure 40 80

Ana 5 10

Relacija

Ime Starost (v letih)

Teža (v kg)

Tine 15 50

Meta 20 45

Jure 40 80

Ana 5 10

Atribut relacije

Page 6: Laboratorijske Vaje PB1 VSP-Sezana v02

6

RELACIJSKA SHEMA: Vsaki relaciji pripada relacijska shema. Sestavljata jo oznaka relacijske sheme R in lista oznak atributov Ai s pripadajočimi oznakami domen Di: R={A1:D1, A2:D2, ...An:Dn} Relacijske sheme predstavljajo semantično komponento podatkovne baze. Iz njih naj bi bil razviden pomen relacij, ki tem shemam pripadajo. Oznaka relacijske sheme naj bi posredovala informacijo o pomenu relacije, oznake atributov pa pomen posameznih komponent v n-terica relacije.

ODVISNOSTI MED ATRIBUTI Sredstvo s katerim pri relacijskem modelu povemo, katere vrednosti relacij so veljavne ali bi lahko bile veljavne in katere sploh ne morejo obstajati, so ti. odvisnosti:

funkcionalne odvisnosti, večvrednostne odvisnosti in stične odvisnosti.

Lastnosti relacij • Ime relacije je enolično. V relacijski shemi podatkovne baze ni dveh relacij z enakim

imenom. • Vsaka celica tabele, ki predstavlja relacijo, vsebuje natančno eno atomarno

vrednost. • Vsak atribut relacije ima enolično ime. V isti relaciji ni dveh atributov, ki bi imel

isto ime. • Vrednosti nekega atributa so vse iz iste domene. • Vsaka n-terica relacije je enolična v relaciji ni dveh enakih n-teric. • Vrstni red atributov v relaciji je nepomemben. • Vrstni red n-teric v relaciji je nepomemben.

Ključ relacijske sheme Na podlagi opredelitve funkcionalnih odvisnosti lahko opredelimo še ključ relacijske sheme. Ker je relacija množica n-teric, so si v njej vse n-terice različne med seboj. Če se želimo sklicevati na posamezno n-terico, oziroma jo enolično identificirati, moramo navesti vrednosti atributov oziroma komponent, ki jo sestavljajo. V primeru, ko nastopajo v relacijski shemi funkcionalne odvisnosti, ni potrebno poznati vrednosti atributov, pač pa le tistih, ki zadoščajo za razlikovanje n-teric med seboj. Množici teh atributov pravimo ključ relacijske sheme.

Ime Starost (v letih)

Teža (v kg)

Tine 15 50

Meta 20 45

Jure 40 80

Ana 5 10

Relacija, predstavljena kot tabela

Shema relacije

Page 7: Laboratorijske Vaje PB1 VSP-Sezana v02

7

Def. ključa: Naj bodo atributi X podmnožica relacijske sheme R={ A1, A2, ...An} X je ključ relacijske sheme R, če sta izpolnjena naslednja dva pogoja:

X R ni res, da bi obstajal atribut A, tako da bi veljalo: A ⊂ X ∧ ((X-A) R)

Relacijski shemi lahko pripada tudi več ključev. Atributi, ki so vsebovani v enem od ključev relacijske sheme, se imenujejo osnovni atributi. Množica atributov, v kateri je vsebovan eden od ključev, se imenuje nadključ (superkey).

Poizvedovalni jeziki Poizvedovalni jeziki so specializirani jeziki za izvajanje poizvedb. Pogledali si bomo en formalen poizvedovalni jezik za pridobivanje podatkov iz relacij:

relacijska algebra (osnova za SQL): o Poizvedbe so sestavljene kot množice operacij nad podatki; vsaka poizvedba

korak za korakom opisuje kako pridemo do želenega rezultata. o Pravimo, da so poizvedbe opredeljene na proceduralni način.

Za primerjavo lahko omenimo: relacijski račun (osnova za QBE): V relacijskem računu se želeni rezultat poizvedbe samo opiše. Pravimo, da so poizvedbe opredeljene na deklarativen način.

Relacijska algebra Relacijska algebra predstavlja teoretični poizvedovalni jezik, ki definira operacije nad eno ali več relacij in s tem opredeli novo relacijo, ne da bi se pri tem spremenile originalne relacije. Iz tega sledi, da so tako operandi kot rezultati operacij relacije. Operacije relacijske algebre bomo razdelili v naslednje skupine:

enostavne operacije (unary operations): selekcija, projekcija, operacije nad množicami: unija, razlika, presek, kartezijski produkt, operacija preimenovanja, stične operacije: theta stik, ekvistik, naravni stik, (levi) zunanji-odprti stik, polstik

(semijoin), deljenje in operacije za agregacijo in grupiranje.

Za prikaz operacij uvedemo naslednje relacije: R: A B C a b c d a f c b d S: D E F b g a d a f

Selekcija )(RbB<σ

Page 8: Laboratorijske Vaje PB1 VSP-Sezana v02

8

A B C d a f

)(RdCbB =∧=σ A B C c b d V pogoju se lahko nahaja bolj kompleksen predikat sestavljen iz

pogojev, ki so povezani z logičnimi operatorji: AND, OR, NOT in vsebujejo različne primerjalne operatorje: <>,>=,<=, =, >, <.

Projekcija )(, RBAπ

A B a b d a c b Pri projekciji se nekatere vrstice lahko izgubijo, ker v relaciji ne sme obstajati biti enakih vrstic.

Unija R∪S A B C a b c d a f c b d b g a d a f R U S vrne instanco relacije, ki vsebuje vse n-terice, ki se pojavljajo ali v instanci relacije R ali instanci relacije S. Velja:

R in S morata biti za operacijo unije medsebojno kompatibilni; shema rezultata je enaka shemi relacije R.

Za dve relaciji pravimo, da sta kompatibilni, če sta izpolnjena naslednja 2 pogoja: o imata enako število polj, o istoležna polja od leve proti desni imajo isto domeno.

Relacija, ki predstavlja rezultat operacije unije ima atribute poimenovane enako kot leva relacija, ki se navaja v izrazu relacijske algebre.

Razlika R-S A B C a b c c b d

Page 9: Laboratorijske Vaje PB1 VSP-Sezana v02

9

R - S vrne instanco relacije, ki vsebuje vse n-terice, ki se nahajajo v relaciji R in hkrati ne v relaciji S.

R in S morata biti medsebojno kompatibilni; shema rezultata je identična shemi relacije R.

Presek R ∩ S

A B C d a f R presek S vrne instanco relacije, ki vsebuje vse n-terice, ki se nahajajo v obeh instancah relacij R in S hkrati.

R in S morata biti medsebojno kompatibilni; shema rezultata je identična shemi relacije R.

Operacijo preseka lahko izrazimo z enostavnimi operacijami: R ∩ S = R - (R - S)

Kartezijski produkt R × S A B C D E F a b c b g a a b c d a g d a f b g a d a f d a f c b d b g a c b d d a f R X S vrne instanco relacije, katere relacijska shema vsebuje vse atribute relacije R (isti vrstni red) in relacije S (isti vrstni red). R x S vsebuje po eno n-terico oblike <r,s> (r pripada R, s pripada S) za vsak par n-teric r in s. Za kartezijski produkt velja asociativnost: (R x S) x T = R x (S x T)

Operacija preimenovanja Izrazi relacijske algebre lahko postanejo zelo kompleksni. Kompleksnost lahko zmanjšamo tako, da izraz razbijemo na zaporedje enostavnejših izrazov, ki jim priredimo določena imena. Pri tem uporabimo operator prirejanja " ", s katerim se rezultat izraza relacijske algebre poimenuje (podobno kot pri prirejanju vrednosti spremenljivkam v programskih jezikih). Primer: Temp(A, B, C) )(,, RCBAπ Lahko pa kompleksnost zmanjšamo tudi z uporabo operacije preimenovanja, ki rezultatu izraza relacijske algebre priredi določeno ime (ime relacije), opcijsko pa dovoljuje tudi poimenovanje atributov v relaciji, ki predstavlja rezultat.

Page 10: Laboratorijske Vaje PB1 VSP-Sezana v02

10

ρS(E) ali ρS(a1, a2, a3,…,an)(E) Operacija preimenovanja predpiše rezultatu izraza relacijske algebre E novo ime S in opcijsko poimenuje atribute z a1, a2, a3, …, an. PRIMER: o ρCMM(sid1,B,C,sid2,E,F)(R x S)

Rezultat primera: CMM: sid1 B C sid2 E F a b c b g a a b c d a f d a f b g a d a f d a f c b d b g a c b d d a f

Theta stik: Θ - stik

Θ opredeljuje logični pogoj. Theta stik je opredeljen na naslednji način:

SRΘ>< = )( SR ×Θσ

Simbol theta označuje predikat. Za prikaz operacij spremenimo tabeli R in S: R: A B C 1 2 3 4 5 6 7 8 9 S: D E 3 1/2 6 2 -podatek 2 je za primer EKVISTIKA Primeri:

SRDB<

><

A B C D E 1 2 3 3 1 1 2 3 6 2 4 5 6 6 2

Page 11: Laboratorijske Vaje PB1 VSP-Sezana v02

11

Ekvistik SR

EB=><

A B C D E 1 2 3 3 2 1 2 3 6 2 - stolpca B in E sta enaka EKVISTIK

Naravni stik Naravni stik je definiran kot ekvistik nad vsemi skupnimi stolpci iz relacij R in S. Če dve relaciji nimata skupnih atributov, potem je naravni stik med R in S enak kartezijskemu produktu med R in S!

SR>< = ekvistik \ podvojeni stolpci

A B C

B C D

A B C B C D

A B C D

Odprti stik (zunanji stik) Pogosto se zgodi, da pri združevanju relacij neka n-terica v prvi relaciji nima ustrezne n-terice iz druge relacije. Z drugimi besedami: v povezovalnih atributih ni ustreznih vrednosti, v katerih bi se n-terici ujemali. Včasih bi kljub temu radi, da se n-terica, za katero v drugi relaciji ne obstaja ujemalnih n-teric, pojavi v rezultatu. To je možno doseči z uporabo odprtega stika. R: A B a 1 b 2 S: B C 1 x 1 y 3 z Levi odprti stik:

SR f< A B C a 1 x a 1 y b 2 NULL

Page 12: Laboratorijske Vaje PB1 VSP-Sezana v02

12

Opomba: Če nad rezultatom izvedemo projekcijo po atributih A in B, dobimo vse podatke iz začetne relacije R. Vidimo, da so se vse n-terice iz relacije R uvrstile v rezultat. Levi odprti stik (left outer join) predstavlja stik, pri katerem n-terice iz relacije R, katerim ne pripadajo nobene n-terice iz relacije S, kljub temu uvrstimo v rezultat. Manjkajoče vrednosti iz druge relacije (relacije S) se pri tem nadomesti z NULL. Primer: Izpišite imena in priimke vseh oseb, vključno s kraji prebivališč:

PREDNOSTI: Prednost levega zunanjega stika je v tem, da se podatki, ki se pri drugih tipih stikov izgubijo, tukaj ohranijo (v levi tabeli, v našem primeru v tabeli R). Poleg levega zunanjega stika poznamo tudi desnega. Pri tem se ohranijo v rezultatu vse n-terice desne relacije (v našem primeru iz relacije S). Obstaja pa tudi popolni zunanji stik, ki ohranja vse n-terice v obeh relacijah, pri tem pa manjkajoče vrednosti atributov v obeh relacijah nadomesti z NULL. Desni odprti stik:

SR >p A B C a 1 x a 1 y NULL 3 z Opomba: Če nad rezultatom izvedemo projekcijo po atributih B in C, dobimo vse podatke iz začetne relacije S. Vidimo, da so se vse n-terice iz relacije S uvrstile v rezultat. Popolni zunanji stik:

Page 13: Laboratorijske Vaje PB1 VSP-Sezana v02

13

SR fp A B C a 1 x a 1 y b 2 NULLNULL 3 z Opomba: N-terice iz obeh relacij se v rezultatu ohranijo..

Polstik

)( SRSR FAF ><> Π= to je pravzaprav pol-theta-stik, obstaja pa tudi pol-naravni-stik. F: pogoj, ki velja pri theta stiku. A: množica atributov relacije R. Za polstik je značilno, da se v relaciji, ki predstavlja stik, ohranijo le atributi 1. relacije.

Deljenje Predpostavimo, da imamo relaciji R in S. Relacija R ima množico atributov A, relacija S pa množico atributov B, tako da velja:

AB ⊆ Naj bo C = A - B Operacijo deljenja lahko zapišemo z elementarnimi operacijami na naslednji način: R/S ali

)))((()( RRSRSR CCC −Π×Π−Π=÷ R: A B a x a y a z b x c y

S: B x z

SR ÷ A a

Agregacija τAL(R)

Page 14: Laboratorijske Vaje PB1 VSP-Sezana v02

14

Agregacija uporabi seznam funkcij agregacije AL nad relacijo R. AL vsebuje enega ali več parov (<funkcija agregacije>, <atribut>). Agregacijske funkcije: COUNT - vrne število vrednosti v stolpcu. SUM - vrne vsoto vrednosti v stolpcu. AVG - vrne povprečje vrednosti v stolpcu. MIN - vrne minimum v stolpcu. MAX - vrne maksimalno vrednost v stolpcu. R: A B C a m 10 b d 20 b d 30 c g 5 d a 10 d b 40 d b 50 ρR(Maksimum)(τMAX C (R)): R: Maksimum 50

Grupiranje

GAτAL(R); splošna oblika grupirne funkcije izgleda takole: GA: atributi po katerih se grupira n-terice v relaciji R, AL: lista funkcij agregacije a1, a2, …, an τ <Ap ap>, <Aq aq>,…,<Az az>(R) R: relacija, a1, a2, …, an: atributi relacije R po katerih se izvede grupiranje (določajo strukturo grup), ap, aq, …, az: preostali atributi relacije R, Ap, Aq,…,Az: funkcije agregacije. ρR(A, Vsota) (AΤSUM C (R)): R: A Vsota a 10 b 50 c 5 d 100

Page 15: Laboratorijske Vaje PB1 VSP-Sezana v02

15

Vaje 1 (vaje relacijska algebra): KUPUJE K Stranka Operater Marko Mobitel Marko Simobil Meta Mobitel Meta Vega Meta Simobil Janez Simobil Petra Mobitel PRODAJA P Operator Telefon Mobitel Nokia Mobitel Siemens Vega Nokia Vega SE Simobil Nokia Simobil Siemens Simobil SE NAJRAJE N Stranka Telefon Marko Siemens Meta Nokia Janez Siemens Petra Nokia 1. Katere stranke kupujejo pri operaterju Mobitel? RA: odg = ))(( '' KMobitelOperatorStranka =σπ Stranka Marko Meta Petra 2. Katere mobilne telefone lahko kupuje Petra, glede na to, da kupuje le pri nekaterih

operaterjih, pri katerih prodajajo le nekatere vrste mobilnih telefonov? RA: odg = )(( '' PKPetraStrankaTelefon ><=σπ Telefon Nokia Siemens

Page 16: Laboratorijske Vaje PB1 VSP-Sezana v02

16

3. Pri katerih operaterjih prodajajo Janezov najljubši telefon? vsaj enega: RA: odg = ))(( '' PNJanezStrankaoperater ><=σπ vse najljubše: RA: odg = ))((/ '' NP JanezStrankaTelefon =σπ Operator Mobitel Simobil 4. Katere stranke kupujejo pri vseh operaterjih, ki so navedeni v relaciji P? RA: odg = )(/ PK Operaterπ Stranka Meta Vaje 2 (relacijska algebra): 1. STRANKA (sid, sime, spriimek, starost, naslov) S 2. PRODAJALEC (pid, pime, ppriimek, starost, popust) P 3. GSM (gid, tip-gsm, cena) G 4. KUPČIJA (sid, pid, gid, datum, kosov) K 1. Izpišite imena in priimke tistih strank, ki so iz Kranja in so stare nad 18 let: RA: odg= ))(( ''18, STRANKAKranjnaslovstarostspriimeksime =∧>σπ 2. Izpišite imena strank, ki so iz kopra ali iz Pirana in so stara manj kot 18 let: RA: odg= ))(( )'''(18, STRANKAPirannaslovKopernaslovstarostspriimeksime =∨=∧<σπ 3. Izpišite imena in priimke strank, ki so kdajkoli že kaj kupile (ter imena in priimke

strank, ki še niso nič kupile, če predpostavimo, da imamo stranke že vnaprej vnesene). RA: odg= )(, KUPCIJASTRANKAspriimeksime ><π RA: odg= )()( ,, KUPCIJASTRANKASTRANKA spriimeksimespriimeksime ><ππ −

Page 17: Laboratorijske Vaje PB1 VSP-Sezana v02

17

4. Izpišite imena in priimke prodajalcev, ki so do sedaj prodali le GSM-je tipa nokia. RA: odg=

))(())(( '','', KGPKGP NOKIAgsmtipppriimekpimeNOKIAgsmtipppriimekpime ><><><>< <>−=− − σπσπ Opomba: Projekcije v tem primeru ne smemo izpostaviti, čeprav na prvi pogled zgleda da bi to lahko storili. Problem je naslednji. Če bi najprej izvedli samo razliko, potem se vrstici (Janez, Novak, Nokia) in (Janez, Novak, Ericsson) ne bi odšteli, čeprav Janez Novak prodaja ne samo Nokie in zaradi tega ne sme iti v rezultat. 5. Izpišite vse tipe GSM aparatov in skupno število prodanih kosov po posameznih tipih. RA: odg=

)))((( ),(, KGSUMkosovgsmtipkolicinagsmtipRkolicinagsmtip f<τρπ −−− Opomba: Če ne uporabimo levega odprtega stika, dobimo v rezultatu samo tipe telefonov, ki so jih kdaj prodali (in njihove količine), ne pa tudi telefonov, ki se nahajajo v tabeli GSM in se še niso prodajali. Vaje 3 (relacijska algebra) Podane so naslednje relacijske sheme: Employee (empNo, eName, salary, position) Aircraft (aircraftNo, aName, aModel, flyingRange) Flight (flightNo, from, to, flightDistance, departTime, arriveTime) Certified (empNo, aircraftNo) kjer Employee vsebuje podatke o zaposlenih (pilotih in ne-pilotih), AirCraft vsebuje podatke o letalih, Flight vsebuje podatke o letih, Certified pa vsebuje podatke o tem, kateri zaposleni lahko leti s katerim letalom. 1. Poiščite vse podatke o letalih Boeing. RA: Π empNo, eName, salary, position (σaName = ‘Boeing’(Aircraft)) 2. Poiščite vse podatke o Boeing 737 letalih. RA: ΠaircraftNo, aName, aModel, flyingRange (σaName = ‘Boeing’ ∧ aModel= ‘737’ (Aircraft)) 3. Poiščite idente pilotov, ki imajo certifikat za letenje z Boeing-i. RA: ΠempNo (σaName = ‘Boeing’(Aircraft)►◄aircraftNo Certified) 4. Poiščite vsa taka letala, ki so brez postankov zmožna leteti iz Glasgowa do New Yorka

(flyingRange > flightDistance). RA: ΠaircraftNo(σflyingRange > flightDistance(σfrom=‘Glasgow’ ∧ to=‘New York’(Flight) X Aircraft))

Page 18: Laboratorijske Vaje PB1 VSP-Sezana v02

18

5. Poiščite idente zaposlenih, ki imajo najvišji osebni dohodek. RA: Da bi odgovorili na zastavljeno vprašanje, poiščemo najprej vse zaposlene, ki nimajo najvišjega osebnega dohodka in jih odštejemo od originalnega seznama zaposlenih. Na ta način dobimo seznam zaposlenih z najvišjim osebnim dohodkom. ρE1(Employee) ρE2(Employee) ρE3(ΠE2.empNo(E1►◄E1.salary > E2.salary E2) ΠempNo(E1) – E3 alternativna rešitev:

))((/()(: )(, EmployeeEmployeeRA MAXsalarysalaryRsalaryempNo τρπ 6. Poiščite idente zaposlenih, ki imajo certifikat za letenje z natančno tremi letali. RA: Da bi lahko odgovorili na to vprašanje, najprej poiščemo zaposlene, ki imajo certifikat za letenje z vsaj tremi letali, nato poiščemo zaposlene, ki imajo certifikat za letenje z vsaj štirimi letali. Razlika med omenjenima množicama je ravno množica zaposlenih, ki so certificirani za letenje z natančno tremi letali. ρC1(Certified) ρC2(Certified) ρC3(Certified) ρC4(Certified) ρC5(ΠempNo((σ(C1.empNo=C2.empNo=C3.empNo) ∧ (C1.aircraftNo<>C2.aircraftNo<>C3.aircraftNo) (C1 X C2 X C3))) ρC6(ΠempNo((σ(C1.empNo=C2.empNo=C3.empNo=C4.empNo) ∧ (C1.aircraftNo<>C2.aircraftNo<>C3.aircraftNo<>C4.aircraftNo) (C1 X C2 X C3 X C4))) odg=C5 – C6 Vaje 4 (vaje relacijska algebra): HOTEL (hotelNo, hotelNname, city) H ROOM (roomNo, hotelNo, type, price) R BOOKING (hotelNo, guestNo, dateFrom, dateTo, roomNo) B GUEST (guestNo, guestName, guestAddress) G 1. Izpišite vse enoposteljne sobe, katerih cena je pod 50$ na dan. RA: odg=

))(( 50'' RpricenaenoposteljtyperoomNo <∧=σπ 2. Izpišite številko, ceno in tip sob v hotelu Grosvenor.

Page 19: Laboratorijske Vaje PB1 VSP-Sezana v02

19

RA: odg=

))(( '',, HRGrosvenhotelNamepricetyperoomNo ><=σπ 3. Izpišite imena vseh gostov, ki se trenutno nahajajo v hotelu Grosvenor in tipe ter cene

sob, v katerih se nahajajo. RA: odg=

)))))((((( '',,, GHBR dateTotodaydateFromtodayGrosvenrhotelNameroomNoguestNopricetypeguestName ><><>< =<∧>=∧=σππ Opomba: Projekcije uporabimo zato, da ne bi pri izvedbi naravnega stika med relacijami (B-H) in R ne prišlo do povezave po atributih roomNo in hotelNo. ali RA: odg=

))))()(((( '',,, RGHB GrosvenrhotelNamedateTotodaydateFromtodayroomNoguestNopricetypeguestNam ><><>< ==<∧>= σσππ 4. Izpišite vse podatke o vseh sobah v hotelu Grosvenor, vključno z imenom gosta v sobi,

v primeru, da je soba trenutno zasedena. RA: odg=

)))((())(((

,,

'',,,

GBHR

dateTotodaydateFromtodayguestNamehotelNoroomNo

GrosvenorhotelNameguestNamepricetyperoomNo

><

f<>

<∧>

=

σπ

σπ

Opomba: Druga projekcija ni potrebna. Dodana je zaradi večje jasnosti rešitve.

Page 20: Laboratorijske Vaje PB1 VSP-Sezana v02

20

SQL Oracle si prizadeva, da bi njihov SQL ustrezal industrijsko sprejetim standardom. Poleg tega aktivno sodeluje v različnih telesih za standardizacijo jezika SQL, kot sta ANSI in ISO. Obe telesi za standarde sta SQL sprejeli kot standardni jezik za relacijske podatkovne baze. Standard SQL (Structured Query Language) je do danes doživel več revizij (vir: Wikipedia): Year Name Alias Comments 1986 SQL-86 SQL-87 First published by ANSI. Ratified by ISO in 1987. 1989 SQL-89 FIPS 127-1 Minor revision, adopted as FIPS 127-1.

1992 SQL-92 SQL2, FIPS 127-2

Major revision (ISO 9075), Entry Level SQL-92 adopted as FIPS 127-2.

1999 SQL:1999 SQL3 Added regular expression matching, recursive queries, triggers, support for procedural and control-of-flow statements, non-scalar types, and some object-oriented features.

2003 SQL:2003 Introduced XML-related features, window functions, standardized sequences, and columns with auto-generated values (including identity-columns).

2006 SQL:2006

ISO/IEC 9075-14:2006 defines ways in which SQL can be used in conjunction with XML. It defines ways of importing and storing XML data in an SQL database, manipulating it within the database and publishing both XML and conventional SQL-data in XML form. In addition, it provides facilities that permit applications to integrate into their SQL code the use of XQuery, the XML Query Language published by the World Wide Web Consortium (W3C), to concurrently access ordinary SQL-data and XML documents.

Vsak proizvajalec v okviru svoje relacijske podatkovne baze podpre nek SQL standard. Poleg tega pa ponudi tudi svoje rešitve, iz česar izhajajo različni dialekti jezika SQL.

Oblika klasičnega SQL stavka SELECT A1, A2,… Ak FROM T1, T2,… Tn WHERE P;

Enostavni primeri Projekcija: SELECT A1,A2,…An FROM T; Selekcija: SELECT A1,A2,…An FROM T WHERE P; Stik: SELECT T1.A1, T2.A1 FROM T1, T2 WHERE T1.A3=T2.A3;

Page 21: Laboratorijske Vaje PB1 VSP-Sezana v02

21

Primeri za na tablo: Za primer vzemi 4 tabele: 1. stranka (sid, sime, mesto, popust) 2. agent (aid, aime, mesto, procent) 3. izdelek (iid, iime, mesto, zaloga, cena) 4. narocilo (nid, mesec, sid, aid, iid, kosov, koncna_cena) 1. Izpiši imena in idente kranjskih agentov: SELECT aid, aime FROM agent WHERE mesto=’Kranj’; -- SQL je občutljiv na velike črke pri vrednostih atributov, drugače pa ne. če je vrednost numerična ne potrebujemo narek. 2. Izpiši vse podatke vseh strank: SELECT * -- * pomeni vse atribute – projekcija na vse atribute FROM stranka; 3. Izpiši idente izdelkov, ki so bili kdaj naročeni SELECT DISTINCT iid -- DISTINCT eliminira duplikate FROM narocilo; SELECT po definiciji izpisuje duplikate. Če hočemo vse izpisati lahko to explicitno zahtevamo z ukazom ALL (namesto DISTINCT) (1-22, 1-23). 4. Izpiši vse pare (sime, aime), kjer je sime naročil nekaj pri aime: stranka: sid sime

naročilo: sid aid

agent: aid aime

SELECT stranka.sime, agent.aime FROM stranka, narocilo, agent WHERE stranka.sid=narocilo.sid AND narocilo.aid=agent.aid -- v zadnji vrstici je ime tabele potrebno, ker imamo isto ime atributa v več tabelah. Vrstni red pri AND za pomen ni pomemben, razen za performance -- logični operatorji: (2-15, 2-16, 2-17, 2-18) 5. Za vsako naročilo izračunaj čisti dobiček: dobiček=0.40 X kosov X cena enega kosa - (popust+marza)/100 X kosov X cena enega kosa

Page 22: Laboratorijske Vaje PB1 VSP-Sezana v02

22

SELECT n.nid, n.sid, n.aid, n.iid, 0.40*(n.kosov*i.cena)-0.01*(s.popust+a.procent)*(n.kosov*i.cena) AS dobicek FROM narocilo n, stranka s, agent a, izdelek I WHERE s.sid=n.sid AND n.aid=a.aid AND n.iid=i.iid; -- z “AS” povemo, kako bo ime stolpcu z izračunanimi vrednostmi. Rezultat: n.nid n.sid n.aid n.iid dobicek izračun dobička: (1-9, 1-10, 1-11) preimenovanje atributa: (1-17, 1-18, 1-19, 1-20, 1-21) 6. Izpiši vse pare strank, ki imajo sedež v istem mestu: Stranka: sid mesto A Lj B Nm C Lj D Lj

Stranka: sid mesto A Lj B Nm C Lj D lj

SELECT s1.sime, s2.sime --moramo preimenovati obe tabeli, ker se drugače ne moremo sklicevati na vsako posebej (4-12) FROM stranka s1, stranka s2 WHERE s1.mesto=s2.mesto AND s1.sid<s2.sid; --drugi pogoj je zato, da ne izpiše A, B in B, A kar je isto! 7. Izpiši idente izdelkov, ki sta jih naročili vsaj 2 stranki: Naročilo: sid iid

Naročilo: sid iid

SELECT DISTINCT n1.iid FROM narocilo n1, narocilo n2 WHERE n1.iid=n2.iid AND n1.sid <> n2.sid; -- če damo ta primerjalni operator se pojavi: A, B in B, A zato raje uporabimo < ali > ORACLE SINTAKSA: Ekvistik: normalen SQL stavek - stolpec po katerem stikamo je podvojen (4-9) Levi in desni zunanji stik: (4-17, 4-18)

Page 23: Laboratorijske Vaje PB1 VSP-Sezana v02

23

Povezovanje tabel v SQL: Sintaksa 1999 kartezični produkt: (4-23) naravni stik: (4-24) stik z uporabo USING - s tem se natančno opredeli, po katerem stolpcu se stik izvaja: (4-

26). Ime povezovalnega stolpca ne sme imeti pred seboj imena tabele. (pomembno) stik z uporabo ON - s tem se opredeli različne pogoje za povezovanje: (4-28,

4-29) levi zunanji stik: (4-32) desni zunanji stik: (4-33) popolni zunanji stik: (4-34)

Primerjalni operatorji (2-7): = Je enako != ali <> Različno > Večje >= Večje ali enako < Manjše <= Manjše ali enako IN Equal to any member of a list BETWEEN Between two values, inclusive LIKE Similar to a character pattern NULL Unknown NOT Reverses any of the preceeding four

operators Prioriteta operatorjev: aritmetičnih, logičnih in ostalih omenjenih: (2-19)

Page 24: Laboratorijske Vaje PB1 VSP-Sezana v02

24

Vaja: Študenti s pomočjo SQL praktično realizirajo poizvedbe. Z uporabo skripta kreiraj_GSM.sql kreirajo tabele iz Vaje 1 (relacijska algebra) in izdelajo poizvedbe. Skripto dobijo na spletni strani. Skripta: CREATE TABLE PRODAJA ( OPERATER VARCHAR2(10), TELEFON VARCHAR2(10) ); CREATE TABLE KUPUJE ( STRANKA VARCHAR2(10), OPERATER VARCHAR2(10) ); CREATE TABLE NAJRAJE ( STRANKA VARCHAR2(10), TELEFON VARCHAR2(10) ); Insert into KUPUJE (STRANKA, OPERATER) Values ('Marko', 'Mobitel'); Insert into KUPUJE (STRANKA, OPERATER) Values ('Marko', 'Simobil'); Insert into KUPUJE (STRANKA, OPERATER) Values ('Meta', 'Mobitel'); Insert into KUPUJE (STRANKA, OPERATER) Values ('Meta', 'Vega'); Insert into KUPUJE (STRANKA, OPERATER) Values ('Meta', 'Simobil'); Insert into KUPUJE (STRANKA, OPERATER) Values ('Janez', 'Simobil'); Insert into KUPUJE (STRANKA, OPERATER) Values ('Petra', 'Mobitel'); Insert into NAJRAJE (STRANKA, TELEFON) Values ('Petra', 'Nokia'); Insert into NAJRAJE (STRANKA, TELEFON) Values ('Janez', 'Siemens'); Insert into NAJRAJE (STRANKA, TELEFON) Values ('Meta', 'Nokia'); Insert into NAJRAJE (STRANKA, TELEFON) Values ('Marko', 'Siemens'); Insert into PRODAJA (OPERATER, TELEFON) Values ('Simobil', 'SE'); Insert into PRODAJA (OPERATER, TELEFON) Values ('Simobil', 'Siemens');

Page 25: Laboratorijske Vaje PB1 VSP-Sezana v02

25

Insert into PRODAJA (OPERATER, TELEFON) Values ('Simobil', 'Nokia'); Insert into PRODAJA (OPERATER, TELEFON) Values ('Vega', 'SE'); Insert into PRODAJA (OPERATER, TELEFON) Values ('Vega', 'Nokia'); Insert into PRODAJA (OPERATER, TELEFON) Values ('Mobitel', 'Siemens'); Insert into PRODAJA (OPERATER, TELEFON) Values ('Mobitel', 'Nokia');

1. Katere stranke kupujejo pri operaterju Mobitel? 2. Pri katerih mobilnih operaterjih kupuje Petra? 3. Katere mobilne telefone lahko kupuje Petra, glede na to, da kupuje le pri nekaterih

operaterjih, pri katerih prodajajo le nekatere vrste mobilnih telefonov? 4. Pri katerih operaterjih prodajajo Janezov najljubši telefon? 5. Izpišite katere telefone prodaja posamezni operater. Izpis naj ima naslednjo obliko:

Operater prodaja telefon Mobitel prodaja telefone znamke Nokia … …

REŠITVE: 1. SELECT stranka FROM kupuje WHERE operater = 'Mobitel'; 2. SELECT operater FROM kupuje WHERE stranka = 'Petra'; 3. SELECT p.telefon FROM kupuje k, prodaja p WHERE stranka='Petra' AND k.operater=p.operater; 4. SELECT operater FROM prodaja p, najraje n WHERE stranka = 'Janez' AND p.telefon=n.telefon; 5. SELECT operater || ' prodaja telefone znamke ' || telefon AS »Operater prodaja telefon« FROM prodaja;

Page 26: Laboratorijske Vaje PB1 VSP-Sezana v02

26

Primeri: BETWEEN (2-10): value1 =< X =< value2 SELECT a1,a2,… FROM t1, t2,… WHERE t1.a1 BETWEEN value1 AND value2; LIKE (2-12, 2-13): SELECT a1,a2,… FROM t1, t2,… WHERE t1.a1 LIKE ‘43%’; --string kakršnekoli dolžine LIKE ‘4_’; --en znak Kaj pa če hočemo poiskati v nizu tudi % ali _? Uporabimo "escape characterje". Primer: Hočemo izpisati stringe, ki vsebujejo SA_ SELECT employee_id, last_name, job_id FROM employees WHERE job_id LIKE '%SA\_%' ESCAPE '\'; ESCAPE ukaz določa, kaj je escape character. Uporaba NULL v selekcijskem pogoju: (2-14) 6. Izpiši idente strank, ki so naročile vsaj en izdelek, ki ga je prodal tudi agent A6: Naročilo: sid iid ? x

Naročilo: sid iid aid x a6

SELECT DISTINCT n1.sid FROM narocilo n1, narocilo n2 WHERE n1.iid=n2.iid AND n2.aid=’a6’; MNOŽICE: 7. Izpiši imena in popuste strank, ki so naročile kaj pri agentu iz Kranja ali Kopra; 1. način: SELECT sime, popust FROM stranke WHERE /* sid je naročil pri agentu iz Kranja ali Kopra */ sid IN (SELECT sid FROM narocilo WHERE /* aid je iz Kranja ali Kopra */

Page 27: Laboratorijske Vaje PB1 VSP-Sezana v02

27

aid IN (SELECT aid FROM agent WHERE mesto IN (‘Kranj’, ‘Koper’))); (2-11) 2. način: SELECT DISTINCT sid FROM narocilo WHERE /* aid, ki je prodal, je iz Kranja ali Kopra */ /* aid {aid | aid je identifikacija agenta iz Kranja ali Kopra} */ aid IN (SELECT aid FROM agent WHERE mesto=’Kranj’ OR mesto=’Koper’); 8. Izpiši imena strank, ki so naročile izdelek P5: 1. način: SELECT DISTINCT sime FROM stranka, narocilo WHERE stranka.sid=narocilo.sid AND narocilo.iid=’P5’; 2. način: SELECT sime FROM stranka WHERE /* P5 je med izdelki, ki jih je naročil sime */ ‘P5’ IN (SELECT iid FROM narocilo WHERE sid=stranka.sid); /* ime sid se nanaša na najbljižjo tabelo, lahko pa dodamo: narocilo.sid Operatorji nad množicami:

Operator Opis UNION Vse vrstice iz vseh množic

(brez duplikatov) INTERSECT Presek množic MINUS Vrstice, ki so samo v prvi

množici UNION ALL Vse vrstice iz vseh množic (z

duplikati) ANY, ALL operatorja: (6-14) Primeri za ANY: • WHERE x < ANY (SELECT y…); • WHERE x = ANY (SELECT y…);

Page 28: Laboratorijske Vaje PB1 VSP-Sezana v02

28

• WHERE x <> ANY (SELECT y…); Primeri za ALL: • WHERE x < ALL (SELECT y…); • WHERE x = ALL (SELECT y…); • WHERE x <> ALL (SELECT y…); 9. Izpiši idente tistih agentov, ki imajo najnižji odstotek provizije: SELECT aid FROM agent WHERE procent <= ALL (SELECT procent FROM agent); -- tukaj ni potreben selekcijski pogoj 10. Izpiši ident agentov, ki nimajo najvišjega odstotka provizije: SELECT aid FROM agent WHERE procent < ANY (SELECT procent FROM agent); Uporaba spremenljivk v SQL stavkih Spremenljivko definiramo na naslednji način: &ime_spremenljivke. SELECT aid FROM agent WHERE mesto='&ime_kraja';

Page 29: Laboratorijske Vaje PB1 VSP-Sezana v02

29

Vaja 1 V podatkovni bazi kreirajte tabele S, P, J, SPJ (podobno kot za seminarsko nalogo) z uporabo skriptne datoteke, ki jo dobite na spletni strani predmeta. Izvedite naslednja povpraševanja: 1. Poiščite imena tistih trgovcev, ki imajo status večji od 20 in so iz Pariza. 2. Poiščite imena delov, katerih teža znaša vsak 17 kg in so rdeči. 3. Poiščite imena trgovcev, ki so v okviru ene kupčije prodali največ kosov določenega dela. 4. Poiščite imena trgovcev, ki so prodajali projektom iz Athen. 5. Poiščite imena delov, ki se do sedaj še niso prodajali. 6. Poiščite imena delov, si sta jih prodajala vsaj dva različna trgovca. 7. Poiščite trgovce, ki so prodajali projektom iz mesta London. 8. Poiščite imena delov, ki so jih kupovali hkrati projekti iz Osla in Pariza. REŠITVE: 1: select sname from s where city='Paris' AND status>20; 2: select pname from p where weight=17 and color='Red'; 3: SELECT sname FROM s WHERE s# IN (SELECT s# FROM spj WHERE qty>=ALL ( SELECT qty FROM spj)) SELECT sname FROM s, spj WHERE s.s#=spj.s# AND qty>=ALL ( SELECT qty FROM spj) 4: SELECT DISTINCT sname FROM s,spj,j WHERE s.s#=spj.s# AND

Page 30: Laboratorijske Vaje PB1 VSP-Sezana v02

30

spj.j#=j.j# AND j.city='Athens'; 5: SELECT pname FROM p WHERE p# NOT IN (SELECT p# FROM spj); (SELECT pname FROM p) MINUS (SELECT pname FROM p, spj WHERE p.p#=spj.p#); 6: select distinct x1.p#, p.pname from spj x1, spj x2, p where x1.p#=x2.p# AND x1.s#>x2.s# AND x1.p#=p.p# order by x1.p# 7: SELECT DISTINCT spj.s#,sname FROM s,spj,j WHERE s.s#=spj.s# AND spj.j#=j.j# AND j.city='London'; 8: (SELECT pname FROM p, spj, j WHERE p.p#=spj.p# AND spj.j#=j.j# AND j.city='Paris') INTERSECT (SELECT pname FROM p, spj, j WHERE p.p#=spj.p# AND spj.j#=j.j# AND j.city='Oslo')

Page 31: Laboratorijske Vaje PB1 VSP-Sezana v02

31

Klasifikacija SQL ukazov v skupine:

DDL (Data Definition Language): • CREATE (kreiranje tabele) • ALTER (razširjanje tabele s stolpci, spreminjanje stolpca) • DROP (uničenje tabele, stolpca) Primeri: KREIRANJE TABEL: (9-4 (naming rules), 9-5, 9-8) CREATE TABLE table_name

(column_name1 datatype() NULL|NOT NULL, … column_name2 datatype() NULL|NOT NULL);

--do 30 znakov za ime stolpca Namesto TABLE: USER, VIEW,… RAZŠIRJANJE TABELE S STOLPCI: (9-23) ALTER TABLE table_name

ADD (column_name datatype()); (9-25) ALTER TABLE table_name

DROP COLUMN column_name; UNIČENJE TABELE: (9-27) DROP TABLE table_name; Namesto TABLE: USER, VIEW Koristno tudi: (9-19) CREATE TABLE <ime tabele> AS SELECT …..

DCL (Data Control Language): • GRANT (podelitev pravice) • REVOKE (odvzem pravice)

Primeri:

Page 32: Laboratorijske Vaje PB1 VSP-Sezana v02

32

GRANT role_name TO user; REVOKE role_name FROM user; Nekaj o pravicah: Varnost je zagotovljena z:

• uporabniškimi imeni in gesli (kontrola dostopa do ORACLA) • vlogami (nadzor dostopa na nivoju PB) • privilegijami (za nadzor dostopa na nivoju tabel) • sinonimi (za nadzor dostopa na nivoju tabel) - tako kot alias (definira se prijaznejše

ime za določen objekt v PB) DBA (Data Base Admionistrator) dela nove userje z SQL ukazom: CREATE USER username IDENTIFIED BY password; Uniči pa jih z: DROP USER username; Geslo se zamenja z: ALTER USER username IDENTIFIED BY newpass; Oracle zagotavlja 3 default vloge, ko se baza kreira: • DBA • RESOURCE • CONNECT Vloga Dovoljuje uporabniku CONNECT • Povezavo s podatkovno bazo

• Manipulacijo s podatki v tabelah na katerih ima pravico

RESOURCE • Vse kot CONNECT • Kreiranje objektov v PB • Dodeljevanje pravic drugim uporabnikom nad svojimi

objekti

DBA • Vključuje vse prejšnje pravice in še • Lahko kreira PB • Zažene in zaustavi (shutdown) bazo • Kreira uporabnike • Izdeluje varnostne kopije in restavrira celotno ali del

PB

Page 33: Laboratorijske Vaje PB1 VSP-Sezana v02

33

DML (Data manipulation Language): (8-3 ) • SELECT (poizvedba) • INSERT (vnos, najmanjša enota pri vnosu je ena vrstica) • UPDATE (posodabljanje, najmanjša enota je stolpec v vrstici) • DELETE (brisanje, najmanj kar lahko brišemo je ena vrstica) Primeri: VSTAVLJANJE VRSTIC V TABELO: (8-5, 8-6) INSERT INTO table_name(attribut1, attribut2, attribut3) VALUES (‘value1’, ‘value2’, ‘value3’); Števila se ne vpisuje v narekovajih. S to sintakso je možno vnesti samo eno vrstico naenkrat. Možno je dodajati tudi vrstice z NULL vrednostmi. (8-7) Tabelo lahko polnimo tudi na podlagi vrednosti iz druge tabele. (8-11) POSODABLJANJE VRSTIC V TABELI: (8-13, 8-14, 8-15) integrity constraints napake: (8-17) UPDATE table_name SET column_name=expression|NULL WHERE condition; --pogoj, katere vrstice updateamo, če pogoj izpustimo, se posodobijo vse vrstice. Posodablja se lahko več stolpcev v vrstici naenkrat. BRISANJE VRSTIC IZ TABELE: (8-19, 8-20) DELETE FROM table_name WHERE condition; --pove katere vrstice se izbriše, če ga izpustimo, se pobrišejo vse Če iz tabele pobrišeš vse vrstice, ta še vedno obstaja v PB!!!

TPO (Transaction Processing Option): (8-38, 8-39, 8-40) S tema dvema ukazoma se zagotavlja konsistentnost (kaj je to) podatkovne baze!

• COMMIT (uveljavi transakcijo): podatki se v PB uveljavijo in postanejo vidni drugim uporabnikom,

• ROLLBACK (razveljavi transakcije od zadnjega commita naprej): uporabnik razveljavi operacije.

Lahko nastaviš: AVTOCOMMIT ON ali AVTOCOMMIT OFF (default). Osnovni podatkovni tipi v ORACLE-u (9-11): CHAR[(size)] Fixed-length character data of length size

bytes. Maximum size is 2000 bytes. Default and minimum size is 1 byte.

Page 34: Laboratorijske Vaje PB1 VSP-Sezana v02

34

VARCHAR2(size) [byte|char] se uporablja (1-4000 bytov) NUMBER(p,s) p-število vseh mest za predstavitev števila

(precision - točnost) s-število decimalnih mest (scale - stopnja) Če ne opredelimo p in s, gre za FLOAT number.

DATE Valid date range from January 1, 4712 BC to December 31, 9999 AD

RAW(size) Raw binary data of length size bytes. Maximum size is 2000 bytes. You must specify size for a RAW value.

LONG RAW Raw binary data of variable length up to 2 gigabytes.

BLOB A binary large object. Maximum size is 4 gigabytes.

Za več podatkovnih tipov glej priročnik za Oracle. ORDER BY (2-22, 2-23, 2-24, 2-25):

• Se uporablja za izpis vrstic po vrstnem redu (abecednem redu). • Sortiranje je avtomatsko naraščajoče (ASC). • Sortiramo lahko po več stolpcih: ORDER BY column_name1, column_name2,… • Za sortiranje po padajočem vrstnem redu se uporablja:

ORDER BY column_name1 DESC SELECT column_name(s) FROM table_name WHERE condition ORDER BY column_name; GROUP FUNCTIONS: (omogočajo operacije nad več vrsticami) (5-4, 5-11) AVG Povprečje COUNT Prešteje število vrednosti v stolpcu; NULL elementi se ne štejejo MAX Max vrednost; deluje tudi nad datumi in stringi MIN Min vrednost; deluje tudi nad datumi in stringi SUM Vsota Primeri: SELECT COUNT(attribute_name) FROM table; SELECT COUNT(DISTINCT attribute_name) FROM table;

Page 35: Laboratorijske Vaje PB1 VSP-Sezana v02

35

GROUP BY: (5-14, 5-15) SELECT major, SUM(tuition_paid) FROM student GROUP BY major; -- tisti atribut po katerem grupiraš, mora biti na 1. mestu! GROUP BY: (5-16) Stolpca, po katerem se izvaja grupiranje, ni potrebno navesti v SELECT delu stavka.

Omejevanje grup: HAVING: (5-22, 5-23, 5-24) SELECT major, SUM(tuition_paid) FROM student GROUP BY major HAVING SUM (tuition_paid)>2500;

Vrstni red je pomemben: GROUP BY, HAVING, ORDER BY SELECT column_name(s) FROM table_name(s) WHERE condition(s) GROUP BY column_name(s) HAVING condition(s) ORDER BY column_name(s); HAVING se sicer lahko postavi pred GROUP BY, vendar je priporočljivo, da se GROUP BY postavi pred HAVING, saj je to boljo logično.

Page 36: Laboratorijske Vaje PB1 VSP-Sezana v02

36

EXISTS in NOT EXISTS (izvedba operacije deljenja): (18-18, 18-19, 18-20) Operator EXISTS testira obstoj vrstic v rezultatu vgnezdene poizvedbe. Če se v rezultatu vgnezdene poizvedbe nahaja vsaj ena vrstica, je logična vrednost operatorja EXIST "true", v nasprotnem primeru pa je "false". Operator NOT EXISTS preverja ali je rezultat vgnezdene poizvedbe prazna množica. Če je, je njegova logična vrednost "true". Primer: SELECT department_id, department_name FROM departments d WHERE NOT EXISTS (SELECT 'X'

FROM employees WHERE department_id = d.department_id);

Z operatorjem NOT EXIST lahko na enostaven način izvedemo operacijo deljenja. Za primer vzemimo nalogo iz avditornih vaj (prodaja GSM aparatov): KUPUJE K Stranka Operater Marko Mobitel Marko Simobil Meta Mobitel Meta Vega Meta Simobil Janez Simobil Petra Mobitel PRODAJA P Operator Telefon Mobitel Nokia Mobitel Siemens Vega Nokia Vega SE Simobil Nokia Simobil Siemens Simobil SE NAJRAJE N Stranka Telefon Marko Siemens Meta Nokia Janez Siemens Petra Nokia

"Katere stranke kupujejo pri vseh operaterjih, ki so navedeni v relaciji P?" RA: odg = )(/ PK Operaterπ Rezultat: Stranka

Page 37: Laboratorijske Vaje PB1 VSP-Sezana v02

37

Meta

SQL - varianta 1: SELECT DISTINCT stranka FROM Kupuje K1 WHERE NOT EXISTS (SELECT Operater

FROM Prodaja MINUS SELECT Operater FROM Kupuje K2 WHERE K2.stranka = K1.stranka);

Vaja 2 Uporabite tabele S, P, J, SPJ (podobno kot za seminarsko nalogo) pri izvedbi naslednjih poizvedb: 1. Izpišite vsote prodanih kosov delov, ki so jih prodali posamezni trgovci. Izpis naj ima

najprej obliko izpisa, kot jo prikazuje slika a.), nato pa še obliko izpisa, kot jo prikazuje slika b.):

a.) Ident trgovca Vsote b.) Vsote

2. Izpišite vsote prodanih kosov delov, ki so jih prodali posamezni trgovci, tako kot v nalogi 1.a, z dodatno omejitvijo, da trgovca izpišete, če je vsota večja od 800.

3. Ugotovite koliko vrstic se nahaja v tabeli CUSTOMERS, ki se nahaja v shemi azrnec.

4. Za vsako ime (C_CONTRACTNAME) v tabeli CUSTOMERS ugotovite, koliko različnih strank ga poseduje in izpišite vsako tisto ime, ki ga posedujejo 4 stranke.

5. Prečitajte šifro trgovca (X); poiščite šifre projektov, ki kupujejo med drugim tudi vse take

dele, ki so na voljo pri trgovcu X!

6. Kreirajte tabelo OSEBA z naslednjimi atributi: EMSO, Ime, Priimek, Starost. Za vsak atribut izberite ustrezne podatkovni tip. V tabelo nato vstavite naslednje tri vrstice: 1305970505200, Miha, Bomba, 37 0912980505233, Marko, Novak, 27 1111980500124, Neja, Groznik, 27

7. V tabeli OSEBA povečajte vrednost atributa Starost za 1 vsem osebam, ki imajo v EMŠO številki niz "980".

8. Iz tabele OSEBE zbrišite vrstico, ki opisuje Miho Bombo.

Page 38: Laboratorijske Vaje PB1 VSP-Sezana v02

38

9. Izpišite vse podatke tabele SPJ urejene po vrednostih QTY najprej naraščajoče in potem padajoče.

10. Izpišite vse podatke iz tabele SPJ, urejene naraščajoče po atributu S# in hkrati padajoče po atributu P#.

REŠITVE -- 1a: SELECT s# as "Ident trgovca", sum(QTY) AS Vsote FROM SPJ GROUP BY s#; -- 1b: SELECT sum(QTY) AS Vsote FROM SPJ GROUP BY s#; -- 2: SELECT s# as "Ident trgovca", sum(QTY) AS Vsote FROM SPJ GROUP BY s# HAVING sum(QTY)>800; -- 3: SELECT count(*) FROM azrnec.Customers; -- 4: SELECT c_contractname FROM Customers GROUP BY c_contractname HAVING COUNT(c_customerid)=4; -- 5: SELECT J# FROM J WHERE NOT EXISTS (SELECT P# FROM SPJ S2 WHERE S#='&trgovec' MINUS SELECT P# FROM SPJ S3 WHERE S3.J#=J.J#) -- 6: CREATE TABLE Oseba ( EMSO VARCHAR2(13), Ime VARCHAR2(20), Priimek VARCHAR2(20), Starost NUMBER ) INSERT INTO Oseba VALUES ('1305970505200','Miha','Bomba', 37); INSERT INTO Oseba VALUES ('0912980505233','Marko','Novak', 27); INSERT INTO Oseba

Page 39: Laboratorijske Vaje PB1 VSP-Sezana v02

39

VALUES ('1111980500124','Neja','Groznik', 27); -- 7: UPDATE Oseba SET Starost=Starost+1 WHERE EMSO LIKE '%980%'; -- 8: DELETE FROM Oseba WHERE Ime='Miha' AND Priimek='Bomba'; -- 9: SELECT * FROM SPJ ORDER BY QTY; SELECT * FROM SPJ ORDER BY QTY DESC; -- 10: SELECT * FROM SPJ ORDER BY S#, P# DESC;

Page 40: Laboratorijske Vaje PB1 VSP-Sezana v02

40

Omejitve (10-3, 10-4) Poznamo več vrst omejitev za zagotavljanje celovitosti podatkov:

• Obveznost podatkov: NULL/NOT NULL • Omejitve domene (Domain constraints): DOMAIN • Pravila za celovitost podatkov (Integrity constraints)

a. Celovitost entitet (Entity Integrity): PRIMARY KEY b. Celovitost povezav (Referential Integrity): FOREING KEY

• Števnost (Multyplicity) • Splošne omejitve (General constraints)

Vrste omejitev: NOT NULL določa, da stolpec ne more imeti NULL vrednosti (10-7, 10-8); opredeli se ga samo na nivoju stolpca, UNIQUE določa, da morajo biti vrednosti v stolpcu unique (10-9, 10-10), PRIMARY KEY določa vsako vrstico v tabeli (10-11, 10-12), FOREING KEY Vzpostavi relacijo na referencirano tabelo (10-13, 10-14, 10-15), CHECK opredeljuje pogoj, ki mora biti resničen (10-16). • Omejitev (constraint) je potrebno poimenovati, drugače ga sistem poimenuje s SYS_Cn . • Omejitev se kreira

o istočasno s kreiranjem tabele ali o po tem, ko je bila tabela kreirana.

• Omejitev se opredeli na nivoju tabele ali na nivoju stolpca.

NULL constraint Definiran samo na nivoju stolpca. CREATE TABLE employees ( employee_id NUMBER(6), last_name VARCHAR(25) NOT NULL, salary NUMBER(8,2),

hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL, …….

) /* v prvi vrstici sistem sam poimenuje NULL constraint, druga sintaksa omogoča da sami dodamo ime constraint-a

UNIQUE constraint Definiran na nivoju stolpca ali tabele. Implicitno se definira še UNIQUE index nad stolpcem. CREATE TABLE employees(

employee_id UMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... CONSTRAINT emp_email_uk UNIQUE(email)

Page 41: Laboratorijske Vaje PB1 VSP-Sezana v02

41

) ali (za več stolpcev) ALTER TABLE employees ADD CONSTRAINT emp_email_uk UNIQUE (COLOR, CITY);

Primary key (10-11, 10-12) Definiran na nivoju stolpca ali tabele. create table Base_fact ( BF_ID bigint not null, P_ID bigint null, BF_desc varchar(500) null, CONSTRAINT pk_base_fact PRIMARY KEY (BF_ID) ) ali (za več stolpcev) ALTER TABLE Base_fact ADD CONSTRAINT pk_base_fact PRIMARY KEY (BF_ID); Nad Primary key-em se avtomatično generira unique constraint.

Foreing key (definiran izven tabele, 10-14, 10-17, 10-18) Definiran na nivoju stolpca ali tabele. Opredelitev v okviru opredelitve tabele: CREATE TABLE employees(

employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... department_id NUMBER(4),

CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id),

CONSTRAINT emp_email_uk UNIQUE(email)); ali: alter table Base_fact add constraint FK_BASE_FAC_REFERENCE_PROJECT foreign key (P_ID)references Project (P_ID) on update cascade on delete cascade;

CHECK constraint: CREATE TABLE employees ( ...

salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary > 0),

Page 42: Laboratorijske Vaje PB1 VSP-Sezana v02

42

...

Odstranjevanje omejitve: (10-19) ALTER TABLE ime_tabele DROP CONSTRAINT ime_constrainta;

Omogočanje in onemogočanje Constraint-a: (10-20, 10-21) ALTER TABLE ime_tabele ENABLE CONSTRAINT ime_constrainta; ALTER TABLE ime_tabele DISABLE CONSTRAINT ime_constrainta;

Page 43: Laboratorijske Vaje PB1 VSP-Sezana v02

43

Pogledi (11-4) Pogled predstavlja logično tabelo, ki temelji na tabeli ali drugem pogledu. Pogled sam po sebi ne vsebuje nobenega podatka. Lahko bi rekli, da pogled predstavlja okno, skozi katerega uporabnik vidi podatke v eni ali več tabelah. Pogled je v bazi shranjen kot SQL stavek.

Razlogi za uporabo pogledov (11-5) omejitev dostopa do podatkov (s pogledom se prikažejo le izbrani stolpci in izbrane

vrstice), skrivanje kompleksnosti podatkov (pogled se obnaša kot ena tabela, čeprav so podatki v

njem iz večih tabel), zagotavljanje podatkovne neodvisnosti in za predstavitev različnih pogledov na podatke (pogled predstavlja način za preimenovanje

stolpcev, ne da bi dejansko spremenili definicijo osnovne tabele).

Enostavni in kompleksni pogledi (11-6)

Kreiranje pogleda (11-7, 11-8, 11-9, 11-13) CREATE VIEW ime_pogleda (alias1, alias2,…alias n) AS SELECT A1, A2,…An FROM T1, T2,…Tn WHERE P1, P2,…Pn;

Posodabljanje pogleda (11-12) CREATE OR REPLACE VIEW ime_pogleda (id_number, name, sal, department_id) AS SELECT employee_id, first_name || '' || last_name, salary, department_id FROM employees WHERE department_id=80; Pogled se nadomesti z novim.

Uničevanje pogleda (11-20) DROP VIEW ime_pogleda;

Sekvenca (12-4, 12-6) Sekvenca je objekt v podatkovni bazi, ki si ga lahko deli več uporabnikov. Avtomatično generira unique cela števila. Tipično se uporablja za kreiranje vrednosti primarnega ključa. Nadomešča programsko kodo.

Kreiranje sekvence: CREATE SEQUENCE dept_deptid_seq

INCREMENT BY 10

Page 44: Laboratorijske Vaje PB1 VSP-Sezana v02

44

START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;

Uporaba opcije CYCLE v sekvenci ni priporočljiva v primeru generiranja primarnih ključev, razen če se uporablja zanesljiv mehanizem, ki zagotavlja, da se stare vrstice brišejo hitreje, kot pa sekvenca ponovno generira obstoječe vrednosti.

Uporaba sekvence (12-10): INSERT INTO departments(department_id, department_name, location_id) VALUES (dept_deptid_seq.NEXTVAL,'Support', 2500);

Posodabljanje sekvence (12-12): ALTER SEQUENCE dept_deptid_seq

INCREMENT BY 20 MAXVALUE 9999 NOCACHE NOCYCLE;

Page 45: Laboratorijske Vaje PB1 VSP-Sezana v02

45

Vaja 3 S pomočjo skripta "kreiraj.sql", ki ga dobite na spletni strani predmeta kreirajte tabele S, P, J in SPJ. Tabela SPJ vsebuje podatke o kupčijah, S podatke o trgovcih, J podatke o projektih in P podatke o delih, ki se prodajajo. 1. Zagotovite, da bodo podatki in kreirani objekti (tabele) v bazi ostali tudi potem, ko se

boste iz baze odjavili. 2. Kreirane tabele imajo naslednje atribute (podane so relacijske sheme):

S(S#, SNAME, STATUS, CITY) Primarni ključ: S# P(P#, PNAME, COLOR, WEIGHT, CITY) Primarni ključ: P# J(J#, JNAME, CITY) Primarni ključ: J# SPJ(S#, P#, J#, QTY) Primarni ključ: (S# P# J#) Tuji ključi: S#, P#, J# Z uporabo orodja TOAD kreirajte navedene omejitve (constraints) v podanih tabelah.

3. Ko ste kreirali zahtevane omejitve, vstavite najprej v tabelo SPJ vrstico (S6, P6, J4, 800),

nato pa v tabelo S pa vrstico (S6, Ana, 40, Ljubljana). Komentirajte!

4. Kako je vseeno mogoče vrstici iz prejšnje naloge vstaviti v podanem vrstnem redu? Vstavite ju!

5. V prejšnji nalogi vneseni vrstici izbrišite iz tabel. Najprej vrstico iz tabele SPJ, nato pa še

vrstico iz tabele S.

6. V svoji shemi kreirajte tabelo ORDERS na podlagi tabele NAROCILO, ki se nahaja v shemi "azrnec". Vaša tabela naj ima enake atribute kot izvorna tabela, atributi naj bodo istih tipov, v svojo tabelo pa morate vstaviti prvih 50000 zapisov iz izvorne tabele. Atribut O_ORDERID naj bo v vaši tabeli primarni ključ (definirajte ustrezno omejitev).

7. V svoji shemi kreirajte pogled z imenom "delavec" na podlagi tabele ORDERS. Pogled

naj omogoča videti podatke iz prvega in tretjega stolpca tabele ORDERS, pri čemer lahko uporabnik vidi le prvih 10000 vrstic.

8. V svoji shemi kreirajte sekvenco z imenom avt_kljuc z naslednjimi parametri:

INCREMENT BY 1 START WITH 1 MAXVALUE 10000 NOCACHE NOCYCLE; V tabelo ORDERS vnesite vrstico, tako da za vnos vrednosti ključa uporabite v prejšnji nalogi kreirano sekvenco. Ali je potrebno sekvenco posodobiti, preden lahko vrstico vnesemo?

Page 46: Laboratorijske Vaje PB1 VSP-Sezana v02

46

9. V tabeli ORDERS (v svoji shemi) posodobite vrednosti atributa C_CUSTOMERID v prvih 1000 vrednostih na NULL.

10. Iz tabele ORDERS zbrišite vse tiste vrstice, ki imajo za katerokoli atribut vrednost enako

NULL. 11. Iz tabele ORDERS izpišite vse vrstice, ki imajo za atribut "o_shipaddress" niz, ki se

prične s štirimestno številko, nato sledi presledek in nato še ostalo besedilo. 12. Iz svoje sheme zbrišite tabelo ORDERS.

Page 47: Laboratorijske Vaje PB1 VSP-Sezana v02

47

Indeksiranje ISAM indeks: IDEJA ISAM indeksa: Imamo datoteko oseb, urejeno po polju “starost”. Uporabimo naslednjo možnost za pohitritev iskanja:

1. Izdelamo dodatno datoteko, s po enim zapisom za vsako stran v (osnovni) podatkovni datoteki in jo uredimo po polju “starost”.

2. Vsak zapis v dodatni (indeksni) datoteki vsebuje par <ključ prvega zapisa na strani, kazalec na zapis>

3. Vsak ključ v indeksni datoteki predstavlja mejnik vsebine, na katero kažeta levi in desni kazalec vsaka stran v indeksu vsebuje en kazalec več, kot je ključev.

4. Binarno iskanje se izvede nad indeksno datoteko, ki je manjša od osnovne datoteke => hitrejše iskanje.

5. IDEJA!!! Zakaj ne bi ponovili koraka in zgradili še eno dodatno datoteko, ki bi imela za vsako indeksno stran en zapis, tako da bi velikost končnega indeksa znašala samo eno stran?

Skica ideje ISAM indeksa: ZNAČILNOSTI ISAM INDEKSA:

• ISAM indeks je statičen (z izjemo prelivnih strani) potrebno ga je reorganizirati.

• ISAM indeks je sestavljen iz indeksnih zapisov - vozlišč in listov (listnih strani).

• Problem ISAM strukture se pokaže, ko naraste število prelivnih strani.

Page 48: Laboratorijske Vaje PB1 VSP-Sezana v02

48

o Podatki v prelivnih straneh so načeloma lahko urejene, običajno pa niso (zaradi učinkovitosti dodajanja zapisov)

o Problem omilimo tako, da v začetku, ko izgradimo indeks, pustimo nekaj praznega prostora v straneh listov.

Primer izračuna stroškov iskanja zapisa v ISAM strukturi:

• Število I/O operacij = logFN, kjer je N število primarnih strani listov, F število otrok vsake indeksne strani (koliko kazalcev gre iz vozlišča).

• Število I/O operacij pri binarnem iskanju po urejeni datoteki je log2N. Pri iskanju po eno-nivojskem indeksu: log2(N/F)

• Primer: datoteka z 1.000.000 zapisi, 10 zapisov na stran v listih in 100 zapisov v indeksnih straneh:

o Strošek branja cele datoteke: 100.000 o Strošek binarnega iskanja po urejeni datoteki: 17 o Strošek binarnega iskanja po eno-nivojskem indeksu: 10 o Strošek binarnega iskanja po ISAM strukturi: 3 (brez dodatnih strani)

Naloga 1: Zapisi osnovne datoteke so urejeni po polju teža. Vsaka stran v osnovni datoteki vsebuje po dva zapisa. Zapisi v osnovni datoteki imajo za polje teža naslednje vrednosti: 4,5,6,7,10,13,14,17,19,21,24,25,28,30,31,32,33,36 ISAM indeks:

(a) V osnovno datoteko dodajte zapis s ključem 22 in 20. (b) Iz osnovne datoteke zbrišite zapise z vrednostmi ključev: 22, 20, 21, 19, 31 (izhajajte

iz slike, ki jo dobite pod postavko a.). Rešujte po korakih. (c) Kolikšno je število I/O operacij za branje določenega zapisa?

14 28

6 10 19 24

4 5 6 7 10 13 14 17 19 21 24 25

31 33

28 30 31 32 33 36

Page 49: Laboratorijske Vaje PB1 VSP-Sezana v02

49

Rešitev naloge 1: a)

b)

Komentar: Primarno stran v listu pustimo prazno za morebitna kasnejša vstavljanja. Prelivno stran pa zbrišemo, ker ta predstavlja dinamični del ISAM indeksa, ki se dodaja in krči po potrebi. Ko je ISAM indeks skreiran, se vnašanje in brisanje dogaja samo v listih. To lahko povzroči kreiranje veliko prelivnih strani. Indeksna vozlišča služijo izključno iskanju ustreznih strani v listih (usmerjanje iskanja). To je povsem normalno, saj je ISAM statičen. Pri brisanju podatka s ključem 31 iz osnovne datoteke vidimo, da je ključ 31 v indeksnem vozlišču ostal. Šele nato, ko preiščemo ustrezno listno stran, lahko ugotovimo, da zapisa s ključem 31 v osnovni datoteki ni več. Drevesno strukturo ISAM indeksa običajno skreiramo tako, da 20% prostora na listih pustimo praznega. c) Število I/O operacij = logFN, kjer je N število primarnih strani listov, F število otrok vsake indeksne strani. V našem primeru je število I/O operacij enako 2 v indeksnem delu ISAM drevesa. Temu je potrebno prišteti še branje listne strani (seveda, če predvidevamo, da se podatek nahaja v listu in ne v overflow strani), torej je število potrebnih branj za iskanje določene vrednosti enako 3. Število I/O operacij je enako številu nivojev drevesa.

Page 50: Laboratorijske Vaje PB1 VSP-Sezana v02

50

B+ Indeks: Naloga 1: Nad neurejeno datoteko je zgrajen B+ indeks, ki ga prikazuje spodnja slika:

1. Kako se spremeni B+ indeks, če se v osnovno datoteko vstavi zapis s ključem 9? 2. Kako se spremeni B+ indeks, če se v osnovno datoteko vstavi zapis s ključem 3? 3. Kako se spremeni B+ indeks, če se iz osnovne datoteke zbrišemo zapis s ključem 8, pri

čemer predvidevamo, da je levo vozlišče (sibling) možno uporabiti za redistribucijo? 4. Kako se spremeni B+ indeks, če se iz osnovne datoteke zbrišemo zapis s ključem 8, pri

čemer predvidevamo, da je desno vozlišče (sibling) možno uporabiti za redistribucijo? 5. Kako se spremeni B+ indeks, če v osnovno datoteko najprej vnesemo zapis s ključem 46,

nato pa iz iste datoteke zbrišemo zapis s ključem 52? (2 rešitvi - odvisno od tega, koliko vozlišč vzamemo za premik v desno).

6. Kako se spremeni B+ indeks, če iz osnovne datoteke zbrišemo zapis s ključem 91

(izhajamo iz začetnega indeksa)? 7. Kako se spremeni B+ indeks, če v osnovno datoteko najprej vnesemo zapis s ključem 59,

nato pa iz iste datoteke zbrišemo zapis s ključem 91? (enako kot 6., samo da se predhodno doda ključ 59).

8. Kako se spremeni B+ indeks, če bi iz osnovne datoteke postopama brisali zapise s ključi

32, 39, 41, 45 in 73? (rešitev je ena, ker se pri zlivanju gleda desni brat). Rešitev naloge 1: 1.)

Page 51: Laboratorijske Vaje PB1 VSP-Sezana v02

51

2.)

Tukaj se indeksi zapis 3 sicer postavi v levi blok, ki ga dobimo pri razcepu originalnega lista. Vendar bi po algoritmu bilo pravilno, da gre 2 v desni list. Algoritem namreč pravi, da gre d zapisov v levi list, preostanek pa v desni. 1. zapis v novonastalem desnem listu pa postane tudi delitveni ključ v indeksnem vozlišču. 3.)

4.)

Page 52: Laboratorijske Vaje PB1 VSP-Sezana v02

52

5.)

6.)

7.)

8.)

Page 53: Laboratorijske Vaje PB1 VSP-Sezana v02

53

Naloga 2: Predpostavimo, da PB podpira oba tipa indeksov, statičnega ISAM in dinamičnega B+. Ali bi se sploh kdaj odločili za uporabo statičnega indeksa namesto dinamičnega? Svojo odločitev utemeljite. Rešitev naloge 2: Statični indeks ISAM brez overflow strani je hitrejši kot B+ indeks pri operacijah update in delete, in sicer zato, ker se indeksna vozlišča pri teh dveh operacijah v primeru statičnega indeksa samo bere. Če je množica ključev, ki se bo v prihodnosti vstavila v indeks znana v naprej, potem lahko statični indeks zgradimo tako, da predvidimo zadosti praznega prostora za bodoča vstavljanja. Če se sistem periodično ugaša, se v tem času lahko statični indeks ponovno zgradi. Redka in vnaprej znana posodabljanja so indikator, ko je potrebno razmisliti o uporabi statičnega indeksa. Naloga 3: Nad datoteko zgradimo dva drevesna indeksa (ISAM in B+), ki sta na začetku identična (slika). Kako se spremenita indeksa, če v datoteko najprej dodamo zapis s ključem 41, nato pa še zapis s ključem 23. Za oba indeksa narišite sliko za obe ažuriranji. Obkrožite pravilen odgovor: a. ISAM in B+ indeks sta dinamična indeksa. DA NE NE VEM b. ISAM indeks predstavlja uravnoteženo drevo. DA NE NE VEM c. Pri branju podatka je ISAM indeks s ključem 41

hitrejši kot B+ indeks. DA NE NE VEM

Velja: Max število kazalcev na h-tem nivoju je funkcija razvejanosti (F) in višine (h) in torej znaša: Fh, kjer h∈ {1,2,3,…} in F=2d+1, kjer je d red drevesa Min število kazalcev na h-tem nivoju je potem: 2(d+1)h-1, d+1 predstavlja število kazalcev za polovično zasedeno indeksno vozlišče. Ker imamo v root vozlišču samo dva kazalca, je v formuli 2. V bistvu imamo dva drevesa, ki imata za 1 manjšo višino in zanju potem izračunamo minimalno število kazalcev.

Page 54: Laboratorijske Vaje PB1 VSP-Sezana v02

54

Naloga 4: Izračunajte, koliko zapisov v osnovni datoteki lahko indeksiramo z B+ indeksom reda 50, ki ima 3 nivoje (h) indeksnih blokov, bloki v gostem indeksu (listi) pa so veliki 10 indeksnih zapisov. Število kazalcev na h=3. nivoju: Fh=(2d+1)h=(2*50+1)3=1030301 Vsak indeksni kazalec na 3. nivoju kaže na indeksni blok gostega indeksa, ki ima še 10 indeksnih zapisov. Tako lahko indeksiramo datoteko, ki ima 1030301*10=10303010 zapisov. Naloga 5: Koliko največ listov imamo lahko v B+ drevesu, če je red drevesa 20 in imamo 3 nivoje v B delu drevesa? d=20 F=(2d+1)=41 Fh=(2*20+1)3=(2*20+1)3=68921

Sočasni dostop do podatkov Opis protokolov za preprečevanje mrtve zanke (Mohorič): Vsaki izmed transakcij pripiše SUPB ob njenem pričetku časovno oznako - njen startni čas. Na ta način je možno za poljubni dve transakciji ugotoviti katera je "starejša" in katera "mlajša". Starejša transakcija je tista, ki se že dlje časa izvaja in je zato njen startni čas manjši. Ko transakcija TA zahteva zaseženje podatka, ki ga je že zasegla transakcija TB, in se njeni zahtevi zaradi nekompatibilnosti zaseženj ne da pri priči ugoditi, se zgodi naslednje:

− po protokolu Čakaj ali izdihni (Wait-Die):

če je transakcija TA starejša od TB, preide TA v stanje čakanja na odobritev, če je mlajša, pa se njeno izvajanje prekine, transakcija se razveljavi in posreduje transakcijskemu programu v ponovno izvajanje (z istim časovnim žigom, s čimer se zagotovi, da sčasoma postane starejša (da se je ne bi venomer prekinjalo));

− po protokolu Rani ali čakaj (Wound-Wait):

če je transakcija TA starejša od TB, se prekine, razveljavi in vrne v ponovno izvajanje transakcija TB (po njeni razveljavitvi se transakciji TA odobri zaseženje podatka), če je TA mlajša, pa preide v stanje čakanja.

Protokol Čakaj ali izdihni (Wait-Die) zagotavlja, da v primeru nekompatibilnosti zahtev po zaseženju podatkov starejše transakcije čakajo na zaključek mlajših in s tem na sprostitev po njih zaseženih podatkov. Tako se ne more nikoli pripetiti, da bi T0 čakala na T1, T1 na T2, ... in Tn na T0. Po protokolu Rani ali čakaj (Wound-Wait) je čakanje na sprostitev podatkov tudi urejeno po starosti, vendar tako, da mlajše transakcije čakajo na zaključek starejših.

Page 55: Laboratorijske Vaje PB1 VSP-Sezana v02

55

Po obeh protokolih so vedno mlajše transakcije tiste, katerih izvajanje se prekine, če obstaja potencialna nevarnost za nastop mrtve zanke. Da bi se ne dogajalo, da bi bila vedno ena in ista transakcija prekinjena in vrnjena v ponovno izvajanje, je potrebno poskrbeti, da vsaka transakcija prej ali slej postane starejša. To se lahko doseže tako, da se pri ponovnem izvajanju transakcije ohrani njena prejšnja časovna oznaka, kar pa pomeni, da mora pri dodeljevanju časovne oznake SUPB ločevati med transakcijami, ki se izvajajo prvič, in transakcijami, ki so bile razveljavljene in vrnjene v ponovno izvajanje zaradi pravil protokola. Konstrukcija čakalnega grafa: WFG je usmerjen graf G = (N, E), kjer N vozlišča, E povezave. Postopek risanja WFG:

– Kreiraj vozlišče za vsako transakcijo – Kreiraj direktno povezavo Ti Tj, če Ti čaka na zaklepanje podatkovne enote, ki

je zaklenjena s strani Tj. Pojav mrtve zanke označuje cikel v grafu. SUPB periodično gradi graf in preverja obstoj mrtve zanke. Ko je mrtva zanka detektirana, je potrebno eno ali več transakcij prekiniti. Pomembno:

– Izbira transakcije za prekinitev: možni kriteriji: ‘starost’ transakcije, število sprememb, ki jih je transakcija naredila, število sprememb, ki jih transakcija še mora opraviti.

– Koliko transakcije preklicati: namesto preklica cele transakcije včasih mrtvo zanko moč rešiti s preklicom le dela transakcije.

– Izogibanje stalno istim žrtvam: potrebno preprečiti, da ni vedno izbrana ista transakcija. Podobno živi zanki (live lock)

Naloga 1: Imamo račune R1=200 €, R2=300 € in R3=400 €. Ukazi transakcij T1 in T2 se izvedejo po naslednjem razporedu:

T1 T2 PoiščiPreberi (R1, a) a:=a-10 Ažuriraj (R1, a)

PoiščiPreberi (R2, c) c:=c-20 Ažuriraj (R2, c)

PoiščiPreberi (R2, b) b:=b+10 Ažuriraj (R2, b) Pomni

poiščiPreberi (R3, d) Pozabi

Vsota na računih R1, R2 in R3 mora po izvedbi transakcij biti enaka kot pred izvedbo T1 in T2. Če ni, opiši kaj je narobe in napiši urnik izvajanja, z uporabo protokola PXC.

Page 56: Laboratorijske Vaje PB1 VSP-Sezana v02

56

Rešitev naloge 1: • Če se T1 in T2 izvedeta v takem urniku kot je podan, bo vsota na računih na koncu

naslednja: R1=190 R2=300 R3=400 SUM= 890 Pride do branja nepotrjenega podatka (branje neobstoječega podatka).

• Uporaba protokola PXC (ekskluzivno zaklepanje podatkov):

T1 T2 E-PoiščiPreberi (R1, a) a:=a-10 Ažuriraj (R1, a)

E-PoiščiPreberi (R2, c) c:=c-20 Ažuriraj (R2, c)

E-PoiščiPreberi (R2, b) (čakanje na odobritev)

E-PoiščiPreberi (R3, d) Pozabi

(zaseženje odobreno, ukaz se izvede) b:=b+10 Ažuriraj (R2, b) Pomni

Po izvedbi transakcij T1 in T2 je vsota na računih naslednja: R1=190 R2=310 R3=400 R1 + R2 + R3 = 900 OK Naloga 2: V podatkovni bazi imamo podatke o naslednjih računih: R1=100, R2=200 in R3=300 €. Transakciji T0 prenese vrednost 10 € iz računa R1 na R2, sočasno pa se izvaja transakcija T1, ki iz R2 na R1 prenese vrednost 20€.

1. Kakšna bi bila vsota na računih R1, R2 in R3, če se transakciji izvedeta zaporedno, najprej T0 in nato T1?

2. Kakšna je vrednost na računih, če se operacije transakcij izvedejo v podanem vrstnem redu?

3. Kako se izvedejo podane operacije z uporabo deljenega zaklepanja - PSC? Komentirajte, narišite čakalni graf!

4. Kako bi se navedeni transakciji izvedli z uporabo protokola "Čakaj ali izdihni", pri čemer uporabljamo ekskluzivno zaklepanje podatkov?

Page 57: Laboratorijske Vaje PB1 VSP-Sezana v02

57

T0 T1 PoiščiPreberi (R1, a) a:=a-10 Ažuriraj (R1, a) PoiščiPreberi (R2, b) b:=b+10

PoiščiPreberi (R2, c) c:=c-20 Ažuriraj (R2, c)

Ažuriraj (R2, b) Pomni

PoiščiPreberi (R3, d) d:=d+20 Ažuriraj (R3, d) Pomni

Rešitev naloge:

1. Vsota na računih bi znašala 600 €. Prikaži potek. 2. Vsota po podanem vrstnem redu bi znašala 620 €. Prikaži potek. 3. Uporaba deljenega zaklepanja, nariši čakalni graf.

T0 T1 D-PoiščiPreberi (R1, a) a:=a-10 E-Ažuriraj (R1, a) D-PoiščiPreberi (R2, b) b:=b+10

D-PoiščiPreberi (R2, c) c:=c-20 E-Ažuriraj (R2, c) (čakanje na odobritev)

E-Ažuriraj (R2, b) (čakanje na odobritev) MRTVA ZANKA!!! Pomni

PoiščiPreberi (R3, d) d:=d+20 Ažuriraj (R3, d) Pomni

4. Potek operacij z uporabo protokola "Čakaj ali izdihni": Ko transakcija TA zahteva zaseženje podatka, ki ga je že zasegla transakcija TB, in se njeni zahtevi zaradi nekompatibilnosti zaseženj ne da pri priči ugoditi, se zgodi naslednje:

* po protokolu Čakaj ali izdihni (Wait-Die): če je transakcija TA starejša od TB, preide TA v stanje čakanja na odobritev, če je mlajša, pa se njeno izvajanje prekine, transakcija se razveljavi in posreduje transakcijskemu programu v ponovno izvajanje;

T0 T1 E-PoiščiPreberi (R1, a) a:=a-10 Ažuriraj (R1, a) E-PoiščiPreberi (R2, b) b:=b+10

E-PoiščiPreberi (R2, c) (prekinitev izvajanja)

Page 58: Laboratorijske Vaje PB1 VSP-Sezana v02

58

Ažuriraj (R2, b) Pomni

PoiščiPreberi (R2, c) c:=c-20 Ažuriraj (R2, c) PoiščiPreberi (R3, d) d:=d+20 Ažuriraj (R3, d) Pomni

Obnavljanje podatkov po nesrečah Naloga 1: Za zaščito PB se uporablja obnavljanje s senčnimi stranmi. Stanje tekoče tabele strani pred pričetkom transakcije je prikazano na sliki. V okviru transakcije se izvedejo po vrsti naslednji ukazi: read(A,a), read(D,d), write(G,g), read(C,c), write(E,e), write(I,i). Kakšna je vsebina tekoče tabele strani, če se transakcija zaključi s Pozabi, in kakšna, če se zaključi s Pomni? V kakšnem zaporedju se strani čitajo z diska oziroma se izpisujejo nanj, če je v datotečnem vmesniku prostora le za dve strani hkrati, in se pri zasedenem vmesniku prepiše vedno najdalj časa neuporabljena stran?

Tekoča Podatkovna tabela strani baza

Rešitev naloge 1:

s1 s2 s3

s1 A B C s2 D E F s3 G H I s4 s5 s6

Page 59: Laboratorijske Vaje PB1 VSP-Sezana v02

59

Tekoča tabela strani: s1 s2, s5 s3, s4, s6

s1

A

B

C

s2

D

E

F

s3

G

H

I

s4

G

H

I

s5

D

E

F

s6

G

H

I

Datotečni vmesnik: DV1 s1, s3, s2

DV2 s2, s1, s4