select

Werbung
Kapitel 2
Dr. Brigitte Mathiak
SQL Anfragen
Lernziele

• Syntax von SQL Anfragen
• Präzise Semantik von SQL Anfragen:
Abbildung auf Relationale Algebra
• Erweiterte Konstrukte in SQL Abfragen:
Aggregation, Gruppierung, rekursive Anfragen ..
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
2
Professoren
Vorlesungen
Studenten
Rang Raum MatrNr
Name
Semester VorlNr
PersNr
Name
2125
Sokrates
C4
226
24002
Xenokrates
18
2126
Russel
C4
232
25403
Jonas
12
2127 Kopernikus
C3
310
26120
Fichte
10
2133
C3
52
26830
Aristoxenos
8
2134 Augustinus
C3
309
27550 Schopenhauer
6
2136
Curie
C4
36
28106
3
2137
Kant
C4
7
29120 Theophrastos
2
29555
2
Popper
voraussetzen
5041
5001
5043
5001
5049
5041
5216
5043
5052
5041
5052
5052
5259
Feuerbach
hören
Vorgänger Nachfolger
5001
Carnap
prüfen
MatrNr VorlNr PersNr Note
Titel
SWS gelesen
Von
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052 Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
4
2137
MatrNr
VorlNr
26120
5001
27550
5001
27550
4052
28106
5041
28106
5052
PerslNr
Name
Fachgebiet
Boss
28106
5216
3002
Platon
Ideenlehre
2125
28106
5259
3003
Aristoteles
Syllogistik
2125
29120
5001
3004
Wittgenstein
Sprachtheorie
2126
29120
5041
3005
Rhetikus
Planetenbewegung
2127
Assistenten
28106
5001
2126
1
29120
5049
3006
Newton
Keplersche Gesetze
2127
25403
5041
2125
2
29555
5022
3007
Spinoza
Gott und Natur
2126
27550
4630
2137
2
25403
5022
Einfache SQL-Anfragen
select
*
from
Professoren;
from wählt die Tabelle
select *: Wählt alles aus
PersNr
Name
2125
Sokrates
C4
226
2126
Russel
C4
232
2127 Kopernikus
C3
310
2133
C3
52
2134 Augustinus
C3
309
2136
Curie
C4
36
2137
Kant
C4
7
Popper
Rang Raum
Einfache SQL-Anfragen
select
Bei select können
auch bestimmte Spalten
PersNr, Name gewählt werden
from
Professoren
where
Rang= ´C4´;
Bei where können logische
Einschränkungen gemacht
werden
PersNr
2125
2126
Name
Sokrates
Russel
2136
2137
Curie
Kant
Einfache SQL-Anfragen
Sortierung
select PersNr, Name, Rang
Mit order by kann die
Reihenfolge der Anzeige
verändert werden
from Professoren
order by Rang desc, Name asc;
Was zuerst steht, danach
wird zuerst sortiert
desc ist für absteigende
Ordnung, asc für
aufsteigende
PersNr
2136
2137
2126
2125
2134
2127
2133
Name
Curie
Kant
Russel
Sokrates
Augustinus
Kopernikus
Popper
Rang
C4
C4
C4
C4
C3
C3
C3
Duplikateliminierung
select distinct Rang
Mit distinct werden Duplikate
herausgenommen
from Professoren
Rang
C3
C4
Professoren
Vorlesungen
Studenten
Rang Raum MatrNr
Name
Semester VorlNr
PersNr
Name
2125
Sokrates
C4
226
24002
Xenokrates
18
2126
Russel
C4
232
25403
Jonas
12
2127 Kopernikus
C3
310
26120
Fichte
10
2133
C3
52
26830
Aristoxenos
8
2134 Augustinus
C3
309
27550 Schopenhauer
6
2136
Curie
C4
36
28106
3
2137
Kant
C4
7
29120 Theophrastos
2
29555
2
Popper
voraussetzen
5041
5001
5043
5001
5049
5041
5216
5043
5052
5041
5052
5052
5259
Feuerbach
hören
Vorgänger Nachfolger
5001
Carnap
prüfen
MatrNr VorlNr PersNr Note
Titel
SWS gelesen
Von
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052 Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
4
2137
MatrNr
VorlNr
26120
5001
27550
5001
27550
4052
28106
5041
28106
5052
PerslNr
Name
Fachgebiet
Boss
28106
5216
3002
Platon
Ideenlehre
2125
28106
5259
3003
Aristoteles
Syllogistik
2125
29120
5001
3004
Wittgenstein
Sprachtheorie
2126
29120
5041
3005
Rhetikus
Planetenbewegung
2127
Assistenten
28106
5001
2126
1
29120
5049
3006
Newton
Keplersche Gesetze
2127
25403
5041
2125
2
29555
5022
3007
Spinoza
Gott und Natur
2126
27550
4630
2137
2
25403
5022
Anfragen über mehrere Relationen
Welcher Professor liest "Mäeutik"?
select Name, Titel
from Professoren, Vorlesungen
where PersNr = gelesenVon and Titel = `Mäeutik‘ ;
Hinter from werden nun
zwei Tabellen genannt
Anfragen über mehrere Relationen
Professoren
PersNr Name
Rang Raum VorlNr
2125 Sokrates C4
226
5001
2126
Russel
C4
232
5041
2137
Kant
C4
7
5049
Vorlesungen
Titel
SWS gelesen Von
Grundzüge
4
2137
Ethik
4
2125
Mäeutik
4630 Die 3 Kritiken
Verknüpfung 
2
2125
4
2137
PersN
r
2125
Name
Sokrates
Rang
C4
Raum
226
VorlNr
5001
Titel
Grundzüge
SWS gelesen Von
4
2137
1225
Sokrates
C4
226
5041
Ethik
4
2125
2125
Sokrates
C4
226
5049
Mäeutik
2
2125
Jeder mit jedem einmal
2126
2126
Russel
Russel
C4
C4
232
232
5001
5041
Grundzüge
Ethik
4
4
2137
2125
2137
Kant
C4
7
4630
Die 3 Kritiken
4
2137
where PersNr = gelesenVon and Titel = `Mäeutik‘
PersNr
Name
Rang
Raum
VorlNr
Titel
SWS
2125
Sokrates
C4
226
5049
Mäeutik
2
select Name, Titel
Name
Sokrates
Titel
Mäeutik
gelesen
Von
2125
Anfragen über mehrere Relationen
Welche Studenten hören welche Vorlesungen?
select Name, Titel
from Studenten, hören, Vorlesungen
where Studenten.MatrNr = hören.MatrNr and
hören.VorlNr = Vorlesungen.VorlNr;
Alternativ:
select s.Name, v.Titel
from Studenten s, hören h, Vorlesungen v
where s. MatrNr = h. MatrNr and
h.VorlNr = v.VorlNr
Mit Korrelationsvariablen
Professoren
Vorlesungen
Studenten
Rang Raum MatrNr
Name
Semester VorlNr
PersNr
Name
2125
Sokrates
C4
226
24002
Xenokrates
18
2126
Russel
C4
232
25403
Jonas
12
2127 Kopernikus
C3
310
26120
Fichte
10
2133
C3
52
26830
Aristoxenos
8
2134 Augustinus
C3
309
27550 Schopenhauer
6
2136
Curie
C4
36
28106
3
2137
Kant
C4
7
29120 Theophrastos
2
29555
2
Popper
voraussetzen
5041
5001
5043
5001
5049
5041
5216
5043
5052
5041
5052
5052
5259
Feuerbach
hören
Vorgänger Nachfolger
5001
Carnap
prüfen
MatrNr VorlNr PersNr Note
Titel
SWS gelesen
Von
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052 Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
4
2137
MatrNr
VorlNr
26120
5001
27550
5001
27550
4052
28106
5041
28106
5052
PerslNr
Name
Fachgebiet
Boss
28106
5216
3002
Platon
Ideenlehre
2125
28106
5259
3003
Aristoteles
Syllogistik
2125
29120
5001
3004
Wittgenstein
Sprachtheorie
2126
29120
5041
3005
Rhetikus
Planetenbewegung
2127
Assistenten
28106
5001
2126
1
29120
5049
3006
Newton
Keplersche Gesetze
2127
25403
5041
2125
2
29555
5022
3007
Spinoza
Gott und Natur
2126
27550
4630
2137
2
25403
5022
Mengenoperationen und geschachtelte Anfragen
Mengenoperationen union, intersect, minus
(Vereinigung, Schnittmenge, Differenz)
( select Name
from Assistenten )
union
( select Name
from Professoren);
Was passiert hier?
Was würde bei intersect
Passieren oder bei minus?
Jeder für sich mit
Zettel und Stift; 3 min.
Existenzquantor exists
select p.Name
from Professoren p
where not exists ( select *
from Vorlesungen v
where v.gelesenVon = p.PersNr );
Vorlesungen
VorlNr
Titel
SWS gelesen
Von
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052 Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
4
2137
Professoren
PersNr
Name
2125
Sokrates
C4
226
2126
Russel
C4
232
2127 Kopernikus
C3
310
2133
C3
52
2134 Augustinus
C3
309
2136
Curie
C4
36
2137
Kant
C4
7
Popper
Rang Raum
Existenzquantor exists
select p.Name
from Professoren p
where not exists ( select *
from Vorlesungen v
where v.gelesenVon = p.PersNr );
Professoren
PersNr
Name
2125
Sokrates
C4
226
2126
Russel
C4
232
2127 Kopernikus
C3
310
2127 Kopernikus
C3
310
2133
C3
52
2136
C4
36
2134 Augustinus
C3
309
2136
Curie
C4
36
2137
Kant
C4
7
Popper
Rang Raum
Professoren
PersNr
Name
Curie
Rang Raum
Mengenvergleich
Hatten wir das nicht gerade?
select Name
from Professoren
where PersNr not in ( select gelesenVon
from Vorlesungen );
Unkorrelierte Unterabfragen
sind meist effizienter, da sie
nicht pro Zeile ausgewertet
werden müssen
"Quantifizierte" Subqueries
Die Bedingung Wert  ANY Menge mit   {{=, , , , , } ist erfüllt,
wenn es in der Menge ein Element gibt, für das Wert  Element gilt.
(=ANY ist äquivalent zu IN) .. SOME ist equivalent to ANY
Die Bedingung Wert  ALL Menge mit   {=, , , , , } ist erfüllt,
wenn für alle Elemente der Menge gilt: Wert  Element.
(<>ALL ist äquivalent zu NOT IN.)
Die Bedingung EXISTS Menge ist erfüllt,
wenn die Menge nicht leer ist
(dies ist äquivalent zur Bedingung 0 < SELECT COUNT(*) FROM ...)
Achtung: Wert  ALL (query_returns_no_rows) = TRUE
Wert  ANY (query_returns_no_rows) = FALSE
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
18
"Quantifizierte" Subqueries
Anfrage:
Studenten im höchsten Semester:
SELECT *
FROM Studenten
WHERE Semester >= ALL (SELECT Semester
FROM Studenten) ;
Anfrage:
Studenten, für die keine Prüfungen erfasst sind:
SELECT * FROM Studenten s
WHERE NOT EXISTS ( SELECT *
FROM Prüfen p
WHERE p.MatrNr = s.MatrNr );
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
19
Professoren
Vorlesungen
Studenten
Rang Raum MatrNr
Name
Semester VorlNr
PersNr
Name
2125
Sokrates
C4
226
24002
Xenokrates
18
2126
Russel
C4
232
25403
Jonas
12
2127 Kopernikus
C3
310
26120
Fichte
10
2133
C3
52
26830
Aristoxenos
8
2134 Augustinus
C3
309
27550 Schopenhauer
6
2136
Curie
C4
36
28106
3
2137
Kant
C4
7
29120 Theophrastos
2
29555
2
Popper
voraussetzen
5041
5001
5043
5001
5049
5041
5216
5043
5052
5041
5052
5052
5259
Feuerbach
hören
Vorgänger Nachfolger
5001
Carnap
prüfen
MatrNr VorlNr PersNr Note
Titel
SWS gelesen
Von
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052 Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
4
2137
MatrNr
VorlNr
26120
5001
27550
5001
27550
4052
28106
5041
28106
5052
PerslNr
Name
Fachgebiet
Boss
28106
5216
3002
Platon
Ideenlehre
2125
28106
5259
3003
Aristoteles
Syllogistik
2125
29120
5001
3004
Wittgenstein
Sprachtheorie
2126
29120
5041
3005
Rhetikus
Planetenbewegung
2127
Assistenten
28106
5001
2126
1
29120
5049
3006
Newton
Keplersche Gesetze
2127
25403
5041
2125
2
29555
5022
3007
Spinoza
Gott und Natur
2126
27550
4630
2137
2
25403
5022
Aggregatfunktion und Gruppierung
Aggregatfunktionen avg, max, min, count, sum
select avg (Semester)
from Studenten;
select gelesenVon, sum (SWS)
from Vorlesungen
group by gelesenVon;
select gelesenVon, Name, sum (SWS)
from Vorlesungen, Professoren
where gelesenVon = PersNr and Rang = ´C4´
group by gelesenVon, Name
having avg (SWS) >= 3;
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
Ausführen der Anfrage mit group by
Vorlesung x Professoren
VorlNr
Titel
SWS gelesen PersNr Name Rang Raum
Von
5001 Grundzüge 4
2137
2125 Sokrates C4 226
5041
Ethik
4
2125
2125 Sokrates C4
...
4630
...
Die 3
Kritiken
...
4
...
2137
...
2137
...
Kant
...
C4
where gelesenVon = PersNr and Rang = ´C4´
226
...
7
VorlNr
Titel
5001
5041
5043
Grundzüge
Ethik
Erkenntnistheorie
Mäeutik
Logik
Wissenschaftstheorie
Bioethik
Die 3 Kritiken
5049
4052
5052
5216
4630
SWS gelesen
Von
4
2137
4
2125
3
2126
PersNr
Name
Rang Raum
2137
Kant
2125 Sokrates
2126 Russel
C4
C4
C4
7
226
232
2
4
3
2125
2125
2126
2125 Sokrates
2125 Sokrates
2126 Russel
C4
C4
C4
226
226
232
2
4
2126
2137
2126
2137
C4
C4
232
7
group by gelesenVon, Name
Russel
Kant
VorlNr
Titel
SWS gelesenVon PersNr Name
5041
Ethik
4
2125
2125 Sokrates
5049
Mäeutik
2
2125
2125 Sokrates
4052
Logik
4
2125
2125 Sokrates
5043 Erkenntnistheorie
3
2126
2126 Russel
5052 Wissenschaftstheo. 3
2126
2126 Russel
5216
Bioethik
2
2126
2126 Russel
5001
Grundzüge
4
2137
2137
Kant
4630
Die 3 Kritiken
4
2137
2137
Kant
Rang Raum
C4
226
C4
226
C4
226
C4
232
C4
232
C4
232
C4
7
C4
7
having avg (SWS) >= 3
VorlN
r
5041
5049
4052
Titel
Ethik
Mäeutik
Logik
5001
4630
Grundzüge
Die 3 Kritiken
SWS gelesenVon PersNr
4
2125
2125
2
2125
2125
4
2125
2125
4
4
2137
2137
2137
2137
Name
Sokrates
Sokrates
Sokrates
Kant
Kant
Rang Raum
C4
226
C4
226
C4
226
C4
C4
7
7
Aggregation (sum(SWS)) pro Gruppe
gelesenVon
Name
sum (SWS)
2125
Sokrates
10
2137
Kant
8
Geschachtelte Anfrage (Forts.)
Unteranfrage in der select-Klausel
Für jedes Ergebnistupel wird die Unteranfrage ausgeführt
Man beachte, dass die Unteranfrage korreliert ist (greift auf
Attribute der umschließenden Anfrage zu)
select PersNr, Name, ( select sum (SWS) as Lehrbelastung
from Vorlesungen
where gelesenVon=PersNr )
from Professoren;
Professoren
Vorlesungen
Studenten
Rang Raum MatrNr
Name
Semester VorlNr
PersNr
Name
2125
Sokrates
C4
226
24002
Xenokrates
18
2126
Russel
C4
232
25403
Jonas
12
2127 Kopernikus
C3
310
26120
Fichte
10
2133
C3
52
26830
Aristoxenos
8
2134 Augustinus
C3
309
27550 Schopenhauer
6
2136
Curie
C4
36
28106
3
2137
Kant
C4
7
29120 Theophrastos
2
29555
2
Popper
voraussetzen
5041
5001
5043
5001
5049
5041
5216
5043
5052
5041
5052
5052
5259
Feuerbach
hören
Vorgänger Nachfolger
5001
Carnap
prüfen
MatrNr VorlNr PersNr Note
Titel
SWS gelesen
Von
5001
Grundzüge
4
2137
5041
Ethik
4
2125
5043
Erkenntnistheorie
3
2126
5049
Mäeutik
2
2125
4052
Logik
4
2125
5052 Wissenschaftstheorie
3
2126
5216
Bioethik
2
2126
5259
Der Wiener Kreis
2
2133
5022
Glaube und Wissen
2
2134
4630
Die 3 Kritiken
4
2137
MatrNr
VorlNr
26120
5001
27550
5001
27550
4052
28106
5041
28106
5052
PerslNr
Name
Fachgebiet
Boss
28106
5216
3002
Platon
Ideenlehre
2125
28106
5259
3003
Aristoteles
Syllogistik
2125
29120
5001
3004
Wittgenstein
Sprachtheorie
2126
29120
5041
3005
Rhetikus
Planetenbewegung
2127
Assistenten
28106
5001
2126
1
29120
5049
3006
Newton
Keplersche Gesetze
2127
25403
5041
2125
2
29555
5022
3007
Spinoza
Gott und Natur
2126
27550
4630
2137
2
25403
5022
Unkorrelierte versus korrelierte Unteranfragen
korrelierte Formulierung
select s.*
from Studenten s
where exists
(select p.*
from Professoren
where p.GebDatum > s.GebDatum);
Ä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
Entschachtelung korrelierter Unteranfragen -- Forts.
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;
Verwertung der Ergebnismenge einer Unteranfrage
select tmp.MatrNr, tmp.Name, tmp.VorlAnzahl
from (select s.MatrNr, s.Name, count(*) as VorlAnzahl
from Studenten s, hören h
where s.MatrNr=h.MatrNr
group by s.MatrNr, s.Name) tmp
where tmp.VorlAnzahl > 2;
MatrNr
Name
VorlAnzahl
28106
Carnap
4
29120
Theophrastos
3
Decision-Support-Anfragen mit geschachtelten Unteranfragen
select h.VorlNr, h.AnzProVorl, g.GesamtAnz,
h.AnzProVorl/g.GesamtAnz as Marktanteil
from
( select VorlNr, count(*) as AnzProVorl
from hören
group by VorlNr ) h,
( select count (*) as GesamtAnz
from Studenten) g;
Das Ergebnis der Anfrage
VorlNr
AnzProVorl
GesamtAnz Marktanteil
4052
1
8
.125
5001
4
8
.5
5022
2
8
.25
...
...
...
...
Simulation allquantifizierter Suchprädikate

Anfrage:
Wer hat alle vierstündigen Vorlesungen gehört?
Problem:  ist in SQL nicht vorgesehen, nur exists
Idee: Elimination von  und 
Dazu sind folgende Äquivalenzen anzuwenden:
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
35
Umformung der Logik (1/3)

Schritt 1: Elimination 
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
36
Umformung der Logik (2/3)

Schritt 2: Elimination 
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
37
Umformung der Logik (3/3)

Schritt 3: Transformation
ergibt schließlich:
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
38
Umsetzung der Logik in SQL
Anfrage:
Wer hat alle vierstündigen Vorlesungen gehört?
SELECT s.MatrNr
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 ) );
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
39
Simulation allquantifizierter Suchprädikate:
alternative Form mit Mengenoperation
Anfrage:
Wer hat alle vierstündigen Vorlesungen gehört?
SELECT s.MatrNr
Zwischenanfrage:
FROM Studenten s
Alle Vorlesungen, die 4 SWS
WHERE NOT EXISTS
haben
( SELECT v.VorlNr
MINUS
Alle Vorlesungen, die der Student s
FROM Vorlesungen v
gehört hat
WHERE v.SWS = 4
MINUS
SELECT h.VorlNr
FROM hören h
WHERE h.MatrNr = s.MatrNr ) ;
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
40
Allquantifizierung durch count-Aggregation
Allquantifizierung kann immer auch durch eine countAggregation 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);
Herausforderung
Wie formuliert man die komplexere Anfrage:
„Wer hat alle vierstündigen Vorlesungen gehört“
ohne Korrelation nur mit Zählen
Grundidee besteht darin, vorher durch einen Join die
Studenten/Vorlesungs-Paare einzuschränken und danach das
Zählen durchzuführen
Jeder für sich mit Zettel und Stift; 5 min
Simulation allquantifizierter Suchprädikate
durch count-Aggregation
Anfrage:
Wer hat alle vierstündigen Vorlesungen gehört?
SELECT h.MatrNr
FROM hören h, Vorlesungen v
WHERE v.SWS = 4 AND h.VorlNr = v.VorlNr
GROUP BY h.MatrNr
HAVING count (*) = (SELECT count (*)
FROM Vorlesungen v1
WHERE v1.SWS = 4);
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
43
Count-Aggregation: Fehlerquellen
Anfrage:
Namen der Studenten, die alle vierstündigen Vorlesungen gehört haben
Vorsicht: so geht das nicht..
SELECT h.MatrNr, s.Name
FROM hören h, Vorlesungen v, Studenten s
WHERE
v.SWS = 4 AND h.VorlNr = v.VorlNr AND h.MatrNr = s.MatrNr
GROUP BY h.MatrNr
HAVING count (*) = (SELECT count (*)
FROM Vorlesungen v1
WHERE v1.SWS = 4);
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
44
Count-Aggregation: Fehlerquellen
Anfrage:
Namen der Studenten, die alle vierstündigen Vorlesungen gehört haben
SELECT h.MatrNr, s.Name
FROM hören h, Vorlesungen v, Studenten s
WHERE
v.SWS = 4 AND h.VorlNr = v.VorlNr AND h.MatrNr = s.MatrNr
GROUP BY h.MatrNr, s.Name
HAVING count (*) = ( SELECT count (*)
FROM Vorlesungen v1
WHERE v1.SWS = 4);
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!
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
45
Allquantifizierung - Fazit
Es geht zwar nicht direkt, aber indirekt
Man kann per deMorgan den Ausdruck auf exists
zurückführen
Man kann per Mengenoperation minus die Fälle
eliminieren, in denen es nicht übereinstimmt
Man kann zählen, ob alle Fälle betrachtet sind und dies
dann mit der Gesamtmenge der Fälle vergleichen
Für die Prüfung reicht eine Methode
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
46

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:
select count (*)
from Studenten
where Semester < 13 or Semester > =13
Wenn es Studenten gibt, deren Semester-Attribut den Wert
null hat, werden diese nicht mitgezählt
Der Grund liegt in folgenden Regeln für den Umgang mit
null-Werten begründet:

