Upload
sebastian-kolbe
View
213
Download
0
Embed Size (px)
Citation preview
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
Vorlesung #5
SQL (Teil 2)
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
„Fahrplan“ Kanonische Übersetzung (SQL relationale
Algebra) Aggregation und Gruppierung NULL -Werte, 3-wertige Logik Geschachtelte Anfragen in SQL
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
Auswertungsplan (F10 – Explain Plan)
© Bojan Milijaš, 30.10.2015
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
Auswertungsplan (wei (F10 – Explain Plan)
© Bojan Milijaš, 30.10.2015
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Aggregatfunktionen min, max, avg, sum, count
SELECT min(Semester) FROM Studenten;SELECT max(Semester) FROM Studenten;SELECT avg(Semester) FROM Studenten;SELECT sum(Semester) FROM Studenten;SELECT count(MatrNr), -- count(*) count(DISTINCT Semester) FROM Studenten;
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
... mit Gruppierung min, max, avg, sum, count mit GROUP BY
select gelesenVon, sum (SWS)from Vorlesungengroup by gelesenVon;
mit HAVINGselect gelesenVon, Name, sum (SWS)from Vorlesungen, Professorenwhere gelesenVon = PersNr and Rang = ´C4´group by gelesenVon, Namehaving avg (SWS) >= 3;
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Besonderheiten bei 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 by-Klausel 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
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Ergebnis der Abfrage
gelesenVon Name sum (SWS)2125 Sokrates 102137 Kant 8
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
SQL, Fortsetzung Geschachtelte Anfragen Korrelierte Anfragen Mengenoperationen Quantifizierte Anfragen (, ) Spezielle Sprachkonstrukte Joins in SQL-92, SQL-99 Rekursion Sichten (Views)
Ausblick Vorlesung #5
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Nullwerte 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 Studentenwhere Semester < 13 or Semester >= 13
Tupel (Zeilen) mit Null-Werten werden einfach nicht mitgezählt !!!
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Nullwerte (2) 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
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
3-wertige Logik (NULL Logik)
notTRUE FALSENULL NULL
FALSE TRUE
and TRUE NULL FALSETRUE TRUE NULL FALSENULL NULL NULL FALSE
FALSE FALSE FALSE FALSE
or TRUE NULL FALSETRUE TRUE TRUE TRUENULL TRUE NULL NULL
FALSE TRUE NULL FALSE
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Regeln für NULL Werte 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
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Behandlung von NULL Werten (Oracle und SQL-92) 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)
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Geschachtelte Anfragen 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
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Geschachtelte Anfragen (2) ... in WHERE-Klausel Welche Prüfungen sind besser als
durchschnittlich verlaufen?
SELECT *FROM prüfen
WHERE Note < ( select avg (Note) from prüfen );
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Geschachtelte Anfragen (3) ... 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 vWHERE p.PersNr = v.gelesenVonGROUP BY PersNr, Name;
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Geschachtelte Anfragen (4) ... 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
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
© Bojan Milijaš, 30.10.2015
Geschachtelte Anfragen (5) ... 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) tmpWHERE tmp.VorlAnzahl > 2;
WS 2015/16Datenbanksysteme
Fr 17:00 – 18:30R 1.008
Vorlesung #5
Ende