Databases Reference
In-Depth Information
Aufgabe 5.39
Welche Bestellungen sind nicht von Kunden aus Kayhude?
Aufgabe 5.40
Welche Artikel haben einen höheren Listenpreis als alle Artikel, deren
artikel_nr
mit
'G'
anfängt?
Hinweis: Verwenden Sie in der Bedingung der Unterabfrage den Operator
LIKE
.
Aufgabe 5.41
Welche Artikel sind schon irgendwann einmal bestellt worden? Welche sind noch
nie bestellt worden? Geben Sie jeweils die Artikel_nr und die Bezeichnung an.
Aufgabe 5.42
Welche Kunden haben kein Girokonto?
5.4.5 EXISTS versus IN
Abfragen mit
EXISTS
lassen sich grundsätzlich in Abfragen mit
IN
umwandeln.
Vorsicht ist aber geboten, da Bedingungen mit
EXISTS
grundsätzlich nur die Wahr-
heitswerte
TRUE
und
FALSE
ergeben, Bedingungen mit
IN
können auch
UNKNOWN
zurückgeben. Das spielt dann eine Rolle, wenn Bedingungen mit
NOT
verneint wer-
den, da
NOT
FALSE
=
TRUE
und
NOT
UNKNOWN
=
UNKNOWN
ist. Ein Tupel wird aber dann in
die Ergebnisrelation übernommen, wenn die Bedingung auf
TRUE
evaluiert, bei
UNKNOWN
und
FALSE
fällt es heraus.
25
An folgendem Beispiel erläutern wir den Unterschied: Gesucht sind die Bestellun-
gen, bei denen keine Position mit der Liefermenge 11 auftritt.
SELECT * FROM bestellung AS b
WHERE NOT 11 in
(SELECT liefermenge FROM position AS p
WHERE b.bestell_nr = p.bestell_nr);
bestell_nr kunden_nr bestelldatum lieferdatum rechnungsbetrag
=========== ========= ============ =========== ===============
151 101 2000-04-28 2000-05-02 196.75
152 103 2000-04-30 2000-05-02 2270.86
Bei den Positionen, in denen die Liefermenge noch gar keinen Wert enthält, ergibt
die Bedingung »
11
IN
(SELECT
liefermenge ...
«
den Wahrheitswert
UNKNOWN
.
Daran ändert auch die Verneinung mit
NOT
nichts. Anders bei der nächsten
Abfrage. Dort wird die Bedingung »
EXISTS (SELECT liefermenge ... WHERE ...
25 Eine ausführliche Darstellung dieses Problems findet sich in [Date90a S. 339ff].