Vorlesung7

Werbung
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
Vorlesung #7
SQL (Teil 2)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
„Fahrplan“






Besprechung der Übungsaufgaben
Geschachtelte Anfragen in SQL
Korrelierte vs. Unkorrelierte Anfragen
Entschachtelung der Anfragen
Operationen der Mengenlehre
Spezielle Sprachkonstrukte (BETWEEN,
CASE, LIKE)
 Joins in SQL-92
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
2
Geschachtelte Anfragen
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 In SQL ist es möglich, SELECT Anweisungen
auf viele Weisen zu verknüpfen und zu
verschachteln
 Man unterscheidet zwischen Anfragen, die
ein Tupel (eine Zeile) zurückliefern, von
denen, die mehrere Tupeln (Zeilen) ergeben
 Die Anfragen können dann als Unterfragen in
SELECT, FROM oder WHERE Teil eingesetzt
werden
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
3
Geschachtelte Anfragen (2)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 ... in WHERE-Klausel
 Welche Prüfungen sind besser als
durchschnittlich verlaufen?
SELECT *
FROM prüfen
WHERE Note < ( select avg (Note)
from prüfen );
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
4
Geschachtelte Anfragen (3)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 ... in SELECT-Klausel
 Professoren mit deren Lehrbelastung und
durchschnittlicher Lehrbelsatung
SELECT PersNr, Name, sum(SWS) AS Lehrbelastung,
( select avg (sum(SWS))
from Vorlesungen
group by gelesenVon) AS Durchschnitt
FROM Professoren p, Vorlesungen v
WHERE p.PersNr = v.gelesenVon
GROUP BY PersNr, Name;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
5
Geschachtelte Anfragen (4)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 ... in SELECT-Klausel
 Professoren mit deren Lehrbelastung und
durchschnittlicher Lehrbelsatung – korreliert ohne
GROUP BY:
SELECT PersNr, Name,
(select sum (SWS)
from Vorlesungen
where gelesenVon = p.PersNr) AS Lehrbelastung,
(select sum(SWS) / count(DISTINCT gelesenVon)
from Vorlesungen) AS Durchschnitt
FROM Professoren p
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
6
Geschachtelte Anfragen (5)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 ... in FROM-Klausel
 „fleißige“ Studenten – die mehr als 2 Vorlesungen
hören:
SELECT tmp.MatrNr, tmp.Name, tmp.VorlAnzahl
FROM (select s.MatrNr, s.Name,
count(*) as VorlAnzahl
from Studenten s, hoeren h
where s.MatrNr=h.MatrNr
group by s.MatrNr, s.Name) tmp
WHERE tmp.VorlAnzahl > 2;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
7
Korreliert vs. unkorreliert
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 Achtung: funktioniert in der Original-BeispielDatenbank UNI nicht, da GebDatum fehlt!
 Alle Studenten, die älter als der jüngste
Professor sind - korrelierte Formulierung
select s.*
from Studenten s
where exists
(select p.*
from Professoren p
where p.GebDatum > s.GebDatum);
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
8
Korreliert vs. Unkorreliert (2)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 Äquivalente unkorrelierte Formulierung
select s.*
from Studenten s
where s.GebDatum <
(select max (p.GebDatum)
from Professoren p);
 Vorteil: Unteranfrageergebnis kann materialisiert werden
 Unteranfrage braucht nur einmal ausgewertet zu werden
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
9
Entschachtelung korrelierter
Unteranfragen
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
Assistenten, die für eine(n) jüngere(n) Professor(in) arbeiten
select a.*
from Assistenten a
where exists
( select p.*
from Professoren p
where a.Boss = p.PersNr and p.GebDatum > a.GebDatum);
Entschachtelung durch Join
select a.*
from Assistenten a, Professoren p
where a.Boss = p.PersNr
and p.GebDatum > a.GebDatum;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
10
Operationen der Mengenlehre
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
Vereinigung – UNION bzw. UNION ALL
Durchschnitt – INTERSECT
Differenz – MINUS (auch EXCEPT)
UNION, INTERSECT und MINUS setzen
Schemagleichheit voraus
 Der Operator IN bzw. NOT IN testet auf
Mengenmitgliedschaft
 Der Operator ALL testet, ob alle Ergebnisse
der Unteranfrage den Vergleich erfüllen




© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
11
Operationen der Mengenlehre (2)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
• UNION – mit Duplikatelimierung,
• UNION ALL – ohne Duplikateliminierung
(
select Name
from Assistenten )
union
(
select Name
from Professoren );
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
12
Operationen der Mengenlehre (3)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 Mengendurchschnitt – INTERSECT
 Alle Professoren, die eine Vorlesung halten
