De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Databases I (H. 9.3) Tupelcalculus Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003.

Verwante presentaties


Presentatie over: "Databases I (H. 9.3) Tupelcalculus Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003."— Transcript van de presentatie:

1 Databases I (H. 9.3) Tupelcalculus Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003

2 Te behandelen querytalen u relationele algebra u domeincalculus u tupelcalculus u SQL

3 Voorbeeld Database DEPT D#NAMEBUDGET D1engineering500,000 D2sales200,000 DPD EMPE#NAME REL E#NAME BDATE D# E3Mary daughter E1John 28-08-1964 D1 E3Sue wife E2Joe 04-04-1968 D1 E4Suzie daughter E3Jack 03-09-1969 D1 E4Tom son E4Will 21-03-1971 D2 E4Mary wife E5Bridget 22-01-1972 D2

4 Domeincalculus versus Tupelcalculus Vb. query:“Geef de naam en geboortedatum van de werknemers die in D2 werken” Domeincalculus: variabelen bevatten attribuutwaarden (‘domeinelementen’) b.v.: { (n, b) | EMP(name: n, bdate: b, D#: “D2”) } Tupelcalculus: variabelen bevatten tupels uit relaties { (e.name, e.bdate) | EMP(e)  e.D# = “D2” } Dus eig.: tupelvariabelen vs. domeinelementvariabelen

5 Tupelcalculus Algemene vorm: { (t 1.A 1, t 2.A 2, …, t n.A n ) | CONDITIE(t 1, t 2, …, t n, t n+1, …, t n+m ) } waarbij CONDITIE een formule in predicaatlogica is met: –t 1, t 2, …, t n als vrije tupelvariabelen, en –t n+1, t n+2, …, t n+m als gebonden tupelvariabelen (door quantor  of  ) –en A 1, A 2, …, A n attributen van de betreffende tupels en die opgebouwd is uit de volgende atomen: –R(t i ) waarbij R een relatie in de DB is (“membership condition”; en t i een tupelvariabele elke t i komt voor in een m.c.) –t i.A op t j.B met t i een tupelvariabele met attribuut A, t j een tupelvariabele met attribuut B en op  { , , , , ,  } –t i.A op c (of: c op t i.A) met t i een tupelvariabele met attribuut A, c een constante en op  { , , , , ,  }

6 Voorbeeld query (“met  en  ”) “Geef de namen en E#’s van werknemers geboren voor 1970” { (e.name, e.E#) | EMP(e)  (e.bdate < “01-01-1970” ) } e.namee.E# JohnE1 JoeE2 JackE3

7 Voorbeeld query (“met alle attributen”) “Geef alle informatie uit de EMP tabel over werknemers geboren voor 1970” { (e.E#, e.name, e.bdate, e.D#) | EMP(e)  ( e.bdate < “01-01-1970”) } òf: { e | EMP(e)  ( e.bdate < “01-01-1970”) } e.E#e.name e.bdate e.D# E1John 28-08-1964 D1 E2Joe 04-04-1968 D1 E3Jack 03-09-1969 D1

8 Voorbeeld query (“met  ”) “Geef de namen van de ‘dependents’ van Will” { (d.name) | DPD(d)   e (EMP(e)  e.E# = d.E#  e.name = “Will”) } d.name Suzie Tom Mary

9 Voorbeeld Database SECRETARY NAME E# BDATE ADDRESS TSPEED Sue E1 21-08-1971 Singel 30 80 Mary E2 18-12-1968 Damrak 18 90 SALESMAN NAME E# BDATE ADDRESS LIMIT John E3 08-08-1969 Rokin 21 50 000 Joe E4 09-10-1970 Nes 87 75 000 ENGINEER NAME E# BDATE ADDRESS SPECIAL Jack E5 02-02-1972 NZVBW 13 electronics Jill E6 01-01-1971 NZABW 15 software

10 Voorbeeld query (“met  ”) “Geef voor iedere werknemer (= secretary, salesman of engineer) z’n E# en naam” { (e.E#, e.name) | SECRETARY(e)  SALESMAN(e)  ENGINEER(e) } e.E#e.name E1Sue E2Mary E3John E4Joe E5Jack E6Jill

11 Voorbeeld query (“met  ”) “Geef de namen en E#’s van de ongehuwde engineering- werknemers” { (e.name, e.E#) | EMP(e)   dpm (DEPT(dpm)  dpm.D# = e.D#  dpm.name = “engineering”)   dpd (DPD(dpd)  dpd.E# = e.E#  (dpd.rel = “husband”  dpd.rel = “wife”) )} e.namee.E# JohnE1 JoeE2

12 Voorbeeld query (“met  ”) “Geef de E#’s van de werknemers die werken aan alle projecten” { (e.E#) | EMP(e)   p ( PROJ(p)   ep (EMP_PROJ(ep)  ep.J# = p.J#  ep.E# = e.E#) ) } e.E# E3

13 Toelichting bij laatste query { (e.E#) | EMP(e)  PROJ  p (PROJ(p)  J#NAME  ep (EMP_PROJ(ep)  J1build-intranet ep.J# = p.J#  ep.E# = e.E#) )} J2market-research EMP_PROJ EMPE#J# E#NAME BDATE D# E2J1 E1John 28-08-1964 D1 E3J1 E2Joe 04-04-1968 D1 E3J2 E3Jack 03-09-1969 D1 E4J2 E4Will 21-03-1971 D2 E5J2 E5Bridget 22-01-1972 D2

14 Voorbeeld Database M_ZOEKENDE NAAMADRES GJAAR MINJMAXJ TeunNes 30 1950 19501960 WimSingel 23 1955 19501960 SjonDamstr 9 1975 19751980 V_ZOEKENDE NAAMADRES GJAAR MINJMAXJ Truus Amstel 80 1953 19501960 BepRokin 42 1959 19501960 AnitaNZVBW 18 1980 19751980

15 Voorbeeld query (“met  ”) “Geef alle paren (naam + adres) van mannen en vrouwen, ongeacht of ze in elkaars gewenste leeftijdscategorie vallen” { (m.naam, m.adres, v.naam, v.adres) | M_ZOEKENDE(m)  V_ZOEKENDE(v) }

16 Resultaat query m.naam m.adresv.naamv.adres Teun Nes 30Truus Amstel 80 Teun Nes 30Bep Rokin 42 Teun Nes 30Anita NZVBW 18 Wim Singel 23Truus Amstel 80 Wim Singel 23Bep Rokin 42 Wim Singel 23Anita NZVBW 18 Sjon Damstr 9Truus Amstel 80 Sjon Damstr 9Bep Rokin 42 Sjon Damstr 9Anita NZVBW 18

17 Relationeel compleet u tupelcalculus is relationeel compleet; je kunt er dezelfde queries mee opstellen als met de operaties { , , , ,  } in relationele algebra u queries met de operaties outer join, outer union of aggregate functions kunnen niet noodzakelijkerwijs in tupelcalculus worden uitgedrukt “kale” tupelcalculus en “kale” domeincalculus hebben dus dezelfde functionaliteit als “kale” relationele algebra

18 Voorbeeld complexe queries (I) ZOEKENDE NAAM ADRES GESL GJAARMINJ MAXJ Teun Nes 30 M 19501950 1960 Wim Singel 23 M 19551950 1960 Sjon Damstr 9 M 19751975 1980 Truus Amstel 80 V 19531950 1960 Bep Rokin 42 V 19591950 1960 Anita NZVBW 18 V 19801975 1980 “Geef de namen en adressen van alle eventuele paren (d.w.z. personen van tegenovergesteld geslacht die binnen elkaars gewenste leeftijdscategorie vallen)”

19 Voorbeeld query (I) “Geef de namen en adressen van alle eventuele paren (d.w.z. personen van tegenovergesteld geslacht die binnen elkaars gewenste leeftijdscategorie vallen)” { (m.naam, m.adres, v.naam, v.adres) | ZOEKENDE(m)  ZOEKENDE(v)  m.gesl = ‘M’  v.gesl = ‘V’  v.minj  m.gjaar  m.gjaar  v.maxj  m.minj  v.gjaar  v.gjaar  m.maxj }

20 Voorbeeld complexe queries (I) m.naam m.adresv.naamv.adres TeunNes 30Truus Amstel 80 TeunNes 30Bep Rokin 42 WimSingel 23Truus Amstel 80 WimSingel 23Bep Rokin 42 SjonDamstr 9Anita NZVBW 18

21 Voorbeeld complexe queries (II) CAN_SUPPLY SUPPLIERPART PRICE s1 p1 3 s1 p2 3NEEDED s2 p1 2PART s2 p2 3 p1 s2 p3 4 p2 s3 p1 4 p3 s3 p2 3 s3 p3 3 “Geef de supplier(s) die alles s3 p4 8 kunnen leveren wat we nodig hebben”

22 Voorbeeld complexe queries (II) “Geef de suppliers die alles kunnen leveren wat we nodig hebben” { (cs1.supplier) | CAN_SUPPLY(cs1)   p (NEEDED(p)   cs2 (CAN_SUPPLY(cs2)  cs2.supplier = cs1.supplier  cs2.part = p.part) ) } cs1.supplier s2 s3

23 Voorbeeld complexe queries (II) { (cs1.supplier) | CAN_SUPPLY(cs1)  CAN_SUPPLY  p (NEEDED(p)  SUPPLIERPART PRICE  cs2 (CAN_SUPPLY(cs2)  s1 p1 3 cs2.supplier = cs1.supplier  s1 p2 3 cs2.part = p.part) ) } s2 p1 2 s2 p2 3 s2 p3 4NEEDED s3 p1 4PART s3 p2 3 p1 s3 p3 3p2 s3 p4 8p3

24 Voorbeeld complexe queries (III) DRAAITFAN_VAN STATIONARTIESTPERSOONARTIEST CountryCarpenters JanOP CountryParton PietMeeuwis NoordzeeHazes JoostBorsato NoordzeeBorsato JoostCarpenters NoordzeeMeeuwis Radio10MeeuwisLUISTERT_NAAR Radio10ElvisPERSOONSTATION Radio10Abba JanRadio10 PietNoordzee JoostRadio10 JoostNoordzee

25 Voorbeeld complexe queries (III.a) “Geef de artiesten die gedraaid worden op de stations waar Joost naar luistert” { (d.artiest) | DRAAIT(d)   l (LUISTERT_NAAR(l)  l.station = d.station  l.persoon = “Joost”) } d.artiest Hazes Borsato Meeuwis Elvis Abba

26 Voorbeeld complexe queries (III.b) “Geef de fans van artiesten die nergens gedraaid worden” { (f.persoon) | FAN_VAN(f)   d (DRAAIT(d)  d.artiest = f.artiest) } f.persoon Jan

27 Voorbeeld complexe queries (III.c) “Geef de personen die tenminste naar ieder radiostation luisteren waar Piet ook naar luistert” (N.B. tenminste, dus eventueel ook nog naar andere stations) { (ln1.persoon) | LUISTERT_NAAR(ln1)   ln2 ( (LUISTERT_NAAR(ln2)  ln2.persoon = “Piet”)   ln3 (LUISTERT_NAAR(ln3)  ln3.persoon = ln1.persoon  ln3.station = ln2.station) ) } ln1.persoon Piet Joost

28 Safe expressions (1/4) { t |  EMP(t) } wat komt hier zoal uit? o.a.: –(“E6”, “Nick”, “13-03-1973”, “D2”) –(“D1”, “engineering”, 500000) –(“q%k$@p!”, 862296, 96398, “y&$q!%”, 3.1415927) “alles”, zolang het maar geen in de DB aanwezig EMP tupel is

29 Safe expressions (2/4) BOEK: Het (safe-)domein van een tupelcalculus-query { (t 1.A 1, t 2.A 2, …, t n.A n ) | CONDITIE(t 1, t 2, …, t n, t n+1, …, t n+m ) } is de verzameling van alle waarden: –die als constante voorkomen in CONDITIE –die voorkomen in een tupel van een relatie die genoemd wordt in CONDITIE

30 Safe expressions (3/4) voorbeeld: { (e.name, e.E#) | EMP(e)  e.bdate < “01-01-1970” ) } (safe-)domein:vb. is safe, want output: { 01-01-1970, e.namee.E# E1, John, 28-08-1964, D1, JohnE1 E2, Joe, 04-04-1968, D1, JoeE2 E3, Jack, 03-09-1969, D1, JackE3 E4, Will, 21-03-1971, D2, E5, Bridget, 22-01-1972, D2 } Boek:Een (domein/tupel) calculus-query is safe indien iedere attribuut-waarde van de output een element is van het bij die query behorende (safe-)domein

31 Safe expressions (4/4) OPMERKINGEN: Deze aanpak van het boek is (nog) niet helemaal OK, want o.a.: u onnodig restrictief, want verhindert o.a.: –b.v. zoiets als: “t 1.A 1  t 2.A 2 ” en “t 1.A 1  t 2.A 2 ” –aggregaat-functies u onnodig ruim, want lijkt onvoldoende af te dwingen dat resultaat-tupels van juiste graad en type moeten zijn –b.v. character-string als waarde van een ‘integer-attribuut’ u onhandig, want: –(safe-)domein is steeds wat anders, want elke query heeft z’n eigen (safe)-domein Kortom: voegt onvoldoende toe aan onze aanpak met ‘vereiste membership-condities’


Download ppt "Databases I (H. 9.3) Tupelcalculus Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003."

Verwante presentaties


Ads door Google