Auswertung bei Null-Werten
1. In arithmetischen Ausdrücken werden Nullwerte propagiert,
d.h. sobald ein Operand null ist, wird auch das Ergebnis null.
Dementsprechend wird z.B. null + 1 zu null ausgewertet-aber
auch null * 0 wird zu null ausgewertet.
2. SQL hat eine dreiwertige Logik, die nicht nur true und false
kennt, sondern auch einen dritten Wert unknown. Diesen
Wert liefern Vergleichsoperationen zurück, wenn mindestens
eines ihrer Argumente null ist. Beispielsweise wertet SQL das
Prädikat (PersNr=...) immer zu unknown aus, wenn die
PersNr des betreffenden Tupels den Wert null hat.
3. Logische Ausdrücke werden nach den folgenden Tabellen
berechnet:

not
true
false
unknown unknown
false
true
and
true
unknown
false
true
true
unknown
false
unknown
unknown
unknown
false
false
false
false
false
or
true
unknown
false
true
true
true
true
unknown
true
unknown
unknown
false
true
unknown
false
Diese Berechnungsvorschriften sind recht intuitiv.
Unknown or true wird z.B. zu true - die Disjunktion ist
mit dem true-Wert des rechten Arguments immer
erfüllt, unabhängig von der Belegung des linken
Arguments. Analog ist unknown and false
automatisch false - keine Belegung des linken
Arguments könnte die Konjunktion mehr erfüllen.
4. In einer where-Bedingung werden nur Tupel
weitergereicht, für die die Bedingung true ist.
Insbesondere werden Tupel, für die die Bedingung zu
unknown auswertet, nicht ins Ergebnis aufgenommen.
5. Bei einer Gruppierung wird null als
ein eigenständiger Wert aufgefasst
und in eine eigene Gruppe
eingeordnet.
Note
1.0
count(*)
25
1.3
94
…
null
…
248

