1 / 31

Databases I (H. 9.3) Tupelcalculus

versie 2003. Databases I (H. 9.3) Tupelcalculus. Wiebren de Jonge Vrije Universiteit, Amsterdam. Te behandelen querytalen. relationele algebra domeincalculus tupelcalculus SQL. Voorbeeld Database. DEPT D# NAME BUDGET D1 engineering 500,000 D2 sales 200,000 DPD

knoton
Télécharger la présentation

Databases I (H. 9.3) Tupelcalculus

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Te behandelen querytalen • relationele algebra • domeincalculus • tupelcalculus • SQL

  3. Voorbeeld Database DEPT D# NAME BUDGET D1 engineering 500,000 D2 sales 200,000 DPD EMP E#NAME REL E# NAME BDATED#E3 Mary daughter E1 John 28-08-1964 D1 E3 Sue wife E2 Joe 04-04-1968 D1 E4 Suzie daughter E3 Jack 03-09-1969 D1 E4 Tom son E4 Will 21-03-1971 D2 E4 Mary wife E5 Bridget 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: { (t1.A1, t2.A2, …, tn.An) | CONDITIE(t1, t2, …, tn, tn+1, …, tn+m) } waarbij CONDITIE een formule in predicaatlogica is met: • t1, t2, …, tn als vrije tupelvariabelen, en • tn+1, tn+2, …, tn+m als gebonden tupelvariabelen (door quantor  of ) • en A1, A2, …, An attributen van de betreffende tupels en die opgebouwd is uit de volgende atomen: • R(ti) waarbij R een relatie in de DB is (“membership condition”;en ti een tupelvariabele elke ti komt voor in een m.c.) • ti.A op tj.Bmet ti een tupelvariabele met attribuut A,tj een tupelvariabele met attribuut B en op { , , , , , } • ti.A opc (of: c op ti.A)met ti 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.name e.E# John E1 Joe E2 Jack E3

  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.bdatee.D# E1 John 28-08-1964 D1 E2 Joe 04-04-1968 D1 E3 Jack 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 E1 Sue E2 Mary E3 John E4 Joe E5 Jack E6 Jill

  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.name e.E# John E1 Joe E2

  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)  J1 build-intranet ep.J# = p.J# ep.E# = e.E#) )} J2 market-research EMP_PROJ EMP E#J# E# NAME BDATED#E2 J1 E1 John 28-08-1964 D1 E3 J1 E2 Joe 04-04-1968 D1 E3 J2 E3 Jack 03-09-1969 D1 E4 J2 E4 Will 21-03-1971 D2 E5 J2 E5 Bridget 22-01-1972 D2

  14. Voorbeeld Database M_ZOEKENDE NAAM ADRES GJAAR MINJ MAXJ Teun Nes 30 1950 1950 1960 Wim Singel 23 1955 1950 1960 Sjon Damstr 9 1975 1975 1980 V_ZOEKENDE NAAM ADRES GJAAR MINJ MAXJ Truus Amstel 80 1953 1950 1960 Bep Rokin 42 1959 1950 1960 Anita NZVBW 18 1980 1975 1980

  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 30 Truus Amstel 80 Teun Nes 30 Bep Rokin 42 Teun Nes 30 Anita NZVBW 18 Wim Singel 23 Truus Amstel 80 Wim Singel 23 Bep Rokin 42 Wim Singel 23 Anita NZVBW 18 Sjon Damstr 9 Truus Amstel 80 Sjon Damstr 9 Bep Rokin 42 Sjon Damstr 9 Anita NZVBW 18

  17. Relationeel compleet • tupelcalculus is relationeel compleet; je kunt er dezelfde queries mee opstellen als met de operaties {, , , , } in relationele algebra • 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 NAAMADRES GESL GJAAR MINJ MAXJ Teun Nes 30 M 1950 1950 1960 Wim Singel 23 M 1955 1950 1960 Sjon Damstr 9 M 1975 1975 1980 Truus Amstel 80 V 1953 1950 1960 Bep Rokin 42 V 1959 1950 1960 Anita NZVBW 18 V 1980 1975 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.naamm.adresv.naam v.adres Teun Nes 30 Truus Amstel 80 Teun Nes 30 Bep Rokin 42 Wim Singel 23 Truus Amstel 80 Wim Singel 23 Bep Rokin 42 Sjon Damstr 9 Anita NZVBW 18

  21. Voorbeeld complexe queries (II) CAN_SUPPLY SUPPLIERPARTPRICE s1 p1 3 s1 p2 3 NEEDED s2 p1 2PART s2 p2 3p1 s2 p3 4p2 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)  SUPPLIER PARTPRICE 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 4 NEEDED s3 p1 4 PART s3 p2 3 p1 s3 p3 3 p2 s3 p4 8 p3

  24. Voorbeeld complexe queries (III) DRAAIT FAN_VAN STATIONARTIEST PERSOONARTIEST Country Carpenters Jan OP Country Parton Piet Meeuwis Noordzee Hazes Joost Borsato Noordzee Borsato Joost Carpenters Noordzee Meeuwis Radio10 Meeuwis LUISTERT_NAAR Radio10 Elvis PERSOONSTATION Radio10 Abba Jan Radio10 Piet Noordzee Joost Radio10 Joost Noordzee

  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 { (t1.A1, t2.A2, …, tn.An) | CONDITIE(t1, t2, …, tn, tn+1, …, tn+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.name e.E# E1, John, 28-08-1964, D1, John E1 E2, Joe, 04-04-1968, D1, Joe E2 E3, Jack, 03-09-1969, D1, Jack E3 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.: • onnodig restrictief, want verhindert o.a.: • b.v. zoiets als: “t1.A1 t2.A2” en “t1.A1 t2.A2” • aggregaat-functies • onnodig ruim, want lijkt onvoldoende af te dwingendat resultaat-tupels van juiste graad en type moeten zijn • b.v. character-string als waarde van een ‘integer-attribuut’ • 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’

More Related