12.08.2013 Aufrufe

in select - Datenbank- und Informationssysteme - Universität ...

in select - Datenbank- und Informationssysteme - Universität ...

in select - Datenbank- und Informationssysteme - Universität ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!