WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
Vorlesung #6
SQL (Teil 3)
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 2
„Fahrplan“ Besprechung eines Beispiels, SQL-Übungen Quantifizierte Anfragen JOINs in SQL-92
Vorlesung #6 - SQL (Teil 3)
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 3
Quantifizierte Anfragen in SQL
• 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 );
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 4
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 5
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 6
Quantifizierte Anfragen in SQL (4)• 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 ) );
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 7
Quantifizierte Anfragen in SQL (5)
• 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);
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 8
JOINs in SQL-92
cross join: Kreuzprodukt natural join: natürlicher Join join oder inner join: Theta-Join left outer join: linker äußerer Join right outer join: rechter äußerer Join full outer join: äußerer Join
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 9
CROSS JOIN (Kartesisches Produkt)
SELECT *
FROM Studenten CROSS JOIN prüfen;
ist äquivalent zu
SELECT *
FROM Studenten, prüfen;
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 10
NATURAL JOIN(natürlicher Verbund)SELECT *
FROM Studenten NATURAL JOIN prüfen;
ist äquivalent zu
SELECT s.MatrNr, s.Name, s.Semester,
/* p.MatrNr ausgelassen */
p.VorlNr, p.PersNr, p.Note
FROM Studenten s, prüfen p
WHERE s.MatrNr = p.MatrNr;
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 11
JOIN(Theta Verbund)SELECT * FROM Studenten s JOIN prüfen p ON s.MatrNr = p.MatrNr;
ist äquivalent zu
SELECT * FROM Studenten s, prüfen p WHERE s.MatrNr = p.MatrNr;
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 12
JOIN(Theta Verbund) (2)
Allgemein – setzt die Gleichheit der Join-Spalten nicht voraus:
SELECT *
FROM Professoren p JOIN
Assistenten a
ON p.persnr = a.boss;
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 13
* OUTER JOINs(äußerer Vebund)SELECT * FROM Studenten s LEFT OUTER JOIN pruefen p ON s.matrnr = p.matrnr;
SELECT * FROM uni.hoeren h RIGHT OUTER JOIN uni.Vorlesungen v ON h.vorlnr = v.vorlnr;
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
© Bojan Milijaš, 09.11.2012 Vorlesung #6 - SQL (Teil 3) 14
* OUTER JOINs(äußerer Vebund) (2)
SELECT *
FROM Vorlesungen v FULL OUTER JOIN
Assistenten a
ON v.gelesenvon = a.Boss
WS 2012/13Datenbanksysteme
Fr 15:15 – 16:45R 2.007
Vorlesung #6
Ende