Sie sind auf Seite 1von 59

3.2.

3 where-Klausel ohne
Unteranfragen im Detail
Wiederholung
Formeln bestehen aus Atomen der Form
A op B
op steht fr ein Vergleichsoperator
A und B stehen hier nicht nur fr Attribute und Konstanten,
sondern es knnen auch komplexere Ausdrcke sein.
Numerische Attribute: Nutzung der arithmetischen
Grundoperatoren und zustzlicher Funktionen (z. B.
abs).
Zeichenketten: Verkettung ||.
Atome knnen mit den Operatoren not, or und and zu
komplexeren Formeln verknpft werden.

168
Atomare Formeln

between-Operator
A between B and C
Ausdruck ist quivalent zu B <= A and A <= C
like-Operator
A like B
Verwendung bei Zeichenketten, um einfache Mustersuchen
zu untersttzen.
Test auf Gleichheit von Zeichenkettet, wobei Wildcards
benutzt werden knnen.
% reprsentiert beliebig viele Zeichen
_ reprsentiert genau ein Zeichen
Beispiel:
select PName
from Personal
where Vorname like 'M%g_t'
169
Atomare Formeln (2)

in-Operator
Es gibt zwei Varianten des in-Operators. Hier zunchst
mal die einfachere.

A in (b,c,,z)
Dabei ist A ein Ausdruck und b,,z Konstanten.
Dieser Ausdruck ist quivalent zu
A = b or A = c or or A = z

170
NULL-Werte

Problem
Es soll in die Relation PMZuteilung eingetragen werden,
dass der Angestellte mit pnr = 82 die Maschine mit mnr
= 84 bedienen kann.
Leider ist die Note des Angestellten fr die Maschine
noch nicht bekannt.

Lsung
Um das Einfgen unvollstndiger Datenstze zu
untersttzen, bekommen die nicht mit einem Wert
belegten Attribute den Wert NULL zugewiesen.
Somit ist das Einfgen durch
insert into PMZuteilung (pnr, mnr) values (82,84)
mglich.
171
und die Konsequenzen einer
voreiligen Entscheidung
Die beiden Anfragen
select * from PMZuteilung where note > 3; Das ist doch das
select * from PMZuteilung where note < 4; negierte Prdikat!!

liefern den Datensatz (82,84,null) nicht zurck!


Der Datensatz kann nicht wie blich gefunden werden.

Lsung
Es kann explizit auf den Wert null getestet werden.
Beispiel
select * from PMZuteilung where note is null;

172
und damit hat man eine
dreiwertige Logik!
Die mit null-Werten aufgefllten Attribute erfordern
eine dreiwertige Logik
Zustzlich zu dem Wert true und false kann eine
Bedingung den Wert unknown liefern.

Das Ergebnis einer Bedingung ist


unknown, wenn ein null-Wert mit einem anderen Wert
durch einen relationalen Operator verglichen wird.

173
Die Wahrheitstabellen der
dreiwertigen Logik
AND true false unknown
true true false ?
unknown
false false false false?
?
unkown unknown ?
false ?
unknown

OR true false unknown


true true true true?
false true false ?
unkown
unkown true? ?
unknown ?
unknown

NOT true false unknown


false true ?
unknown

Eine Selektion (where-Klausel) liefert nur die Datenstze,


die bei der Auswertung den Wert true liefern.
174
3.2.4 Joins

Joins werden in SQL durch kartesisches Produkt


und Selektion ausgedrckt. Join-Bedingung
Equi-Join der Relationen r und s
select * from r, s where r.A = s.B

Relationen
Hiermit lassen sich auch Semi-Joins ausdrcken
select r.* from r, s where r.A = s.B
Liefert alle Attribute der Relation r

Das Datenbanksystem nutzt clevere Strategien,


um die Berechnung des kartesischen Produkts zu
vermeiden.

175
Joins in der from-Klausel

Joins knnen direkt in der from-Klausel formuliert


werden.
Innere Join-Varianten
Das Schlsselwort inner kann weggelassen werden.
Innerer Theta-Join
from r inner join s on r.A > s.B
Innerer Equi-Join ber ein gemeinsames Attribut A
from r inner join s using (A)
- Resultatschema enthlt das Attribut A genau
einmal.
Natural Join
from R natural inner join S