SELECT PersNr
FROM Professoren
INTERSECT
SELECT gelesenVon
FROM Vorlesungen
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
13
Operationen der Mengenlehre (4)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 Gleiche Abfrage, „alle Professoren, die eine
Vorlesung halten“ mit IN Operator
SELECT PersNr
FROM Professoren
WHERE PersNr IN (SELECT gelesenVon
FROM Vorlesungen);
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
14
Operationen der Mengenlehre (5)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 Mengendifferenz – MINUS
 Alle Professoren, die keine Vorlesung halten
SELECT PersNr
FROM Professoren
MINUS
SELECT gelesenVon
FROM Vorlesungen;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
15
Operationen der Mengenlehre (6)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 Gleiche Abfrage, „alle Professoren, die keine
Vorlesung halten“ mit NOT IN
SELECT PersNr
FROM Professoren
WHERE PersNr NOT IN
( SELECT gelesenVon
FROM Vorlesungen);
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
16
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
ALL Operator
 Studenten mit der größten Semesterzahl
SELECT Name, Semester
FROM Studenten
WHERE Semester >= ALL (select Semester
from Studenten);
äquivalent
SELECT Name, Semester
FROM Studenten
WHERE Semester >= (select max(Semester)
from Studenten);
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
17
Spezielle Sprachkonstrukte
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 BETWEEN
select * from Studenten
where Semester > = 1 and Semester < = 4;
select * from Studenten
where Semester between 1 and 4;
select * from Studenten where Semester in (1,2,3,4);
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
18
Spezielle Sprachkonstrukte (2)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 CASE WHEN ... THEN ... ELSE ... END – die erste
qualifizierende WHEN Klausel wird ausgeführt
select MatrNr,
( case when Note < 1.5 then ´sehr gut´
when Note < 2.5 then ´gut´
when Note < 3.5 then ´befriedigend´
when Note < 4.0 then ´ausreichend´
else ´nicht bestanden´end)
from pruefen;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
19
Spezielle Sprachkonstrukte (3)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
 LIKE Operator – Vergleich von Zeichenketten
 "%" steht für beliebig viele (auch gar kein) Zeichen
 "_" steht für genau ein Zeichen
select * from Studenten
where Name like ´T%eophrastos´;
select distinct Name
from Vorlesungen v, hören h, Studenten s
where s.MatrNr = h.MatrNr and h.VorlNr = v.VorlNr and
v.Titel LIKE ´%thik%´;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
20
Quantifizierte Anfragen in SQL
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
•
Es gibt keinen expliziten Allquantor
•
Es gibt aber den Existenzquantor: exists, not exist
•
wieder: „Professoren, die keine Vorlesung halten“
select Name, PersNr
from Professoren p
where not exists
( select *
from Vorlesungen
where gelesenVon = p.PersNr );
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
21
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
22
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
23
Quantifizierte Anfragen
in SQL (5)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
• Wer hat alle vierstündigen Vorlesungen gehört?
select s.*
from Studenten s
where not exists
(select *
from Vorlesungen v
where v.SWS = 4 and not exists
(select *
from hören h
where h.VorlNr = v.VorlNr and h.MatrNr=s.MatrNr ) );
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
24
Quantifizierte Anfragen
in SQL (4)
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
• Allquantifizierung kann immer auch durch eine count
Aggregation ausgedrückt werden
 Wir betrachten dazu eine etwas einfachere Anfrage,
in der wir die (MatrNr der) Studenten ermitteln wollen,
die alle Vorlesungen hören:
select h.MatrNr
from hören h
group by h.MatrNr
having count (*) = (select count (*) from Vorlesungen);
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
25
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
JOINs in SQL-92




cross join: Kreuzprodukt
natural join: natürlicher Join
join oder inner join: Theta-Join
left, right oder full outer join: äußerer Join
select *
from R1, R2
where = R1.A = R2.B;
select *
from R1 join R2 on R1.A = R2.B;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
26
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
27
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
28
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
JOINs in SQL-92

FULL OUTER JOIN
select p.PersNr, p.Name, f.PersNr, f.Note,
f.MatrNr, s.MatrNr, s.Name
from Professoren p full outer join
(pruefen f full outer join Studenten s
on f.MatrNr= s.MatrNr)
on p.PersNr=f.PersNr;
© Bojan Milijaš, 28.04.2004
Vorlesung #7 - SQL (Teil 2)
29
SS 2004
Datenbanken 4W
Mi 13:30 – 15:00
G 2.30
Vorlesung #7
Ende
Herunterladen