Database 1
Data Manipulation

Prof. dr. Paul M.E. De Bra

Dept. of Computer Science

Eindhoven Univ. of Technology

Biervraag g (SQL)

Geef alle kroegen die alleen maar bier schenken

dat iemand lust die die kroeg bezoekt. In L&V notatie :

Omzetten naar TC:

tupel notatie invoeren (maar nog steeds L&V)

Voor SQL al-quantor omzetten naar negatieve existentie:

Vertalen naar SQL:

SELECT DISTINCT v.k FROM V AS v

WHERE NOT EXISTS

(SELECT * FROM S AS s

WHERE s.k = v.k AND NOT EXISTS

(SELECT * FROM V AS w, L AS l

WHERE w.k= v.k AND l.d = w.d AND l.b=s.b))

Gemaakte fouten (bloemlezing)

Geef commentaar:

SELECT DISTINCT S.k FROM S

WHERE S.b IN

(SELECT L.b FROM V, L

WHERE NOT L.b=S.b AND L.d=V.d AND V.k=S.k)

Tip: volgorde logische operatoren expliciet aangeven en altijd

renaming toepassen:

SELECT DISTINCT s.k FROM S AS s

WHERE s.b IN

(SELECT l.b FROM V AS v, L AS l

WHERE (NOT l.b=s.b) AND l.d=v.d AND v.k=s.k)

SELECT DISTINCT s.k FROM S AS s

WHERE s.b IN

(SELECT l.b FROM V AS v, L AS l

WHERE (NOT l.b=s.b) AND l.d=v.d AND v.k=s.k)

Terugvertalen naar L&V:

Expressie zonder v uit existentie halen:

Hier staat dus:

de lege verzameling!

SELECT k FROM S WHERE EXISTS

(SELECT k.b, V.d FROM V, L, S AS k

WHERE k.b = L.b AND L.k=V.k AND V.d=S.d)

Hier is geen touw aan vast te knopen!

SELECT S.k FROM S WHERE EXISTS

(SELECT S.b, V.d FROM S, V, L

WHERE S.b = L.b AND S.k=V.k AND V.d=L.d)

Altijd tupels renamen (twee keer tupel uit S!); bij EXISTS

of NOT EXISTS is geen projectie nodig.

SELECT s.k FROM S AS s WHERE EXISTS

(SELECT * FROM S AS t, V AS v, L AS l

WHERE t.b = l.b AND t.k=v.k AND v.d=l.d)

L&V:

Uitkomst: alle kroegen of lege verzameling (als de kroegen enkel

worden bezocht door drinkers die de geschonken bieren niet lusten)!

SELECT k FROM S EXCEPT

(SELECT k FROM S as S1, V, L

WHERE S1.k=V.k  NOT(V.d=L.d  L.b=S1.b))

Syntaxfouten herstellen en altijd tupels renamen:

SELECT s.k FROM S AS s EXCEPT

(SELECT s1.k FROM S as s1, V AS v, L AS l

WHERE S1.k=V.k AND NOT(V.d=L.d AND L.b=S1.b))

Omzetten naar L&V:

Splitsen existentie:

Bij vaste v en s1 is

altijd true tenzij (v[d], s1[b]) het enige L-tupel is.

Omdat alle bieren gelust worden en alle drinkers bier lusten moet

dan v[d] de enige drinker en s1[b] het enige bier zijn.

Moraal:

1. Altijd renamen van tupels ("FROM tabel AS tupel")

2. Gebruik haakjes bij twijfel volgorde operatoren

3. Probeer aan te sluiten bij L&V; omzetting in beide

richtingen is mogelijk!

4. Bedenk dat in queries als

SELECT .. FROM T AS t, S AS s WHERE t.a <> s.b

de where-clause meestal true is.

In this colstruction we look at common errors in attempts to answer beer query 7 (g) in SQL.

Databases 1, Colstructie 12

SQL bloemlezing

Paul De Bra

2003-04-01T22:52:54

Paul De Bra