176
Outer-Joins

Outer-Joins sind spezielle Joins


Ergebnis umfasst alle Tupel des quivalenten inneren
Join
Zustzlich werden noch die Tupel, die keinen Join-
Partner haben, in das Ergebnis aufgenommen.
Die fehlende Werte werden mit dem Wert null aufgefllt.
Folgende Outer-Joins existieren
left outer join
from r left outer join s on r.A = s.B
right outer join
from r right outer join s on r.A = s.B
full outer join
from r full outer join s on r.A = s.B
177
Beispiel (abstrakt)
A B B c
a1 b1 b1 c1
a2 b2 b3 c2

left-outer A B C
Join a1 b1 c1
a2 b2 null

right-outer A B C
join a1 b1 c1
null b3 c2

full-outer A B C

Join a1 b1 c1
a2 b2 null
null b3 c2
178
3.2.5 select-Klausel

Ausgabe aller Attribute


select * from r, s, where .
Alle Attribute der Relationen r, s, werden ausgegeben.
Ausgabe aller Attribute einer Relation
select r.* from r,s where
Alle Attribute der Relation r werden ausgegeben.
Beispiel
select Personal.* from Personal, PMZuteilung using (pnnr)

Wiederholung: Mengen- und Multimengensemantik


Mengensemantik: Beseitigung der Duplikate
select distinct pnr from PMZuteilung
Multimengensemantik: Erhaltung der Duplikate
select pnr from PMZuteilung
179
Umbenennung und Berechnung

Umbenennung von Attributen


select mnr as m, pnr as p from PMZuteilung;
Verwendung der map-Operation
Ausdrcke und Funktionen (Ann.: RSr = {B,C,D})
select B*C as Y, abs(D) as Z from r
Die select-Klausel verhlt sich wie ein Map-Operator
Die Anzahl der Tupel in der Eingaberelation bleibt gleich!
Beispiel
Vorlesung

Behandlung von Unteranfragen in der select-


Klausel spter!

180
3.2.6 Aggregate

Aggregatfunktion
Liefert zu einer Menge/Multimenge von Werten einen
Wert zurck.

Anwendung von Aggregatfunktionen in SQL


Die Aggregatfunktion wir auf eine Spalte in einer Tabelle
angewendet.
select count(pnr) from PMZuteilung;

Spalten knnen durch einen Ausdruck oder eine


Funktion dynamisch erzeugt werden.
select count(pnr/10) from PMZuteilung;

181
Aggregatfunktionen in SQL

Typische numerische (unre) Aggregate


count, sum, avg, min und max.

Weitere statistische Aggregate


variance, corr, stddev, regr_slope

Logische Aggregate (liefern true oder false)


exists, every, any, some
Diese werden spter besprochen.

182
Aggregate min und max

Aggregate min und max


Liefern zu einem mengenwertigen Ausdruck, das
kleinste bzw. das grte Element der Menge.
Null-Werte werden dabei ignoriert.

Beispiel
Liefere fr die Angestellten der Abteilung A4 die beste
und schlechteste Note bei der Bedienung einer
Maschine.

select min(Note), max(Note)


from

183
Aggregatfunktion count

Zwei Varianten
count(*) - Anzahl der Tupel in einer Menge.
Beispiel:
select count(*) from PMZuteilung where mnr = 93;
count(A) A ist ein Attribut oder ein Ausdruck
Ergebnis ist dann die Anzahl der Werte in der Menge
(ohne die NULL-Werte)
Falls die Menge leer oder nur aus Nullewerten
besteht, wird die Zahl 0 geliefert. r A B
Beispiel a1 2
select count(A) from r; a1 5
NULL 2

184
Aggregatfunktionen sum, avg

sum
Berechnung der Summe ber einen
multimengenwertigen Ausdruck.
avg
Berechnung des Durchschnitts ber einen
mengenwertigen Ausdruck.
Beispiel
select sum(B), avg(B) from r;
Unterschied zu count
Bei einer leeren Eingabe wird der Wert NULL und nicht
die Zahl 0 zurckgeliefert.

185
Aggregate mit distinct

