Vorlesung 5 - SQL (Teil 2)

Werbung
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
Vorlesung #5
SQL (Teil 2)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
„Fahrplan“






NULL Werte
Geschachtelte Anfragen in SQL
Korrelierte vs. Unkorrelierte Anfragen
Entschachtelung der Anfragen
Operationen der Mengenlehre
Spezielle Sprachkonstrukte (BETWEEN,
CASE, LIKE)
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
2
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
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 Studenten
where Semester < 13 or Semester >= 13
 Tupel (Zeilen) mit Null-Werten werden einfach
nicht mitgezählt !!!
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
3
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
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
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
4
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
FALSE
FALSE
FALSE
FALSE
5
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
6
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
7
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
8
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
9
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
10
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
11
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
12
Korreliert vs. unkorreliert
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
13
Korreliert vs. Unkorreliert (2)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 Ä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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
14
Entschachtelung korrelierter
Unteranfragen
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
15
Operationen der Mengenlehre
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
16
Operationen der Mengenlehre (2)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
• UNION – mit Duplikatelimierung,
• UNION ALL – ohne Duplikateliminierung
(
select Name
from Assistenten )
union
(
select Name
from Professoren );
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
17
Operationen der Mengenlehre (3)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 Mengendurchschnitt – INTERSECT
 Alle Professoren, die eine Vorlesung halten
SELECT PersNr
FROM Professoren
INTERSECT
SELECT gelesenVon
FROM Vorlesungen
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
18
Operationen der Mengenlehre (4)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 Gleiche Abfrage, „alle Professoren, die eine
Vorlesung halten“ mit IN Operator
SELECT PersNr
FROM Professoren
WHERE PersNr IN (SELECT gelesenVon
FROM Vorlesungen);
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
19
Operationen der Mengenlehre (5)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 Mengendifferenz – MINUS
 Alle Professoren, die keine Vorlesung halten
SELECT PersNr
FROM Professoren
MINUS
SELECT gelesenVon
FROM Vorlesungen;
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
20
Operationen der Mengenlehre (6)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
21
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
22
Spezielle Sprachkonstrukte
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
23
Spezielle Sprachkonstrukte (2)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
24
Spezielle Sprachkonstrukte (3)
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 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š, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
25
Ausblick Vorlesung #6
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
 Quantifizierte Anfragen
 Joins in SQL 92
 Rekursion
 Rekursion in SQL-92
 Rekursion in DBMS-“Dialekten“ (Oracle und DB2)
 Views (Sichten) - gespeicherte Abfragen
 Gewährleistung der logischen Datenunabhängigkeit
 Modellierung von Generalisierung
 UPDATE-fähige Sichten
 Datenintegrität
 Statische und dynamische Bedingungen
 Referentielle Integrität (primary key, foreign key)
© Bojan Milijaš, 31.10.2013
Vorlesung #5 - SQL (Teil 2)
26
WS 2013/14
Datenbanksysteme
D0 15:15 – 16:45
R 1.007
Vorlesung #5
Ende
Herunterladen