Vorlesung 5

Werbung
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
Vorlesung #5
SQL (Teil 2)
„Fahrplan“
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 Aggregation und Gruppierung
 NULL -Werte, 3-wertige Logik
 Kanonische Übersetzung (SQL  relationale
Algebra)
 Geschachtelte Anfragen in SQL
© Bojan Milijaš, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
© Bojan Milijaš, 29.10.2014
Aggregatfunktionen
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 min, max, avg, sum, count
SELECT
FROM
SELECT
FROM
SELECT
FROM
SELECT
FROM
SELECT
min(Semester)
Studenten;
max(Semester)
Studenten;
avg(Semester)
Studenten;
sum(Semester)
Studenten;
count(MatrNr), -- count(*)
count(DISTINCT Semester)
FROM Studenten;
© Bojan Milijaš, 29.10.2014
... mit Gruppierung
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 min, max, avg, sum, count mit GROUP BY
select gelesenVon, sum (SWS)
from Vorlesungen
group by gelesenVon;
 mit HAVING
select gelesenVon, Name, sum (SWS)
from Vorlesungen, Professoren
where gelesenVon = PersNr and Rang = ´C4´
group by gelesenVon, Name
having avg (SWS) >= 3;
© Bojan Milijaš, 29.10.2014
WS 2013/14
Besonderheiten bei
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
Aggregatoperationen
• SQL erzeugt pro Gruppe ein Ergebnistupel
• Deshalb müssen alle in der select-Klausel
aufgeführten Attribute - außer den
aggregierten – auch in der group byKlausel aufgeführt werden
• Nur so kann SQL sicherstellen, dass sich
das Attribut nicht innerhalb der Gruppe
ändert
SELECT A1, A2, An, count(*)
FROM ...
WHERE ..
GROUP BY A1, A2, An
© Bojan Milijaš, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
© Bojan Milijaš, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
© Bojan Milijaš, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
© Bojan Milijaš, 29.10.2014
Ergebnis der Abfrage
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
gelesenVon
2125
Name
Sokrates
sum (SWS)
10
2137
Kant
8
© Bojan Milijaš, 29.10.2014
Ausblick Vorlesung #5









SQL, Fortsetzung
Geschachtelte Anfragen
Korrelierte Anfragen
Mengenoperationen
Quantifizierte Anfragen (, )
Spezielle Sprachkonstrukte
Joins in SQL-92, SQL-99
Rekursion
Sichten (Views)
© Bojan Milijaš, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
Nullwerte
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 unbekannter Wert
 „wird vielleicht später nachgereicht“
 Nullwerte können auch im Zuge der
Anfrageauswertung entstehen (Bsp. äußere Joins)
 manchmal sehr überraschende Anfrageergebnisse,
wenn Nullwerte vorkommen

UPDATE studenten SET semester = '' WHERE matrnr = 24002;
select count (*)
from Studenten
where Semester < 13 or Semester >= 13
 Tupel (Zeilen) mit Null-Werten werden einfach
nicht mitgezählt !!!
© Bojan Milijaš, 29.10.2014
Nullwerte (2)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 NULL + 1 = NULL, NULL * 1 = NULL
 Beispiele (Oracle)
SELECT NULL + 2
FROM Dual;
SELECT NULL * 2
FROM Dual;
 Dual ist so etwas wie „Dummy“-Tabelle in Oracle
 Es gilt die sogenannte 3-wertige Logik in SQL
© Bojan Milijaš, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
3-wertige Logik
(NULL Logik)
not
TRUE FALSE
NULL NULL
FALSE TRUE
and
TRUE
NULL
FALSE
TRUE NULL
TRUE NULL
NULL
NULL
FALSE FALSE
or
TRUE
TRUE
TRUE
NULL
TRUE
FALSE
TRUE
NULL
FALSE
TRUE
TRUE
NULL
NULL
NULL
FALSE
© Bojan Milijaš, 29.10.2014
FALSE
FALSE
FALSE
FALSE
Regeln für NULL Werte
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 In arithmetischen Ausdrücken werden NULL Werte
propagiert (NULL + 3 = NULL)
 Es gilt die 3-wertige Logik. Vergleichsoperatoren
(=, >,<=) liefern immer NULL zurück, wenn
mindestens ein Argument NULL ist
 Logische Ausdrücke werden entsprechend den
vorgestellten 3-wertige-Logik Tabellen ausgewertet
 Tupeln mit NULL als Ergebnis in einer WHERE
Klausel werden nicht weitergereicht, d.h NULL
Werte werden in WHERE Klauseln ausgelassen
 Bei Gruppierung ist NULL ein eigenständiger Wert
© Bojan Milijaš, 29.10.2014
Behandlung von NULL Werten
(Oracle und SQL-92)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 In Oracle gibt es eine „null value“ Funktion nvl (if
NULL then):
SELECT nvl(NULL,5) + 2 AS Result
FROM Dual;
Result
-----7
 Man kann NULL Werte mit IS NULL oder IS NOT
NULL testen (SQL-92)
© Bojan Milijaš, 29.10.2014
Geschachtelte Anfragen
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 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š, 29.10.2014
Geschachtelte Anfragen (2)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 ... 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š, 29.10.2014
Geschachtelte Anfragen (3)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 ... in SELECT-Klausel
 Professoren mit deren Lehrbelastung und
durchschnittlicher Lehrbelastung
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š, 29.10.2014
Geschachtelte Anfragen (4)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 ... 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š, 29.10.2014
Geschachtelte Anfragen (5)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 ... 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š, 29.10.2014
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
Vorlesung #5
Ende
Herunterladen