LC238D http://www.itel.hist.no/fg/_dmd/ Relsjonsmodellen, del II Eksempelse side 2 Relsjonslger side 3 SQL-opertorer side 4 Seleksjon og side 5 Produkt side 6 Forening (join) side 7-10 Settopersjonene side 11-13 Grupperingsopertoren divisjon side 14-15 Hv er en sdtse? side 16 Bsisrefernsen er: E.F. Codd (IBM): A Reltionl Model of Dt for Lrge Shred Dt Bnks Comm. ACM, juni 1970 Se ellers læreok, side 59-76 Else Lervik, septemer 2012 Forelesning 3, uke 36 Eksempelse leverndor lev_nr lev_nvn sttus lev_y 1 Svendsen 20 Lillehmmer 2 Jensen 10 Porsgrunn 3 Bø 30 Porsgrunn 4 Christinsen 20 Lillehmmer 5 Andersen 30 Arendl produkt prod_nr prod_nvn kode vekt prod_y 1 synåler rød 12 Lillehmmer 2 inders grønn 17 Porsgrunn 3 skruer lå 17 Risør 4 skruer rød 14 Lillehmmer 5 knpper lå 12 Porsgrunn 6 spiker rød 19 Lillehmmer levernse lev_nr prod_nr ntll 1 1 300 1 2 200 1 3 400 1 4 200 1 5 100 2 1 300 2 2 400 3 2 200 4 2 200 4 4 300 4 5 400 Sqlsript vedlgt side 2 1
Relsjonslger Et sett med opersjoner som utføres på er Resulttet er lltid en ny, dvs t vi kn kominere og nøste opersjonene etter ønske De egentlige lgeropertorene:,, produkt og forening Settopertorene: union, snitt, differnse Grupperingsopertoren: divisjon Kn uttrykkes slik (en v flere mulige notsjoner) opersjon(r1:s:r.., r2:s:r...,...); r1, r2, osv er er, der den siste er resultten s uttrykker horisontlt utvlg (), mens r uttrykker vertiklt utvlg (, ttriutter), flere prmetere kommer etter hvert Bruker selet-setningen til å utføre opersjonene i et SQL-sert dtsesystem Med unntk v divisjon er lle opersjonene enkle å utføre i SQL. side 3 SQL-opertorer Smmenlikningsopertorer: = > < >= <= <> IN <> etyr ikke lik Aritmetiske opertorer: + - * / / utfører heltllsdivisjon hvis operndene er heltll Smmenstte logiske uttrykk lges vhj AND, OR og NOT. AND hr høyere prioritet enn OR slik det også er i Jv. Prenteser kn rukes til å overstyre prioritetene. Eksempler (kn ruke OR i eksempel 2 og 3): 1. Finn produkter med frgekode rød og som veier mindre enn 15 grm selet * from produkt where kode = 'rød' nd vekt < 15; 2. Finn levernser på enten 100, 200 eller 400 enheter selet * from levernse where ntll in (100, 200, 400); 3. Finn levernser som verken er 100 eller 200 enheter selet * from levernse where ntll not in(100, 200); side 4 2
Seleksjon og Seleksjon, også klt restriksjon, lger en ny ut fr estemte tupler i en eksisterende. egrenser ntll rder eksempel: SELECT(leverndor:(sttus > 20):*, R::); SELECT * FROM leverndor WHERE sttus > 20; En eller reduksjon lger en ny ut fr estemte ttriutter i en eksisterende. egrenser ntll kolonner eksempel: PROJECT(leverndor::lev_nr lev_nvn, R::); SELECT DISTINCT lev_nr, lev_nvn FROM leverndor; opersjon(r1:s:r, r2:s:r,...); side 5 Produkt Det krtesiske produkt eller kryssprodukt lger en ny R med lle mulige smmensettinger v tupler fr to er A og B. ntll tupler i resultten er lik ntll tupler i A multiplisert med ntll tupler i B ntll ttriutter i resultten er lik summen v ntll ttriutter i A og ntll ttriutter i B CROSS(A::, B::, R::); Eksempel: Ønsker å få ut hele levernsetellen med lle opplysninger om leverndørene CROSS(levernse::, leverndor::, R::); SELECT * FROM levernse, leverndor; Sjekk resulttet fr SQL-setningen! opersjon(r1:s:r, r2:s:r,...); x y z p q A B R x y z p q x y z p q x y z p q side 6 3
Indre forening (inner join) opersjon(a:s:r:k, B:s:r:k, R:s:r); Forening (join) lger en ny med smmensettinger v tupler fr to er på et ttriutt, slik t hver smmensetting tilfredsstiller en gitt etingelse. Vnligvis «De to ene» er to forskjellige relsjoener Fellestriuttet er primærnøkkel i den ene en og fremmednøkkel i den ndre. Fellesttriuttet hr smme nvn i de to ene. Men det ehøver ikke være slik. Fellesttriuttet må defineres! Likhetsforening (equijoin) ttriutt de to ttriuttene hr smme verdi Nturlig forening (nturl join) det smme som likhetsforening, men dupliktttriuttene er fjernet Generelt, k er ttriuttet/-ene JOIN(A:s:r:k, B:s:r:k, R:s:r) Eksempel, nturlig forening hele levernsetellen med lle opplysninger om leverndørene: JOIN(leverndor:::lev_nr, levernse:::lev_nr, R::lev_nr lev_nvn sttus lev_y prod_nr ntll) side 7 Eksempelse, lite dt for å illustrere SQL-forening leverndor lev_nr lev_nvn sttus lev_y 1 Svendsen 20 Lillehmmer 2 Jensen 10 Porsgrunn 3 Bø 30 Porsgrunn levernse lev_nr prod_nr ntll 1 1 300 2 1 300 produkt prod_nr prod_nvn kode vekt prod_y 1 synåler rød 12 Lillehmmer 2 inders grønn 17 Porsgrunn side 8 4
Indre forening (inner join), SQL SQL: Prøv: SELECT * FROM leverndor, levernse; Resultt: Krtesisk produkt Hv må gjøres? SELECT * FROM leverndor, levernse WHERE leverndor.lev_nr = levernse.lev_nr; Nturlig forening lir dermed slik: SELECT leverndor.*, prod_nr, ntll FROM leverndor, levernse WHERE leverndor.lev_nr = levernse.lev_nr; eller: SELECT leverndor.*, prod_nr, ntll FROM leverndor JOIN levernse ON (leverndor.lev_nr = levernse.lev_nr); eventuelt (Orle ok, Jv DB ok fr versjon 10.6) SELECT * FROM leverndor NATURAL JOIN levernse; Vær klr over t NATURAL JOIN kun fungerer korrekt dersom nvnene på kolonnene i de to involverte tellene er de smme. Det går ltså ikke nødvendigvis på kopling primær- - fremmednøkkel. Indre forening, dvs der etingelsen lir evluert til snn. side 9 Ytterforening En venstre ytterforening er en likhetsforening, men med det tillegg t lle tupler i venstre skl være med. Der det mngler smmenfllende verdier fr høyre, er ttriuttene fr høyre gitt nullverdier. Vil også h med leverndører som ikke leverer noe opersjon(a:s:r:k, B:s:r:k, R:s:r); LEFT-OUTER-JOIN(leverndor:::lev_nr, levernse:::lev_nr, R::lev_nr lev_nvn sttus lev_y prod_nr ntll) SELECT leverndor.*, prod_nr, ntll FROM leverndor LEFT OUTER JOIN levernse ON (leverndor.lev_nr = levernse.lev_nr); Resulttet som før, men med følgende tilleggsrd: 3, Bø, 30, Porsgrunn, null, null Kn ikke sette opp denne spørringen uten å ruke LEFT JOIN. Høyre ytterforening defineres tilsvrende. Full ytterforening (FULL OUTER JOIN) kominerer venstre og høyre ytterforening (Orle ok, Jv DB ikke ok) ttriutt side 10 5
Å kominere tre er vi koplings (SQL) Prolem: Lg en liste med lle levernsene og nvn og nummer på leverndør og produkt. Løsninger: SELECT lev_nvn, levernse.*, prod_nvn FROM leverndor, levernse, produkt WHERE leverndor.lev_nr = levernse.lev_nr AND levernse.lev_nr = produkt.lev_nr; SELECT lev_nvn, levernse.*, prod_nvn FROM leverndor JOIN (levernse JOIN produkt ON (levernse.prod_nr = produkt.prod_nr)) ON leverndor.lev_nr = levernse.lev_nr; side 11 Eksempelse leverndor lev_nr lev_nvn sttus lev_y 1 Svendsen 20 Lillehmmer 2 Jensen 10 Porsgrunn 3 Bø 30 Porsgrunn 4 Christinsen 20 Lillehmmer 5 Andersen 30 Arendl produkt prod_nr prod_nvn kode vekt prod_y 1 synåler rød 12 Lillehmmer 2 inders grønn 17 Porsgrunn 3 skruer lå 17 Risør 4 skruer rød 14 Lillehmmer 5 knpper lå 12 Porsgrunn 6 spiker rød 19 Lillehmmer levernse lev_nr prod_nr ntll 1 1 300 1 2 200 1 3 400 1 4 200 1 5 100 2 1 300 2 2 400 3 2 200 4 2 200 4 4 300 4 5 400 Sqlsript vedlgt side 12 6
Settopersjonen UNION Union lger en ny med tupler som finnes i den ene eller egge v to er. Relsjonene må være unionkomptile, dvs. t de hr det smme ntllet ttriutter, og t ttriuttene er definert på smme domene (hr smme dttype). UNION(A:s:r:k, B:s:r:k, R:s:r) Alle involverte yer UNION(leverndor:::lev_y, produkt:::prod_y, R::); SELECT lev_y FROM leverndor UNION SELECT prod_y FROM produkt; Resultt: LEV_BY --------------- Arendl Lillehmmer Porsgrunn Risør opersjon(a:s:r:k, B:s:r:k, R:s:r); ttriutt side 13 Settopersjonen SNITT Relsjonsopertoren snitt (interset) lger en ny med tupler som finnes i egge v to er. Relsjonene må være unionkomptile. INTERSECT(A:s:r:k, B:s:r:k, R:s:r) INTERSECT(leverndor:::lev_y, produkt:::prod_y, R::); SQL: SELECT lev_y FROM leverndor INTERSECT SELECT prod_y FROM produkt Resultt: LEV_BY --------------- Lillehmmer Porsgrunn opersjon(a:s:r:k, B:s:r:k, R:s:r); ttriutt side 14 7
Settopersjonen DIFFERANSE Relsjonsopertoren differnse lger en ny med tupler som finnes i den første, men ikke i den ndre v to er. Relsjonene må være unionkomptile. DIFFERENCE(A:s:r:k, B:s:r:k, R:s:r) Byer der det er leverndører, men ikke produkter DIFFERENCE(leverndor:::lev_y, produkt:::prod_y, R::); SELECT lev_y FROM leverndor EXCEPT SELECT prod_y FROM produkt; OBS! Orle krever t vi ruker MINUS istf. EXCEPT Omvendt: DIFFERENCE(produkt:::prod_y, leverndor:::lev_y, R::); SELECT prod_y FROM produkt EXCEPT SELECT lev_y FROM leverndor; PROD_BY --------------- Risør opersjon(a:s:r:k, B:s:r:k, R:s:r); LEV_BY --------------- Arendl ttriutt side 15 Grupperingsopertoren DIVISJON Opertoren krever t vi hr to er. Den første må h flere eller like mnge tupler som nummer to. Den første en, A, hr to ttriutter eller ttriuttgrupper, g og. Tuplene i A grupperers på g. Tuplene i B hr ttriutter som er smmenliknre med. Tuplenes -del i hver gruppe testes så mot lle tuplene i B. Hvis lle Bs tupler finnes for smme gruppe, vil gruppenes smlingsttriutt(er) g, inkluderes i resultten. DIVIDE(A:s:r:g:, B:s:r:, R:s:r); Hvem hr levernser på lle produktene? DIVIDE(levernse::lev_nr prod_nr:lev_nr:prod_nr, produkt::prod_nr:prod_nr, R::lev_nr) Denne opersjonen finnes ikke i SQL, men kn løses f.eks. ved å ruke EXISTS, se egne SQL-forelesninger senere i kurset. side 16 8
Divisjon, eksempel g r levernse:: lev_nr prod_nr:lev_nr:prod_nr lev_nr 1 1 prod_nr produkt::prod_nr:prod_nr prod _nr 1 Hvem hr levernser på lle produktene? DIVIDE(levernse::lev_nr prod_nr:lev_nr:prod_nr, produkt::prod_nr:prod_nr, R::lev_nr) 1 2 1 3 1 4 1 5 2 1 2 2 3 2 2 3 4 5 6 R::lev_nr 4 2 4 4 4 5 side 17 Hv er en sdtse? Relsjonsmodellen er et teoretisk fundment for dtser. En dtse må tilfredsstille krvene i modellen for å kunne klles en sdtse. Codd sier t et dtsesystem er elt hvis det tilfredsstiller følgende: Brukeren v systemet skl oppftte dtene som en smling med er (teller som tilfredsstiller visse krv), og intet nnet. Systemet må minst tily følgende opersjoner: Seleksjon,, forening (join) uten på forhånd å måtte definere fysiske ksessveier for å kunne ruke disse opersjonene. Detljert i tolv regler ng dtrepresentsjon, ksessveier, dtktloger, dtsespråk, virtuelle er (views), fysisk og logisk dtuvhengighet og integritet. I hht denne definisjonen finnes det ikke elle systemer på mrkedet i dg. Kontroversielt. Kun en kdemisk øvelse? Unsett en solid teoretisk sis og et mål å strekke seg etter. side 18 9