in select - Datenbank- und Informationssysteme - Universität ...
in select - Datenbank- und Informationssysteme - Universität ...
in select - Datenbank- und Informationssysteme - Universität ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Universität</strong><br />
Paderborn<br />
Gr<strong>und</strong>lagen von<br />
<strong>Datenbank</strong>en<br />
5. <strong>Datenbank</strong>sprache SQL<br />
Prof. Dr. Gregor Engels<br />
AG <strong>Datenbank</strong><strong>und</strong> <strong>Informationssysteme</strong><br />
1
Gliederung der Vorlesung<br />
Kap. 1: E<strong>in</strong>führung<br />
Kap. 2: Konzeptioneller Entwurf:<br />
Das Entity-Relationship-Modell<br />
Kap. 3: Relationaler Entwurf:<br />
Das Relationenmodell<br />
Kap. 4: Gr<strong>und</strong>lagen von Anfragen <strong>und</strong> Änderungen<br />
Kap. 5: Datendef<strong>in</strong>ition <strong>und</strong> –Implementierung:<br />
<strong>Datenbank</strong>sprache SQL<br />
Kap. 6: Anschluss an Programmiersprachen<br />
2
<strong>Datenbank</strong>sprache SQL<br />
Die Structured<br />
Query Language<br />
(SQL)<br />
wurde am IBM San<br />
Jose Research Laboratory entwickelt. Die Entwicklung des<br />
SQL-Standards erfolgte <strong>in</strong> den folgenden Etappen:<br />
bis Anfang der 80er Jahre Wildwuchs verschiedener Dialekte<br />
erste Sprachstandardfestlegung um 1986<br />
(ANSI: American National Standards Institute)<br />
endgültiger Sprachstandard im Jahre 1989:<br />
SQL-89 = SQL1<br />
<strong>in</strong> Deutschland als DIN ISO 9075 im Jahre 1990 publiziert<br />
überarbeitete, standardisierte ANSI/ISO Version im Jahre 1992:<br />
SQL-92 = SQL2 („previous standard“)<br />
überarbeitete, standardisierte ANSI/ISO Version im Jahre 1999:<br />
SQL-99 = SQL3 („current standard“)<br />
überarbeitete, standardisierte ANSI/ISO Version im Jahre 2003:<br />
SQL-2003 = SQL200n („evolv<strong>in</strong>g standard“)<br />
3
<strong>Datenbank</strong>sprache SQL<br />
umfasst Sprachanteile<br />
zur Def<strong>in</strong>ition von <strong>Datenbank</strong>schemata<br />
(DDL -<br />
Data Def<strong>in</strong>ition Language)<br />
zur Formulierung von Anfragen<br />
(DQL -<br />
Data Query Language)<br />
zur Formulierung von<br />
<strong>Datenbank</strong>änderungsoperationen<br />
(DML -<br />
Data Manipulation Language)<br />
4
5.1 Datendef<strong>in</strong>itionssprache SQL -<br />
Anforderungen nach Codd, 1982<br />
Sprachmittel zur Def<strong>in</strong>ition von<br />
1.<br />
2.<br />
3.<br />
4.<br />
5.<br />
Attributen<br />
Wertebereichen<br />
Relationenschemata<br />
Primärschlüsseln<br />
Fremdschlüsseln<br />
DDL<br />
5
SQL -<br />
create table<br />
alter table<br />
drop table<br />
DDL Sprachkonstrukte<br />
seit SQL-92 auch<br />
create doma<strong>in</strong><br />
alter doma<strong>in</strong><br />
drop doma<strong>in</strong><br />
6
Die Anweisung create<br />
table<br />
create table basisrelationenname<br />
(spaltenname_1 wertebereich_1 [not null],<br />
...<br />
spaltenname_k wertebereich_k [not null])<br />
7
Erlaubte Wertebereiche <strong>in</strong> create<br />
<strong>in</strong>teger (oder auch <strong>in</strong>teger4, <strong>in</strong>t)<br />
small<strong>in</strong>t (oder auch <strong>in</strong>teger2)<br />
float(p) (oder auch kurz float)<br />
decimal(p,q) oder numeric(p,q)<br />
mit jeweils q Nachkommastellen<br />
character(n) (oder kurz char(n), bei n = 1 auch char)<br />
für Str<strong>in</strong>gs fester Länge n<br />
character vary<strong>in</strong>g(n) (oder kurz varchar(n))<br />
für Str<strong>in</strong>gs variabler Länge bis zur Maximallänge n<br />
bit(n) oder bit vary<strong>in</strong>g(n) analog für Bitfolgen<br />
date, time bzw. timestamp für Datums-, Zeit<strong>und</strong><br />
komb<strong>in</strong>ierte Datums-Zeit-Angaben<br />
table<br />
8
Die Anweisung create<br />
table<br />
Mit not null können <strong>in</strong> bestimmten Spalten<br />
Nullwerte als Attributwerte ausgeschlossen<br />
werden:<br />
create table Buch<br />
( ISBN char(10) not null,<br />
Titel varchar(200),<br />
Verlagsname varchar(30) )<br />
9
create<br />
table<br />
Fremdschlüsseln<br />
mit Schlüsseln <strong>und</strong><br />
create table Buch<br />
( ISBN char(10),<br />
Titel varchar(200),<br />
Verlagsname varchar(30),<br />
primary key (ISBN),<br />
foreign key (Verlagsname)<br />
references Verlag (Verlagsname) )<br />
Vordef<strong>in</strong>ierte Semantik:<br />
primary key-Attribute immer<br />
not<br />
null<br />
10
seit SQL-92:<br />
Neben Def<strong>in</strong>ition von Schlüsseln <strong>und</strong><br />
Fremdschlüsseln<br />
default-Klausel: Defaultwerte für Attribute<br />
create doma<strong>in</strong>-Anweisung für<br />
benutzerdef<strong>in</strong>ierte Wertebereiche<br />
check-Klausel zur Festlegung von weiteren<br />
lokalen Integritätsbed<strong>in</strong>gungen <strong>in</strong>nerhalb der<br />
zu def<strong>in</strong>ierenden Wertebereiche, Attribute <strong>und</strong><br />
Relationenschemata<br />
11
Def<strong>in</strong>ition e<strong>in</strong>es Wertebereichs<br />
create<br />
doma<strong>in</strong><br />
Gebiet varchar(20) default<br />
create table Vorlesung<br />
(V_Bezeichnung varchar(80) not null,<br />
SWS small<strong>in</strong>t,<br />
Semester small<strong>in</strong>t,<br />
Studiengang Gebiet )<br />
create<br />
table Mitarbeiter<br />
(PANr <strong>in</strong>teger not null,<br />
AngNr char(10) not null,<br />
Fachbereich Gebiet,<br />
Gehalt decimal(10,2),<br />
Raum <strong>in</strong>teger,<br />
E<strong>in</strong>stellung date )<br />
‘Informatik‘<br />
12
Integritätsbed<strong>in</strong>gungen mit check-Klausel<br />
Wertebereichsdef<strong>in</strong>itionen<br />
create doma<strong>in</strong> Gebiet varchar(20)<br />
default ‘Informatik‘<br />
check (<br />
value <strong>in</strong> (‘Informatik‘, ‘Mathematik‘,<br />
‘Elektrotechnik‘, ‘L<strong>in</strong>guistik‘)<br />
)<br />
<strong>in</strong><br />
13
Integritätsbed<strong>in</strong>gungen mit check-Klausel<br />
Attributdef<strong>in</strong>itionen<br />
create<br />
table<br />
(V_Bezeichnung<br />
Vorlesung<br />
varchar(80) primary<br />
SWS small<strong>in</strong>t check (SWS ><br />
Semester small<strong>in</strong>t<br />
check (Semester between<br />
Studiengang Gebiet )<br />
0),<br />
1 and<br />
<strong>in</strong><br />
key,<br />
9),<br />
14
Integritätsbed<strong>in</strong>gungen mit check-Klausel<br />
für e<strong>in</strong>e Tabelle<br />
create table Buch_Versionen<br />
( ISBN char(10),<br />
Auflage small<strong>in</strong>t check (Auflage > 0),<br />
Jahr <strong>in</strong>teger check (Jahr between 1800 and 2020),<br />
Seiten <strong>in</strong>teger check (Seiten > 0),<br />
Preis decimal(8,2) check (Preis ≤ 250),<br />
primary key (ISBN, Auflage),<br />
foreign key (ISBN) references Buch (ISBN),<br />
check ( (<strong>select</strong> sum(Preis) from Buch_Versionen) <<br />
(<strong>select</strong> sum(Budget) from Institut) )<br />
)<br />
H<strong>in</strong>weis: Erläuterung der <strong>select</strong>-Anweisung<br />
kommt später!<br />
15
Die Anweisungen<br />
alter table<br />
Syntax:<br />
<strong>und</strong> drop table<br />
alter table basisrelationenname<br />
add spaltenname wertebereich<br />
Beispiel:<br />
alter table Institut<br />
add Budget decimal(8,2)<br />
Wirkung ist:<br />
[default] [check]<br />
Änderung des Relationenschemas im Data Dictionary (e<strong>in</strong> neues<br />
Attribut wird dem Relationenschema Institut zugeordnet)<br />
Erweiterung der existierenden Basisrelation um e<strong>in</strong> Attribut, das bei<br />
jedem existierenden Tupel mit null besetzt wird.<br />
16
Data Dictionary (= Systemrelationen)<br />
Systemarchitektur gemäß<br />
(SPARC = Standards Plann<strong>in</strong>g<br />
spontane<br />
Nutzung<br />
vorgeplante<br />
Nutzung<br />
Prog 1<br />
externe<br />
Anfragen<br />
Updates<br />
Operationen<br />
E<strong>in</strong>bettung<br />
ANSI-SPARC-Standard<br />
and Requirements<br />
Progn Masken<br />
Datendef<strong>in</strong>ition<br />
BenutzungsProgrammierkomponente komponente<br />
Def<strong>in</strong>itionskomponente<br />
Transformationskomponente<br />
von 1978<br />
Eng<strong>in</strong>eer<strong>in</strong>g Committee)<br />
Ebene konzeptionelle Ebene <strong>in</strong>terne Ebene<br />
Optimierung Auswertung Plattenzugriff<br />
Sichtdef<strong>in</strong>ition<br />
Data Dictionary<br />
Dateiorganisation<br />
17
alter table<br />
<strong>und</strong> check-Klausel<br />
alter table<br />
add<br />
-<br />
Kommando mit Default-Wert<br />
Institut<br />
Budget decimal(8,2) default<br />
10000<br />
check (Budget > Anzahl_Planstellen<br />
x 1000)<br />
18
alter-<strong>und</strong><br />
(Spaltennamen)<br />
alter table<br />
Die Klausel<br />
alter spaltenname<br />
drop-Klausel<br />
basisrelationenname<br />
für Attribute<br />
…<br />
default_änderung<br />
nur Änderung der Defaultwerte, nicht Änderung von<br />
Datentypen<br />
Die Klausel<br />
drop spaltenname<br />
{ restrict<br />
| cascade<br />
erlaubt Löschen von Attributen, falls<br />
ke<strong>in</strong>e Integritätsbed<strong>in</strong>gungen mit Hilfe dieses Attributs<br />
def<strong>in</strong>iert wurden (im Fall restrict)<br />
oder mit gleichzeitiger Löschung dieser<br />
Integritätsbed<strong>in</strong>gungen (im Fall cascade)<br />
}<br />
19
Die Anweisung drop table<br />
drop table basisrelationenname<br />
{ restrict | cascade }<br />
Wirkung:<br />
Basisrelationenschema wird aus dem Data<br />
Dictionary entfernt <strong>und</strong> damit auch die Relation<br />
aus der <strong>Datenbank</strong><br />
restrict <strong>und</strong> cascade analog zu drop bei<br />
Attributen<br />
20
<strong>Datenbank</strong>sprache SQL<br />
umfasst Sprachanteile<br />
zur Def<strong>in</strong>ition von <strong>Datenbank</strong>schemata √<br />
(DDL -<br />
Data Def<strong>in</strong>ition Language)<br />
zur Formulierung von Anfragen<br />
(DQL -<br />
Data Query Language)<br />
zur Formulierung von<br />
<strong>Datenbank</strong>änderungsoperationen<br />
(DML -<br />
Data Manipulation Language)<br />
21
5.2 Anfragesprache SQL-DQL<br />
SQL-Anfragen bestehen im Wesentlichen aus dem<br />
sogenannten SFW-Block<br />
(für <strong>select</strong> ... from ... where ... )<br />
<strong>select</strong><br />
bestimmt Projektionen auf Spalten mehrerer Tabellen<br />
from<br />
legt zu verwendende (Basis-)Relationen fest<br />
where<br />
def<strong>in</strong>iert Selektions<strong>und</strong> Verb<strong>und</strong>bed<strong>in</strong>gungen<br />
group<br />
by<br />
Auswertung auf Untergruppen (Aggregratfunktionen)<br />
hav<strong>in</strong>g<br />
Selektionsbed<strong>in</strong>gungen für Bildung von Gruppen<br />
22
Beispiele mit Büchern wieder aufgegriffen<br />
(<strong>Datenbank</strong> 1):<br />
Autoren Ausleihe<br />
ISBN Autor<br />
0-8053-1753-8 Elmasri<br />
0-8053-1753-8 Navathe<br />
3-8244-2021-X Schürr<br />
3-8244-2075-9 Zündorf<br />
Buch<br />
ISBN Name<br />
0-8053-1753-8 Schmitz<br />
0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X Radermacher<br />
3-8244-2075-9 Radermacher<br />
ISBN Titel Verlag<br />
0-8053-1753-8 Pr<strong>in</strong>ciples of Database Systems Benj. Cumm<strong>in</strong>gs<br />
3-8244-2021-X Operationales Spezifizieren mit ... Deutscher <strong>Universität</strong>s-Verlag<br />
3-8244-2075-9 PROgrammierte GraphERsetzungsSysteme Deutscher <strong>Universität</strong>s-Verlag<br />
23
from-Klausel<br />
Syntax:<br />
<strong>select</strong> *<br />
from relationenliste<br />
Beispiel:<br />
<strong>select</strong> *<br />
from Buch<br />
liefert die gesamte Relation Buch<br />
24
Kartesisches Produkt von zwei Relationen:<br />
<strong>select</strong><br />
* from<br />
Autoren, Ausleihe<br />
bildet kartesisches Produkt der beiden Tabellen<br />
selektiert mit * alle Spalten der resultierenden Tabelle<br />
25
<strong>select</strong><br />
* from<br />
Autoren Ausleihe<br />
ISBN Autor<br />
0-8053-1753-8 Elmasri<br />
0-8053-1753-8 Navathe<br />
3-8244-2021-X Schürr<br />
3-8244-2075-9 Zündorf<br />
Autoren, Ausleihe<br />
ISBN Name<br />
0-8053-1753-8 Schmitz<br />
0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X Radermacher<br />
3-8244-2075-9 Radermacher<br />
Autoren.ISBN Autor Ausleihe.ISBN Name<br />
0-8053-1753-8 Elmasri 0-8053-1753-8 Schmitz<br />
0-8053-1753-8 Navathe 0-8053-1753-8 Schmitz<br />
3-8244-2021-X Schürr 0-8053-1753-8 Schmitz<br />
3-8244-2075-9 Zündorf 0-8053-1753-8 Schmitz<br />
0-8053-1753-8 Elmasri 0-8053-1753-8 Derichsweiler<br />
0-8053-1753-8 Navathe 0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X Schürr 0-8053-1753-8 Derichsweiler<br />
3-8244-2075-9 Zündorf 0-8053-1753-8 Derichsweiler<br />
0-8053-1753-8 Elmasri 3-8244-2021-X Radermacher<br />
. . . . . . . . . . . .<br />
26
Kartesisches Produkt<br />
E<strong>in</strong>führung von Tupelvariablen um z.B. auf e<strong>in</strong>e<br />
Relation mehrfach zugreifen zu können<br />
<strong>select</strong><br />
* from<br />
Buch e<strong>in</strong>s , Buch zwei<br />
Ergebnis hat sechs Spalten:<br />
e<strong>in</strong>s.ISBN, e<strong>in</strong>s.Titel, e<strong>in</strong>s.Verlag, zwei.ISBN, zwei.Titel, zwei.Verlag<br />
Selbst-Verb<strong>und</strong> für tupelübergreifende<br />
Selektionen<br />
27
Bezug zum Tupelkalkül<br />
Korrespondierende Kalkülausdrücke automatisch<br />
sicher<br />
<strong>select</strong> ...<br />
from Buch e<strong>in</strong>s , Buch zwei<br />
where ...<br />
{ . . .| Buch (e<strong>in</strong>s) ∧ Buch (zwei) ∧ (. . .) }<br />
28
SQL -<br />
Anfrage mit Verb<strong>und</strong>bildung:<br />
<strong>select</strong> Autoren.ISBN, Autor, Name<br />
from Autoren, Ausleihe<br />
where Autoren.ISBN = Ausleihe.ISBN<br />
berechnet den Verb<strong>und</strong> der beiden Tabellen über ISBN<br />
(natural jo<strong>in</strong>, natürlicher Verb<strong>und</strong>)<br />
anstelle von “=“ geht auch Vergleich auf ““ oder “
<strong>select</strong> Autoren.ISBN, Autor, Name<br />
from Autoren, Ausleihe<br />
where Autoren.ISBN = Ausleihe.ISBN<br />
Autoren Ausleihe<br />
ISBN Autor<br />
0-8053-1753-8 Elmasri<br />
0-8053-1753-8 Navathe<br />
3-8244-2021-X Schürr<br />
3-8244-2075-9 Zündorf<br />
Autoren.ISBN Autor Name<br />
0-8053-1753-8 Elmasri Schmitz<br />
0-8053-1753-8 Navathe Schmitz<br />
0-8053-1753-8 Elmasri Derichsweiler<br />
0-8053-1753-8 Navathe Derichsweiler<br />
3-8244-2021-X Schürr Radermacher<br />
3-8244-2075-9 Zündorf Radermacher<br />
ISBN Name<br />
0-8053-1753-8 Schmitz<br />
0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X Radermacher<br />
3-8244-2075-9 Radermacher<br />
30
Verb<strong>und</strong> als kartesisches Produkt<br />
Kartesisches Produkt<br />
<strong>select</strong><br />
* from<br />
Buch, Ausleihe<br />
mit Verb<strong>und</strong>bed<strong>in</strong>gungen<br />
<strong>select</strong> *<br />
from Buch, Ausleihe<br />
where Buch.ISBN = Ausleihe.ISBN<br />
<strong>und</strong> abschließender Projektion<br />
<strong>select</strong> Buch.ISBN, Titel, Verlag, Name<br />
from Buch, Ausleihe<br />
where Buch.ISBN = Ausleihe.ISBN<br />
entspricht Buch ⋈<br />
Ausleihe<br />
der<br />
Relationenalgebra.<br />
31
Explizite Verb<strong>und</strong>-Operatoren<br />
θ -Verb<strong>und</strong>:<br />
<strong>select</strong> *<br />
from Buch jo<strong>in</strong> Ausleihe<br />
on Buch.ISBN = Ausleihe.ISBN<br />
Gleichverb<strong>und</strong>:<br />
<strong>select</strong> *<br />
from Buch jo<strong>in</strong> Ausleihe<br />
us<strong>in</strong>g (ISBN)<br />
Natürlicher Verb<strong>und</strong>:<br />
<strong>select</strong> *<br />
from Buch natural<br />
jo<strong>in</strong><br />
Ausleihe<br />
32
Äußere Verb<strong>und</strong>e<br />
Statt <strong>in</strong>ner jo<strong>in</strong> nun outer jo<strong>in</strong> (dangl<strong>in</strong>g tuples übernehmen<br />
<strong>und</strong> mit Nullwerten auffüllen)<br />
full outer jo<strong>in</strong>: <strong>in</strong> beiden Operanden<br />
left outer jo<strong>in</strong>: im l<strong>in</strong>ken Operanden<br />
right outer jo<strong>in</strong>: im rechten Operanden<br />
LINKS<br />
A B<br />
1 2<br />
2 3<br />
RECHTS B C NATURAL JOIN A B C<br />
3 4<br />
2 3 4<br />
4 5<br />
OUTER A B C LEFT A B C RIGHT A B C<br />
1 2 ⊥<br />
1 2 ⊥<br />
2 3 4<br />
2 3 4<br />
2 3 4<br />
⊥ 4 5<br />
⊥ 4 5<br />
33
Die <strong>select</strong>-Klausel<br />
Relationenalgebra: abschliessende Projektion<br />
Relationenkalkül: Zielliste<br />
<strong>select</strong> [dist<strong>in</strong>ct] {attribut |<br />
arithmetischer-ausdruck |<br />
aggregat-funktion}<br />
from ...<br />
Attribute aus from-Relationen<br />
Arithmetische Ausdrücke über Attributen <strong>und</strong> Konstanten<br />
Aggregatfunktionen über Attributen<br />
dist<strong>in</strong>ct: Ergebnismenge statt Multimenge<br />
34
Projektionsergebnis Menge oder Multimenge<br />
Ausleihe<br />
<strong>select</strong> Name from Ausleihe <strong>select</strong> dist<strong>in</strong>ct Name from Ausleihe<br />
Name<br />
Schmitz<br />
Derichsweiler<br />
Radermacher<br />
Radermacher<br />
ISBN Name<br />
0-8053-1753-8 Schmitz<br />
0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X Radermacher<br />
3-8244-2075-9 Radermacher<br />
Name<br />
Schmitz<br />
Derichsweiler<br />
Radermacher<br />
35
Tupelvariablen <strong>und</strong> Relationennamen<br />
Angabe der Attributnamen durch Präfix ergänzen, falls nicht e<strong>in</strong>deutig:<br />
<strong>select</strong> ISBN from Buch <strong>und</strong><br />
<strong>select</strong> Buch.ISBN from Buch s<strong>in</strong>d äquivalent<br />
<strong>select</strong> ISBN, Titel, Name<br />
from Buch, Ausleihe<br />
where Buch.ISBN = Ausleihe.ISBN<br />
<strong>select</strong> Buch.ISBN, Titel, Name<br />
from Buch, Ausleihe<br />
where Buch.ISBN = Ausleihe.ISBN<br />
Tupelvariable kann benutzt werden:<br />
<strong>select</strong> e<strong>in</strong>s.ISBN, zwei.Titel<br />
from Buch e<strong>in</strong>s, Buch zwei<br />
falsch: Herkunft von ISBN nicht e<strong>in</strong>deutig!<br />
(auch wenn Werte übere<strong>in</strong>stimmen)<br />
richtig!<br />
36
Bezug zum Tupelkalkül<br />
<strong>select</strong>:<br />
Anfrage<br />
Zielliste im Tupelkalkül<br />
<strong>select</strong> e<strong>in</strong>s.ISBN, zwei.Titel<br />
from Buch e<strong>in</strong>s, Buch zwei<br />
entspricht:<br />
{ e<strong>in</strong>s.ISBN, zwei.Titel |<br />
Buch (e<strong>in</strong>s) ∧ Buch (zwei) }<br />
37
Die where-Klausel<br />
Selektionsbed<strong>in</strong>gung der Relationenalgebra oder<br />
Verb<strong>und</strong>bed<strong>in</strong>gung<br />
<strong>select</strong> ... from ... where<br />
bed<strong>in</strong>gung<br />
Bed<strong>in</strong>gung:<br />
Konstanten-Selektion: attribut θ konstante<br />
Attribut-Selektion zwischen zwei Attributen mit kompatiblen<br />
Wertebereichen: attribut 1 θ attribut 2<br />
weitere Bed<strong>in</strong>gungen auf den folgenden Seiten<br />
38
Verb<strong>und</strong>bed<strong>in</strong>gung<br />
relation1.attribut = relation2.attribut<br />
Beispiel:<br />
natürlicher Verb<strong>und</strong><br />
<strong>select</strong> Buch.ISBN, Titel, Name<br />
from Buch, Ausleihe<br />
where Buch.ISBN= Ausleihe.ISBN<br />
auch Gleichverb<strong>und</strong> <strong>und</strong> θ -Verb<strong>und</strong> möglich<br />
39
Bereichsselektion<br />
attribut between konstante1 and konstante2<br />
Abkürzung für<br />
attribut ≥<br />
konstante1 and attribut ≤<br />
Beispiel:<br />
<strong>select</strong> ISBN<br />
from Autoren<br />
where Autor between ‚A‘<br />
and ‚N‘<br />
konstante2<br />
40
Ungewißheitsselektion<br />
Theoretisch nur Abkürzung für disjunktiv verknüpfte Bed<strong>in</strong>gung<br />
attribut like spezialkonstante<br />
Spezialkonstante kann „%“ (ke<strong>in</strong> oder beliebig viele Zeichen) oder „_“ (genau e<strong>in</strong><br />
Zeichen) be<strong>in</strong>halten<br />
Anwendung: Selektion nach Büchern von Benjam<strong>in</strong>/Cumm<strong>in</strong>gs<br />
<strong>select</strong> * from Buch<br />
where Verlagsname like `Benj%Cumm<strong>in</strong>gs%‘<br />
als Abkürzung für<br />
<strong>select</strong> * from Buch<br />
where Verlagsname = `Benjam<strong>in</strong> Cumm<strong>in</strong>gs‘<br />
or Verlagsname = `Benjam<strong>in</strong>/Cumm<strong>in</strong>gs'<br />
or Verlagsname = `Benjam<strong>in</strong>-Cumm<strong>in</strong>gs'<br />
or Verlagsname = `Benjam<strong>in</strong> and Cumm<strong>in</strong>gs'<br />
or Verlagsname = `BenjXFDGYWCumm<strong>in</strong>gsSCHlumpf'<br />
or ...<br />
41
Weitere Bed<strong>in</strong>gungen<br />
Null-Selektion<br />
attribut is null<br />
Quantifizierte Bed<strong>in</strong>gungen, wenn e<strong>in</strong><br />
Argument <strong>in</strong> Vergleich Menge liefert<br />
all, any, some <strong>und</strong> exists<br />
boolesche Ausdrücke mit Konnektoren<br />
or, and <strong>und</strong> not<br />
42
Bezug zum Tupelkalkül<br />
where-Klausel: qualifizierende Formel <strong>in</strong> Tupelkalkülanfragen<br />
<strong>select</strong> Titel, Name<br />
from Buch, Ausleihe<br />
where Buch.ISBN = Ausleihe.ISBN and<br />
(Verlagsname = `Thomson‘ or Verlagsname = `ITP');<br />
entspricht<br />
{ b.Titel, a.Name | Buch(b) ∧ Ausleihe(a) ∧<br />
b.ISBN = a.ISBN ∧<br />
(b.Verlagsname = `Thomson‘ ∨ b.Verlagsname = `ITP') }<br />
43
Schachtelung von Anfragen<br />
where-Klausel kann geschachtelt werden<br />
SFW-Blöcke liefern im allgeme<strong>in</strong>en mehrere Werte<br />
Vergleiche mit Wertemengen:<br />
Standardvergleiche <strong>in</strong> Verb<strong>in</strong>dung mit Quantoren<br />
all (∀) oder any (oder some) (∃)<br />
spezielle Prädikate für den Zugriff auf Mengen<br />
<strong>in</strong> <strong>und</strong> exists<br />
44
Das <strong>in</strong>-Prädikat <strong>und</strong> geschachtelte Anfragen<br />
attribut <strong>in</strong> ( SFW-block )<br />
Beispiel:<br />
<strong>select</strong> Titel from Buch<br />
where ISBN <strong>in</strong> ( <strong>select</strong> dist<strong>in</strong>ct ISBN from Ausleihe )<br />
äquivalent zu natürlichem Verb<strong>und</strong> mit Projektion<br />
Abarbeitung:<br />
Ergebnis der <strong>in</strong>neren <strong>select</strong>-Anweisung h<strong>in</strong>ter <strong>in</strong> als Liste von Konstanten<br />
e<strong>in</strong>setzen<br />
Dann modifizierte Anfrage<br />
<strong>select</strong> Titel from Buch<br />
where ISBN <strong>in</strong><br />
( `0-8053-1753-8‘, `3-8244-2021-X‘, `3-8244-2075-9‘)<br />
abarbeiten<br />
45
umfangreicheres Beispiel e<strong>in</strong>er relationalen<br />
<strong>Datenbank</strong>: <strong>Datenbank</strong>2<br />
Person<br />
PANr Vorname Nachname PLZ Ort Straße HNr Geb.datum<br />
4711 Andreas Heuer 18209 DBR BHS 15 31.10.1958<br />
5588 Gunter Saake 39106 MD STS 55 05.10.1960<br />
6834 Michael Korn 39104 MD BS 41 24.09.1974<br />
7754 Andreas Möller 18209 DBR RS 31 25.02.1976<br />
8832 Tamara Jagellovsk 38106 BS GS 12 11.11.1973<br />
9912 Antje Hellhof 18059 HRO AES 21 04.04.1970<br />
9999 Christa Loeser 69121 HD TS 38 10.05.1969<br />
Pers_Telefon PANr Telefon<br />
4711 038203-12230<br />
4711 0381-498-3401<br />
4711 0381-498-3427<br />
5588 0391-345677<br />
5588 0391-5592-3800<br />
9999 06221-400177<br />
46
Mitarbeiter<br />
Professor<br />
Student<br />
PANr AngNr Fachbereic Gehalt Raum E<strong>in</strong>stellung<br />
4711 HRO- Informatik 6000 209 01.03.94<br />
5588 MD-5267 Informatik 6000 304 01.04.94<br />
6834 MD- Mathemati 750 309 01.09.94<br />
7754 HRO- Informatik 550 218 01.10.94<br />
8832 MD-4567 Informatik 2800 302 01.08.94<br />
9912 HRO- L<strong>in</strong>guistik 2600 008 01.01.93<br />
PANr Lehrstuhlbezeichnung Stufe<br />
4711 <strong>Datenbank</strong>- <strong>und</strong> <strong>Informationssysteme</strong> C4<br />
5588 <strong>Datenbank</strong>en <strong>und</strong> <strong>Informationssysteme</strong> C4<br />
PANr Matrikelnummer Studienfach Immatrikulationsdatum<br />
6834 MD-891372 Informatik 01.10.89<br />
7754 HRO-912291 Informatik 01.10.91<br />
47
Lehrstuhl<br />
Vorlesung<br />
Lehrstuhlbezeichnung Anzahl_Planstellen<br />
<strong>Datenbank</strong>- <strong>und</strong> <strong>Informationssysteme</strong> 4<br />
<strong>Datenbank</strong> <strong>und</strong> <strong>Informationssysteme</strong> 5<br />
Rechnernetze 2<br />
V_Bezeichnung SWS Semester Studiengang<br />
<strong>Datenbank</strong>en I 4 5 Informatik<br />
<strong>Datenbank</strong>en II 4 6 Informatik<br />
<strong>Datenbank</strong>en 3 7 Mathematik<br />
Objektorientierte <strong>Datenbank</strong>en 4 6 Informatik<br />
<strong>Datenbank</strong>en für Ingenieure 2 7 Elektrotechnik<br />
Verteilte <strong>Datenbank</strong>en 2 8 Informatik<br />
Theorie relationaler <strong>Datenbank</strong>en 3 9 Informatik<br />
Spezifikationsmethoden 3 10 Informatik<br />
48
Buch<br />
Buch_Autor<br />
ISBN Titel Verlagsname<br />
3-89319-175-5 Das DB2-Handbuch Addison-Wesley<br />
0-8053-1753-8 Pr<strong>in</strong>c. of DBS Benj./Cumm<strong>in</strong>gs<br />
0-201-53771-0 Fo<strong>und</strong>ations of DB Addison-Wesley<br />
3-929821-31-1 <strong>Datenbank</strong>en Thomson<br />
ISBN Autor<br />
3-89319-175-5 Vossen<br />
3-89319-175-5 Witt<br />
0-8053-1753-8 Elmasri<br />
0-8053-1753-8 Navathe<br />
0-201-53771-0 Abiteboul<br />
0-201-53771-0 Hull<br />
0-201-53771-0 Vianu<br />
Buch_Stichwort<br />
ISBN Stichwort<br />
3-89319-175-5 RDB<br />
0-8053-1753-8 RDB<br />
0-8053-1753-8 Lehrbuch<br />
0-8053-1753-8 ER<br />
0-201-53771-0 RDB<br />
0-201-53771-0 Theorie<br />
3-929821-31-1 RDB<br />
49
Buch_Versionen<br />
Buch_Exemplare<br />
ISBN Auflage Jahr Seiten Preis<br />
3-89319-175-5 1 1990 288 79,-<br />
0-8053-1753-8 1 1989 802 72,35<br />
0-8053-1753-8 2 1994 873 88,85<br />
0-201-53771-0 1 1995 685 87,45<br />
3-929821-31-1 1 1995 5** 79,-<br />
Inventarnr ISBN Auflage<br />
001 3-89319-175-5 1<br />
005 0-8053-1753-3 1<br />
084 0-8053-1753-3 2<br />
085 0-8053-1753-3 2<br />
101 0-201-53771-0 1<br />
101 0-201-53771-0 1<br />
138 3-929821-31-1 1<br />
139 3-929821-31-1 1<br />
140 3-929821-31-1 1<br />
141 3-929821-31-1 1<br />
50
Verlag Verlagsname Verlagsort<br />
Addison-Wesley Bonn<br />
Benjam<strong>in</strong>/Cumm<strong>in</strong>gs Redwood City<br />
Thomson Bonn<br />
51
Ausleihe<br />
Prüft<br />
PANr Inventarnr<br />
7754 001<br />
7754 140<br />
4711 141<br />
5588 101<br />
9912 102<br />
9912 085<br />
PANr Matrikelnummer V_Bezeichnung Note<br />
4711 HRO-912291 <strong>Datenbank</strong>en I 2.0<br />
4711 HRO-912291 Objektorientierte <strong>Datenbank</strong>en 2.3<br />
5588 MD-891372 <strong>Datenbank</strong>en I 1.3<br />
5588 MD-891372 Spezifikationsmethoden 2.7<br />
52
Empfiehlt<br />
Vorl_Voraus<br />
PANr ISBN V_Bezeichnung<br />
4711 3-929821-31-1 <strong>Datenbank</strong>en I<br />
4711 0-8053-1753-8 <strong>Datenbank</strong>en I<br />
4711 0-8053-1753-8 <strong>Datenbank</strong>en II<br />
4711 0-201-53771-0 Theorie relationaler <strong>Datenbank</strong>en<br />
5588 3-89319-175-5 <strong>Datenbank</strong>en für Ingenieure<br />
5588 0-8053-1753-8 <strong>Datenbank</strong>en I<br />
5588 0-8053-1753-8 <strong>Datenbank</strong>en II<br />
5588 3-929821-31-1 <strong>Datenbank</strong>en I<br />
V_Bezeichnung Voraussetzung<br />
<strong>Datenbank</strong>en II <strong>Datenbank</strong>en I<br />
Objektorientierte <strong>Datenbank</strong>en <strong>Datenbank</strong>en I<br />
Spezifikationsmethoden Objektorientierte <strong>Datenbank</strong>en<br />
Spezifikationsmethoden Theorie relationaler <strong>Datenbank</strong>en<br />
Theorie relationaler <strong>Datenbank</strong>en <strong>Datenbank</strong>en I<br />
Verteilte <strong>Datenbank</strong>en <strong>Datenbank</strong>en II<br />
Verteilte <strong>Datenbank</strong>en Objektorientierte <strong>Datenbank</strong>en<br />
53
Liest<br />
Hört<br />
PANr V_Bezeichnung Semester<br />
4711 <strong>Datenbank</strong>en I WS 95/96<br />
4711 Theorie relationaler <strong>Datenbank</strong>en WS 95/96<br />
4711 <strong>Datenbank</strong>en II SS 96<br />
4711 Objektorientierte <strong>Datenbank</strong>en SS 96<br />
5588 <strong>Datenbank</strong>en für Ingenieure WS 95/96<br />
5588 <strong>Datenbank</strong>en I WS 95/96<br />
5588 Verteilte <strong>Datenbank</strong>en SS 96<br />
5588 Spezifikationsmethoden SS 96<br />
Matrikelnummer V_Bezeichnung Semester<br />
MD-891372 <strong>Datenbank</strong>en I 5<br />
MD-891372 Spezifikationsmethoden 6<br />
MD-891372 Verteilte <strong>Datenbank</strong>en 6<br />
HRO-912291 <strong>Datenbank</strong>en I 5<br />
HRO-912291 Objektorientierte <strong>Datenbank</strong>en 6<br />
HRO-912291 <strong>Datenbank</strong>en II 8<br />
54
Verzahnt geschachtelte Anfragen<br />
<strong>in</strong> der <strong>in</strong>neren Anfrage Relationenoder Tupelvariablen-Name<br />
aus dem from-Teil der äußeren Anfrage verwenden<br />
Beispiel: „Nachnamen von Prüfern, die schon e<strong>in</strong>mal e<strong>in</strong>e 1,0<br />
als Note gegeben haben“<br />
<strong>select</strong> Nachname<br />
from Person<br />
where 1.0 <strong>in</strong> ( <strong>select</strong> Note<br />
from Prüft<br />
where PANr = Person.PANr )<br />
55
Beispiel-<strong>Datenbank</strong><br />
Person<br />
Prüft<br />
PANr Vorname Nachname PLZ Ort Straße HNr Geb.datum<br />
4711 Andreas Heuer 18209 DBR BHS 15 31.10.1958<br />
5588 Gunter Saake 39106 MD STS 55 05.10.1960<br />
6834 Michael Korn 39104 MD BS 41 24.09.1974<br />
7754 Andreas Möller 18209 DBR RS 31 25.02.1976<br />
8832 Tamara Jagellovsk 38106 BS GS 12 11.11.1973<br />
9912 Antje Hellhof 18059 HRO AES 21 04.04.1970<br />
9999 Christa Loeser 69121 HD TS 38 10.05.1969<br />
PANr Matrikelnummer V_Bezeichnung Note<br />
4711 HRO-912291 <strong>Datenbank</strong>en I 2.0<br />
4711 HRO-912291 Objektorientierte <strong>Datenbank</strong>en 2.3<br />
5588 MD-891372 <strong>Datenbank</strong>en I 1.3<br />
5588 MD-891372 Spezifikationsmethoden 2.7<br />
56
Verzahnt geschachtelte Anfragen<br />
<strong>in</strong> der äußeren Anfrage das erste Personen-Tupel untersuchen<br />
Ergebnis <strong>in</strong> <strong>in</strong>nere Anfrage e<strong>in</strong>setzen<br />
<strong>in</strong>nere Anfrage<br />
<strong>select</strong> Note<br />
from Prüft<br />
where PANr = 4711<br />
auswerten, liefert Werteliste ( 2.0, 2.3 )<br />
Ergebnis der <strong>in</strong>neren Anfrage <strong>in</strong> die äußere e<strong>in</strong>setzen<br />
1.0 <strong>in</strong> ( 2.0, 2.3 ) ergibt false, also ersten Prüfer nicht berücksichtigen<br />
<strong>in</strong> der äußeren Anfrage das zweite Personen-Tupel untersuchen usw.<br />
57
Das exists-Prädikat<br />
testet, ob Ergebnis der <strong>in</strong>neren Anfrage nicht leer<br />
Beispiel: „ISBNs der Buch_Exemplare der zur Zeit ausgeliehenen<br />
Bücher“<br />
<strong>select</strong> ISBN<br />
from Buch_Exemplar<br />
where exists<br />
( <strong>select</strong> *<br />
from Ausleihe<br />
where Ausleihe.Inventarnr = Buch_Exemplar.Inventarnr)<br />
58
Beispiel-<strong>Datenbank</strong><br />
Ausleihe<br />
Buch_Exemplar<br />
PANr Inventarnr<br />
7754 001<br />
7754 140<br />
4711 141<br />
5588 101<br />
9912 102<br />
9912 085<br />
Inventarnr ISBN Auflage<br />
001 3-89319-175-5 1<br />
005 0-8053-1753-3 1<br />
084 0-8053-1753-3 2<br />
085 0-8053-1753-3 2<br />
101 0-201-53771-0 1<br />
101 0-201-53771-0 1<br />
138 3-929821-31-1 1<br />
139 3-929821-31-1 1<br />
140 3-929821-31-1 1<br />
141 3-929821-31-1 1<br />
59
Das exists-Prädikat: Allquantor simulieren<br />
Beispiel:<br />
„Lehrstuhlbezeichnungen der Professoren, die alle von ihnen gelesenen<br />
Vorlesungen auch schon e<strong>in</strong>mal geprüft haben.“<br />
bzw.<br />
„Lehrstuhlbezeichnungen von Professoren, so dass ke<strong>in</strong>e von diesem gelesene<br />
Vorlesung existiert, die von ihm nicht geprüft wurde.“<br />
<strong>select</strong> Lehrstuhlbezeichnung<br />
∀φ ≡¬∃¬φ<br />
from Professor<br />
where not exists<br />
( <strong>select</strong> *<br />
from Liest<br />
where Liest.PANr = Professor.PANr<br />
and not exists ( <strong>select</strong> *<br />
from Prüft<br />
where Prüft.PANr = Professor.PANr<br />
and Prüft.V_Bezeichnung = Liest.V_Bezeichnung))<br />
60
Beispiel-<strong>Datenbank</strong><br />
Professor<br />
Liest<br />
Prüft<br />
PANr Lehrstuhlbezeichnung Stufe<br />
4711 <strong>Datenbank</strong>- <strong>und</strong> <strong>Informationssysteme</strong> C4<br />
5588 <strong>Datenbank</strong>en <strong>und</strong> <strong>Informationssysteme</strong> C4<br />
PANr V_Bezeichnung Semester<br />
4711 <strong>Datenbank</strong>en I WS 95/96<br />
4711 Theorie relationaler <strong>Datenbank</strong>en WS 95/96<br />
4711 <strong>Datenbank</strong>en II SS 96<br />
4711 Objektorientierte <strong>Datenbank</strong>en SS 96<br />
5588 <strong>Datenbank</strong>en für Ingenieure WS 95/96<br />
5588 <strong>Datenbank</strong>en I WS 95/96<br />
5588 Verteilte <strong>Datenbank</strong>en SS 96<br />
5588 Spezifikationsmethoden SS 96<br />
PANr Matrikelnummer V_Bezeichnung Note<br />
4711 HRO-912291 <strong>Datenbank</strong>en I 2.0<br />
4711 HRO-912291 Objektorientierte <strong>Datenbank</strong>en 2.3<br />
5588 MD-891372 <strong>Datenbank</strong>en I 1.3<br />
5588 MD-891372 Spezifikationsmethoden 2.7<br />
61
Tupelbildungen<br />
row constructors<br />
bilden Tupel aus Konstanten oder Attributen (e 1 ,. . . , e n )<br />
where ( (`Informatik', `1.10.91') <strong>in</strong><br />
<strong>select</strong> Studienfach, Immatrikulationsdatum<br />
from Studenten<br />
where Matrikelnummer = `HRO-912291‘ )<br />
Attribute müssen kompatibel se<strong>in</strong> (nächste Folie)<br />
Tupelvergleich<br />
(a 1 , . . . , a n ) < (b 1 , . . . , b n )<br />
wahr, wenn e<strong>in</strong> j existiert, für das a j < b j <strong>und</strong> a i = b i für alle i < j gilt<br />
(lexikographische Ordnung)<br />
62
Kompatible Attribute<br />
Attribute s<strong>in</strong>d kompatibel bei kompatiblen Wertebereichen<br />
Zwei Wertebereiche s<strong>in</strong>d kompatibel, wenn sie<br />
gleich s<strong>in</strong>d oder<br />
beide auf character basierende Wertebereiche s<strong>in</strong>d<br />
(unabhängig von der Länge der Str<strong>in</strong>gs) oder<br />
beide numerische Wertebereiche s<strong>in</strong>d (unabhängig von dem<br />
genauen Typ) (wie <strong>in</strong>teger oder float)<br />
Kompatible Attribute können <strong>in</strong> Vergleichen <strong>und</strong><br />
Mengenoperationen benutzt werden<br />
63
Vere<strong>in</strong>igung<br />
SFW_block1 union<br />
Beispiel:<br />
<strong>select</strong> A, B, C<br />
from R1<br />
union<br />
<strong>select</strong> A, C, D<br />
from R2<br />
SFW_block2<br />
Attribute A von R1 <strong>und</strong> A von R2,<br />
B von R1 <strong>und</strong> C von R2<br />
C von R1 <strong>und</strong> D von R2<br />
müssen kompatibel se<strong>in</strong><br />
64
Vere<strong>in</strong>igung<br />
Ergebnis: Attributnamen des l<strong>in</strong>ken Operanden<br />
R1 A B C<br />
1 2 3<br />
2 3 4<br />
R1 union R2 A B C<br />
1 2 3<br />
2 3 4<br />
2 2 3<br />
5 3 2<br />
R2 A C D<br />
2 2 3<br />
5 3 2<br />
SQL-89: - Vere<strong>in</strong>igung nur als “äußerste“ Operation erlaubt<br />
- Vere<strong>in</strong>igung ist die e<strong>in</strong>zige Mengenoperation<br />
65
Simulation der Differenz<br />
Beispiel: „Mitarbeiter, die ke<strong>in</strong>e Studenten s<strong>in</strong>d“<br />
π<br />
[PANr] (Mitarbeiter) –<br />
<strong>in</strong> SQL-89:<br />
π<br />
[PANr] (Student)<br />
<strong>select</strong> PANr from Mitarbeiter<br />
where PANr not <strong>in</strong> ( <strong>select</strong> PANr<br />
from Student )<br />
66
Beispieldatenbank<br />
Mitarbeiter<br />
Student<br />
PANr AngNr Fachbereic Gehalt Raum E<strong>in</strong>stellung<br />
4711 HRO- Informatik 6000 209 01.03.94<br />
5588 MD-5267 Informatik 6000 304 01.04.94<br />
6834 MD- Mathemati 750 309 01.09.94<br />
7754 HRO- Informatik 550 218 01.10.94<br />
8832 MD-4567 Informatik 2800 302 01.08.94<br />
9912 HRO- L<strong>in</strong>guistik 2600 008 01.01.93<br />
PANr Matrikelnummer Studienfach Immatrikulationsdatum<br />
6834 MD-891372 Informatik 01.10.89<br />
7754 HRO-912291 Informatik 01.10.91<br />
67
Vere<strong>in</strong>igung, Durchschnitt <strong>und</strong> Differenz<br />
ab SQL-92<br />
union, <strong>in</strong>tersect <strong>und</strong> except orthogonal <strong>in</strong> andere Anfragen e<strong>in</strong>setzbar<br />
<strong>select</strong> count (*)<br />
from ( (<strong>select</strong> PANr from Professor)<br />
union<br />
(<strong>select</strong> PANr from Student) )<br />
correspond<strong>in</strong>g-Klausel: zwei Relationen nur über ihren geme<strong>in</strong>samen<br />
Bestandteilen (= gleiche Attributnamen) vere<strong>in</strong>igen<br />
<strong>select</strong> count (*)<br />
from ( Professor union correspond<strong>in</strong>g Student) )<br />
Anzahl der Tupel<br />
<strong>in</strong> der Ergebnistabelle<br />
68
Vere<strong>in</strong>igung<br />
Beispiel:<br />
R1 A B C<br />
1 2 3<br />
2 3 4<br />
R1 union correspond<strong>in</strong>g R2 A C<br />
1 3<br />
2 4<br />
2 2<br />
5 3<br />
R2 A C D<br />
2 2 3<br />
5 3 2<br />
69
Differenz<br />
Beispiel:<br />
R1 A B C<br />
1 2 3<br />
2 3 4<br />
R1 except correspond<strong>in</strong>g R2 A C<br />
2 4<br />
R2 A C D<br />
2 2 3<br />
1 3 2<br />
70
Vergleich Relationenalgebra <strong>und</strong> SQL<br />
Relationenalgebra SQL-89 ab SQL-92<br />
Projektion <strong>select</strong> dist<strong>in</strong>ct <strong>select</strong> dist<strong>in</strong>ct<br />
Selektion where ohne Schachtelung where ohne Schachtelung<br />
Verb<strong>und</strong> from, where from, where<br />
from mit jo<strong>in</strong> oder natural jo<strong>in</strong><br />
Umbenennung from mit Tupelvariable from mit Tupelvariable<br />
as<br />
Differenz where mit Schachtelung except correspond<strong>in</strong>g<br />
Durchschnitt where mit Schachtelung <strong>in</strong>tersect correspond<strong>in</strong>g<br />
Vere<strong>in</strong>igung union (nicht orthogonal) union correspond<strong>in</strong>g<br />
71
Weitere Sprachkonstrukte von SQL<br />
Operationen auf Wertebereichen<br />
Aggregatfunktionen<br />
group by <strong>und</strong> hav<strong>in</strong>g<br />
Quantoren <strong>und</strong> Mengenvergleiche<br />
Beispiele für Selbst-Verb<strong>und</strong><br />
order by<br />
Nullwerte<br />
72
Operationen auf Wertebereichen<br />
<strong>in</strong>nerhalb von <strong>select</strong> <strong>und</strong> where: statt Attribute auch<br />
skalare Ausdrücke<br />
numerischen Wertebereiche: etwa +, -, x, /<br />
Str<strong>in</strong>gs: char_length, Konkatenation ||, substr<strong>in</strong>g (Teilzeichenkette<br />
suchen)<br />
Datumstypen, Zeit<strong>in</strong>tervalle: current_date, current_time, +, -, x<br />
Ausdrücke werden tupelweise ausgewertet<br />
ergibt<br />
<strong>select</strong> ISBN, Preis ÷ 1.95583<br />
from Buch_Versionen<br />
Ergebnis<br />
ISBN<br />
3-89319-175-5 40,39<br />
0-8053-1753-8 36,99<br />
0-8053-1753-8 45,43<br />
0-201-53771-0 44,71<br />
3-929821-31-1 40,39<br />
73
Operationen auf Wertebereichen<br />
zweite Spalte im Ergebnis nicht benannt<br />
<strong>in</strong> SQL-89 über Spaltennummer identifizierbar:<br />
<strong>select</strong> 2 from Ergebnis<br />
<strong>in</strong> SQL-92: Attributname zuordnen<br />
<strong>select</strong> ISBN, Preis ÷ 1.95583 as<br />
from Buch_Versionen<br />
Euro_Preis<br />
ISBN Euro_Preis<br />
3-89319-175-5 40,39<br />
0-8053-1753-8 36,99<br />
0-8053-1753-8 45,43<br />
0-201-53771-0 44,71<br />
3-929821-31-1 40,39<br />
74
Aggregatfunktionen<br />
Werden tupelübergreifend ausgewertet<br />
count: Anzahl der Werte e<strong>in</strong>er Spalte oder<br />
Spezialfall count(*) : Anzahl der Tupel e<strong>in</strong>er Tabelle<br />
sum: Summe der Werte e<strong>in</strong>er Spalte<br />
avg: arithmetisches Mittel der Werte e<strong>in</strong>er Spalte<br />
max bzw. m<strong>in</strong>: größter bzw. kle<strong>in</strong>ster Wert e<strong>in</strong>er Spalte<br />
Argumente e<strong>in</strong>er Aggregatfunktion:<br />
Attribut der durch from spezifizierten Relation<br />
gültiger skalarer Ausdruck<br />
bei count auch *<br />
Vor Argument (außer bei count(*) ) optional:<br />
dist<strong>in</strong>ct oder all (all Vore<strong>in</strong>stellung)<br />
Nullwerte werden vor Anwendung aus Wertemenge elim<strong>in</strong>iert<br />
(außer bei count(*) )<br />
75
Aggregatfunktion: Beispiele<br />
<strong>select</strong> sum(Preis) from Buch_Versionen<br />
<strong>select</strong> count(*)<br />
from Professor<br />
<strong>select</strong> count(dist<strong>in</strong>ct PANr)<br />
from Prüft<br />
<strong>select</strong> avg (Note)<br />
from Prüft<br />
where V_Bezeichnung = `<strong>Datenbank</strong>en I'<br />
406,65<br />
„Studenten, die m<strong>in</strong>destens e<strong>in</strong>e Prüfung mit e<strong>in</strong>er Note gemacht haben, die besser als der<br />
Durchschnitt ist“<br />
<strong>select</strong> Matrikelnummer<br />
from Prüft<br />
where Note < ( <strong>select</strong> avg (Note) from Prüft )<br />
76
group by<br />
<strong>und</strong> hav<strong>in</strong>g<br />
<strong>select</strong> . . .<br />
from . . .<br />
[where . . .]<br />
[group by attributliste ]<br />
[hav<strong>in</strong>g bed<strong>in</strong>gung ]<br />
Semantik:<br />
virtuelle geschachtelte Relation<br />
In der Ausgabeliste nur<br />
Gruppierungsattribute <strong>und</strong><br />
Aggregatfunktionen über<br />
Nicht-Gruppierungsattribute<br />
group by G: nach Attributen <strong>in</strong> G schachteln, d.h. für gleiche G-Werte<br />
werden Resttupel <strong>in</strong> Relation gesammelt<br />
hav<strong>in</strong>g C: Selektionsbed<strong>in</strong>gung auf gruppierter Relation: darf neben<br />
Gruppierungsattributen auch auf beliebige Aggregatfunktionen über<br />
Nicht-Gruppierungsattributen Bezug nehmen<br />
77
Beispielanfrage<br />
<strong>select</strong><br />
from<br />
R<br />
where<br />
group by<br />
hav<strong>in</strong>g<br />
A, sum<br />
C < D<br />
A, B<br />
(D)<br />
Gruppierungsattribute<br />
A
Auswertungsreihenfolge von<br />
group by <strong>und</strong> hav<strong>in</strong>g<br />
1.<br />
2.<br />
from R<br />
where C < D<br />
group by<br />
A, B<br />
A B C D<br />
1 2 3 4<br />
1 2 4 5<br />
2 3 3 4<br />
3 3 4 5<br />
3 3 6 7<br />
A B N<br />
C D<br />
1 2 3 4<br />
4 5<br />
2 3 3 4<br />
3 3 4 5<br />
6 7<br />
79
Auswertungsreihenfolge von<br />
group by <strong>und</strong> hav<strong>in</strong>g<br />
3. hav<strong>in</strong>g A
Weiteres Beispiel (auf der <strong>Datenbank</strong> 1)<br />
„Personen, die mehr als e<strong>in</strong> Buch ausgeliehen haben, mit der Anzahl der<br />
ausgeliehenen Bücher“<br />
<strong>select</strong> Name, count (Buch.ISBN)<br />
from Buch, Ausleihe<br />
where Ausleihe.ISBN = Buch.ISBN<br />
group by Name<br />
hav<strong>in</strong>g count(Buch.ISBN) > 1<br />
wird <strong>in</strong> folgenden Schritten abgearbeitet:<br />
1. from Buch, Ausleihe<br />
where Ausleihe.ISBN = Buch.ISBN<br />
Buch.ISBN Titel Verlag Ausleihe.ISBN Name<br />
0-8053-1753-8 . . . Benj. Cumm<strong>in</strong>gs 0-8053-1753-8 Schmitz<br />
0-8053-1753-8 . . . Benj. Cumm<strong>in</strong>gs 0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X . . . DUV 3-8244-2021-X Radermacher<br />
3-8244-2075-9 . . . DUV 3-8244-2075-9 Radermacher<br />
81
Weiteres Beispiel (auf der <strong>Datenbank</strong> 1)<br />
2. group by Name<br />
Buch.ISBN Titel Verlag Ausleihe.ISBN Name<br />
0-8053-1753-8 . . . Benj. Cumm<strong>in</strong>gs 0-8053-1753-8 Schmitz<br />
0-8053-1753-8 . . . Benj. Cumm<strong>in</strong>gs 0-8053-1753-8 Derichsweiler<br />
3-8244-2021-X . . . DUV 3-8244-2021-X Radermacher<br />
3-8244-2075-9 . . . DUV 3-8244-2075-9<br />
3. hav<strong>in</strong>g count<br />
Buch.ISBN Titel Verlag Ausleihe.ISBN Name<br />
3-8244-2021-X . . . DUV 3-8244-2021-X Radermacher<br />
3-8244-2075-9 . . . DUV 3-8244-2075-9<br />
4. <strong>select</strong><br />
(Buch.ISBN) > 1<br />
Name, count(Buch.ISBN)<br />
Name<br />
Radermacher 2<br />
82
Weitere Beispiele (auf der <strong>Datenbank</strong> 2)<br />
„pro Person die Anzahl der von ihr ausgeliehenen Bücher“<br />
<strong>select</strong> count(*) as Anzahl, PANr<br />
from Ausleihe<br />
group by PANr<br />
Anzahl PANr<br />
2 7754<br />
1 4711<br />
1 5588<br />
2 9912<br />
„Personen, die m<strong>in</strong>destens 2 Bücher ausgeliehen haben“<br />
<strong>select</strong> count(*), PANr<br />
from Ausleihe<br />
group by PANr<br />
hav<strong>in</strong>g count(*) > 1<br />
PANr<br />
2 7754<br />
2 9912<br />
83
Gruppierung (auf <strong>Datenbank</strong>2)<br />
„Studenten, deren Durchschnittsnote besser ist<br />
als die Gesamtdurchschnittsnote aller<br />
Prüfungen“<br />
<strong>select</strong> Matrikelnummer<br />
from Prüft<br />
group by Matrikelnummer<br />
hav<strong>in</strong>g avg(Note) < ( <strong>select</strong> avg(Note)<br />
from Prüft)<br />
84
Quantoren <strong>und</strong> Mengenvergleiche<br />
attribut θ { all | any |<br />
(<strong>select</strong> attribut<br />
from . . .<br />
where . . . )<br />
some }<br />
θ Vergleichsoperator,<br />
all Allquantor,<br />
any, some Existenzquantoren<br />
85
Quantoren <strong>und</strong> Mengenvergleiche (Bsp.)<br />
„Studenten, die schon e<strong>in</strong>mal geprüft wurden“<br />
<strong>select</strong> PANr, Immatrikulationsdatum<br />
from Student<br />
where Matrikelnummer = any ( <strong>select</strong> Matrikelnummer<br />
from Prüft )<br />
„schlechteste Note des Studenten mit der Matrikelnummer „HRO-912291“<br />
<strong>select</strong> Note<br />
from Prüft<br />
where Matrikelnummer = `HRO-912291'<br />
and Note ≥ all ( <strong>select</strong> Note<br />
from Prüft<br />
where Matrikelnummer = `HRO-912291' )<br />
Simulation der max-Funktion!<br />
86
Quantoren <strong>und</strong> Mengenvergleiche<br />
Anwendbarkeit e<strong>in</strong>geschränkt: Test auf Mengen-<br />
Gleichheit<br />
∀x ∈ M1 : ∃x ∈ M2 ∧ ∀x ∈ M2 : ∃x ∈ M1<br />
<strong>in</strong> SQL so nicht umsetzbar<br />
Beispiel:<br />
„Gib alle Bücher aus, an denen „Vossen“ <strong>und</strong> „Witt“<br />
geme<strong>in</strong>sam als Autoren beteiligt waren“<br />
87
Quantoren <strong>und</strong> Mengenvergleiche<br />
Beispiel:„Gib alle Bücher aus, an denen „Vossen“<br />
„Witt“ geme<strong>in</strong>sam als Autoren beteiligt waren“<br />
<strong>select</strong> ISBN<br />
from Buch_Autor<br />
where Autor = `Vossen' and Autor = `Witt‘<br />
liefert nicht das richtige Ergebnis, sondern immer die<br />
leere Ergebnisliste!<br />
<strong>und</strong><br />
88
Selbst-Verb<strong>und</strong><br />
letzte Anfrage erst mit Selbst-Verb<strong>und</strong> zu lösen: Vergleich von Wertemengen<br />
<strong>select</strong> B_A_1.ISBN<br />
from Buch_Autor B_A_1, Buch_Autor B_A_2<br />
where B_A_1.ISBN = B_A_2.ISBN<br />
and B_A_1.Autor = `Vossen' and B_A_2.Autor = `Witt‘<br />
Zwischenergebnis (nach Bildung des kartesischen Produkts):<br />
B_A_1.ISBN B_A_1.Autor B_A_2.ISBN B_A_2.Autor<br />
3-89319-175-5 Vossen 3-89319-175-5 Vossen<br />
3-89319-175-5 Vossen 3-89319-175-5 Witt<br />
3-89319-175-5 Vossen 0-8053-1753-8 Elmasri<br />
. . .<br />
3-89319-175-5 3-89319-175-5<br />
. . .<br />
89
order by<br />
-Klausel<br />
Menge von Tupeln als Liste<br />
order by attributliste<br />
Beispiel:<br />
<strong>select</strong> Matrikelnummer, Note<br />
from Prüft<br />
where V_Bezeichnung = ``<strong>Datenbank</strong>en I''<br />
order by Note asc<br />
aufsteigend (asc) oder absteigend (desc) sortieren Sortierung wird auf das<br />
Ergebnis der jeweils vorangehenden SFW-Anfrage angewendet, also FALSCH:<br />
<strong>select</strong> Matrikelnummer<br />
from Prüft<br />
where V_Bezeichnung = ``<strong>Datenbank</strong>en I''<br />
order by Note<br />
(falsch, weil Note nicht <strong>in</strong> der Ausgabeliste steht!)<br />
90
Behandlung von Nullwerten<br />
skalare Ausdrücke: Ergebnis null, sobald Nullwert <strong>in</strong> die Berechnung<br />
e<strong>in</strong>geht<br />
In allen Aggregatfunktionen bis auf count(*) werden Nullwerte vor<br />
Anwendung der Funktion entfernt<br />
Fast alle Vergleiche mit Nullwert ergeben Wahrheitswert unknown (statt<br />
true oder false). Ausnahme: is null ergibt true, is not null ergibt false<br />
Boolesche Ausdrücke basieren dann auf dreiwertiger Logik<br />
and true unknown false<br />
true true unknown false<br />
unknown unknown unknown false<br />
false false false false<br />
not<br />
true false<br />
unknown unknown<br />
false true<br />
or true unknown false<br />
true true true true<br />
unknown true unknown unknown<br />
false true unknown false<br />
91
5.3 Datenmanipulationssprache SQL -<br />
E<strong>in</strong>fügen von Tupeln <strong>in</strong> Basisrelationen: <strong>in</strong>sert<br />
Löschen von Tupeln aus Basisrelationen: delete<br />
Ändern von Tupeln <strong>in</strong> Basisrelationen: update<br />
Diese Operationen jeweils als<br />
DML<br />
E<strong>in</strong>tupel-Operationen (etwa die Erfassung e<strong>in</strong>er neuen<br />
Ausleihe)<br />
Mehrtupel-Operationen (erhöhe das Gehalt aller Mitarbeiter<br />
um 4.5%)<br />
SQL: vor allem Mehrtupel-Operationen<br />
92
update<br />
update basisrelation<br />
set attribut_1 = ausdruck_1<br />
...<br />
Attribut_n = ausdruck_n<br />
[ where bed<strong>in</strong>gung ]<br />
update Angestellte<br />
set Gehalt = Gehalt + 1000<br />
where Gehalt < 5000<br />
update Angestellte<br />
set Gehalt = 6000<br />
where Name = `Bond'<br />
update Angestellte<br />
set Gehalt = 3000<br />
Name Gehalt<br />
Meyer 3000<br />
Schulz 3500<br />
Bond 7200<br />
Schulz 4400<br />
Name Gehalt<br />
Meyer 4000<br />
Schulz 4500<br />
Bond 7200<br />
Schulz 5400<br />
93
delete<br />
delete<br />
from basisrelation<br />
[ where bed<strong>in</strong>gung<br />
delete<br />
where<br />
from<br />
Invnr<br />
]<br />
Ausleihe<br />
= 001<br />
Standardfall ist Löschen mehrerer Tupel:<br />
delete from Ausleihe<br />
where PANr = 7754<br />
Löschen der gesamten Relation:<br />
delete from Ausleihe<br />
94
<strong>in</strong>sert<br />
<strong>in</strong>sert <strong>in</strong>to basisrelation [ (attribut_1, ..., attribut_n) ]<br />
values (konstante-1, ..., konstante_n)<br />
<strong>in</strong>sert <strong>in</strong>to Buch (Invnr, Titel)<br />
values (4867,`Wissensbanken')<br />
<strong>in</strong>sert <strong>in</strong>to Buch<br />
values (4867,`Wissensbanken',`3-876',`Karajan')<br />
<strong>in</strong>sert <strong>in</strong>to basisrelation [ (attribut_1, ..., attribut_n) ]<br />
SQL-anfrage<br />
<strong>in</strong>sert <strong>in</strong>to K<strong>und</strong>e<br />
( <strong>select</strong> LName, LAdr, 0<br />
from Lieferant )<br />
95