Bei Eingabe einer Multimenge kann mit distinct vor dem Aggregat
zunchst eine Duplikatelimininierung vorgenommen werden.
Beispiele
select count(distinct A), avg(distinct B) from r;
In count(*) kann distinct nicht genutzt werden.

186
Mengenwertige Aggregate

Motivation
Berechnung von Aggregaten liefert genau ein Wert.
Beispiel:
Berechne die Anzahl der Angestellten, die Maschine 42
bedienen knnen.
Wunsch: Berechne dieses Aggregat fr alle Maschinen
Formulierung der Anfrage fr jede Maschine?
Stattdessen
Verwendung einer Anfrage mit einer group-by-Klausel
Siehe Operator der erweiterten RA

187
3.2.7 Gruppierung in SQL

Fr die Gruppierung gibt es eine Group-by-Klausel


Diese Klausel beginnt mit dem Schlsselwort group by
und steht direkt hinter der optionalen where-Klausel
Die Group-by-Klausel besteht aus
einer Liste von Attributen
Relation wird partitioniert in quvivalenzklassen bzgl.
der Gleichheit in den angegebenen Attributen.
Die Attribute mssen auch in der select-Klausel stehen.
Aber sie mssen nicht notwendigerweise im Schema
einer der Relationen in der from-Klausel sein.
Optionale Aggregate in der select-Klausel werden fr jede
quivalenzklasse berechnet.
Keine Aggregate vorhanden Duplikateliminierung

188
Beispiel

Beispiel mnr = 101


select mnr, count(*)
mnr = 93

from PMZuteilung
mnr = 84
group by mnr;
Gruppierung mit einem Ausdruck
select pnr/10 as p, count(*)
from PMZuteilung
group by p;
Gruppierung mit mehreren Attributen
select pnr, note, count(*)
from PMZuteilung
group by pnr, note;

189
Null-Werte

Gibt es einen Null-Wert in der Spalte, wird eine


eigene Gruppe erzeugt.
Das Aggregat wird wie blich berechnet.
Mehrere Gruppierungsattribute mit Null-Werten
NULL steht in jedem Attribut fr einen Wert
Beim Gruppieren wird dies entsprechend umgesetzt.
tmp3

select x,y,count(*)
from tmp3
group by x,y;

190
Having

Motivation
Bei der Berechnung von Durchschnittsnoten sind nur
die quivalenzklassen interessant, die gengend viele
Datenstze haben.
siehe Vorlesungsevaluation der Fachschaft
Having-Klausel
Filtern von Gruppen, die gewisse Bedingungen erfllen.
Die Having-Klausel steht hinter der Group-By-Klausel
und beginnt mit dem Schlsselwort having.
Danach folgt ein Prdikat, dass fr eine Gruppe genau
einen Booleschen Wert (true oder false) liefert.
Nur dieGruppen, fr die das Prdikat true liefert,
werden noch in der Anfrage bercksichtigt.

191
Prdikate in der Having-Klausel

Einschrnkung der Prdikate


Attribute aus der Group-By-Klausel
Aggregatfunktionen
Liefern pro Gruppe genau einen Wert

Beispiel
select mnr, avg(note)
from PMZuteilung
group by mnr
having count(*) > 2;

192
3.2.8 Sortierte Ausgabe

Motivation
Ausgabe der Angestellten sortiert bzgl. Der
Durchschnittsnote in PMZuteilung.
Order-Klausel
beginnt mit dem Schlsselwort order by
direkt hinter der optionalen having-Klausel
Danach folgt eine Liste von Sortierkriterien
Sortierung wird bestimmt durch erstes Kriterium. Im Fall
von Gleichheit wird das zweite Kriterium genutzt, usw.