Test auf Nullwert
Anfrage:
bisher unbenotete Prüfungsleistungen
SELECT * FROM prüfen WHERE Note IS NULL
Anfrage:
Professoren mit eigenem Büro
SELECT * FROM Professoren WHERE Raum IS NOT NULL
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
51
Spezielle Sprachkonstrukte ("syntactic sugar")
select *
from Studenten
where Semester > = 1 and Semester < = 6;
select *
from Studenten
where Semester between 1 and 6;
select *
from Studenten
where Semester in (2,4,6);
Das case-Konstrukt
select MatrNr, ( case when Note >= 5.5 then ´sehr gut´
when Note >= 5.0 then ´gut´
when Note >= 4.5 then ´befriedigend´
when Note >= 4.0 then ´ausreichend´
else ´nicht bestanden´end)
from prüfen;
Die erste qualifizierende when-Klausel wird ausgeführt
Vergleiche mit like
Platzhalter "%" ; "_" bei Vergleichen mit like
"%" steht für beliebig viele (auch gar kein) Zeichen
"_" steht für genau ein Zeichen
Vorsicht: Bei Vergleichen mit = werden Platzhalter als
normale Zeichen interpretiert!
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%´;
Behandlung spezieller Datentypen
• Zu Strings gibt es meist eine Reihe Zusatzfunktionen in den
Datenbanken
• Zu erwarten ist einfache Stringmanipulation: Konkatenation,
Suchen, Ersetzen; oft reguläre Ausdrücke und zunehmend
Anwendungen aus NLP und Suchmaschinentechnologie, wie
Synonyme, Ranking, Topic Analysis, …
• Die sind aber bislang noch nicht vereinheitlicht und werden
daher hier nicht behandelt
• Weiterhin gibt es oft Methoden um komplexe Datentypen, wie
Zeit, Ort, Bilder, Musik, etc. zu verarbeiten
• Das ist aber auch nicht standardisiert, wird hier also nicht
behandelt
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
55
Joins in SQL-92
cross join: Kreuzprodukt
select *
from R1, R2;
natural join: natürlicher Join
Join oder inner join: Theta-Join
left, right oder full outer join: äußerer Join
union join: Vereinigungs-Join (wird hier nicht vorgestellt)
Inner Join
Anfrage:
welcher Professor bietet welche Vorlesungen an?
SELECT p.Name, v.Name
FROM Professoren p
JOIN Vorlesungen v ON p.PersNr = v.gelesenVon ;
SELECT p.Name, v.Name
FROM Professoren p, Vorlesungen v
WHERE p.PersNr = v.gelesenVon ;
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
57
Natural Join
Anfrage: Welcher Student hört welche Vorlesung?
SELECT Studenten.Name, Vorlesungen.Name
FROM Studenten
NATURAL JOIN hören
NATURAL JOIN Vorlesungen ;
SELECT s.Name, v.Name
FROM Studenten s, hören h, Vorlesungen v
WHERE
s.MatrNr = h.MatrNr AND
h.VorlNr = v.vorlNr ;
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
58
Cross Join
Anfrage:
alle Paare "Professor – Student" :
SELECT Professoren.Name, Studenten.Name
FROM Professoren CROSS JOIN Studenten ;
SELECT p.Name, s.Name
FROM Professoren p, Studenten s ;
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
59
Outer Joins: Left Outer Join
SELECT p.PersNr, p.Name, f.PersNr, f.Note,
f.MatrNr, s.MatrNr, s.Name
FROM Professoren p LEFT OUTER JOIN
( prüfen f LEFT OUTER JOIN Studenten s
ON f.MatrNr = s.MatrNr )
ON p.PersNr = f.PersNr ;
p.PersN
f.PersN f.Not f.MatrN
p.Name
r
r
e
r
2126
Russel
2126
1
28106
Sokrate
2125
2125
2
25403
s
s.Matr
Nr
28106
25403
s.Name
Carnap
Jonas
2137
Kant
2137
2
27550
2136
Curie
Ø
Ø
Ø
Ø
Ø
…
…
…
…
…
…
…
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
27550 Schopenhauer
60
Outer Joins: Right Outer Join
SELECT p.PersNr, p.Name, f.PersNr, f.Note,
f.MatrNr, s.MatrNr, s.Name
FROM Professoren p RIGHT OUTER JOIN
(prüfen f RIGHT OUTER JOIN
Studenten s ON f.MatrNr = p.MatrNr)
ON p.PersNr = f.PersNr ;
p.PersN
r
p.Name
f.PersNr
f.Note
f.MatrN
r
s.MatrNr
s.Name
2126
Russel
2126
1
28106
28106
Carnap
2125
Sokrates
2125
2
25403
25403
Jonas
2137
Kant
2137
2
27550
27550
Schopenhau
er
Ø
Ø
Ø
Ø
Ø
26120
Fichte
…
…
…
…
…
…
…
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
61
Outer Joins: Full Outer Join
SELECT p.PersNr, p.Name, f.PersNr, f.Note,
f.MatrNr, s.MatrNr, s.Name
FROM Professoren p FULL OUTER JOIN
(prüfen f FULL OUTER JOIN Studenten s
ON f.MatrNr = s.MatrNr)
ON p.PersNr = f.PersNr ;
p.PersN
r
2126
p.Name
f.PersNr
f.Note
f.MatrNr
s.MatrNr
s.Name
Russel
Sokrate
s
2126
1
28106
28106
Carnap
2125
2
25403
25403
Jonas
2137
Kant
2137
2
27550
27550
Schopenhauer
Ø
Ø
Ø
Ø
Ø
26120
Fichte
…
…
…
…
…
…
…
2136
Curie
Ø
Ø
Ø
Ø
Ø
…
…
…
…
…
…
…
2125
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
62
Outer Joins: Oracle-Syntax
Anfrage:
welche Studenten hören welche Vorlesungen
SELECT *
FROM Studenten
LEFT OUTER JOIN hören
USING (MatrNr)
SELECT *
FROM Studenten s, hören h
WHERE
s.MatrNr = h.MatrNr (+)
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
63
Äußere Joins
select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr,
s.MatrNr, s.Name
from Professoren p left outer join
(prüfen f left outer join Studenten s
on f.MatrNr= s.MatrNr)
on p.PersNr=f.PersNr;
PersNr p.Name f.PersNr
2126 Russel
2126
2125 Sokrates 2125
2137
Kant
2137
2136
Curie
-
f.Note
1
2
2
-
f.MatrNr s.MatrNr s.Name
28106
28106
Carnap
25403
25403
Jonas
27550
27550 Schopenhauer
-
Äußere Joins
select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr,
s.MatrNr, s.Name
from Professoren p right outer join
(prüfen f right outer join Studenten s on
f.MatrNr= s.MatrNr)
on p.PersNr=f.PersNr;
PersNr p.Name f.PersNr f.Note f.MatrNr s.MatrNr s.Name
2126 Russel
2126
1
28106
28106
Carnap
2125 Sokrates 2125
2
25403
25403
Jonas
2137
Kant
2137
2
27550
27550 Schopenhauer
26120
Fichte
Äußere Joins
select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr,
s.MatrNr, s.Name
from Professoren p full outer join
(prüfen f full outer join Studenten s on
f.MatrNr= s.MatrNr)
on p.PersNr=f.PersNr;
p.PersNr p.Name f.PersNr
2126 Russel
2126
2125 Sokrates 2125
2137
Kant
2137
f.Note
1
2
2
-
-
-
-
2136
Curie
-
-
f.MatrNr s.MatrNr s.Name
28106
28106
Carnap
25403
25403
Jonas
27550
27550 Schopenhauer
26120
Fichte
-
-
-

