Databases I (H. 9.3) Tupelcalculus

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

description

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# NAMEBUDGET D1engineering500,000 D2sales200,000 DPD - PowerPoint PPT Presentation

Transcript of Databases I (H. 9.3) Tupelcalculus

Page 1: Databases I  (H. 9.3) Tupelcalculus

Databases I (H. 9.3)Tupelcalculus

Wiebren de JongeVrije Universiteit, Amsterdam

versie 2003

Page 2: Databases I  (H. 9.3) Tupelcalculus

Te behandelen querytalen

relationele algebra domeincalculus tupelcalculus

SQL

Page 3: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld Database

DEPTD# NAME BUDGETD1 engineering 500,000D2 sales 200,000

DPDEMP E# NAME RELE# NAME BDATE D# E3 Mary daughterE1 John 28-08-1964 D1 E3 Sue wifeE2 Joe 04-04-1968 D1 E4 Suzie daughterE3 Jack 03-09-1969 D1 E4 Tom sonE4 Will 21-03-1971 D2 E4 Mary wifeE5 Bridget 22-01-1972 D2

Page 4: Databases I  (H. 9.3) Tupelcalculus

Domeincalculus versus TupelcalculusVb. 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

Page 5: Databases I  (H. 9.3) Tupelcalculus

TupelcalculusAlgemene 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 op c (of: c op ti.A)met ti een tupelvariabele met attribuut A, c een constante en op { , , , , , }

Page 6: Databases I  (H. 9.3) Tupelcalculus

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 E1Joe E2Jack E3

Page 7: Databases I  (H. 9.3) Tupelcalculus

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#E1 John 28-08-1964 D1E2 Joe 04-04-1968 D1E3 Jack 03-09-1969 D1

Page 8: Databases I  (H. 9.3) Tupelcalculus

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.nameSuzieTomMary

Page 9: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld Database

SECRETARYNAME E# BDATE ADDRESS TSPEEDSue E1 21-08-1971 Singel 30 80Mary E2 18-12-1968 Damrak 18 90

SALESMANNAME E# BDATE ADDRESS LIMITJohn E3 08-08-1969 Rokin 21 50 000Joe E4 09-10-1970 Nes 87 75 000

ENGINEERNAME E# BDATE ADDRESS SPECIALJack E5 02-02-1972 NZVBW 13 electronicsJill E6 01-01-1971 NZABW 15 software

Page 10: Databases I  (H. 9.3) Tupelcalculus

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.nameE1 SueE2 MaryE3 JohnE4 JoeE5 JackE6 Jill

Page 11: Databases I  (H. 9.3) Tupelcalculus

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 E1Joe E2

Page 12: Databases I  (H. 9.3) Tupelcalculus

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

Page 13: Databases I  (H. 9.3) Tupelcalculus

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_PROJEMP E# J#E# NAME BDATE D# E2 J1E1 John 28-08-1964 D1 E3 J1E2 Joe 04-04-1968 D1 E3 J2E3 Jack 03-09-1969 D1 E4 J2E4 Will 21-03-1971 D2 E5 J2E5 Bridget 22-01-1972 D2

Page 14: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld Database

M_ZOEKENDENAAM ADRES GJAAR MINJ MAXJ Teun Nes 30 1950 1950 1960 Wim Singel 23 1955 1950 1960 Sjon Damstr 9 1975 1975 1980

V_ZOEKENDENAAM ADRES GJAAR MINJ MAXJ Truus Amstel 80 1953 1950 1960 Bep Rokin 42 1959 1950 1960 Anita NZVBW 18 1980 1975 1980

Page 15: Databases I  (H. 9.3) Tupelcalculus

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) }

Page 16: Databases I  (H. 9.3) Tupelcalculus

Resultaat query

m.naam m.adres v.naam v.adres Teun Nes 30 Truus Amstel 80Teun Nes 30 Bep Rokin 42Teun Nes 30 Anita NZVBW 18Wim Singel 23 Truus Amstel 80Wim Singel 23 Bep Rokin 42Wim Singel 23 Anita NZVBW 18Sjon Damstr 9 Truus Amstel 80Sjon Damstr 9 Bep Rokin 42Sjon Damstr 9 Anita NZVBW 18

Page 17: Databases I  (H. 9.3) Tupelcalculus

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

Page 18: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld complexe queries (I)

ZOEKENDENAAM ADRES GESL GJAAR MINJ MAXJTeun Nes 30 M 1950 1950 1960Wim Singel 23 M 1955 1950 1960Sjon Damstr 9 M 1975 1975 1980Truus Amstel 80 V 1953 1950 1960Bep Rokin 42 V 1959 1950 1960Anita 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)”

Page 19: Databases I  (H. 9.3) Tupelcalculus

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

}

Page 20: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld complexe queries (I)

m.naam m.adres v.naam v.adresTeun 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

Page 21: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld complexe queries (II)

CAN_SUPPLYSUPPLIER PART PRICE

s1 p1 3 s1 p2 3 NEEDED s2 p1 2 PART 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”

Page 22: Databases I  (H. 9.3) Tupelcalculus

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.suppliers2s3

Page 23: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld complexe queries (II)

{ (cs1.supplier) | CAN_SUPPLY(cs1) CAN_SUPPLY p (NEEDED(p) SUPPLIER PART 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 4 NEEDED s3 p1 4 PART s3 p2 3 p1 s3 p3 3 p2 s3 p4 8 p3

Page 24: Databases I  (H. 9.3) Tupelcalculus

Voorbeeld complexe queries (III)

DRAAIT FAN_VANSTATION ARTIEST PERSOON ARTIESTCountry Carpenters Jan OPCountry Parton Piet MeeuwisNoordzee Hazes Joost BorsatoNoordzee Borsato Joost CarpentersNoordzee MeeuwisRadio10 Meeuwis LUISTERT_NAARRadio10 Elvis PERSOON STATIONRadio10 Abba Jan Radio10

Piet Noordzee Joost Radio10 Joost Noordzee

Page 25: Databases I  (H. 9.3) Tupelcalculus

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.artiestHazesBorsatoMeeuwisElvisAbba

Page 26: Databases I  (H. 9.3) Tupelcalculus

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.persoonJan

Page 27: Databases I  (H. 9.3) Tupelcalculus

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.persoonPietJoost

Page 28: Databases I  (H. 9.3) Tupelcalculus

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

Page 29: Databases I  (H. 9.3) Tupelcalculus

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

Page 30: Databases I  (H. 9.3) Tupelcalculus

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 iedereattribuut-waarde van de output een element is van hetbij die query behorende (safe-)domein

Page 31: Databases I  (H. 9.3) Tupelcalculus

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’