Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdJoannes de Croon Laatst gewijzigd meer dan 9 jaar geleden
1
Databases I (H.7.4 e.v.) Relationele Algebra Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003
2
Queries en querytalen u Strikt genomen is een query een vraag (in dit geval een vraag naar specifieke informatie uit de database) Een voorbeeld van een query: “Geef de namen en geboortedata van de employees die bij department engineering werken” u In de database-wereld worden update-opdrachten ook geformuleerd m.b.v. een “querytaal”, m.a.w. omvat het begrip “query” dus ook vaak update-opdrachten u “opdracht” en “opdrachttaal” zijn dus eigenlijk betere benamingen dan “vraag” en “vraagtaal”
3
Onze voorbeeld-DB 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
Resultaat van VB-query op VB-DB Resultaat van de voorbeeld-query “Geef de namen en geboortedata van de employees die bij department engineering werken” bij uitvoering op de voorbeeld-DB: NAMEBDATE John28-08-1964 Joe 04-04-1968 Jack03-09-1969
5
Te behandelen querytalen 3 soorten querytalen: u relationele algebra u domeincalculus u tupelcalculus één specifieke (en belangrijke) querytaal: u SQL (omvat zowel algebra als tupelcalculus)
6
Relationele Algebra u Idee: querytaal bestaande uit operaties –die werken (gedefinieerd zijn ) op één of meerdere relaties, en –die elk weer opnieuw een relatie opleveren u Operaties in Rel. Algebra o.a.: –select ( ) –project ( ) –intersection ( ) –union ( ) –difference (-) –carthesisch product ( ) –theta-join (|> <|), natural join ( ) –division (÷) –rename –outer union, outer join (left: =|> <|=),...
7
Voorbeeld Select ( ) “Geef alle employees die werken bij department D2” RES D# = “D2” EMP RES E#NAME BDATE D# E4Will 21-03-1971 D2 E5Bridget 22-01-1972 D2
8
Select: cond (REL) u select condition is o.a. van de vorm: –attribuutnaam comp waarde –attribuutnaam comp attribuutnaam met comp { ‘ ’, ‘ ’, ‘ ’, ‘ ’, ‘ ’, ‘ ’ } u select werkt op hele relatie, select condition wordt voor elk individueel tupel uitgerekend u select condition mag AND, OR of NOT bevatten voorbeeld: (D# = “D1”) AND (BDATE < “01-01-1965”) EMP
9
Voorbeeld Project ( ) “Geef voor elke employee z’n naam en geboortedatum” RES NAME, BDATE EMP RES NAME BDATE John 28-08-1964 Joe 04-04-1968 Jack 03-09-1969 Will 21-03-1971 Bridget 22-01-1972
10
Project: attr_1, attr_2, …, attr_n (REL) u geeft voor ieder tupel uit REL een tupel met uitsluitend de attributen attr_1, attr_2, …, attr_n u attr_1, attr_2, …, attr_n moeten attributen zijn van relatie REL (en verschillend) u dubbele tupels worden geëlimineerd (in Rel. Algebra)
11
Voorbeeld Rename en Cartesian Product ( ) RES (E#, ENAME, BDATE, ED#, DD#, DNAME, BUDGET) EMP DEPT RES E# ENAMEBDATEED#DD#DNAMEBUDGET E1 John28-08-1964D1D1engineering500,000 E1 John28-08-1964D1D2sales200,000 E2 Joe04-04-1968D1D1engineering500,000 E2 Joe04-04-1968D1D2sales200,000 E3 Jack03-09-1969D1D1engineering500,000 E3 Jack03-09-1969D1D2sales200,000 E4 Will21-03-1971D2D1engineering500,000 E4 Will21-03-1971D2D2sales200,000 E5 Bridget22-01-1972D2D1engineering500,000 E5 Bridget22-01-1972D2 D2sales200,000
12
Cartesian Product: REL1 REL2 u Geeft alle tupels bestaande uit een “aan elkaar geplakte” combinatie van een tupel uit REL1 met een tupel uit REL2 u De attribuutnamen worden “geërfd” van REL1 en REL2 u Als in REL1 en REL2 een zelfde attribuutnaam voorkomt, dan is een rename nodig, omdat voor elke relatie geldt dat zijn attributen altijd verschillende namen moeten hebben!
13
Rename: RES (attr_1,..., attr_n) ... u Geeft de attributen van het resultaat van de expressie aan de rechterkant van de assignment de attribuutnamen attr_1, attr_2, attr_3,..., attr_n u In deze door het boek (en tot nu toe door ons) gebruikte syntax: –moeten de namen van alle attributen opgegeven worden, en –zijn afspraken over “de gebruikte volgorde” helaas noodzakelijk !! u In alternatieve (of aanvullende) en betere syntax/notatie: –alleen opgave van gewijzigde namen vereist, en –wordt evt. qualification gebruikt (ter vermijding volgorde-afspraken) Voorbeelden: EMP2 (ENAME = NAME, ED# = D#) EMP RES2 (ENAME = EMP.NAME, ED# = EMP.D#) EMP DEPT u Eig. beste notatie: (ENAME = NAME, ED# = D#) EMP
14
Voorbeeld Equijoin (|><| equ.cond ) RES (ENAME = EMP.NAME, ED# = EMP.D#) EMP |><| EMP.D# = DEPT.D# DEPT of: RES ( (ENAME = NAME, ED# = D#) EMP) |><| ED# = D# DEPT RES E# ENAMEBDATEED#D#NAMEBUDGET E1 John28-08-1964D1D1engineering500,000 E2 Joe04-04-1968D1D1engineering500,000 E3 Jack03-09-1969D1D1engineering500,000 E4 Will21-03-1971D2D2sales200,000 E5 Bridget22-01-1972D2 D2sales200,000
15
Equijoin: REL1 |><| equ.cond REL2 u is hetzelfde als: eqn.cond (REL1 REL2) u “plakt” dus elk tweetal tupels (steeds één van REL1 en één van REL2) aan elkaar, maar alleen als ze voldoen aan de gegeven “gelijkheidsconditie” u de “gelijkheidsconditie” moet bestaan uit één vergelijking m.b.v. de operator “=” of meerdere van zulke vergelijkingen onderling verbonden door de boolean operator “AND” dus b.v.:REL1.A = REL2.B REL1.A = REL2.B AND REL1.C = REL2.D REL1.A = REL2.B AND REL1.C = REL2.D AND...
16
Voorbeeld Natural Join ( equ.cond ) RES (ENAME = EMP.NAME) EMP EMP.D# = DEPT.D# DEPT RES E# ENAMEBDATED#NAMEBUDGET E1 John28-08-1964D1engineering500,000 E2 Joe04-04-1968D1engineering500,000 E3 Jack03-09-1969D1engineering500,000 E4 Will21-03-1971D2sales200,000 E5 Bridget22-01-1972D2sales200,000 N.B. Als bovenstaand alleen “ ” (dus zonder conditie) zou zijn gebruikt, dan “by default” een natural join over (NAME, D#)-combinatie en dan dus als resultaat een lege relatie !! (Want er komen geen gelijke namen voor in EMP.NAME en DEPT.NAME)
17
Natural Join:REL1 equ.cond REL2 u is (bijna) hetzelfde als equijoin, maar projecteert van elk “gelijkgesteld paar” steeds één van beide attributen weg u gebruik b.v.k. expliciete gelijkheidsconditie: –wij:als bij equijoin: EMP EMP.D# = DEPT.D# DEPT –boek:aparte notatie:EMP (D#), (D#) DEPT u als “ ” zonder conditie, dan impliciete gelijkheidsconditie: de gelijksconditie bevat dan “alle paren attributen met dezelfde naam” (natuurlijk vergeleken met “=” en verbonden door “AND”)
18
Voorbeeld Theta-join (|><| cond ) RES (ENAME = EMP.NAME, ED# = EMP.D#) EMP |><| EMP.NAME < DEPT.NAME DEPT RES E# ENAMEBDATEED#D#NAMEBUDGET E1 john28-08-1964D1D2sales200,000 E2 joe04-04-1968D1D2sales200,000 E3 jack03-09-1969D1D2sales200,000 E5 bridget22-01-1972D2D1engineering500,000 E5 bridget22-01-1972D2 D2sales200,000 N.B. Voor dit voorbeeld de namen van employees gebruikt zonder hoofdletter om de vergelijking met namen van departments eenduidig te maken
19
Theta-join: REL1 |><| cond REL2 u is hetzelfde als: cond (REL1 REL2) u “plakt” dus elk tweetal tupels (steeds één van REL1 en één van REL2) aan elkaar, maar alleen als ze voldoen aan de gegeven conditie u boek: de conditie moet bestaan uit één willekeurige vergelijking of meerdere onderling verbonden door “AND” dus b.v.:REL1.A REL2.B AND REL1.C REL2.D u wij: ook “OR” en “NOT” toegestaan en evt. zelfs een willekeurige conditie !! (In het laatste geval kan het cartesisch product gezien worden als een theta-join met conditie true)
20
Vb. met Project, Select, Rename en Equijoin “Geef de namen van de dependents van Will” EMP2 (E_E#, E_NAME, BDATE, D#) EMP DPD2 (D_E#, D_NAME, REL) DPD EMP_DPD EMP2 |><| E_E#=D_E# DPD2 RESULT D_NAME ( E_NAME = “Will” (EMP_DPD)) NAME Suzie Tom Mary
21
Tussenresultaat na equijoin EMP_DPD E_E#E_NAME BDATE D# D_E# D_NAME REL E3Jack 03-09-1969 D1 E3 Mary daughter E3Jack 03-09-1969 D1 E3 Sue wife E4Will 21-03-1971 D2 E4 Suzie daughter E4Will 21-03-1971 D2 E4 Tom son E4Will 21-03-1971 D2 E4 Mary wife
22
Zelfde vb. met Natural Join “Geef de namen van de dependents van Will” EMP2 (E#, E_NAME, BDATE, D#) EMP DPD2 (E#, D_NAME, REL) DPD EMP_DPD EMP2 DPD2 RESULT D_NAME E_NAME=“Will” EMP_DPD
23
Tussenresultaat na natural join EMP_DPD E#E_NAME BDATE D# D_NAME REL E3Jack 03-09-1969 D1 Mary daughter E3Jack 03-09-1969 D1 Sue wife E4Will 21-03-1971 D2 Suzie daughter E4Will 21-03-1971 D2 Tom son E4Will 21-03-1971 D2 Mary wife
24
Zelfde vb. met Cartesisch Product “Geef de namen van de dependents van Will” EMP2 (E_E#, E_NAME, BDATE, D#) EMP DPD2 (D_E#, D_NAME, REL) DPD EMP_DPD E_E# = D_E# (EMP2 DPD2) RESULT D_NAME ( E_NAME=“Will” (EMP_DPD))
25
Een vb. met Verschil ( ) en Natural Join ( ) “Geef de E#’s en namen van de ongehuwde engineering-employees” DEPT2 (D#, DPM_NAME, BUDGET) DEPT EMP2 (E#, EMP_NAME, BDATE, D#) EMP DPD2 (E#, DPD_NAME, REL) DPD ENGINEERS DPM_NAME=“engineering” ( EMP2 DEPT2) MARRIED REL=“husband” OR REL=“wife” ( EMP2 DPD2) RESULT ( E#,EMP_NAME ENGINEERS) ( E#,EMP_NAME MARRIED) E#EMP_NAME E1John E2Joe
26
Vereniging ( ) / Doorsnede ( ) / Verschil ( ) u geeft respectievelijk wiskundige vereniging, doorsnede en verschil van twee relaties u altijd voorwaarde: “union compatible” REL1 (A1, A2, … An) en REL2 (B1, B2, … Bm) kunnen alleen union compatible zijn als: –ze dezelfde graad hebben (d.w.z. n=m) –en voor iedere 1 i n geldt: dom(Ai) dom(Bi) OR dom(Ai) dom(Bi) u Merk op: relationele algebra bevat geen complement operator
27
Andere voorbeeld-DB PROJ J#NAME J1build-intranet 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
28
Voorbeeld Division ( ) “Geef de E#’s van de employees die werken aan alle projecten” EMP_PROJ ( J# (PROJ)) E#J# E2J1 E3J1J#E# E3J2 J1=E3 E4J2J2 E5J2
29
Division:REL1 REL2 u REL1 REL2 met REL1 (A1, A2, … An, B1, B2, … Bm) en REL2 (B1, B2, … Bm) geeft de waarden van A1, A2, … An die in REL1 voorkomen in combinatie met alle waarden (tupels) die in REL2 voorkomen u alternatieve beschrijving (m.b.v. domeincalculus): {a1, a2, … an | b1, b2, … bm: ( REL2(b1, b2, … bm) REL1(a1, a2, … an, b1, b2, … bm) )}
30
Relationeel volledig (relationally complete) u De verz. operaties { , , , , } is volledig, d.w.z. de andere operaties (zoals b.v. |><|, , of ) kunnen hierin worden uitgedrukt. u Strikt genomen is bovenstaande uitspraak onjuist !! Want de rename-operatie ( ) ontbreekt nog. u Ook na toevoeging van kunnen wel de tot nu toe behandelde operaties hierin uitgedrukt worden, maar b.v. nog niet aggregaat-functies. u Nog niet expliciet vermeld, maar ook nodig, is een “tuple constructor”. (O.a. nodig voor kunnen uitdrukken van insertions, deletions, outer union en outer joins.)
31
Herschrijven doorsnede ( ) R S (R S) ((R S) (S R))
32
Herschrijven theta-join (|><|) R |><| cond S cond (R S)
33
Herschrijven division ( ) Als JNRS staat voor J# (PROJ), dan geldt: WORK_ON_ALL EMP_PROJ JNRS geeft hetzelfde resultaat als: ALL_W_EMPS E# (EMP_PROJ) MISSING_PAIRS (ALL_W_EMPS JNRS) EMP_PROJ WORK_ON_ALL ALL_W_EMPS E# (MISSING_PAIRS)
34
Keys Stel, je hebt: EMP2 (E#, E_NAME, BDATE, E_D#) EMP DEPT2 (D_D#, D_NAME, BUDGET) DEPT Wat wordt dan de key van: u EMP2 |><| E_D# = D_D# DEPT2 ?antw.: E# u EMP2 DEPT2 ?antw.: (E#, D_D#) u E_D# = D_D# (EMP2 DEPT2) ?antw.: E# Opmerkingen: –“voor elke relatie, dus ook voor relaties die resultaat zijn van relationele algebra operaties, kun je een primary key definiëren” –echter, evt. wel degelijk een probleem: 1) als er null-waarden voorkomen, en 2) bij outer union (zie later)
35
Voorbeeld Left Outer Join (=|><|) “Geef van iedere employee zijn/haar E# en, zo mogelijk, de naam van zijn echtgenote resp. haar echtgenoot” EMP2 (E_E#, E_NAME, BDATE, D#) EMP DPD2 (D_E#, D_NAME, REL) DPD ECHTGENOTEN REL=“husband” OR REL=“wife” DPD2 RES E_E#, D_NAME (EMP2 =|><| E_E# = D_E# ECHTGENOTEN)
36
Tussenresultaat direct na left outer join E#E_NAME BDATE D# D_E# D_NAME REL E1John 28-08-1964 D1 null null null E2Joe 04-04-1968 D1 null null null E3Jack 03-09-1969 D1 E3 Sue wife E4Will 21-03-1971 D2 E4 Mary wife E5Bridget 22-01-1972 D2 null null null
37
Eindresultaat RES E_E# D_NAME E1 null E2 null E3 Sue E4 Mary E5 null
38
Left Outer Join:REL1 =|><| cond REL2 u REL1 =|><| cond REL2 bevat: –de tupels die zouden worden geproduceerd door een theta-join (met dezelfde join-conditie), en –de tupels uit REL1 waarvoor er geen bijbehorend tupel uit REL2 bestaat dat voldoet aan de join-conditie; deze tupels worden aangevuld met null-waarden voor de attributen van REL2 u ook bij de (left) outer join geldt als voorwaarde dat REL1 en REL2 geen attributen met dezelfde naam bevatten
39
Nog een andere voorbeeld-DB SECRETARY NAME SSN BDATE ADDRESS TSPEED Sue 001 21-08-1971 Singel 30 80 Mary 002 18-12-1968 Damrak 18 90 SALESMAN NAME SSN BDATE ADDRESS LIMIT John 003 08-08-1969 Rokin 21 50 000 Joe 004 09-10-1970 Nes 87 75 000 ENGINEER NAME SSN BDATE ADDRESS SPECIAL Jack 005 02-02-1972 NZVBW 13 electronics Jill 006 01-01-1971 NZABW 15 software
40
Voorbeeld Outer Union “Geef van alle employees (= secretary, salesman of engineer) de naam, ssn en (indien aanwezig) typesnelheid” EVERYBODY SECRETARY OUTER_UNION SALESMAN OUTER_UNION ENGINEER RESULT NAME, SSN, TSPEED (EVERYBODY)
41
Tussenresultaat (direct na outer unions) EVERYBODY NAME SSN BDATE ADDRESS TSPEED LIMIT SPECIAL Sue 001 21-08-1971 Singel 30 80 null null Mary 002 18-12-1968 Damrak 18 90 null null John 003 08-08-1969 Rokin 21 null 50 000 null Joe 004 09-10-1970 Nes 87 null 75 000 null Jack 005 02-02-1972 NZVBW 13 null null electronics Jill 006 01-01-1971 NZABW 15 null null software
42
Eindresultaat RESULT NAME SSN TSPEED Sue 001 80 Mary 002 90 John 003 null Joe 004 null Jack 005 null Jill 006 null
43
REL1 Outer Union REL2 REL1 OUTER_UNION REL2: –gedefinieerd op relaties die partially compatible zijn (d.w.z. slechts sommige attributen zijn union compatible) –levert relatie op met tupels met alle attributen van REL1 en/of REL2 –tupels die uit REL1 afkomstig zijn hebben null-waarden voor attributen die uitsluitend in REL2 zitten –tupels die uit REL2 afkomstig zijn hebben null-waarden voor attributen die uitsluitend in REL1 zitten Outer Union mag alleen als je in het resultaat een Primary Key kunt definiëren
44
Voorbeeld Aggregate Functions “Geef het gemiddelde department-budget” F AVERAGE (BUDGET) DEPT AVERAGE_BUDGET 350 000 “Geef per D# het aantal employees” D# F COUNT (E#) EMP D#COUNT_E# D1 3 D2 2
45
Agg. Functions: grouping_attr F function_list REL u grouping attributes behoren allen tot REL u mogelijke functies: –count –minimum –maximum –sum –average u resulterende relatie bevat een tupel voor elke verschillende en voorkomende waarde (resp. combinatie van waarden) van de grouping attribute(s) u wij: voorkeur voor gebruik van haakjes om de argumenten van elke gebruikte functie heen
46
Voorbeeld complexe queries (I) ZOEKENDE NAAM ADRES GESL GJAARMINJ MAXJ Teun Nes 30 M 19501950 1960 Truus Amstel 80 V 19531950 1960 Bep Rokin 42 V 19591950 1960 Anita NZVBW 18 V 19801975 1980 Wim Singel 23 M 19551950 1960 Sjon Damstr 9 M 19751975 1980 “Geef de namen en adressen van alle eventuele paren (d.w.z. personen van tegenovergesteld geslacht die binnen elkaars gewenste leeftijdscategorie vallen)”
47
Vb. complexe queries (I): antwoord M_ZOEKENDE(M_NAAM, M_ADRES, M_GJAAR, M_MINJ, M_MAXJ) NAAM, ADRES, GJAAR, MINJ, MAXJ GESL=“M” ZOEKENDE V_ZOEKENDE(V_NAAM, V_ADRES, V_GJAAR, V_MINJ, V_MAXJ) NAAM, ADRES, GJAAR, MINJ, MAXJ GESL=“V” ZOEKENDE COMBINATIE M_ZOEKENDE |><| V_MINJ M_GJAAR V_MAXJ V_ZOEKENDE AND M_MINJ V_GJAAR M_MAXJ PAAR M_NAAM, M_ADRES, V_NAAM, V_ADRES COMBINATIE
48
Vb. complexe queries (I): stappen 1 en 2 M_ZOEKENDE M_NAAM M_ADRESM_GJAAR M_MINJ M_MAXJ TeunNes 30 1950 19501960 WimSingel 23 1955 19501960 SjonDamstr 9 1975 19751980 V_ZOEKENDE V_NAAM V_ADRES V_GJAARV_MINJ V_MAXJ Truus Amstel 80 1953 19501960 Bep Rokin 42 1959 19501960 Anita NZVBW 18 1980 19751980
49
Vb. complexe queries (I): resultaat PAAR M_NAAM M_ADRESV_NAAMV_ADRES Teun Nes 30 TruusAmstel 80 Teun Nes 30 BepRokin 42 Wim Singel 23 TruusAmstel 80 Wim Singel 23 BepRokin 42 Sjon Damstr 9 AnitaNZVBW 18
50
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 voor iedere supplier s3 p4 8die alles kan leveren wat we nodig hebben, z’n totaalprijs”
51
Vb. complexe queries (II): idee stap 1 CAN_SUPPLY SUPPLIERPART PRICE s1 p1 3 NEEDED s1 p2 3 PART s2 p1 2 p1 s2 p2 3 p2 s2 p3 4 p3 s3 p1 4 s3 p2 3 s3 p3 3TOTAL_SUPPLIERS s3 p4 8SUPPLIER s2 s3
52
Vb. complexe queries (II): foute stap 1 SUPPLIERPRICE PART s1 3 p1 s1 3 p2 s2 2 p1PART s2 3 p2 p1 SUPPLIER PRICE s2 4 p3 p2 = s3 4 p1 p3 s3 3 p2 s3 3 p3 s3 8 p4leeg resultaat, dus zo moet het zeker niet...
53
Vb. complexe queries (II): goede stap 1 SUPPLIER, PART (CAN_SUPPLY) SUPPLIERPART s1 p1 s1 p2NEEDED s2 p1 PART TOTAL_SUPPLIERS s2 p2 p1 SUPPLIER s2 p3 p2 =s2 s3 p1 p3s3 s3 p2 s3 p3 s3 p4
54
Vb. complexe queries (II): antwoord “Geef voor iedere supplier die alles kan leveren wat we nodig hebben z’n totaalprijs” TOTAL_SUPPLIERS ( SUPPLIER, PART CAN_SUPPLY) NEEDED CAN_SUPPLY_RELEVANT CAN_SUPPLY TOTAL_SUPPLIERS NEEDED RESULT SUPPLIER F SUM (PRICE) CAN_SUPPLY_RELEVANT
55
Vb. complexe queries (II): resultaten stap 2 en 3 CAN_SUPPLY_RELEVANT SUPPLIERPART PRICE s2 p1 2 s2 p2 3 RESULT s2 p3 4 SUPPLIER SUM_PRICE s3 p1 4s2 9 s3 p2 3s310 s3 p3 3 N.B.:in stap 2 worden de relevante tupels “slim” geselecteerd d.m.v. 2 natural joins
56
Voorbeeld-DB t.b.v. complexe queries (III.a,b,c) DRAAITFAN_VAN STATIONARTIESTPERSOONARTIEST CountryCarpenters JanOP CountryParton PietMeeuwis NoordzeeHazes JoostBorsato NoordzeeBorsato JoostCarpenters NoordzeeMeeuwis Radio10MeeuwisLUISTERT_NAAR Radio10ElvisPERSOONSTATION Radio10Abba JanRadio10 PietNoordzee JoostRadio10 JoostNoordzee
57
Voorbeeld complexe queries (III.a) “Geef de artiesten die gedraaid worden op de stations waar Joost naar luistert” ARTIEST (( STATION PERSOON=“Joost” LUISTERT_NAAR) DRAAIT) alternatief: ARTIEST PERSOON=“Joost” ( LUISTERT_NAAR DRAAIT)
58
Voorbeeld complexe queries (III.b) “Geef de fans van artiesten die nergens gedraaid worden” GELIEFDE_ART ARTIEST FAN_VAN GEDRAAIDE_ART ARTIEST DRAAIT GEMISTE_ART GELIEFDE_ART GEDRAAIDE_ART RESULT PERSOON (FAN_VAN GEMISTE_ART)
59
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) PIET_STATIONS STATION PERSOON=“Piet” LUISTERT_NAAR RESULT LUISTERT_NAAR PIET_STATIONS
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.