Rekursion
select Vorgänger
from voraussetzen, Vorlesungen
where Nachfolger= VorlNr and
Titel= `Der Wiener Kreis´

Der Wiener Kreis
Wissenschaftstheorie
Erkenntnistheorie
Bioethik
Ethik
Grundzüge
Mäeutik
Rekursion
select v1.Vorgänger
from voraussetzen v1, voraussetzen v2, Vorlesungen v
where v1.Nachfolger= v2.Vorgänger and
v2.Nachfolger= v.VorlNr and
v.Titel=`Der Wiener Kreis´

Vorgänger des „Wiener Kreises“
der Tiefe n
select v1.Vorgänger
Wollen wir das wirklich?
from voraussetzen v1

voraussetzen vn_minus_1
voraussetzen vn,
Vorlesungen v
where v1.Nachfolger= v2.Vorgänger and

vn_minus_1.Nachfolger= vn.Vorgänger and
vn.Nachfolger = v.VorlNr and
v.Titel= `Der Wiener Kreis´


Grundproblem: Transitive Hülle
transA,B(R)= {(a,b)  k  IN (1, ..., k  R (
1.A= 2.B 

k-1.A= k.B 
1.A= a 
k.B= b))}

Der Wiener Kreis
Wissenschaftstheorie
Erkenntnistheorie
Bioethik
Ethik
Grundzüge
Mäeutik

Die connect by-Klausel (Oracle)
select Titel
from Vorlesungen
where VorlNr in (select Vorgänger
Grundzüge
Ethik
Erkenntnistheorie
Wissenschaftstheorie
from voraussetzen
connect by Nachfolger=prior Vorgänger
start with Nachfolger= (select VorlNr
from Vorlesungen
where Titel= `Der
Wiener Kreis´));
Rekursion in DB2/SQL99:
gleiche Anfrage
with TransVorl (Vorg, Nachf)
as (select Vorgänger, Nachfolger from voraussetzen
union all
select t.Vorg, v.Nachfolger
from TransVorl t, voraussetzen v
where t.Nachf= v.Vorgänger)
select Titel from Vorlesungen where VorlNr in
(select Vorg from TransVorl where Nachf in
(select VorlNr from Vorlesungen
where Titel= `Der Wiener Kreis´) )


zuerst wird eine temporäre Sicht TransVorl mit der withKlausel angelegt
Diese Sicht TransVorl ist rekursiv definiert, da sie selbst in
der Definition vorkommt
Aus dieser Sicht werden dann die gewünschten Tupel
extrahiert
Ergebnis ist natürlich wie gehabt
Fazit Rekursion/transitive Hülle
In SQL nur mühsam lösbar
Vorhandene Lösungen sind technologieabhängig
Die praktisch beste Lösung ist fast immer das Ändern der
Datenstruktur oder das Anlegen von Hilfstabellen
voraussetzen_rec
5001
5216
Vorgänger Nachfolger
5001
5052
5001
5041
5001
5043
5001
5043
5001
5052
5001
5049
5043
5041
5216
5041
5043
5052
5041
5052
5052
5259
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
Achtung!
5259
Solche Datenstrukturen
5259
sind oft schwer aktuell zu
halten -> Datenintegrität
77
Syntaktische Beschreibung einer Select Anweisung
"Grobsyntax":
select_block { { UNION | INTERSECT | EXCEPT } [ALL]
select_block ...}
[ORDER BY result_column [ASC | DESC]
{, result_column [ASC | DESC] …}
mit select_block ::=
SELECT [ALL | DISTINCT]
{column | {expression [AS result_column]}}
{, {column | {expression [AS result_column]}} …}
FROM table [correlation_var] {, table [correlation_var] …}
[WHERE search_condition]
[GROUP BY column {, column …} [HAVING search_condition] ]
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
78
Oracle: Syntaxdiagramme
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
79
Fazit
Sie können nun SQL-Anfragen 
Datenbanken, SS 12 Kapitel 2: SQL Anfragen
80
Herunterladen