ORDER BY sort_expression1
[ASC | DESC] [NULLS { FIRST | LAST }]
[, sort_expression2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
193
Sortierkriterien

Attribute
Entweder im Schema der Relationen aus der from-
Klausel vorhanden.
oder die erst in der Select-Klausel definiert wurden.
ASC|DESC
Option, ob aufsteigend oder abtsteigend sortiert wird.
Default: Aufsteigend (ASC)
NULLS { FIRST | LAST }
Behandlung von Nullwerten
zuerst oder am Ende der sortierten Ausgabe
Erst seit SQL:2003 im Standard

194
Einschrnkung der Resultate

Motivation
Man mchte die drei besten Angestellten (beste
Durchschnittsnote) auszeichnen.
Sortieren der Daten und auslesen der ersten drei Tupel.
Limit-Klausel
limit N [offset M]
N, M sind ganze Zahlen
Anfrage liefert aus der sortierten Ergebnisfolge das
(M+1)-te, (M+2)-te, (M+N-1)-te Tupel.
Sinnvoll nur bei SQL-Anfragen mit order-by-Klausel.
Optimierungspotential bei der Auswertung der Anfrage!
Syntax noch nicht im SQL-Standard, aber wird bereits von
vielen Datenbanksystemen untersttzt.

195
Beispielanfragen

Wie viele Angestellte knnen Maschine 93 bedienen?

Liefere fr jede Maschine die Anzahl der Angestellten, die diese


Maschine bedienen knnen.

Liefere fr jede Maschine die Anzahl der Angestellten, die diese


Maschine bedienen knnen, aber nur die Maschinen mit
hchstens 2 Angestellten.

Sortiere PMZuteilung nach dem Attribut Note und dann nach dem
Attribut pnr.

Liefere nur die ersten drei Antworten der letzten Anfrage.

196
Zusammenfassung

Zusammensetzung einer SQL-Anfrage


select X
from R,S,T,...
where F
group by Y
having G
order by H
limit N offset M noch nicht im Standard !!
X eine Menge von Attributen
R,S,T, eine Liste von Relationen
Optional knnen bereits hier die Joins formuliert werden.
F eine Boolesche Formel
Y eine Menge von Attributen
G eine Boolesche Formel zur Filterung von Gruppen
H eine Liste von Attributen zum Sortieren

197
3.3 Geschachtelte Anfragen

Anforderung: Kompositionsfhigkeit
In SQL kann berall dort, wo bisher eine Relation verlangt
wird, eine temporre Relation in Form einer SQL-Anfrage
eingesetzt werden.
relationenerzeugende Unteranfrage
(engl.: table subquery)
berall dort, wo ein Wert verlangt wird, soll es mglich
sein, eine temporre Relation mit einem Attribut und einer
Spalte zu verwenden.
werterzeugende Unteranfrage
(engl. scalar subquery)
berall dort, wo ein Tupel stehen darf, erlaubt SQL eine
Unteranfrage, die genau ein Tupel produziert.
tupelerzeugende Unteranfrage
(engl.: row subquery)
198
Unteranfragen

SQL bietet deshalb die Mglichkeit, diese


Unteranfragen in vielen Klauseln zu verwenden.
Werterzeugende Unteranfragen knnen statt einer
Konstante in allen Ausdrcken stehen.

Im Folgenden
Werterzeugende Unteranfragen
Relationenerzeugende Unteranfragen in den folgenden
Klauseln
where-Klausel,
from-Klausel,
select-Klausel

199
3.3.1 Werterzeugende
Unteranfragen
Diese Unteranfragen produzieren eine Relation mit
genau einem Tupel und mit einem Attribut.
Beispiel:
select avg(note)
from pmzuteilung;
Diese Unteranfragen kann man in einem beliebigen
Ausdruck statt eines Werts oder andere Bezeichner
wiederverwenden.
Beispiel:
select pnr
from pmzuteilung
where note > (select avg(note) Unteranfrage muss in
from pmzuteilung) ! einem Klammerpaar stehen. !
200
Ausdrcke in SQL

Werterzeugende Unteranfragen werden in SQL in


einem Ausdruck verwendet.
Ausdrcke haben einen Typ.
bersicht zu Ausdrcken in SQL
Arithmetische Ausdrcke
Ausdrcke mit Zeichenketten
Hier gibt es die aus anderen Programmiersprachen
bekannten Operationen.
Ausdrcke fr spezielle Datentypen
Datum & Zeit
Boolesche Ausdrcke
Beachte dabei die dreiwertige Logik.
Wir werden spter noch mehr ber die Mglichkeiten von
Unteranfragen in solchen Ausdrcken erfahren.
201
3.3.2 From-Klausel

Statt einer persistenten Relation kann eine


temporre Relation (Unteranfrage) benutzt werden.
Syntax
Unteranfrage wird geklammert.
Es muss in PostgreSQL fr eine Unteranfrage stets eine
Tupelvariable definiert werden.
Beispiel
select v.mnr
from (select mnr, note from PMZuteilung where pnr < 100) v
where v.note < 3;
Unteranfrage Tupelvariable

202
Tupelvariablen

Tupelvariablen mssen bei Unteranfragen


deklariert werden.
Deklaration in der from-Klausel
Mit dieser Variable kann der Bezug zu den Variablen der
temporren Relation hergestellt werden.

Verwendung bei persistenten Relationen


zur Vermeidung langer Relationennamen
als eine Art Umbenennung von Relationen
Zwingend erforderlich, wenn Joins ber die gleiche
Relation berechnet werden.

203
Beispiel

Welche Angestellten knnen die gleiche Maschine


bedienen?

select distinct a1.pnr, a2.pnr


from PMZuteilung a1, PMZuteilung a2
where a1.mnr = a2.mnr and a1.pnr < a2.pnr

204
Having-Ersatz mit Unteranfragen

Mit Unteranfragen ist es mglich die having-


Klausel nachzubauen.
Pro Gruppe mssen dann ggf. weitere Aggregate fr
den Ausdruck in der having-Klausel produziert werden.
Diese Aggregate knnen dann durch eine Projektion
wieder entfernt werden.

Beispiel
Wie gut knnen Maschinen im Durchschnitt bedient?
Liefere nur die Maschinen mit von mindestens vier
Angestellten bedient werden!
siehe Vorlesung

205
3.3.3 select-Klausel

Unteranfragen in der select-Klausel


Diese Unteranfragen drfen pro Ergebnistupel nur einen
Wert erzeugen.

Ein Spezialfall sind Anfragen, die insgesamt nur


einen Wert liefern.
Beispiel
select (select count(*) from PMZuteilung);

Solche Anfragen sind jedoch nicht von Bedeutung.

206
Korrelierte Unteranfrage

Sinn machen Unteranfragen in der select-Klausel


erst, wenn die Unteranfrage von der ueren
Anfrage abhngt.
Man spricht dann von korrelierten Unteranfragen!
Beispiel:
select B.pnr,
(select count(*) from Personal A
where A.pnr = B.pnr and Lohn < 40000)
from Personal B;

Diese Anfrage liefert fr jede Person B mit Personalnummer


B.pnr nur genau einen Wert!

207
Group-by Ersatz

Es lsst sich mit solchen Unteranfragen jede


group-by-Klausel nachbauen.
Historische Anmerkung:
Solche Unterfragen sind erst seit SQL2003 im Standard.
Tatschlich ist dies ausdrucksstrker als group-by
Es knnen gleichzeitig mehrere Gruppierungen in einer
Anfrage untersttzt werden.
select B.pnr,
(select count(*) from Personal A
where A.pnr = B.pnr and Lohn < 50000),
(select count(*) from Personal A
where A.pnr = B.pnr and Lohn > 60000)
from Personal B;

208
3.3.4 where-Klausel

Wie bereits oben erwhnt, lsst sich in einem


Prdikat eine werterzeugende Unteranfrage
benutzen.
Dies gilt ebenfalls fr die where-Klausel
Beispiel:
select mnr
from PMZuteilung
where pnr = 67 and note < (select avg(note)
from PMZuteilung);

209
exists

Skalare Unteranfragen mit exists


In der where Klausel werden auch Unteranfragen erlaubt,
die einen Booleschen Wert zurckliefern. Hierzu wird das
Schlsselwort exists genutzt.
exists <Subquery>
- true Unteranfrage ist nicht leer.
- Ansonsten wird der Wert false geliefert.

Bedeutungen von exists


exists steht fr den Existenzquantor in SQL
Man kann exists auch als Aggregatoperation ansehen,
die zu einer Menge die Werte true oder false liefert.

210
Korrelierte Unteranfragen in der
where-Klausel
Unteranfragen in der where-Klausel treten sehr oft
in korrelierter Weise auf.

Welche Abteilungen haben Angestellten, welche die


Maschine 84 bedienen knnen?

select distinct abtnr


uere
Anfrage from Personal P Korrelation
where exists (select pnr
Innere from PMZuteilung
Anfrage where P.pnr = pnr and mnr = 84)
Das ist doch wie im Tupelkalkl!

211
Sichtbarkeit von Tupelvariablen
in korrelierten Unteranfragen
Eine korrelierte Unteranfrage ist abhngig von
einer Tupelvariable der ueren Anfrage.
hnlich dem Konzept bei inneren und ueren Klassen
in Java stellt sich die Frage, welche Variablen in einer
Unteranfrage gltig sind.

Sichtbarkeit einer Tupelvariable


Eine Tupelvariable ist zunchst in allen zugehrigen
Unteranfragen gltig.
Wird die Tupelvariable erneut deklariert, ist die uere
Deklaration nicht mehr sichtbar.
Sucht man die Deklaration einer Tupelvariable geht man
von innen nach auen bis zur ersten Deklaration.

212
Auswertung von
korrelierten Unteranfragen
Eine korrelierte Unteranfrage ist abhngig von
einer Tupelvariable der ueren Anfrage.

Die Auswertung entspricht dem im Tupelkalkl


Fr jeden mglichen Wert der Tupelvariable, muss die
korrelierte Unteranfrage einmal ausgefhrt werden.

Ein solche Auswertung ist i. A. sehr teuer und es stellt


sich deshalb die Frage, ob man diese Anfragen noch
anders ohne eine korrelierte Unteranfrage berechnen
kann.
Wenn es gelingt, spricht man vom Dekorrelieren der
Unteranfrage.

213
Unkorrelierte Unteranfragen

Wenn eine Unteranfrage unabhngig von der


ueren Anfrage ist, spricht man von einer
unkorrelierten Unteranfrage.
Im Gegensatz zu einer korrelierten Anfrage ist dann eine
einmalige Auswertung der Unteranfrage mglich.

Die Kosten bei der Auswertung solcher Unteranfragen


sind i. A. niedrig.

214
Vermeidung korrelierter
Unteranfragen
Hufig lassen sich korrelierte Unteranfragen in
gewhnliche Umfragen transformieren.
Beispiel
Welche Angestellte knnen keine Maschine mit Note 2
und besser bedienen.
select *
from Personal p
where not exists (select pnr
from PMZuteilung
where p.pnr = pnr and note < 3);
Diese Anfrage lsst sich auch ber einen Left-Outer Join
ausdrcken.
Wie?

215
quivalente Anfragen

Gegeben
Prdikat p und zwei Relationen r und s.
Dann liefern die folgenden Anfragen das gleiche
Ergebnis.
select * from s
where not exists (
select * from r
where s.K = r.K and p)

select s.*
from s left outer join
(select * from r where p) t on s.K = t.K
where t.K is null
216
Mengenwertige Unteranfragen

Durch das Schlsselwort in kann getestet werden, ob ein Attribut


einen Wert in einer Menge annimmt.
Beispiel Das muss zueinander passen!
select pnr, PName
from Personal
where pnr in
(select pnr from PMZuteilung)
Durch Negation lsst sich auch not in testen.

217
Differenz mit Unteranfragen

Differenz zwischen zwei Relationen


Verwendung von except
Unteranfrage mit not in
Unteranfrage mit not exists

Beispiel:
Berechne alle Angestellten, die derzeit keine Maschine
bedienen knnen.
select *
from Personal
where pnr not in (select pnr from PMZuteilung)
select *
from Personal p
where not exists (select pnr from PMZuteilung where
pnr = p.pnr)
218
3.3.5 Allquantifizierte Anfragen

Existenzquantor in SQL mit exists


berprfung, ob ein Tupel in einer Unteranfrage gibt.
Fr den Benutzer sind jedoch Anfragen besonders wichtig, ob
alle Tupel einer Relation (Unteranfrage) etwas erfllen.
Berechne die Angestellten, die alle Maschinen bedienen
knnen.
Berechne die Studenten, die alle Vorlesungen bei Prof.
Taentzer gehrt haben.

Frage: Gibt es dafr einen Allquantor in SQL?
Nein, den gibt es in seiner allgemeinen Form nicht.
Nur fr sehr spezielle Flle, gibt es diesen Operator.
einfache allquantifizierte Anfragen

219
Einfache allquantifizierte
Anfragen
Teste, ob ein Attribut mit allen Elementen einer Menge in einer
bestimmten Beziehung steht.
Verwendung des Schlsselworts all
Beispiel
- Suche fr alle Maschinen die Angestellten mit den besten
Noten!
select *
from PMZuteilung L
where note <= all ( select note
from PMZuteilung
where mnr = L.mnr)

220
Unterschied all und some

Neben dem Schlsselwort all gibt es noch some bzw. any.


Dabei gilt folgenden Semantik (3-wertige Logik !!)
Semantik Semantik
ALL SOME bzw. ANY
alle Elem. true: true alle Elem. false: false
mind. 1 Elem. false: false mind. 1 Elem. true: true
sonst: unknown sonst: unknown

Beispiel
Suche fr alle Maschinen die Angestellten, die besser sind
als der/die mit der schlechtesten Note!
select *
from PMZuteilung L
where note < some( select note
from PMZuteilung
where mnr = L.mnr)
221
Allgemeine
allquantifizierte Anfragen
Es gibt keinen Allquantor in SQL !!
Stattdessen mssen die Anfragen auf den Existenz-
Operator exists zurckgreifen.
Fr eine Boolesche Funktion f mit freier Variable x gilt:
x: f(x) (x: f(x))
Nach diesem Lsungsmuster knnen nun allquantifzierte
Anfragen beantwortet werden.
Beispiel
Welche Mitarbeiter knnen alle Maschinen bedienen, die
Mitarbeiter114 bedienen kann?
Anfrage im Tupelkalkl?

222
Lsung mit Unteranfragen

Anfrage
Welche Mitarbeiter knnen alle Maschinen bedienen, die
Mitarbeiter 114 bedienen kann?

select distinct T.pnr


Alle Maschinen, die Person 114
from PMZuteilung T
bedienen kann, aber nicht pnr.
where not exists (
select U.mnr
from PMZuteilung U
where U.pnr = 114 and not mnr in (
select V.mnr Alle Maschinen, die
from PMZuteilung V Person pnr bedienen
where V.pnr = T.pnr)) kann.

223
Allquantifizierte Anfragen und
Aggregate
Bei einigen allquantifizierte Anfragen knnen
Aggregate genutzt werden.
Dadurch entstehen etwas einfachere (?) SQL-Anfragen
Anfrage
Welche Angestellte knnen alle Maschinen bedienen?
select pnr
from PMZuteilung
group by pnr
having count(*) = (select count(*) from
(select distinct mnr
from PMZuteilung) t
);

224
Test auf eindeutige Existenz in
SQL
Mit Unteranfragen ist es ziemlich unkomfortabel, zu berprfen, ob genau
ein Objekt mit einer bestimmten Eigenschaft existiert.

Prdikatenlogischer Hintergrund: Der -Operator wird "simuliert" mittels

x: F x: F [ y: F (y=x) ] bzw.
... x: F [ y: F (y=x) ]

Welche Mglichkeiten gibt es dafr noch in SQL?

Beispiel: Welche Maschinen knnen von genau einem Angestellten aus


der Abteilung 64 bedient werden?

225
Existenzbedingungen: Resmee
Warum diese ganze "Wirbelei" mit Quantoren in SQL ????

Nur sehr einfache Anfragen lassen sich ohne die


genauere Kenntnis von Existenzbedingungen
formulieren.
Sowie das Wrtchen "alle" bzw. "jeder" ins Spiel kommt,
wird es schwierig und Quantoren sind nahezu
unvermeidbar!
Auch "genau ein"-Anfragen haben es in sich und treten
in der Praxis auch fters auf.
Graphische Anfrage-Editoren ( la MS Access) lassen
einen bei diesen Anfragetypen "im Regen stehen": Ohne
SQL-Formulierung geht es dann nicht!

Ohne gute Grundkenntnisse der Prdikatenlogik


(insbesondere der Quantoren) kann man niemals
vernnftig SQL anwenden !

226