Beruflich Dokumente
Kultur Dokumente
SQ L Advanced
SQ L Advanced
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!!
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.
173
Die Wahrheitstabellen der
dreiwertigen Logik
AND true false unknown
true true false ?
unknown
false false false false?
?
unkown unknown ?
false ?
unknown
Relationen
Hiermit lassen sich auch Semi-Joins ausdrcken
select r.* from r, s where r.A = s.B
Liefert alle Attribute der Relation r
175
Joins in der from-Klausel
176
Outer-Joins
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
180
3.2.6 Aggregate
Aggregatfunktion
Liefert zu einer Menge/Multimenge von Werten einen
Wert zurck.
181
Aggregatfunktionen in SQL
182
Aggregate min und max
Beispiel
Liefere fr die Angestellten der Abteilung A4 die beste
und schlechteste Note bei der Bedienung einer
Maschine.
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
188
Beispiel
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
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
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
Sortiere PMZuteilung nach dem Attribut Note und dann nach dem
Attribut pnr.
196
Zusammenfassung
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
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
202
Tupelvariablen
203
Beispiel
204
Having-Ersatz mit Unteranfragen
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
206
Korrelierte Unteranfrage
207
Group-by Ersatz
208
3.3.4 where-Klausel
209
exists
210
Korrelierte Unteranfragen in der
where-Klausel
Unteranfragen in der where-Klausel treten sehr oft
in korrelierter Weise auf.
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.
212
Auswertung von
korrelierten Unteranfragen
Eine korrelierte Unteranfrage ist abhngig von
einer Tupelvariable der ueren Anfrage.
213
Unkorrelierte Unteranfragen
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
217
Differenz mit Unteranfragen
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
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?
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.
x: F x: F [ y: F (y=x) ] bzw.
... x: F [ y: F (y=x) ]
225
Existenzbedingungen: Resmee
Warum diese ganze "Wirbelei" mit Quantoren in SQL ????
226