Einführung in relationale Datenbanken und SQL

Werbung
Einführung in relationale
Datenbanken und
SQL-Programmierung
Ralf Adams, TBS1 Bochum
12. Oktober 2011
Inhaltsverzeichnis
1 Einführung
2 Tabellen
2.1 Tabellen . . . . . . . . . . . . . . . . . . .
2.1.1 Tabelle, Zeile, Spalte und Schlüssel
2.2 Exkurs: Hierarchische Datenbanken . . . .
2.3 Schlüssel und Verknüpfungen . . . . . . .
2.3.1 Schlüssel und Primärschlüssel . . .
2.3.2 Darstellung als ER-Modell . . . . .
2.3.3 Was ist eine Verknüpfung? . . . . .
2.3.4 Kardinalitäten . . . . . . . . . . . .
2.3.4.1 1:1-Verknüpfungg . . . . .
2.3.4.2 1:n-Verknüpfung . . . . .
2.3.4.3 n:m-Verknüpfung . . . . .
2.3.5 Aufgaben zum ER-Modell . . . . .
2.3.6 Referentielle Integrität . . . . . . .
2.3.7 Normalformen . . . . . . . . . . . .
2.3.7.1 Normalform 1 . . . . . . .
2.3.7.2 Normalform 2 . . . . . . .
2.3.7.3 Normalform 3 . . . . . . .
7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Implementieren mit SQL
3.1 Was ist SQL? . . . . . . . . . . . . . . . . . . . . . .
3.2 MySQL . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 SQL-DDL . . . . . . . . . . . . . . . . . . . . . . . .
3.4 SQL-DML . . . . . . . . . . . . . . . . . . . . . . . .
3.4.1 Daten einfügen . . . . . . . . . . . . . . . . .
3.4.1.1 Daten aus CSV-Dateien einfügen . .
3.4.1.2 Daten mit INSERT einfügen . . . . .
3.4.2 Daten ändern . . . . . . . . . . . . . . . . . .
3.4.3 Exkurs: WHERE-Klausel . . . . . . . . . . . . .
3.4.4 Daten löschen . . . . . . . . . . . . . . . . . .
3.4.5 Daten auswerten mit SELECT . . . . . . . . . .
3.4.5.1 Tabellenunabhängige Auswertungen
3.4.5.2 Einfache Zeilen und Spaltenauswahl
3.4.5.3 Auswahl sortieren . . . . . . . . . .
Einführung in relationalen Datenbanken und SQL
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
8
11
12
12
15
15
18
18
20
22
23
25
27
27
28
30
.
.
.
.
.
.
.
.
.
.
.
.
.
.
31
31
31
32
40
41
41
42
43
43
46
46
46
47
49
2
Inhaltsverzeichnis
3.4.5.4
3.4.5.5
Inhaltsverzeichnis
Mehrfachausgaben unterdrücken . . . . . . . . . . . . .
Verknüpfen mit INNER JOIN . . . . . . . . . . . . . . .
Einführung in relationalen Datenbanken und SQL
50
51
3
Tabellenverzeichnis
2.3
2.5
Namensübersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tabelle: buch (3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
14
3.1
3.2
3.3
3.4
3.5
3.5
Tabelle:
Tabelle:
Tabelle:
Tabelle:
Tabelle:
Tabelle:
34
35
36
37
44
45
Numerische Datentypen (Auszug) . . . . .
Datum und Zeit Datentypen (Auszug) . . .
Text und Blob Datentypen (Auszug) . . .
Zusätze (modifier) zu Datentypen (Auszug)
Elemente der WHERE-Klausel (Auszug) . . .
Elemente der WHERE-Klausel (Auszug) . . .
Einführung in relationalen Datenbanken und SQL
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
Abbildungsverzeichnis
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
Hierarchische Darstellung . . . . . . . . . . . . . . . . . . . . . .
ER-Modell buch(1) . . . . . . . . . . . . . . . . . . . . . . . . . .
Primärschlüssel - Fremdschlüssel zwischen buch und autor . . . .
Primärschlüssel - Fremdschlüssel zwischen buch anderen Tabellen
ER-Modell Buch(2) . . . . . . . . . . . . . . . . . . . . . . . . . .
Primärschlüssel - Fremdschlüssel zwischen person und ausweis .
ER-Modell person - ausweis . . . . . . . . . . . . . . . . . . . . .
Primärschlüssel - Fremdschlüssel zwischen bankkunde und konto .
ER-Modell bankkunde - bankkonto . . . . . . . . . . . . . . . . .
ER-Modell kuchen . . . . . . . . . . . . . . . . . . . . . . . . . .
Primärschlüssel - Fremdschlüssel zwischen kuchen und zutat . . .
Datenauszug von kunde und adresse . . . . . . . . . . . . . . . .
Datenauszug von kunde und adresse . . . . . . . . . . . . . . . .
Einführung in relationalen Datenbanken und SQL
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
15
16
18
19
19
20
20
21
22
23
25
25
5
Definitionen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Spalte . . . . . . . . . . . .
Zeile . . . . . . . . . . . . .
Tabelle . . . . . . . . . . . .
Domäne . . . . . . . . . . .
Schlüssel . . . . . . . . . . .
Primärschlüssel . . . . . . .
Entity Relationship Model .
Fremdschlüssel . . . . . . .
Verknüpfung . . . . . . . . .
1:1-Verknüpfung . . . . . . .
1:n-Verknüpfung . . . . . .
n:m-Verknüpfung . . . . . .
Referentielle Integrität . . .
Atomar . . . . . . . . . . .
Wiederholungsgruppefreiheit
Normalform 1 . . . . . . . .
Voll- und teilfunktional . . .
Normalform 2 . . . . . . . .
Transitiv . . . . . . . . . . .
Normalform 3 . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
11
12
13
15
16
17
19
21
22
26
28
28
28
29
30
30
30
21
22
Kartesisches Produkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INNER JOIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
53
Einführung in relationalen Datenbanken und SQL
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
1 Einführung
Die Ablage, Edition und Auswertung von Informationen ist eines der wesentlichen Aufgaben der EDV. Schnell stößt man dabei auf das Problem, die Daten in möglichst optimaler Form zu verwalten. Die Daten sollen derart abgelegt sein, dass sie schnell verfügbar,
leicht auszuwerten und mit möglichst geringem Aufwand zu editieren sind. Mit wachsender Rechnerleistung werden die dazu verwendeten Konzepte immer mächtiger. Das
derzeit bedeutendste ist das Konzept der relationalen Datenbanken mit der Abfragesprache SQL1 . Neben diesem Konzept gibt es aber auch noch andere, die hier nur kurz
erwähnt werden
• Hierarchische Datenbanken
• Objektorientierte Datenbanken
Alle diese Konzepte finden heute in der Praxis Verwendung.
Zum Skript
Ziel des Skripts ist die Einführung aller wichtigen Begriffe und Techniken einer relationalen Datenbank, sofern diese sinnvollerweise Unterrichtsgegenstand sein können. Weiterführende Techniken oder Vertiefung in einzelnen Datenbankserversysteme, wie Oracle
würden den Rahmen sprengen.
Die Zielgruppen dieses Skripts sind Informationstechnische Assistenten/innen und Fachinformatiker/innen in der Ausbildung. Das Skript kann als Unterrichtsgrundlage oder
häusliches Lernmittel verwendet werden.
1
structered query language; engl. strukturierte Abfragesprache
Einführung in relationalen Datenbanken und SQL
7
2 Tabellen
2.1 Tabellen
2.1.1 Tabelle, Zeile, Spalte und Schlüssel
In relationalen Datenbanken werden alle Informationen in Tabellen abgespeichert. Dies
scheint trivial zu sein, aber man mache sich klar, dass es auch andere Formate zur Ablage
von Informationen gibt.
Als Beispiel für eine sequentielle Buchdatenablage nehmen wir ein spezielles Ablageformat: Das BibTEX-Format.
BibTeX
@Book{boehm1,
author = {Oliver Böhm},
title = {Fehlerfrei programmieren in C und C++},
publisher = {dpunkt.verlag},
year = {2000},
key = {Softwareentwicklung, C, C++},
address = {Heidelberg},
edition = {2},
note = {Tipps zur Fehlervermeidung},
annote = {ISBN: 3-932588-76-3}
}
@Book{apetri1,
author = {Marius Apetri},
title = {3D-Grafik Progammierung},
publisher = {mitp},
year = {2003},
key = {Grafikprogrammierung, C++},
address = {Bonn},
edition = {1},
note = {Theorie + Praxis der Grafikprogrammierung},
annote = {ISBN: 3-8266-0891-7}
}
@Book{loudon1,
author = {Kyle Loudon},
title = {Algorithmen in C},
publisher = {O’Reilly},
year = {2000},
key = {Algorithmen, Programmierung, C},
address = {Köln},
edition = {1},
note = {Theorie + Praxis von Standardalgorithmen},
annote = {ISBN: 3-89721-165-3}
}
@Book{yarger1,
author = {Randay J. Yarger, George Reese, Tim King},
title = {MySQL},
publisher = {O’Reilly},
year = {2000},
key = {Datenbankprogrammierung, SQL},
address = {Köln},
edition = {1},
note = {MySQL als DB-Engine und die Sprache SQL},
annote = {ISBN: 3-89721-163-7}
}
Einführung in relationalen Datenbanken und SQL
8
2 Tabellen
2.1 Tabellen
@Book{stoer1,
author = {Josef Stoer},
title = {Numerische Mathematik 1},
publisher = {Springer},
year = {1989},
key = {Mathematik},
address = {Berlin},
edition = {5},
note = {},
annote = {ISBN: 3-540-51481-3}
}
@Book{stoer2,
author = {Josef Stoer, Roland Burlisch},
title = {Numerische Mathematik 2},
publisher = {Springer},
year = {1990},
key = {Mathematik},
address = {Berlin},
edition = {3},
note = {},
annote = {ISBN: 3-540-51482-1}
}
Offensichtlich liegt ein Ordnung der Daten vor und man kann sich leicht vorstellen, dass
diese Daten von einem Programm (hier: BibTEX) ausgewertet werden können.
Aufgabe 2.1 Sammeln Sie weitere Ablageformate von Informationen!
Der erste Schritt in Richtung relationale Datenbank wäre nun die Daten in Tabellen
anzuordnen. In diesem Fall wäre der Umbau schnell passiert.
address
edition
dpunkt.verlag
2000
Softwareentwicklung, C, C++
Heidelberg
2
Tipps zur Fehlervermeidung
ISBN:
3-93258876-3
petri1
Marius Apetri
3D-Grafik
Programmierung
mitp
2003
Grafikprogrammierung, C++
Bonn
1
Theorie
+
Praxis
der
Grafikprogrammierung
ISBN:
3-82660891-7
loudon1
Kyle Loudon
Algorithmen in C
O’Reilly
2000
Algorithmen,
Programmierung,
C
Köln
1
Theorie
+
Praxis
von
Standardalgorithmen
ISBN:
3-89721165-3
yarger1
Randay
J.
Yarger,
George Reese,
Tim King
MySQL
O’Reilly
2000
Datenbankprogrammierung,
SQL
Köln
1
MySQL als DBEngine und die
Sprache SQL
ISBN:
3-89721163-7
stoer1
Josef Stoer
Numerische
thematik 1
Me-
Springer
1989
Mathematik
Berlin
5
ISBN:
3-54051481-3
stoer2
Josef Stoer,
Roland Burlisch
Numerische
thematik 2
Me-
Springer
1990
Mathematik
Berlin
3
ISBN:
3-54051482-1
annote
year
Fehlerfrei
programmieren in C
und C++
note
publisher
Oliver Böhm
key
author
boehm1
title
id
Tabelle: buch (1)
Der Aufbau in der Tabellenform ermöglicht nun die direkte Vergleichbarkeit aller gleichartigen Informationen. Alle Verlage oder Erscheinungsdatümer stehen nun untereinan-
Einführung in relationalen Datenbanken und SQL
9
2 Tabellen
2.1 Tabellen
der. Für die Datenverarbeitung kann nun sehr schnell auf eine bestimmte Information
zugegriffen werden. Möchte man auf das Erscheinungsjahr des zweiten Buches zugreifen,
kann der Computer die Stelle sehr schnell errechnen:
Position = Spaltenanzahl × (Zeilennummer − 1) + Spaltennummer
Tragen wir die Daten ein, so ergibt sich für das Erscheinungsjahr des zweiten Datensatzes: Spaltenanzahl = 10, Zeilennummer = 2 und Spaltennummer = 5
Position = 10 × (2 − 1) + 5 = 15
Im 15ten Feld steht somit die gesuchte Information. Die Tabellendarstellung ist unter
anderem wegen dieser Eigenschaft gut für die Verarbeitung mit dem Computer geeignet.
Tabellenspalte
Definition 1 Spalte
Eine Spalte einer Tabelle enthält immer Informationen des selben Typs. Damit meint man Daten
1. des selben technischen Datentyps und
2. zur gleichen inhaltlichen Kategorie.
Jede Spalte hat eine Überschrift, die die Kategorie inhaltlich festlegt und innerhalb der Tabelle eindeutig ist.
Tabellenzeile
Definition 2 Zeile
Eine Zeile einer Tabelle enthält in jeder Spalte inhaltlich zusammenhängende
Informationen. Die Reihenfolge der Spalten ist in jeder Zeile gleich.
Tabelle
Definition 3 Tabelle
Eine Tabelle besteht aus mindestens einer Spalte und einer endlichen Anzahl
von Zeilen. Die Anzahl der Spalten ist ebenfalls endlich.
In diesem Skript werden diese drei Begriffe verwendet: Tabelle, Zeile und Spalte. In der
Literatur findet man aber noch andere, die ebenfalls verwendet werden können (siehe
Tabelle 2.3 auf der nächsten Seite).
Überprüfen wir, ob unsere Tabelle 2.2 auf der vorherigen Seite auch den Definitionen 1, 2
und 3 genügt.
Einführung in relationalen Datenbanken und SQL
10
2 Tabellen
2.2 Exkurs: Hierarchische Datenbanken
Tabelle 2.3: Namensübersicht
Skript
Alternative Namen
Zeile
Tupel, Entity (Entität), Objekt, Datensatz, Record
Spalte
Attribut, Feld, Datenfeld, Item, Property
Tabelle
Matrix, Entitytyp (Entititätentyp), Schema, Relation, Klasse, Recordset
In jeder Spalte müssen die Informationen des gleichen Datentyps und der gleichen inhaltlichen Kategorie vorhanden sein. Dies ist offensichtlich der Fall. Jede Zeile besteht
aus gültigen Attributwerten in den Spalten. Auch dies ist der Fall. Wir haben nirgendwo
Werte, die nicht zu einem Buch passen würden. Die Tabelle selbst besteht tatsächlich
aus Zeilen und Spalten. Das bedeutet, sie hat keine Untertabellen oder ähnlich windige
Dinger zu bieten.
Der Begriff relationale Datenbank kommt somit nicht - wie oft irrtümlich angenommen
wird - von den Beziehungen der Tabellen untereinander, sondern vom Fachbegriff Relation für eine Tabelle. Bei relationalen Datenbanken werden die Daten in Tabellen abgelegt.
Die Bedeutung einer Information ist davon abhängig, in welcher Tabelle diese steht.
Definition 4 Domäne
Als Domäne einer Spalte bezeichnet man die fachlich und formal gültigen
Spaltenwerte (Attributwerte).
2.2 Exkurs: Hierarchische Datenbanken
Betrachten Sie folgenden Dateiauszug:
05
10
15
15
15
10
15
05
10
15
15
12345 Marx
Karl
8594882 37010011 01.12.1990
01.12.1990 +100,00
02.12.1990 +50,00
05.12.1990 +50,00
8594823 37010011 01.05.2000
01.15.2000 +5,00
12346 Engels
Friederich
8236734 37010011 01.05.2001
01.05.2001 +0,00
01.05.2001 +1432,45
Hauptstraße 41 Trier
Sparbuch
Giro
Nebensstraße 3 Bremen
Giro
Aufgabe 2.2 Versuchen Sie die Informationen des Auszugs zu bestimmen.
Einführung in relationalen Datenbanken und SQL
11
Relationale
Datenbank
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Man erkennt eine inhaltliche Struktur, die offensichtlich keine Tabelle ist. Die Daten
haben eine hierarchische Struktur (siehe Abb. 2.1), da die Daten von oben nach unten
organisiert sind. Die Bedeutung einer Information ist davon abhängig, unter welcher
anderen Information sie steht.
00
05
10
15
15
05
10
15
15
10
15
15
Abbildung 2.1: Hierarchische Darstellung
2.3 Schlüssel und Verknüpfungen
2.3.1 Schlüssel und Primärschlüssel
In Tabelle 2.2 auf Seite 9 heißt eine Spalte id und soll offensichtlich eine eindeutige
Benennung (Identifikation) eines Buches darstellen. Eine solche eindeutige Identifikation
braucht man, wenn man auf eine bestimmte Zeile zugreifen möchte. Will man diese Zeile
lesen, löschen oder verändern, so ist es sehr umständlich immer angeben zu müssen:
Lösche die Zeile mit dem Autor ..., dem Titel ... usw.. Man möchte sagen können:
Lösche boehm1. Durch die Eindeutigkeit von boehm1 kann kein Missverständnis darüber
entstehen, welche Zeile gelöscht werden soll.
Definition 5 Schlüssel
Ein Schlüssel ist mindestens eine Spalte einer Tabelle, welche jede Zeile konzeptionell eindeutig macht, d.h. der Attributwert kann per Definition in der
Tabelle nur einmal in der Spalte vorkommen.
Ein Schlüssel kann aus mehreren Spalten zusammengesetzt werden, muss aber
minimal sein. Ein Schlüssel ist dann minimal, wenn er nicht mehr reduziert
werden kann, ohne seine Schlüsseleigenschaft zu verlieren.
Einführung in relationalen Datenbanken und SQL
12
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Definition 6 Primärschlüssel
In einer Tabelle können mehrere Schlüssel vorkommen. Ein Schlüssel wird
herausgehoben und als Primärschlüssel gekennzeichnet. Die anderen Schlüssel nennt man Sekundärschlüssel oder Schlüsselkandidaten.
Was meint konzeptionell eindeutig? Stellen Sie sich vor, in der Buchtabelle sind nur
2 Bücher mit unterschiedlichen Buchtitel erfasst. Dann könnte man auf die Idee kommen,
den Titel als Schlüssel anzusehen. Konzeptionell eindeutig bedeutet, dass es kein Zufall
sein darf, dass die Attributwerte eindeutig sind.
konzeptionell
eindeutig
Aufgabe 2.3 Nennen Sie Schlüssel der Bücherliste in Tabelle 2.4. Wählen Sie einen
Primärschlüssel aus und begründen Sie ihre Wahl!
year
address
edition
Fehlerfrei
programmieren in C
und C++
dpunkt.verlag
2000
Softwareentwicklung, C, C++
Heidelberg
2
Tipps zur Fehlervermeidung
ISBN:
3-93258876-3
petri1
Marius Apetri
3D-Grafik
Programmierung
mitp
2003
Grafikprogrammierung, C++
Bonn
1
Theorie
+
Praxis
der
Grafikprogrammierung
ISBN:
3-82660891-7
loudon1
Kyle Loudon
Algorithmen in C
O’Reilly
2000
Algorithmen,
Programmierung,
C
Köln
1
Theorie
+
Praxis
von
Standardalgorithmen
ISBN:
3-89721165-3
yarger1
Randay
J.
Yarger,
George Reese,
Tim King
MySQL
O’Reilly
2000
Datenbankprogrammierung,
SQL
Köln
1
MySQL als DBEngine und die
Sprache SQL
ISBN:
3-89721163-7
kopka1
Helmut Kopka
Latex
Addison-Wesley
1996
Latex
Bonn
2
Einführung
Latex
ISBN:
3-89319199-2
kopka2
Helmut Kopka
Latex, Band 1
Addison-Wesley
1998
Latex
Bonn
2
Einführung in
Latex, Überarbeitete Auflage
stoer1
Josef Stoer
Numerische
thematik 1
Me-
Springer
1989
Mathematik
Berlin
5
ISBN:
3-54051481-3
stoer2
Josef
Stoer,
Roland
Burlisch
Numerische
thematik 2
Me-
Springer
1990
Mathematik
Berlin
3
ISBN:
3-54051482-1
note
annote
publisher
Oliver Böhm
key
author
boehm1
title
id
Tabelle: buch (2)
in
Hinweis: Wenn man selbst Tabellen erstellt, sollte man zusammengesetzte Primärschlüssel vermeiden. Die neigen dazu Schwierigkeiten zu machen. Eine einfach aber sehr sichere
Einführung in relationalen Datenbanken und SQL
13
ISBN:
3-82731025-3
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Wahl ist die Verwendung einer laufenden Nummer, wie Artikelnummer, Kundennummer
usw.. Sie nehmen wenig Platz ein und müssen fast nie verändert werden.
Gerade bei zusammengesetzten Primärschlüsseln kann das Verändern aber ein Problem
werden. Nehmen wir an, dass der Primärschlüssel einer Adressentabelle Nachname +
Vorname ist. Man hat zwar immer noch das Problem, dass es durchaus mehrere Leute
mit dem gleichen Namen geben kann, aber lassen wir dieses Problem mal beiseite. Nun
heiratet die Person und nimmt einen neuen Nachnamen an. Dadurch ändert sich der
Primärschlüssel dieser Zeile und alle, die auf die Tabelle zugreifen, müssen von dem
neuen Primärschlüssel unterrichtet werden; ein großer Aufwand und eine potentielle
Fehlerquelle.
Bauen wir die Tabelle nun bezüglich der obigen Bemerkungen um:
1. Eindeutschen der Namen
2. isbn ist Primärschlüssel
3. id-Spalte entfällt
In Tabelle 2.5 können Sie das Ergebnis des Umbaus betrachten.
verlag
jahr
ort
auflage
bemerkung
autor
3-932588-76-3
Oliver Böhm
Fehlerfrei programmieren in C und
C++
dpunkt.verlag
2000
Softwareentwicklung, C, C++
Heidelberg
2
Tipps zur Fehlervermeidung
3-8266-0891-7
Marius Apetri
3D-Grafik Programmierung
mitp
2003
Grafikprogrammierung, C++
Bonn
1
Theorie + Praxis der Grafikprogrammierung
3-89721-165-3
Kyle Loudon
Algorithmen in C
O’Reilly
2000
Algorithmen,
Programmierung,
C
Köln
1
Theorie + Praxis von Standardalgorithmen
3-89721-163-7
Randay
J.
Yarger,
George Reese,
Tim King
MySQL
O’Reilly
2000
Datenbankprogrammierung,
SQL
Köln
1
MySQL als DBEngine und die
Sprache SQL
3-89319-199-2
Helmut Kopka
Latex
Addison-Wesley
1996
Latex
Bonn
2
Einführung in Latex
3-8273-1025-3
Helmut Kopka
Latex, Band 1
Addison-Wesley
1998
Latex
Bonn
2
Einführung in Latex, Überarbeitete
3-540-51481-3
Josef Stoer
Numerische Methematik 1
Springer
1989
Mathematik
Berlin
5
-
3-540-51482-1
Josef Stoer,
Roland Burlisch
Numerische Mathematik 2
Springer
1990
Mathematik
Berlin
3
-
titel
isbn
ttichwort
Tabelle 2.5: Tabelle: buch (3)
Einführung in relationalen Datenbanken und SQL
14
2 Tabellen
2.3 Schlüssel und Verknüpfungen
2.3.2 Darstellung als ER-Modell
In der Informatik ist es üblich, dass man ein Modell eines EDV-Systems erstellt. Sie
kennen solche Modelle aus der Programmierung: Programmablaufplan, Struktogramm,
Datenflussdiagramm, UML-Diagramme usw. Die Modellierungstechnik für relationale
Datenbanken ist das Entity Relationship Model oder auch ER-Modell.
ER-Modell
Definition 7 Entity Relationship Model
Das Entity Relationship Model (ER-Modell oder ERM) ist eine grafische Darstellung von Tabellen und ihren Beziehungen untereinander.
Die Symbole1 und die Verwendung des ER-Modells werden in den nachfolgenden Kapiteln mit eingeführt.
Betrachten wir dazu das Beispiel in Abbildung 2.2:
verlag
titel
jahr
autor
isbn
stichwort
ort
buch
auflage
bemerkung
Abbildung 2.2: ER-Modell buch(1)
Man erkennt, dass die Tabelle selbst als ein Rechteck mit dem Tabellennamen buch
dargestellt wird. Die Attribute einer Tabelle werden als Ellipsen mit dem Spaltennamen
titel durch eine einfache Linie mit der Tabelle verbunden. Der Primärschlüssel wird
durch Unterstrich beim Attributnamen isbn hervorgehoben. Spalten, die mehr als einen
Wert enthalten können, werden mehrwertige Spalten genannt; stichwort ist so eine
Spalte. Diese Spalten werden durch eine doppelte Ellipse stichwort dargestellt.
2.3.3 Was ist eine Verknüpfung?
In der Tabelle 2.5 auf der vorherigen Seite findet man unter autor und stichwort Informationen, die mehrfach vorkommen. Für das Lesen der Tabelle durch einen Menschen
ist dies eine gute Sache. Er erkennt sofort, worum es in dem Buch geht und wer es
geschrieben hat. Aus Sicht der EDV ist das nicht so prickelnd.
1
In diesem Skript wird die Notation nach Chen verwendet. Andere Notationen, wie beispielsweise die
Krähenfußnotation, sind auch möglich.
Einführung in relationalen Datenbanken und SQL
15
ChenNotation
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Aufgabe 2.4 Überlegen Sie sich mindestens drei Gründe, die gegen eine Wiederholung
der Stichwörter in Klartext sprechen!
Da wir bei relationalen Datenbanken Informationen in Tabellen organisieren, wird nun
eine neue Tabelle angelegt, die die Autoren enthält. Als Primärschlüssel wählen wir eine
laufende Nummer. Die Tabelle nennen wir autor.
Hinweis: Wenn man den Namen des Primärschlüssels neu festlegt und dieser eine laufende
Nummer ist, ist es eine gute Konvention den Primärschlüsselnamen wie folgt zusammenzusetzten: tabellenname_id; für uns heißt der Primärschlüssel somit autor_id.
Primärschlüsselnamen
Die Spalte darf den gleichen Namen haben wie die ganze Tabelle. Nun kann man in die
Tabelle Buch anstelle der Autoren die Ziffer aus der Spalte autor_id eintragen. Man
erhält folgende Verknüpfung (einige Spalten wurden hier wegen der Übersichtlichkeit
weggelassen):
Tabelle: buch (4)
Tabelle: autor
autor
autor_id
Oliver Böhm
1
Apetri Marius
2
Kyle Loudon
3
Randay J. Yarger
4
George Reese
5
Tim King
6
Helmuth Kopka
7
Josef Stoer
8
Roland Burlisch
9
isbn
autor_id
titel
verlag
jahr
stichwort
3-932588-76-3
1
Fehlerfrei programmieren in C und C++
dpunkt.verlag
2000
Softwareentwicklung,
C++
3-8266-0891-7
2
3D-Grafik Programmierung
mitp
2003
Grafikprogrammierung,
C++
3-89721-165-3
3
Algorithmen in C
O’Reilly
2000
Algorithmen, Programmierung, C
3-89721-163-7
6 , 5 , 4
MySQL
O’Reilly
2000
Datenbankprogrammierung,
SQL
3-89319-199-2
7
Latex
Addison-Wesley
1996
Latex
3-8273-1025-3
7
Latex, Band 1
Addison-Wesley
1998
Latex
3-540-51481-3
8
Numerische Methematik 1
Springer
1989
Mathematik
3-540-51482-1
8 , 9
Numerische Mathematik 2
Springer
1990
Mathematik
Abbildung 2.3: Primärschlüssel - Fremdschlüssel zwischen buch und autor
Es ist klar, warum das Ding nun Verknüpfung heißt. Jede Zeile in der Tabelle autor
ist eindeutig durch den Primärschlüssel autor_id gekennzeichnet. Wird dieser Primärschlüsselwert nun in die Tabelle buch eingetragen, wird auf die entsprechende Zeile
verwiesen; die Einträge werden verknüpft.
Definition 8 Fremdschlüssel
Ein Fremdschlüssel ist mindestens eine Spalte der Tabelle A, welche Attributwerte des Primärschlüssels der Tabelle B enthält.
In unserem Fall enthält die Spalte autor_id Fremdschlüssel auf die Tabelle autor.
Aufgabe 2.5 Man mache sich klar, dass diese Definition auch für A = B gilt!
Einführung in relationalen Datenbanken und SQL
16
C,
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Hinweis: Der Name des Fremdschlüssels sollte der gleiche sein, wie der Name des entsprechenden Primärschlüssels. In unserem Fall wäre ein Änderung des Namen Autor
in autor_id sinnvoll. Man erkennt so unmittelbar, auf welche Tabelle sich der Fremdschlüssel bezieht, wenn die Namenskonvention für die Primärschlüssel eingehalten wurde.
Referenz
Definition 9 Verknüpfung
Eine Verknüpfung oder Referenz entsteht durch die Verwendung von Fremdschlüsseln.
Durch die Verwendung des Fremdschlüssels autor_id in der Tabelle buch entsteht die
Verknüpfung zur Tabelle autor.
Man erkennt die Vorteile der Organisation durch Verknüpfungen unmittelbar:
• Es wird im System viel weniger Speicherplatz verbraucht.
• Eine Änderung (Korrektur) muss nur an einer Stelle vorgenommen werden.
• Informationen können nicht in unterschiedlichen Schreibweisen vorkommen.
Das gleiche Verfahren kann auch für Stichwörter und Verlage angewendet werden. Wir
erhalten:
Aufgabe 2.6 Tragen Sie die passenden Fremdschlüsselattributwerte ein und zeichnen
Sie die Verknüpfungen!
Verknüpfungen werden im ER-Modell durch eine Raute dargestellt. Welche Art von
Beziehung zwischen den Tabellen besteht, muss noch genauer untersucht werden. Das
vorläufige ER-Modell für die vier Tabellen buch, stichwort, autor und verlag kann
man in Abbildung 2.5 auf Seite 19 sehen.
In die Rauten der Verbinder schreibt man einen Text, der die Qualität der Verknüpfung
beschreibt. Das Stichwort passt zum Buch, der Autor schreibt das Buch und der Verlag
gibt das Buch heraus.
Weiter ist wichtig, das die Fremdschlüssel nicht mehr in den Tabellen angezeigt werden.
Dies erklärt sich aus der anderen Sichtweise, die ein ER-Modell hat. Das ER-Modell ist
eine logische Sicht auf die Datenbank und keine physische. Es wird ausgedrückt, dass
es eine Verknüpfung zwischen Verlag und Buch gibt. Wie diese realisiert wird - durch
Fremdschlüssel oder Wunder - lässt das ER-Modell offen. Dem Programmierer ist klar,
dass er diese Verknüpfung durch Fremdschlüssel realisieren muss. Es kann daher darauf
verzichtet werden, das ER-Modell durch die Fremdschlüssel aufzublähen2 .
2
In bestimmten Situationen - wie Klausuren, Prüfungen etc. - kann es notwendig sein, die Fremdschlüssel anzugeben!
Einführung in relationalen Datenbanken und SQL
17
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Tabelle: stichwort
Tabelle: buch (5)
isbn
autor_id
titel
verlag_id
jahr
stichwort_id
stichwort_id
stichwort
1
Softwareentwicklung
3-932588-76-3
Fehlerfrei programmieren in C und C++
2000
2
Programmierung
3-8266-0891-7
3D-Grafik Programmierung
2003
3
C
3-89721-165-3
Algorithmen in C
2000
4
C++
3-89721-163-7
MySQL
2000
5
Grafikprogrammierung
3-89319-199-2
Latex
1996
6
Algorithmen
3-8273-1025-3
Latex, Band 1
1998
7
Datenbankprogrammierung
3-540-51481-3
Numerische Mathematik 1
1989
8
SQL
3-540-51482-1
Numerische Mathematik 2
1990
9
Latex
10
Mathematik
Tabelle: autor
Tabelle: verlag
autor_id
autor
verlag_id
verlag
erscheinungsort
1
Oliver Böhm
1
dpunkt.verlag
Heidelberg
2
Apetri Marius
2
mitp
Bonn
3
Kyle Loudon
3
O’Reilly
Köln
4
Randay J. Yarger
4
Addison-Wesley
Bonn
5
George Reese
5
Springer
Berlin
6
Tim King
7
Helmuth Kopka
8
Josef Stoer
9
Roland Burlisch
Abbildung 2.4: Primärschlüssel - Fremdschlüssel zwischen buch anderen Tabellen
2.3.4 Kardinalitäten
Es gibt verschiedene Arten von Verknüpfungen. Sie ergeben sich aus dem Mengenverhältnis zwischen den Zeilen verknüpfter Tabellen.
2.3.4.1 1:1-Verknüpfungg
Betrachten Sie bitte die Tabellen in Abbildung 2.6 auf der nächsten Seite:
Aufgabe 2.7 Zeichnen Sie die Referenzen zwischen den Tabellen ein!
Man erkennt, dass jede Zeile der Tabelle person mit genau einer Zeile aus der Tabelle
ausweis verknüpft ist. Man kann auch sagen, dass jede Zeile der Tabelle ausweis mit
genau einer Zeile aus der Tabelle person verknüpft ist. Eine solche Verknüpfung von
Tabellen nennt man 1:1 -Verknüpfung.
Einführung in relationalen Datenbanken und SQL
18
1:1
2 Tabellen
2.3 Schlüssel und Verknüpfungen
isbn
titel
jahr
stichwort_id
stichwort
auflage
buch
passt zu
schreibt
gibt heraus
stichwort
bemerkung
autor
autor
autor_id
verlag
ort
verlag_id
verlag
Abbildung 2.5: ER-Modell Buch(2)
Tabelle: person
Tabelle: ausweisdaten
nachname
vorname
verheiratet
kinder
personalausweisnummer
personalausweisnummer
austellungsort
Müller
Hans
Nein
0
1212121212
12121212
Bochum
gültig bis
01.01.2005
Schmidt
Peter
Ja
2
1313131313
13131313
Dortmund
17.09.2020
Meier
Gundula
Nein
1
1414141414
14141414
Gelsenkirchen
29.02.2010
Abbildung 2.6: Primärschlüssel - Fremdschlüssel zwischen person und ausweis
Definition 10 1:1-Verknüpfung
Zwei Tabellen A und B stehen in einer 1:1-Verknüpfung, wenn es zu jeder
Zeile aus der Tabelle A höchstens eine Zeile in der Tabelle B gibt und wenn
es zu jeder Zeile aus der Tabelle B höchstens eine Zeile in der Tabelle A gibt.
Das entsprechende ER-Modell ist in Abbildung 2.7 auf der nächsten Seite zu sehen.
Wie realisiert man 1:1-Verknüpfung? Eine 1:1-Verknüpfung wird in der Regel durch
einen gemeinsamen Primärschlüssel realisiert. Bei den Ausweisdaten ist die Personalausweisnummer der gemeinsame Primärschlüssel.
Aufgabe 2.8 Beschreiben Sie weitere Möglichkeiten eine 1:1-Verknüpfung zu realisieren.
Einführung in relationalen Datenbanken und SQL
19
2 Tabellen
2.3 Schlüssel und Verknüpfungen
ausstellungsort
nachname
vorname
gültig bis
verheiratet
person
1
gehört
personalausweis
1
kinder
personalausweisnummer
personalausweisnummer
Abbildung 2.7: ER-Modell person - ausweis
Aufgabe 2.9 Man mache sich klar, dass, wenn zwei Tabellen den gleichen Primärschlüssel haben, eine 1:1-Verknüpfung vorliegen muss!
Hinweis: Diese Formulierung lässt zu, dass es zu einem Datensatz in der Tabelle A keinen
in der Tabelle B gibt und umgekehrt.
Aufgabe 2.10 Diskutieren Sie die Möglichkeit 1:1-Verknüpfungen zu einer Tabellen zusammenzufassen!
2.3.4.2 1:n-Verknüpfung
Tabelle: bankkunde
Tabelle: bankkonto
nachname
vorname
geburtsjahr
bankkunde_knr
bankkunde_knr
kontonummer
stand
gesperrt
Müller
Hans
1950
965489
965489
1000001
-60,23e
Nein
Schmidt
Peter
1963
732984
965489
1000002
+12099,20e
Nein
Meier
Gundula
1974
665238
965489
1000003
+10,12e
Nein
732984
2000001
-234,98e
Ja
732984
2000002
+123,90e
Ja
Abbildung 2.8: Primärschlüssel - Fremdschlüssel zwischen bankkunde und konto
Aufgabe 2.11 Zeichnen Sie die Referenzen der Tabellen in Abbildung 2.8 ein!
Sie können sehen, dass ein Kunde 3 Bankkonten, ein Kunde 2 Bankkonten und ein Kunde
kein Bankkonto hat. Die Verknüpfung zwischen diesen Tabellen ist somit derart, dass
es zu jeder Zeile in der Tabelle bankkunde beliebig viele Zeile in der Tabelle bankkonto
gibt und es zu jeder Zeile in der Tabelle bankkonto genau eine Zeile in der Tabelle
bankkunde gibt3 .
Das entsprechende ER-Modell ist in Abbildung 2.9 auf der nächsten Seite zu sehen. Auch
hier kann man sehen, dass der Fremdschlüssel nicht im ER-Modell angegeben wird.
Einführung in relationalen Datenbanken und SQL
20
2 Tabellen
2.3 Schlüssel und Verknüpfungen
vorname
stand
nachname
gesperrt
geburtsjahr
bankkunde 1
unterhält
kundennummer
n bankkonto
kontonummer
Abbildung 2.9: ER-Modell bankkunde - bankkonto
1:n
Definition 11 1:n-Verknüpfung
Zwei Tabellen A und B stehen in einer 1:n-Verknüpfung, wenn es zur jeder
Zeile aus der Tabelle A beliebig Zeilen in der Tabelle B gibt und wenn es zu
jeder Zeile aus der Tabelle B genau eine Zeile in der Tabelle A gibt.
Hinweis: Diese Formulierung lässt zu, dass es zu einem Datensatz in der Tabelle A keinen
in der Tabelle B gibt, aber nicht umgekehrt.
Aufgabe 2.12 Tragen Sie im ER-Modell 2.5 auf Seite 19 die 1:n-Verknüpfungen ein.
Wie realisiert man 1:n-Verknüpfung? Wenn man das ER-Modell vor sich hat, gibt
es bei der 1:n-Verknüpfung immer eine Tabelle, wo die 1 steht und eine Tabelle, wo
das n steht. Dort wo das n steht, wird der Primärschlüssel der anderen Tabelle als
Fremdschlüssel aufgenommen.
Das bedeutet in unserem Beispiel: In der Tabelle bankkonto gibt es den Fremdschlüssel
bankkunde_knr.
Aufgabe 2.13 Natürlich könnte man sich auch überlegen, in der Tabelle bankkunde
eine Spalte kontonummer einzufügen und dort per Liste alle Konten einzutragen. Nennen
Sie die Nachteile dieses Verfahrens!
3
Dies setzt inhaltlich voraus, dass ein Konto nur von einem Kunden verwendet werden kann; tun wir
einfach mal so.
Einführung in relationalen Datenbanken und SQL
21
2 Tabellen
2.3 Schlüssel und Verknüpfungen
2.3.4.3 n:m-Verknüpfung
Aufgabe 2.14 Finden Sie anhand der Definitionen 10 auf Seite 19 und 11 auf der
vorherigen Seite heraus, ob es sich bei der Verknüpfung von Buch und Stichwort um
eine der beiden Verknüpfungsarten handelt. Begründen Sie!
Betrachten wir die Zutaten eines Kuchens4 . Aus dem ER-Modell 2.10 kann man entnehmen, dass es sich um eine n:m-Verknüpfung handelt.
zutat_id
kuchen_id
kuchen
n
beinhaltet
m
name
zutat
name
Abbildung 2.10: ER-Modell kuchen
n:m
Definition 12 n:m-Verknüpfung
Zwei Tabellen A und B stehen in einer n:m-Verknüpfung, wenn es zur jeder
Zeile aus der Tabelle A beliebig viele Zeilen in der Tabelle B gibt und wenn
es zu jeder Zeile aus der Tabelle B beliebig viele Zeilen in der Tabelle A gibt.
Aufgabe 2.15 Tragen Sie im ER-Modell 2.5 auf Seite 19 die n:m-Verknüpfungen ein.
Wie realisiert man n:m-Verknüpfung? Eine n:m-Verknüpfung wird über eine Hilfstabelle realisiert. In dieser Hilfstabelle werden die Primärschlüssel der beiden zu verknüpfenden Tabellen als Fremdschlüssel eingetragen.
Aufgabe 2.16 Betrachten Sie dazu das Beispiel Backrezept. Was für eine Kardinalität
besteht zwischen den zu verknüpfenden Tabellen und der Hilfstabelle?
Aufgabe 2.17 Erweitern Sie dieses Beispiel um alle Zutaten für einen Käse-, Marmorund Pflaumenkuchen. Erweitern Sie die Verknüpfungstabelle (Hilfstabelle) entsprechend
und verbinden Sie die Fremdschlüsselwerte mit den passenden Primärschlüsselwerten.
4
Lassen wir dabei der Einfachheit halber Menge und Zubereitung weg :-)
Einführung in relationalen Datenbanken und SQL
22
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Tabelle: zutat_kuchen
zutat_id
kuchen_id
name
1
1
Mehl
1
2
1
Ei
2
3
1
Zucker
3
4
1
Butter
4
6
1
Milch
5
1
2
Tabelle: zutat
zutat_id
Kakao
Hefe
6
7
2
2
3
2
4
2
Tabelle: kuchen
kuchen_id
name
1
Marmorkuchen
2
Käsekuchen
3
Pflaumenkuchen
Abbildung 2.11: Primärschlüssel - Fremdschlüssel zwischen kuchen und zutat
2.3.5 Aufgaben zum ER-Modell
Aufgabe 2.18 Erstellen Sie ein ER-Modell für folgenden Anforderungen: Für eine Bücherei sollen Kunden, Bücher und ein Verleihvorgang in eine Datenbank abgelegt werden.
Die Darstellung der Bücher soll sich an obigen Daten orientieren. Zum Kunden sollen
die üblichen Stammdaten, wie Name etc. erfasst werden. Der Verleihvorgang besteht aus
den Informationen: Wer hat was von wann bis wann ausgeliehen.
Aufgabe 2.19 Eine Clown-Agentur beauftragt Sie mit der Erstellung einer Clown Datenbank. Diese soll Informationen über Clowns, ihre Verträge etc. enthalten. Erstellen
Sie ein ER-Modell für die Tabellen clown, vertrag, veranstalter und programm. In clown
sind die Basisdaten des Künstlers erfasst, veranstalter analog. In vertrag werden Ort
und Termin eines Auftritts festgelegt. Jeder Clown bietet mehrere Programme an. Bei
einigen Programmen arbeiten mehrere Clowns zusammen. Es kann im Vertrag festgelegt
werden, welche der angebotenen Programme bei der Veranstaltung vorgeführt werden
sollen!
Aufgabe 2.20 Für den deutschen Brauereiverband soll eine Datenbank, die über alle
Biere Auskunft geben kann, entwickelt werden. Erstellen Sie ein ER-Modell für die Tabellen bier, brauerei, grosshaendler und brauart. Großhändler führen mehrere Biere im
Sortiment!
Einführung in relationalen Datenbanken und SQL
23
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Aufgabe 2.21 Ein mittelständiges Unternehmen möchte seine Kunden über ihre Zufriedenheit befragen. Erstellen Sie ein ER-Modell für eine Fragebogenaktion. Verwenden
Sie folgende Tabellen: frage, antwort und ueberschrift (mehrere Fragen werden unter
einer Überschrift zusammengefasst). Jeder Fragebogen soll dem entsprechenden Kunden
zugeordnet werden können.
Aufgabe 2.22 Im Rahmen eines Hotel-Software Projektes werden Sie gebeten, die Datenhaltungsschicht zu programmieren. Erstellen Sie ein ER-Modell nach Auszug aus dem
Lastenheft: Die Anwendung soll folgende Bereiche abdecken:
1. Kundenverwaltung
Zu jedem Kunden werden seine persönlichen Daten, sowie Rechnungsanschriften
erfasst. Falls Kunden einer bestimmten Firma angehören, sollen diese einer Firma
zugeordnet werden können, um spätere Rabatte berechnen zu können.
2. Raumreservierung
Für jeden Raum wird seine Bezeichnung, Ausstattung und Tarifgruppe erfasst.
Ebenso sollen pro Raum mehrere Reservierungszeiträume erfasst werden können.
Diese Zeiträume sollen einem Kunden zugeordnet werden.
3. Rechnungsstellung.
Für jeden Kunden soll anhand der Belegzeiten und sonstiger Leistungen (Mini-Bar,
Sauna etc.) eine Rechnung zusammengestellt werden können.
Aufgabe 2.23 Sie sollen Auswertungen in einer CD-Sammlung programmieren. Gehen
Sie von folgendem Sachverhalt aus: Es gibt die Tabellen: cd, titel und interpret. Erstellen
ein sinnvolles ER-Modell.
Aufgabe 2.24 Erstellen Sie ein ER-Modell passend für folgenden Lastenheftauszug:
Für ein Bestellwesen sollen die Bestell- und Kundendaten in einer Datenbank abgelegt
werden. Zu einem Kunden werden Name und Ort erfasst. Jeder Kunde soll anhand einer eindeutigen Identifikation ermittelt werden können. Jeder Kunde kann Bestellungen
aufgeben. Zu jeder Bestellung werden das Bestelldatum und eine Bestellnummer erfasst.
Der Kunde gibt an, welche Artikel er bestellt hat. Die Artikel werden als Positionen der
Bestellung zugeordnet. Zu jeder Position wird die Bestellmenge mit erfasst. Zu jedem
Artikel wird der Stückpreis und die Bezeichung gespeichert. Jeder Artikel soll eindeutig
identifiziert werden können.
Aufgabe 2.25 Erstellen Sie zu dem Tabellenauszug in Abbildung 2.12 auf der nächsten
Seite ein passendes ER-Modell.
Einführung in relationalen Datenbanken und SQL
24
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Tabelle: kunde
Tabelle: adresse
name
kunde_knr
id
kunde_knr
strasse
plz
ort
Hans Herbet Schmidt
1
1
1
Feldweg 7
90909
Kaff
Jochen Schibulsky
2
2
1
Hochstrasse 12,
90909
Kaff
Manfred Gianonatti
3
3
5
Ruhrschnellweg 1,
44879
Bochum
Gundula Schauinsfeld
4
4
2
Kleine Gasse 3,
22122
Hallig
Angelique Börger
5
4
3
Kleine Gasse 3,
22122
Hallig
Abbildung 2.12: Datenauszug von kunde und adresse
Aufgabe 2.26 Erstellen Sie ein ER-Modell für die Tabellen klasse, schueler, lehrer,
raum, fach und stundenplan. In klasse sind die Daten einer Schulklasse erfasst. In lehrer und schueler die entsprechenden Stammdaten. In der Tabelle fach werden die Fächer
erfasst. Die Tabelle stundenplan enthält alle Stundenplandaten für alle Schuljahre. Jeder
Stundenplaneintrag enthält neben anderen Informationen die Angaben: Uhrzeit, Schuljahr und Wochentag.
Wie muss dass ER-Modell abgeändert werden, damit ein Schüler mehrere Klassen besuchen kann?
2.3.6 Referentielle Integrität
Tabellen werden über Primär-/Fremdschlüsselpaare mit einander verknüpft. Mit anderen
Worten, wenn man eine Datenbank als ein fein verknüpftes Netzwerk von Tabellenzeilen
versteht, sind diese Primär-/Fremdschlüsselpaare die Knoten. Und was passiert, wenn
diese Knoten sich lösen oder die Enden falsch verknüpft werden?
Betrachten Sie das Beispiel in Abbildung 2.13.
Tabelle: kunde
Tabelle: adresse
name
kunde_knr
id
kunde_knr
strasse
plz
ort
Hans Herbet Schmidt
1
1
1
Feldweg 7
90909
Kaff
Jochen Schibulsky
2
2
1
Hochstrasse 12,
90909
Kaff
Manfred Gianonatti
3
3
6
Ruhrschnellweg 1
44879
Bochum
Gundula Schauinsfeld
4
4
2
Kleine Gasse 3
22122
Hallig
Angelique Börger
5
5
3
Kleine Gasse 3
22122
Hallig
Abbildung 2.13: Datenauszug von kunde und adresse
Aufgabe 2.27 Verbinden Sie alle Primär-/Fremdschlüsselpaare. Was fällt auf ?
Einführung in relationalen Datenbanken und SQL
25
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Definition 13 Referentielle Integrität
Wenn es zu jedem Attributwert eines Fremdschlüssels einen passenden Attributwert des entsprechenden Primärschlüssels gibt, ist die Verknüpfung (Referenz) integer.
Ist diese Bedingung nicht erfüllt, spricht man von einer verletzten referentiellen Integrität.
Eine Verletzung der referentiellen Integrität kann aus vielen Gründen passieren. Ich
werde hier einige anhand des Bankkontobeispiels erläutern:
• Der Kunde mit der Kundennummer 963680 ist in der Tabelle bankkunde gelöscht
worden. In vielen Systemen kann man das DBMS anweisen, alle Zeilen, die mit
einer zu löschenden Zeile verknüpft sind, ebenfalls zu löschen. Man spricht hier
von kaskadierendem Löschen oder Löschweitergabe. Dieses Feature ist mit großer
Vorsicht zu genießen. Beispiel: Sie löschen einen Bankkunden. Dadurch werden
alle Konten des Kunden gelöscht. Dadurch werden alle Buchungen des Kunden
gelöscht. Dadurch werden alle Buchungen bei anderen Kunden gelöscht, die mit
den gelöscht verknüpft waren. Dadurch werden alle Einträge in anderen Tabellen, wie z.B. Kreditrückzahlungen gelöscht usw. Das Löschen von Datensätzen
ist bei nicht trivialen Systemen das Schwierigste, was man sich vorstellen kann.
Aus diesen Gründen wird in vielen Programmierrichtlinien das Verwenden der
Löschweitergabe untersagt. Oftmals wird überhaupt nicht gelöscht! Man fügt den
Tabellen standardmäßig eine Spalte mit dem Namen aktiv oder deleted hinzu.
Diese Spalte dient als Löschkennzeichen.
• Der Kunde mit der Kundennummer 665238 hatte vorher die Nummer 963680.
Der Primärschlüsselattributwert hat sich also geändert. Wie bei der Löschweitergabe, kann man man bei den meisten DBMSen eine Änderungsweitergabe oder
kaskadierende Änderung verwenden. Die Folgen sind zwar in der Regel nicht ganz
so katastrophal, können aber auch schon gehörigen Schaden anrichten. Beispiel: Die
Kundennummer hat sich geändert. In allen archivierten Schriftverkehren steht aber
die alte Kundennummer. Das gleiche gilt für elektronisch signierte Archive (z.B. für
die Steuer). Man vermeidet das Problem, indem man nichtinformationstragende
Primärschlüssel verwendet. Laufende Nummern sind deshalb sehr gute Primärschlüssel. Schlüssel, die sich aus informationstragenden Spalten zusammensetzen,
laufen immer Gefahr, dass sie sich ändern müssen (z.B. geändertes Kennzeichen
bei einem PKW).
• Es sollten zwei Datensätze eingefügt werden: Einen neuen Kunden und das neue
Konto. Diese Operation ist aber unvollständig durchgeführt worden (z.B. durch
einen Absturz oder Timeout). Dieses Problem vermeidet man durch die Verwendung von Transaktionen. Eine Folge von SQL-Befehlen werden als Teil einer Transaktion gekennzeichnet. Diese SQL-Operationen werden dann simuliert ausgeführt.
Einführung in relationalen Datenbanken und SQL
26
kaskadierendes
Löschen
Löschweitergabe
Löschkennzeichen
Änderungsweiter
kaskadierende
Änderung
Transaktion
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Am Ende überprüft das System, ob alle Befehle der Transaktion vollständig und
korrekt ausgeführt wurden. Erst dann werden die Daten in die Tabellen übernommen (commit). War die Transaktion nicht erfolgreich, wird der Zustand vor der
Transaktion wieder hergestellt (rollback).
Natürlich können auch andere Gründe eine verletzte referentielle Integrität verursachen;
die hier vorgestellten Gründe sind aber die häufigsten.
Ist die Integrität einmal kaputt, hat man ein echtes Problem :-( In der Regel ist es
nur mit sehr kostenintensiven manuellen Analysen möglich, die verbogenen Referenzen
wieder gerade zu biegen. Also: Vorsicht bei Operationen, die direkt oder indirekt den
Primärschlüssel betreffen.
2.3.7 Normalformen
Der inhaltliche Aufbau von Tabellen ist in den Anfängen der Datenbankentwicklung
sehr intuitiv erfolgt. Dies hatte zur Folge, dass viele Datenbanken im Laufe der Zeit
sehr langsam im Zugriff wurden und die Konsistenz der Daten abnahm. Ebenso kam
es oft vor, dass Daten redundant5 vorkamen und somit an allen Stellen gepflegt werden mussten. Man suchte Wege, Datenbanken grundsätzlich so zu gestalten, dass diese
Probleme erst gar nicht entstehen. Das Ergebnis ist die Formulierung sogenannter Normalformen. Die Anpassung einer bestehenden Datenbank an die Normalformen nennt
man Normalisierung.
2.3.7.1 Normalform 1
Aufgabe 2.28 Betrachten Sie die Inhalte der Bestelltabelle 2.6 und diskutieren Sie die
möglichen Nachteile. Gibt es auch Vorteile?
Tabelle: bestellung (1)
5
id
knr
positionen
1
4712
5 Towergehäuse, 3 CD-ROM Laufwerke, 2 DVD Laufwerke
2
4712
10m Netzwerkkabel, 25 Anschlussdosen
3
10001
5 DVD Laufwerke, 5m Netzwerkkabel
mehrfach, überflüssig
Einführung in relationalen Datenbanken und SQL
27
COMMIT
ROLLBACK
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Die Attributwerte der Spalte positionen sind im Grunde Listen und sie wiederholen
sich inhaltlich. Dies will man verhindern, indem man fordert, dass die Attributwerte
atomar sind.
Definition 14 Atomar
Ein Attributwert ist atomar, wenn er nicht mehr in Teilinformationen zerlegt
werden kann, ohne seinen Sinn zu verlieren. Eine Tabelle heißt atomar, wenn
alle ihre Attributwerte atomar sind.
Ein weiterer Nachteil ist die Wiederholung von Artikeltexten, man spricht hier von
Wiederholungsgruppen.
Definition 15 Wiederholungsgruppefreiheit
Eine Wiederholungsgruppe ist eine Liste von Informationen des selben inhaltlichen Typs. Eine Tabelle ist dann wiederholungsgruppenfrei, wenn alle
ihre Attributwerte wiederholungsgruppenfrei sind.
Definition 16 Normalform 1
Eine Tabelle ist dann in der 1. Normalform, wenn sie atomar und wiederholungsgruppenfrei ist.
Die Tabelle müsste somit in zwei Schritten normalisiert werden:
1. Auflösen der Wiederholungsgruppe (menge, artikelname)
2. Herstellen der Atomarität durch Aufteilung in menge und artikelname
Hinweis: Die Werte dürfen nicht zufällig atomar oder wiederholungsgruppenfrei sein.
Aufgabe 2.29 Erstellen Sie ein ER-Modell für das Beispiel in der Tabelle 2.6 auf der
vorherigen Seite, welches der 1. Normalform entspricht.
2.3.7.2 Normalform 2
Aufgabe 2.30 Betrachten Sie die Inhalte der Buchtabelle 2.7 auf der nächsten Seite. Entspricht die Tabelle der 1. Normalform? Hinweis: Die ISBN setzt sich wie folgt
zusammen.
1. Gruppe Sprachkennung: 0, 1 = Englisch; 2 = Französich; 3 = Deutsch; 4 = Japanisch; usw.
Einführung in relationalen Datenbanken und SQL
28
2 Tabellen
2.3 Schlüssel und Verknüpfungen
2. Gruppe Verlagsnummer: 8237 = Stam; 89721 = O’Reilly; 446 = Hanser; usw.
3. Gruppe Laufende Nummer: Diese Nummer wird vom Verlag intern vergeben.
P9
4. Gruppe Prüfziffer (ISNB-10): (
Position ist.
i=1
i · zi )mod 11, wobei zi die Ziffer an der i -ten
Gegen welche weitere Definition verstößt diese Tabelle?
Tabelle: buch (6)
isbn PK
titel
verlag
jahr
stichwort
3-932588-76-3
Fehlerfrei programmieren in C und C++
dpunkt
2000
Softwareentwicklung, C, C++
3-8266-0891-7
3D-Grafik
mierung
mitp
2003
Grafikprogrammierung, C++
3-89721-165-3
Algorithmen in C
O’Reilly
2000
Algorithmen, Programmierung, C
3-89721-163-7
MySQL
O’Reilly
2000
Datenbankprogrammierung, SQL
3-89319-199-2
Latex
AddisonWesley
1996
Latex
3-8273-1025-3
Latex, Band 1
AddisonWesley
1998
Latex
3-540-51481-3
Numerische Methematik 1
Springer
1989
Mathematik
3-540-51482-1
Numerische Mathematik 2
Springer
1990
Mathematik
Program-
Es fällt auf, dass die Attributwerte der Spalte verlag sich wiederholen. Grund ist, dass
der Verlagsname nicht etwa vom gesamten Primärschlüssel abhängt - und damit potentiell einmalig ist -, sondern nur von einem Teil - und deshalb mehrfach vorkommt.
Definition 17 Voll- und teilfunktional
Wenn die Attributwerte einer Spalte nur von einem Teil des Primärschlüssels abhängen, ist diese Spalte teilfunktional. Ist dies nicht der Fall, ist sie
vollfunktional.
Teilfunktionalität tritt nur bei zusammengesetzten6 Primärschlüsseln auf. Laufende Zähler sind - ausser bei perversen Gegenbeispielen - davon nicht betroffen.
6
siehe Definition 5 auf Seite 12: Ein Schlüssel kann aus mehreren Spalten bestehen.
Einführung in relationalen Datenbanken und SQL
29
2 Tabellen
2.3 Schlüssel und Verknüpfungen
Definition 18 Normalform 2
Eine Tabelle ist dann in der 2. Normalform, wenn sie den Bedingungen der
1. Normalform entspricht und alle Nichtschlüsselspalten vollfunktional sind.
Aufgabe 2.31 Erstellen Sie ein ER-Modell für das Beispiel aus Tabelle 2.7 auf der
vorherigen Seite, welches der 2. Normalform entspricht.
2.3.7.3 Normalform 3
Aufgabe 2.32 Lassen sich in Tabelle 2.8 Abhängigkeiten von Nichtschlüsselspalten festellen?
Tabelle: buchung (1)
id
quelle_ktnr
quelle_blz
12
54842
46062817
13
58627
14
25823
15
quelle_bank
ziel_ktnr
ziel_blz
ziel_bank
betrag
VB Schmallenberg
54568
40040028
Commerzbank Münster
-60,23e
43050001
Sparkasse Bochum
85674
40040028
Commerzbank Münster
+12099,20e
43050001
Sparkasse Bochum
67831
46062817
VB Schmallenberg
+10,12e
54842
10010010
Postbank Berlin
67831
46062817
VB Schmallenberg
+54,02e
16
54842
10010010
Postbank Berlin
67831
46062817
VB Schmallenberg
-234,98e
17
25823
43050001
Sparkasse Bochum
67831
46062817
VB Schmallenberg
+123,90e
Wenn nicht Nichtschlüsselspalten aus anderen Nichtschlüsselspalten herleitbar sind, bedeutet dies in der Regel, dass Informationen redundant in der Tabelle gehalten werden.
Wie in Tabelle 2.8 zu sehen, werden die Banknamen mehrfach genannt. Dies verbraucht
nicht nur Speicherplatz, sondern macht eine Änderung der Banknamen teuer.
Definition 19 Transitiv
Eine Nichtschlüsselspalte ist transistiv, wenn sie sich aus anderen Nichtschlüsselspalten herleiten lässt.
Definition 20 Normalform 3
Eine Tabelle entspricht der 3. Normalform, wenn sie den Bedingungen der
2. Normalform entspricht und keine transitiven Spalten hat.
Aufgabe 2.33 Erstellen Sie ein ER-Modell für Tabelle 2.8, so dass diese der 3. Normalform entspricht.
Einführung in relationalen Datenbanken und SQL
30
3 Implementieren mit SQL
3.1 Was ist SQL?
Die Abkürzung SQL steht für Structured Query Language 1 . SQL ist eine Sprache zu
Bearbeitung und Auswertung von relationalen Datenbanken. Sie umfasst drei Bereiche:
1. Data Definition Language (DDL): Befehlssatz zum Anlegen, Ändern und Löschen
von Datenbanken, Tabellen usw. und ihren Strukturen.
2. Data Manipulation Language (DML): Befehlssatz zum Einfügen, Ändern, Löschen
und Auslesen von Daten aus den Tabellen.
3. Data Control Language (DCL): Befehlssatz zur Administration von Datenbanken2 .
Anders als bei imperativen Programmiersprachen wie C#, C++, Java oder Pascal wird
durch die Befehle nicht die Art und Weise bestimmt, wie man ein Ergebnis erhält; es
wird kein Algorithmus implementiert. Vielmehr sagt man, was man haben möchte und
der Datenbankserver ermittelt das Ergebnis. Solche Arten von Programmiersprachen
nennt man deklarativ.
Obwohl es viele SQL-Dialekte gibt, ist der offizielle SQL-Standard in vielen Systemen
implementiert und garantiert eine leichte Wiederverwendbarkeit oder Übertragbarkeit
der Befehle. 1986 wurde der erste SQL-Standard vom ANSI verabschiedet (der 1987
von der ISO ratifiziert wurde). 1992 wurde der Standard überarbeitet und als SQL92 (oder auch SQL2) veröffentlicht. Alle aktuellen Datenbanksysteme halten sich im
wesentlichen an diese Standardversion. Die Version SQL:1999 (ISO/IEC 9075:1999, auch
SQL3 genannt) ist noch nicht in allen Datenbanksystemen implementiert. Das gilt auch
für die nächste Version SQL:2003. Der aktuelle Standard wurde 2008 unter SQL:2008
verabschiedet.3 .
3.2 MySQL
MySQL ist ein frei verfügbarer Datenbankserver; er kann unter http://www.mysql.com
heruntergeladen werden. Eine weitere Quelle ist http://www.apachefriends.org. Dort
1
Aussprache: EsKjuEl; die Aussprache SiQwL ist nicht korrekt, da damit der Vorläufer von SQL
SEQUEL gemeint ist.
2
Nicht zur Administration des Servers!
3
Quelle: http://de.wikipedia.org/wiki/SQL, Stand 10.2011
Einführung in relationalen Datenbanken und SQL
31
imperativ
deklarativ
3 Implementieren mit SQL
3.3 SQL-DDL
kann man ein Paket herunterladen, welches nach der Installation einen vorkonfigurierten
Web-Server (Apache), einen Datenbankserver (MySQL) und die Programmiersprachen
PHP und Perl zur Verfügung stellt4 . Linux-Distributionen liefern diese Pakete in der
Regel mit und daher sollten diese über die Installationsskripte der Distribution installiert
werden.
Die hier gezeigten Beispiele sind alle unter MySQL Server 5.1.53 unter OpenSuse 11.3
getestet worden. Als Beispiel wird die Sakila-Datenbank von MySQL (http://dev.
mysql.com/doc) verwendet5
Sakila
Aufgabe 3.1 Ordnen Sie den folgenden Begriffen Datenbankprodukten zu:
• Office Solution
• Midrange Solution
• Enterprise Solution
Aufgabe 3.2 Bereiten Sie sich vor:
1. Installieren Sie XAMPP oder einen MySQL-Server ihrer Wahl (Version ≥ 5.1)
auf Ihren Rechner.
2. Installieren Sie die Sakila-Datenbank.
3. erstellen Sie ein ER-Modell zur Sakila-Datenbank.
4. Legen Sie sich Links auf den Desktop zu der MySQL- und Sakila-Dokumentation.
3.3 SQL-DDL
In diesem Kapitel werden ein Teil SQL-DDL6 -Befehle beschrieben. Die Auswahl ist so
getroffen, dass viele Standardaufgaben gelöst werden können. Weitere Befehle oder Befehlsvarianten sollten dem SQL-Handbuch Ihres Servers entnommen werden.
Nach der Installation gibt es einen vordefinierten SQL-User, den root7 . Starten Sie den
MySQL-Client unter Angabe des anzumeldenden Benutzers.
1
ralf@linux - edzz :~ > mysql - uroot -p
MySQL Client
Nach dem -u folgt der Name des SQL-Benutzers (nach einer Installation meist root).
Der Parameter -p erzwingt die Eingabe eines Passworts. Falls Sie bei der Installation
keines vergeben haben (BÖSE!), geben Sie auch keines ein.
Zuerst interssiert, welche Datenbanken schon vorhanden sind:
SHOW DATABASES
4
Da wir als Projekt eine PHP-Anwendung schreiben werden, empfehle ich die XAMPP-Installation.
Eine Dokumentation dieses Beispiels finden Sie unter http://downloads.mysql.com/docs/
sakila-db.zip.
6
DDL: data definition language; engl. Datendefinitionssprache
7
Nicht zu verwechseln mit den Benutzern des Betriebssystems. Selbst gleichnamige Benutzer in SQL
und dem Betriebssystem haben nichts miteinander zu tun!
5
Einführung in relationalen Datenbanken und SQL
32
3 Implementieren mit SQL
1
2
3
4
5
6
7
8
9
10
11
12
3.3 SQL-DDL
mysql > SHOW DATABASES ;
+ -- - - - - - - - - - - - - - - - - - -+
| Database
|
+ -- - - - - - - - - - - - - - - - - - -+
| in fo rma ti on _sc he ma |
| mysql
|
| sakila
|
| test
|
+ -- - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )
mysql >
Falls Sie sakila noch nicht installiert haben, fehlt dieser Eintrag natürlich.
Aufgabe 3.3 Finden Sie heraus, welche Aufgaben die Datenbanken
• information_schema,
• mysql und
• test
haben.
Bevor wir die Sakila-Datenbank verwenden, legen wir eine eigene Spieldatenbank an.
Basis soll die Abbildung 2.5 auf Seite 19 sein.
Dazu werden folgende Schritte unternommen:
1. Anlegen der Datenbank
2. Wechseln in die Datenbank
3. Anlegen der Tabellen
4. Anzeige aller Tabellen
5. Tabellenbeschreibungen anzeigen
Das Anlegen einer Datenbank erfolgt durch CREATE DATABASE datenbankname. Der Datenbankname muss auf dem Server einmalig sein. Unsere Datenbank soll buch heißen.
1
2
3
mysql > CREATE DATABASE buch ;
Query OK , 1 row affected (0.00 sec )
mysql >
Es fällt auf, dass wie bei SHOW DATABASES der Befehl mit einem Semikolon endet. Dies
ist bei SQL-Befehlen grundsätzlich so. Dabei spielt der Zeilenumbruch keine Rolle! Der
Parser eines SQL-Befehls sucht nach einem Semikolon und erst dann wird der Befehl
analysiert und interpretiert. Folgendes hätte genau die gleiche Wirkung gehabt:
Einführung in relationalen Datenbanken und SQL
33
CREATE
DATABASE
3 Implementieren mit SQL
1
2
3
4
5
3.3 SQL-DDL
mysql > CREATE
-> DATABASE
-> buch ;
Query OK , 1 row affected (0.00 sec )
mysql >
Als zweites fällt auf, dass die SQL-Befehle alle in Großbuchstaben geschrieben werden.
Dies ist nicht von der Sprachdefinition gefordert, aber eine weit verbreitete Sprachkonvention, der wir folgen.
Aufgabe 3.4 Ermitteln Sie, ob die Datenbank erfolgreich angelegt wurde.
Da ein Datenbankserver viele Datenbanken beinhalten kann, muss man ihm sagen, auf
welche Datenbank alle nachfolgenden Befehle angewendet werden sollen. Dazu verwendet
man den Befehl USE:
1
2
3
USE
mysql > USE buch ;
Database changed
mysql >
Aufgabe 3.5 Wenn der Befehl zur Auflistung der Datenbanken SHOW DATABASES heißt,
wie mag der Befehl zur Auflistung der Tabellen heißen?
Nun sollen die Tabellen angelegt werden. Der entsprechende Befehl heißt CREATE TABLE
tabellenname. Bevor wir den Befehl näher betrachten, wollen wir ermitteln, welche
Datentypen und Zusätze einem bei einer Spaltenspezifikation zur Verfügung stehen.
CREATE
TABLE
Datentypen
Zusätze
Datentypen:
Zahlen
Tabelle 3.1: Tabelle: Numerische Datentypen (Auszug)
Typ
#Bytes
Kommentar
TINYINT(länge)
1
Integer im Bereich 0 bis 255 (ohne Vorzeichen) oder -128 bis 127 (mit Vorzeichen).
SMALLINT(länge)
2
Integer im Bereich 0 bis 65.353 (ohne Vorzeichen) oder -32.768 bis 32.767
(mit Vorzeichen).
MEDIUMINT(länge)
3
Integer im Bereich 0 bis 16.777.215
(ohne Vorzeichen) oder -8.388.608 bis
8.388.607 (mit Vorzeichen).
INT(länge)
4
Integer im Bereich 0 bis 4.294.967.295
(ohne Vorzeichen) oder -2.174.483.648
bis 2.174.483.647 (mit Vorzeichen).
Einführung in relationalen Datenbanken und SQL
34
3 Implementieren mit SQL
3.3 SQL-DDL
Typ
#Bytes
Kommentar
BIGINT(länge)
8
Integer
im
Bereich
0
bis
18.446.744.073.709.551.615
(ohne
Vorzeichen)
oder
9.223.372.036.854.775.808
bis
9.223.372.036.854.775.807 (mit Vorzeichen).
FLOAT(länge,dezimalstellen)
4
Fließkommazahlen mit einem Maximalwert von ±3, 40282346638 und einem Minimalwert ±1, 175494351−38 .
DOUBLE(länge,dezimalstellen)
8
Fließkommazahlen mit einem Maximalwert von ±1, 7976931348623157308
und
einem
Minimalwert
−308
±2, 250738585072014
.
länge
Fließkommazahlen mit einem Wertebereich von double, die in einem CHARFeld abgelegt werden.
DECIMAL(länge,dezimalstellen)
Die Angaben länge und dezimalstellen in Tabelle 3.1 auf der vorherigen Seite sind optional und bestimmen die Konsolenausgabe.
Tabelle 3.2: Tabelle: Datum und Zeit Datentypen (Auszug)
Typ
#Bytes
Kommentar
YEAR
1
Dieser Typ speichert eine Jahreszahl. Die Werte
können entweder im Format YY als auch YYYY
eingegeben werden und werden dann als 2 oder
4 stellige Jahreszahl ausgegeben. Bei zweistelligen
liegt der Wertebereich zwischen (19)70 und (20)69.
Bei vierstelligen von 1901 bis 2155.
DATE
3
Ein Datumstyp, der Jahr, Monat und Tag speichert. Die Werte werden im Format YYYY-MMDD ausgegeben.
TIME
3
Ein Zeittyp, der Stunde, Minute und Sekunde speichert. Die Werte werden im Format HH:MM:SS
ausgegeben.
DATETIME
8
Ein Typ, der sowohl Datum als auch Zeit speichert.
Die Werte werden YYYY-MM-DD HH:MM:SS
ausgegeben.
Einführung in relationalen Datenbanken und SQL
35
Datentypen:
Datum und
Zeit
3 Implementieren mit SQL
Typ
3.3 SQL-DDL
#Bytes
8
TIMESTAMP(länge)
Kommentar
Eine Zeitangabe, die bei jeder Modifikation der
Zeile aktualisiert wird. Man kann dieser Spalte
auch manuell einen Wert zuweisen. Die Zuweisung eines NULL-Werts setzt das Feld auf die
aktuelle Zeit. Die optionale Längenangabe bestimmt das Ausgabeformat: 14 (Standardwert):
’YYYYMMDDHHMMSS’, 12: ’YYYYMMDDHHMM’, 8: ’YYYYMMDD’, 6: ’YYMMDD’
Das Ausgabeformat von Datum und Uhrzeit kann durch viele Formatierungszeichen und
Hilfsfunktionen angepasst werden. Näheres entnehmen Sie bitte der Dokumentation.
Tabelle 3.3: Tabelle: Text und Blob Datentypen (Auszug)
Typ
#Bytes
Kommentar
länge
Eine Zeichenkette fester Länge. Eingabe, die kürzer sind
als die länge, werden mit Leerzeichen aufgefüllt. Diese
Leerzeichen werden bei Ausgabe wieder entfernt. Standardmäßig wird nicht zwischen Groß- und Kleinschreibung bei der Verarbeitung dieses Feldtyps unterschieden
(siehe Tabelle 3.4 auf der nächsten Seite).
VARCHAR(länge)
länge+2
Ein Textstring variabler Länge. Eingabe, die länger sind
als die länge, werden gekürzt. Die Länge muss mit einem
Wert von 1 bis 656535 angegeben sein. Standardmäßig
wird nicht zwischen Groß- und Kleinschreibung bei der
Verarbeitung dieses Feldtyps unterschieden (siehe Tabelle 3.4 auf der nächsten Seite).
TINYTEXT
länge+1
Ein Textfeld mit einer maximalen Länge von 255 B.
TINYBLOB
länge+1
Ein Binärfeld mit einer maximalen Länge von 255 B.
TEXT
länge+2
Ein Textfeld mit einer maximalen Länge von 64 KB.
BLOB
länge+2
Ein Binärfeld mit einer maximalen Länge von 64 KB.
MEDIUMTEXT
länge+3
Ein Textfeld mit einer maximalen Länge von 16 MB.
MEDIUMBLOB
länge+3
Ein Binärfeld mit einer maximalen Länge von 16 MB.
LONGTEXT
länge+4
Ein Textfeld mit einer maximalen Länge von 4 GB.
LONGBLOB
länge+4
Ein Binärfeld mit einer maximalen Länge von 4 GB.
CHAR(länge)
Einführung in relationalen Datenbanken und SQL
36
Datentypen:
Text
3 Implementieren mit SQL
3.3 SQL-DDL
Diese Datentypen werden noch durch viele aus dem SQL-Standard ergänzt. Weitere
werden von den einzelnen Serverherstellern properitär angeboten und sollten nur nach
genauer Abwägung eingesetzt werden.
Die Datentypen werden noch durch einige Zusätze (modifier) genauer bestimmt (siehe
Tabelle 3.4).
Modifier
Tabelle 3.4: Tabelle: Zusätze (modifier) zu Datentypen (Auszug)
Zusatz
Kommentar
AUTO_INCREMENT
Dieser Zusatz ermöglicht einem numerischen Feld die automatische Aktualisierung. Dies eignet sich zur Generierung von
Schlüssel. Die Daten können in dieses Feld gelesen und auch
beschrieben werden. Wenn aber ein Wert 0 oder NULL zugewiesen wird, wird der nächste Zahlenwert zugewiesen. Dieser
Zusatz kann nur einmal pro Tabelle und nur dem Primärschlüssel zugewiesen werden.
BINARY
Dieser Zusatz kann bei CHAR und VARCHAR Typen verwendet werden, um die Beachtung der Groß- und Kleinschreibung
zu erzwingen.
DEFAULT wert
Mit diesem Zusatz können Spalten Vorbelegungen zugewiesen
werden. Falls einer Spalte kein Wert zugewiesen wird, wird
automatisch der Wert wert zugewiesen.
NULL
Die Spalte darf auch keinen Attributwert haben. Dies ist nicht
gleichbedeutend der Zahl 0 oder dem Leerstring!
NOT NULL
Spalten mit diesem Zusatz dürfen nicht leer sein.
UNSIGNED
Bei ganzzahligen Zahlentypen steuert dieser Zusatz, ob die
Darstellung das Vorzeichen verwendet oder ob dieses Bit zur
Zahlendarstellung mitgenutzt wird.
Aufgabe 3.6 Weisen Sie mit Hilfe der Tabellen zu den Datentypen und den Zusätzen
den Spalten des ER-Modells aus Abb. 2.5 auf Seite 19 Datentypen und Zusätze zu.
Nun kann man die Tabellen anlegen. Der entsprechende Befehl lautet: CREATE TABLE.
Zu diesem Befehl gibt es viele Varianten, aber für das normale Anlegen einer Tabelle
hat er folgenden Aufbau:
1
2
3
4
5
6
CREATE TABLE tabellenname
(
spaltenname datentyp zusätze ,
spaltenname datentyp zusätze ,
spaltenname datentyp zusätze ,
PRIMARY KEY (spaltenname, spaltenname )
);
Einführung in relationalen Datenbanken und SQL
37
CREATE
TABLE
3 Implementieren mit SQL
3.3 SQL-DDL
Als Beispiel seien hier die CREATE TABLES für zwei Tabellen angegeben:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql > CREATE TABLE buch
-> (
-> id
INT
-> isbn_lkz
INT
-> isbn_verlag INT
-> isbn_nr
INT
-> titel
VARCHAR (255)
-> jahr
YEAR ,
-> auflage
INT
-> bemerkung
TEXT ,
-> verlag_id
INT
-> PRIMARY KEY ( id )
-> );
mysql > CREATE TABLE verlag
-> (
-> id
INT
-> verlag
VARCHAR (255)
-> ort
VARCHAR (255) ,
-> PRIMARY KEY ( id )
-> );
UNSIGNED AUTO_INCREMENT ,
UNSIGNED ,
UNSIGNED ,
UNSIGNED ,
NOT NULL ,
UNSIGNED ,
UNSIGNED ,
UNSIGNED AUTO_INCREMENT ,
NOT NULL ,
Um der ersten Normalform zu entsprechen, wurde die ISBN in ihre Teile zerlegt. Ein
weiterer Grund ist die Erfüllung der 2. Normalform durch die Verknüpfung über die
Verlagsnummer.
Aufgabe 3.7 Welche Normalform wird verletzt und warum?
Aufgabe 3.8 Erstellen Sie für alle ausstehenden Tabellen (inklusive der Hilfstabellen)
die CREATE TABLE Befehle.
Dem kritischen Leser wird auffallen, das wir das Primär-/Fremdschlüsselverhältnis zwischen verlag.id und buch.isbn_verlag nicht mit einem SQL-Befehl hergestellt haben.
Vom Modell her ist das auch nicht nötig. Das es sich hier um ein Primär-/Fremdschlüsselpaar handelt, wird durch entsprechende Auswertungen (s. INNER JOIN etc) sichergestellt. Trotzdem kann es sinnvoll sein (siehe Referentielle Integrität 13 auf Seite 26),
durch entsprechende Erweiterung der Tabellenspezifikation dem Server schon mitzuteilen, dass diese Tabellen über diese beiden Spalten verbunden sind.
Dazu legen wir die Tabelle buch neu an. Vorher muss man dieser aber löschen 8 .
1
DROP
TABLE
mysql > DROP TABLE IF EXISTS buch ;
Der Zusatz IF EXISTS ist nicht zwingend nötig, verhindert aber eine Fehlermeldung,
falls die Tabelle - warum auch immer - schon nicht mehr da ist. Es wird dann eine
entsprechende Warnung erzeugt, die man mit SHOW WARNINGS einsehen kann.
8
ALTER TABLE kommt noch ;-)
Einführung in relationalen Datenbanken und SQL
38
SHOW
WARNINGS
3 Implementieren mit SQL
1
2
3
4
5
6
7
8
3.3 SQL-DDL
mysql > DROP TABLE IF EXISTS buch ;
mysql > SHOW WARNINGS ;
+ -- - - - - -+ - - - - - -+ - - - - - - - - - - - - - - - - - - - - - -+
| Level | Code | Message
|
+ -- - - - - -+ - - - - - -+ - - - - - - - - - - - - - - - - - - - - - -+
| Note | 1051 | Unknown table ’ buch ’ |
+ -- - - - - -+ - - - - - -+ - - - - - - - - - - - - - - - - - - - - - -+
1 row in set (0.00 sec )
Nun kann man ein verändertes CREATE TABLE absetzten, welches eine Verknüpfung
festlegt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql > CREATE TABLE buch
-> (
-> id
INT
UNSIGNED AUTO_INCREMENT ,
-> isbn_lkz
INT
UNSIGNED ,
-> isbn_verlag INT
UNSIGNED ,
-> isbn_nr
INT
UNSIGNED ,
-> titel
VARCHAR (255)
NOT NULL ,
-> jahr
YEAR ,
-> auflage
INT
UNSIGNED ,
-> bemerkung
TEXT ,
-> verlag_id
INT
UNSIGNED ,
-> PRIMARY KEY ( id ) ,
->
CONSTRAINT fk_ve rlag_buch _id
->
FOREIGN KEY ( isbn_verlag )
->
REFERENCES verlag ( id )
->
ON DELETE NO ACTION
->
ON UPDATE NO ACTION
-> );
In Zeile 13 wird ein Constraint9 definiert. Jeder Constraint hat einen datenbankweiten
eindeutigen Namen. Bei Fremdschlüsseln empfiehlt sich folgende Namenskonvention:
fk_Quelltabelle_Zieltabelle_Primärschlüsselname
Der Constraint kann für vieles verwendet werden, hier beschreibt er eine Fremdschlüsselbeziehung. In Zeile 14 wird über das Schlüsselwort FOREIGN KEY die Spalten benannt,
die ein Fremdschlüssel in der Tabelle ist. In der Zeile danach wird mit dem Schlüsselwort
REFERENCES die Tabelle und in Klammern dahinter der Schlüssel festgelegt10 .
Aufgabe 3.9 Was bedeuten ON DELETE NO ACTION und ON UPDATE NO ACTION?
In der Tabelle verlag muss gar nichts passieren, da es Tabelle egal sein muss, wer wie
auf sie verweist.
Nun wäre es schön bescheuert, wenn man bei jeder Änderung der Tabellenspezifikation
die Tabelle löschen und neu anlegen müsste. Deshalb gibt es einen Befehl, mit dessen
9
10
engl. Einschränkung
Um den Zugriff über den Fremdschlüssel zu beschleunigen, sollte man einen Index vor der Zeile 13
für diese Spalte definieren: INDEX buch_verlag_id (verlag_id ASC).
Einführung in relationalen Datenbanken und SQL
39
CONSTRAINT
FOREIGN
KEY
3 Implementieren mit SQL
3.4 SQL-DML
Hilfe man nachträglich Spezifikationseigenschaften einfügen, ändern oder löschen kann.
Wollte man beispielsweise für den Verlag eine neue Spalte geloescht hinzufügen, ginge
dies so:
1
2
ALTER TABLE
mysql > ALTER TABLE verlag
-> ADD geloescht BOOL NOT NULL DEFAULT false ;
Möchte man den Datentyp von BOOL auf INT umstellen ginge dies so:
1
2
mysql > ALTER TABLE verlag
-> MODIFY geloescht INT NOT NULL DEFAULT 0;
Wollte man diese Spalte wieder entfernen, ginge die so:
1
mysql > ALTER TABLE verlag DROP geloescht ;
Man kann in einem Befehl mehrere Änderungen vornehmen:
1
2
3
4
mysql > ALTER TABLE verlag
-> ADD wurst char (3) ,
-> ADD kaese INT ,
-> MODIFY ort VARCHAR (100);
Aufgabe 3.10 Ändern Sie die vorhandenen Tabellen so, dass alle Constraints bzgl.
der Fremdschlüssel enthalten. Ändern Sie alle VARCHAR / CHAR Spalten so um, dass sie
zwischen Groß- und Kleinschreibung unterscheiden.
Die vorhandene Tabellenstruktur kann man mit dem Befehl DESCRIBE ermitteln:
1
2
3
4
5
6
7
8
9
10
11
DESCRIBE
mysql > DESCRIBE verlag ;
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - -+
| Field | Type
| Null | Key | Default | Extra
|
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - -+
| id
| int (10) unsigned | NO
| PRI | NULL
| auto_increment |
| verlag | varchar (255)
| NO
|
| NULL
|
|
| ort
| varchar (100)
| YES |
| NULL
|
|
| wurst | char (3)
| YES |
| NULL
|
|
| kaese | int (11)
| YES |
| NULL
|
|
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - -+
5 rows in set (0.00 sec )
3.4 SQL-DML
Die Befehle der SQL-DML11 werden verwendet um
1. Daten hinzuzufügen,
11
DML: data manipulation language; engl. Datenveränderungssprache
Einführung in relationalen Datenbanken und SQL
40
3 Implementieren mit SQL
3.4 SQL-DML
2. Daten zu ändern,
3. Daten zu löschen oder
4. Daten auszuwerten.
Wie bei der SQL-DDL werden hier nur solche Befehle und Befehlsvarianten vorgestellt,
die man für die wichtigsten Standardaufgaben benötigt.
3.4.1 Daten einfügen
3.4.1.1 Daten aus CSV-Dateien einfügen
Daten werden oft aus anderen Systemen übernommen. Typische Beispiele sind: Messwertdaten, Vorversionen, Tabellenkalkulationen, Tabellenkalkulationen, proprietäre Programme etc. Diese Daten werden oft über das CSV-Format in Datenbanken importiert.
Aufgabe 3.11 Finden Sie heraus, was das CSV-Format ist und erstellen Sie eine Datei
namens verlag.csv mit folgenden Inhalt:
verlagnr;verlagsname;ort
8266;mitp;Bonn
89721;O’Reilly;Köln
8362;Galileo Press;Bonn
Stellen Sie sicher, dass in der Datenbank eine Tabelle verlag wie oben beschrieben
existiert. Dann können die Daten der CSV-Datei verlag.csv mit dem Befehl LOAD
DATA INFILE importiert werden.
1
2
3
4
5
6
7
8
9
LOAD DATA LOCAL INFILE ’/ home / user / verlag . csv ’
INTO TABLE verlag
FIELDS
TERMINATED BY ’; ’
LINES
TERMINATED BY ’\ n ’
IGNORE 1 LINES
( id , verlag , ort )
;
In Zeile 1 wird dem Server mitgeteilt, wo die Datei liegt. Der Zusatz LOCAL legt fest,
dass die Datei nicht auf dem MySQL-Server liegt, sondern beim Client. Sie wird dann
zuerst vom Client zum Server kopiert und anschließend eingelesen. In Zeile 2 wird die
Zieltabelle angegeben: Hier verlag.
Nun folgt die Spezifikation der CSV-Parameter. Ab Zeile 3 wird festgelegt, wie der
Befehl einzelne Feldinhalte von einander unterscheiden kann. In unserem Fall ist das sehr
Einführung in relationalen Datenbanken und SQL
41
LOAD
DATA
INFILE
3 Implementieren mit SQL
3.4 SQL-DML
einfach, die Felder werden durch ein Semikolon getrennt. Ab Zeile 3 auf der vorherigen
Seite wird festgelegt, wie einzelne Datensätze unterschieden werden können. Auch hier
ist das relativ einfach, jeder Datensatz ist eine Zeile der CSV-Datei, daher das Zeichen
für einen Zeilenumbruch \n12 . Da die erste Zeile keine Daten enthält, wird in Zeile 7 auf
der vorherigen Seite die Anzahl der zu ignorierenden Zeilen mit 1 angegeben. In Zeile 8
auf der vorherigen Seite wird die Entsprechung der Felder in der Datei zu den Spalten
der Tabelle bestimmt. Das erste Feld wird der Spalte id, die zweite der Spalte verlag
und die letzte der Spalte ort zugeordnet.
Erfolgt keine Fehlermeldung sollte folgendes Ergebnis vorhanden sein:
1
2
3
4
5
6
7
mysql > select * from verlag ;
+ -- - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - -+
| id
| verlag
| ort
|
+ -- - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - -+
| 8266 | mitp
| Bonn |
| 8362 | Galileo Press | Bonn |
+ -- - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - -+
3.4.1.2 Daten mit INSERT einfügen
Ab jetzt werde ich die sakila-Datenbank (siehe 3.2 auf Seite 32) verwenden. Bitte
stellen Sie die Installation sicher. Ich möchte in die Tabelle languageweitere Sprachen
hinzufügen.
Aufgabe 3.12 Ermitteln Sie die Struktur und den Inhalt der Tabelle language.
Eine Sprache, die derzeit nicht in dieser Tabelle erfasst ist, ist: Sindarin13 . Diesen Datensatz kann mit dem INSERT INTO Befehl einfügen.
1
INSERT INTO language ( name ) VALUES ( ’ Sindarin ’ );
Nach dem INSERT INTO steht immer der Name der Tabelle, in dem die Daten eingefügt werden sollen. Hinter dem Tabellennamen kommt eine Liste von Spaltennamen
(in runden Klammern, durch Komma getrennt), für welche man Werte zur Verfügung
stellt. Anschließend stehen hinter dem Schlüsselwort VALUES in runden Klammern, durch
Komma getrennt die Datensätze.
1
2
3
4
5
6
INSERT INTO language
( language_id , name )
VALUES
(10 , ’ Quenya ’) ,
(15 , ’ Westron ’) ,
(16 , ’ Entisch ’ );
12
13
Bei unter Windows erzeugten CSV-Dateien muss oft \r\n als Zeilenende angegeben werden!
Na, wer weiss es?
Einführung in relationalen Datenbanken und SQL
42
INSERT INTO
3 Implementieren mit SQL
3.4 SQL-DML
Aufgabe 3.13 Überprüfen Sie, ob die Datensätze in der Tabelle angekommen sind.
Die Anzahl der Angaben in der Spaltenliste (hinter dem Tabellennamen) muss mit die
Anzahl der Werte pro Datensatz übereinstimmen! Werden keine Spaltennamen hinter
dem Tabellennamen angegeben, müssen zu allen Spalten der Tabelle Werte angegeben
werden. Die Reihenfolge muss der des CREATE TABLE entsprechen.
Aufgabe 3.14 Versuchen Sie zu beiden Situationen fehlerhaft Befehle auszuführen. Notieren Sie sich die Fehlermeldung und ihre Bedeutung.
3.4.2 Daten ändern
Sind die Datensätze vorhanden und soll der Inhalt der Datensätze geändert werden,
verwendet man den Befehl: UPDATE.
UPDATE
In der Tabelle film gibt die Spalte length, die die Länge des Films in Minuten angibt.
Ich möchte diese Angabe auf Sekunden ändern.
1
2
mysql > UPDATE film
SET length = length * 60;
In der Tabelle film gibt die Spalte rental_rate den Preis pro Ausleihperiode an. Diesen
Preis möchte ich um 15% erhöhen.
1
2
mysql > UPDATE film
SET rental_rate = rental_rate + ( rental_rate * 15) / 100;
In der Tabelle category befinden sich Filmkategorien. Die Kategorie new möchte ich
nun in brand new ändern.
1
2
3
UPDATE category
SET
name = ’ brand ␣ new ’;
Aufgabe 3.15 Führen Sie den Befehl aus und überprüfen Sie das Ergebnis. Diskutierten Sie mögliche Ursachen. Stellen Sie anschließend den originalen Zustand der Tabelle
wieder her, indem Sie das Installationsskript wieder starten.
Was dem Befehl fehlt, ist die Einschränkung, auf welche Datensätze die UPDATE Operation ausgeführt werden soll.
3.4.3 Exkurs: WHERE-Klausel
Die WHERE-Klausel ist so was wie das if für SQL. Es werden Bedingungen mit Teilbedingungen formuliert, die datensatzweise auf TRUE oder FALSE überprüft werden. Ist der
Datensatz mit TRUE bewertet, wird die Operation ausgeführt, ansonsten nicht.
Einführung in relationalen Datenbanken und SQL
43
WHERE
3 Implementieren mit SQL
3.4 SQL-DML
Tabelle 3.5: Tabelle: Elemente der WHERE-Klausel (Auszug)
Element
Bedeutung
(bedingung)
Mit runden Klammern kann man die Auswertungsreihenfolge von Teilbedingungen festlegen.
Oft dienen sie nur der optischen Gruppierung
von Teilbedingungen, damit man sie besser lesen und warten kann.
bedingung AND bedingung
bedingung && bedingung
Die beiden Teilbedingungen werden mit der logischen UND-Funktion verknüpft. Die UNDFunktion bindet stärker als die ODERFunktion. Der Lesbarkeit wegen sollte der Text
AND verwendet werden.
bedingung OR bedingung
bedingung || bedingung
Die beiden Teilbedingungen werden mit der logischen ODER-Funktion verknüpft. Der Lesbarkeit wegen sollte der Text OR verwendet werden.
NOT bedingung
!bedingung
Kehrt den Wahrheitswert einer Bedingung oder
Funktion um, d.h. TRUE → FALSE und
FALSE → TRUE .
wert1 = wert2
Überprüft, ob die rechts und links vom Gleichheitszeichen stehenden Werte(!) gleich sind.
Vorsicht: Anders als bei C/C++ steht hier nur
ein Gleichheitszeichen.
wert1 <> wert2
wert1 != wert2
Überprüft, ob die rechts und links vom Gleichheitszeichen stehenden Werte(!) ungleich sind.
Vorsicht: Bei Kommazahlen sind Rundungsfehler zu beachten.
wert1 < wert2
Überprüft, ob der linke Wert kleiner dem rechten Wert ist. Bei numerischen Datentypen wird
der Zahlenwert als Ordnungskriterium verwendet, bei Texten die festgelegte lexikalische Reihenfolge (nicht die Länge).
wert1 <= wert2
Kurzschreibweise von:
((wert1 < wert2 ) OR (wert1 = wert2 )).
wert1 > wert2
Überprüft, ob der linke Wert größer dem rechten Wert ist. Bei numerischen Datentypen wird
der Zahlenwert als Ordnungskriterium verwendet, bei Texten die festgelegte lexikalische Reihenfolge (nicht die Länge).
Einführung in relationalen Datenbanken und SQL
44
3 Implementieren mit SQL
3.4 SQL-DML
Tabelle 3.5: Tabelle: Elemente der WHERE-Klausel (Auszug)
Element
Bedeutung
wert1 >= wert2
Kurzschreibweise von:
((wert1 > wert2 ) OR (wert1 = wert2 )).
wert BETWEEN wert1 AND wert2
Es wird überprüft, ob wert in dem Intervall von
(wert1 , wert2 ) liegt. Kurzschreibweise von:
((wert >= wert1 ) AND (wert <= wert2 )).
wert NOT BETWEEN wert1 AND wert2
Es wird überprüft, ob wert nicht in dem Intervall von (wert1 , wert2 ) liegt.
wert IN (wert1 , wert2 , ...)
Es wird überprüft, ob wert in der Werteliste
(wert1 , wert2 , ...) liegt. Kurzschreibweise von:
((wert = wert1 ) OR (wert = wert2 ) usw.).
wert NOT IN (wert1 , wert2 , ...)
Es wird überprüft, ob wert nicht in der Werteliste (wert1 , wert2 , ...) liegt.
’wert1 ’ LIKE ’wert2 ’
Es wird überprüft, ob der Text wert1 dem Text
von wert2 ähnlich ist. Die Ähnlichlichkeit wird
mit Wildcards bestimmt. Das Wildcard % steht
für jedes Zeichen beliebig (auch 0 mal) oft. Das
Wildcard _ steht für jedes beliebige Zeichen genau einmal.
wert IS NULL
Wenn der Inhalt einer Spalte auf NULL überprüft werden soll, kann man nicht wert = NULL
schreiben, sondern muss diese Notation verwenden.
Ein typisches Beispiel für eine WHERE-Klausel ist:
WHERE (umsatz > 50000 OR typ = ’G’) AND (name1 LIKE ’A%’)
Diese Klausel trifft auf alle Zeilen zu, die einen Umsatz größer 50000 oder vom Typ G
sind und deren Name mit einem A beginnt. Die Klammerung ist notwendig, da sonst
das AND stärker bindet als das OR.
Hinweis: Datumswerte werden unabhängig von der Ländereinstellung der Ausgabe im
(YYYY-MM-DD) Format angegeben.
Zurück zu unserem obigen Beispiel. Ich möchte immer noch new in brand new ändern14 .
Mit einer passenden WHERE-Klausel sähe es so aus:
14
Haben Sie den ursprünglichen Inhalt der Tabelle wieder hergestellt?
Einführung in relationalen Datenbanken und SQL
45
3 Implementieren mit SQL
1
2
3
4
3.4 SQL-DML
mysql > UPDATE category
-> SET name = ’ brand ␣ new ’ WHERE name = ’ new ’;
Query OK , 1 row affected (0.03 sec )
Rows matched : 1 Changed : 1 Warnings : 0
Aufgabe 3.16 Wie könnte die WHERE-Klausel auch aussehen?
3.4.4 Daten löschen
Bevor wir das Löschen besprechen, soll hier etwas sehr deutlich betont werden:
Es gibt kein Undo!. Was immer sie löschen, ist weg.
1
2
undo
Nach dem MVC-Konzept ist die Controler-Schicht für die Plausibilisierung der Löschoperation verantwortlich, nicht der SQL-Server.
MVC
Der SQL-Befehl zum Löschen ist DELETE. Ohne WHERE-Klausel löscht er die Inhalte einer
ganzen Tabelle. Deshalb sollte er auch nur vorsichtig verwendet werden.
DELETE
mysql > DELETE FROM film_category WHERE category_id = 6;
Query OK , 68 rows affected (0.11 sec )
Dieser Befehl löscht aus der Verknüpfungstabelle zwischen film und category alle Zeilen, deren category_id des Wert 6 (Dokumentation) haben.
Aufgabe 3.17 Welche Kardinalität besteht zwischen diesen beiden Tabellen?
3.4.5 Daten auswerten mit SELECT
Der SELECT-Befehl ermittelt aus einer oder mehreren Tabellen die Inhalte, bereitet sie
auf und stellt sie wieder in tabellarischer Form zur Verfügung.
SELECT
3.4.5.1 Tabellenunabhängige Auswertungen
Bevor wir die Auswertung von Tabellendaten bearbeiten, soll hier kurz eingeführt werden, dass man mit SELECT auch andere Sachen machen kann.
Arithmetische Berechnungen werden in einem SELECT ausgerechnet und angezeigt. Welche mathematischen Operationen zur Verfügung stehen, entnehmen Sie bitte dem Handbuch.
1
2
3
4
5
6
mysql > SELECT 5+7;
+ -- - - -+
| 5+7 |
+ -- - - -+
| 12 |
+ -- - - -+
Einführung in relationalen Datenbanken und SQL
46
Berechnungen
3 Implementieren mit SQL
3.4 SQL-DML
Eine weitere Anwendung ist die Ausgabe von Texten auf der Konsole.
1
2
3
4
5
6
mysql > SELECT ’ Berechnung ␣ des ␣ J a hr e sd u rc h s ch n it t s ’;
+ -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
| Berechnung des J a hr e sd u r ch s ch n i tt s |
+ -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
| Berechnung des J a hr e sd u r ch s ch n i tt s |
+ -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
Das erscheint im Moment nicht besonders sinnvoll. hat man aber SQL-Skripte geschrieben, die umfangreiche Konvertierungen oder Auswertungen durchführen, so kann die
Ausgabe auf der Konsole sehr hilfreich sein, wenn dabei Problemen auftreten.
3.4.5.2 Einfache Zeilen und Spaltenauswahl
Die einfachste Art den kompletten Inhalt einer Tabelle zu erfahren ist:
1
2
3
4
5
6
7
8
9
10
11
mysql > SELECT * FROM language ;
+ -- - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
| language_id | name
| last_update
|
+ -- - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
|
1 | English | 2006 -02 -15 05:02:19 |
|
2 | Italian | 2006 -02 -15 05:02:19 |
|
3 | Japanese | 2006 -02 -15 05:02:19 |
|
4 | Mandarin | 2006 -02 -15 05:02:19 |
|
5 | French
| 2006 -02 -15 05:02:19 |
|
6 | German
| 2006 -02 -15 05:02:19 |
+ -- - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
Nach dem Schlüsselwort SELECT steht ein *. Dieser ist ein Platzhalter für die Spalten,
die man sich anzeigen lassen möchte. Der Stern steht für alle Spalten. Anstelle des Sterns
können auch einzelne Spalten in beliebiger Reihenfolge durch Komma getrennt stehen.
1
2
3
4
5
6
7
8
9
10
11
mysql > SELECT last_update , name FROM language ;
+ -- - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
| last_update
| name
|
+ -- - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
| 2006 -02 -15 05:02:19 | English |
| 2006 -02 -15 05:02:19 | Italian |
| 2006 -02 -15 05:02:19 | Japanese |
| 2006 -02 -15 05:02:19 | Mandarin |
| 2006 -02 -15 05:02:19 | French
|
| 2006 -02 -15 05:02:19 | German
|
+ -- - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
Die Spaltennamen können mit einem Alias versehen werden:
1
2
3
4
Alias
mysql > SELECT last_update ’ aktualisiert ␣ am ’ , name ’ Sprache ’
->
FROM language ;
+ -- - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
| aktualisiert am
| Sprache |
Einführung in relationalen Datenbanken und SQL
47
3 Implementieren mit SQL
5
6
7
8
9
10
11
12
3.4 SQL-DML
+ -- - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
| 2006 -02 -15 05:02:19 | English |
| 2006 -02 -15 05:02:19 | Italian |
| 2006 -02 -15 05:02:19 | Japanese |
| 2006 -02 -15 05:02:19 | Mandarin |
| 2006 -02 -15 05:02:19 | French
|
| 2006 -02 -15 05:02:19 | German
|
+ -- - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
Mit Hilfe der WHERE-Klausel können Zeilen bestimmt werden, die angezeigt werden sollen:
1
2
3
4
5
6
7
8
9
mysql > SELECT name ’ Sprache ’ FROM language WHERE name LIKE ’% a % ’;
+ -- - - - - - - - -+
| Sprache |
+ -- - - - - - - - -+
| Italian |
| Japanese |
| Mandarin |
| German
|
+ -- - - - - - - - -+
Eine weitere Methode die Zeilen der Auswahl einzuschränken ist die Ergänzung LIMIT
des SELECT.
1
2
3
4
5
6
7
8
9
10
mysql > SELECT actor_id , first_name , last_name FROM actor LIMIT 5;
+ -- - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
| actor_id | first_name | last_name
|
+ -- - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
|
1 | PENELOPE
| GUINESS
|
|
2 | NICK
| WAHLBERG
|
|
3 | ED
| CHASE
|
|
4 | JENNIFER
| DAVIS
|
|
5 | JOHNNY
| LOLLOBRIGIDA |
+ -- - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
Durch das LIMIT 5 werden nur die ersten 5 Zeilen angezeigt. Man kann sich auch die
Ergebnisse von Zeile 11 bis 16 anzeigen lassen:
1
2
3
4
5
6
7
8
9
10
11
mysql > SELECT actor_id , first_name , last_name FROM actor LIMIT 10 , 6;
+ -- - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - -+
| actor_id | first_name | last_name |
+ -- - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - -+
|
11 | ZERO
| CAGE
|
|
12 | KARL
| BERRY
|
|
13 | UMA
| WOOD
|
|
14 | VIVIEN
| BERGEN
|
|
15 | CUBA
| OLIVIER
|
|
16 | FRED
| COSTNER
|
+ -- - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - -+
Wird das LIMIT in dieser Form angegeben, ist die Bedeutung etwas komplizierter als
mit nur einer Zahl. Bei einer Zahl (wie oben die 5) werden die ersten 5 Zeilen ausgegeben. Bei LIMIT 10, 6 ist die erste Zahl der Offset und die zweite die Anzahl. Da die
Nummerierung immer mit 0 beginnt, zeigt der Offset 10 auf die 11 Zeile.
Einführung in relationalen Datenbanken und SQL
48
LIMIT
3 Implementieren mit SQL
3.4 SQL-DML
3.4.5.3 Auswahl sortieren
Üblicherweise werden Daten in irgendeiner Art und Weise sortiert: Nach Name, Umsatz,
Ort, Betrag, Dauer etc. Eine Sortierung erfolgt mit der Ergänzung ORDER BY des SELECT.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ORDER BY
mysql >
SELECT actor_id , last_name , first_name
FROM actor
ORDER BY last_name
LIMIT 5 ;
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - -+
| actor_id | last_name | first_name |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - -+
|
58 | AKROYD
| CHRISTIAN |
|
92 | AKROYD
| KIRSTEN
|
|
182 | AKROYD
| DEBBIE
|
|
118 | ALLEN
| CUBA
|
|
145 | ALLEN
| KIM
|
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - -+
Man kann deutlich erkennen, dass die Daten aufsteigend nach dem Nachnamen sortiert
werden. Beim Nachnamen AKROYD fällt auf, dass die Vornamen immer noch unsortiert
sind. Will man nach mehr als einer Spalte sortieren, gibt man die Spaltennamen hinter
dem ORDER BY durch Komma getrennt an. Nun werden die Schauspieler bei Gleichheit
des Nachnamens nach dem Vornamen sortiert.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql >
SELECT actor_id , last_name , first_name
FROM actor
ORDER BY last_name , first_name
LIMIT 5 ;
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - -+
| actor_id | last_name | first_name |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - -+
|
58 | AKROYD
| CHRISTIAN |
|
182 | AKROYD
| DEBBIE
|
|
92 | AKROYD
| KIRSTEN
|
|
118 | ALLEN
| CUBA
|
|
145 | ALLEN
| KIM
|
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - -+
Die Sortierung erfolgt aufsteigend (ASC), wenn man nichts anderes festlegt. So ist folgender SQL gleichbedeutend mit dem vorherigen:
1
2
3
4
5
ASC
mysql >
SELECT actor_id , last_name , first_name
FROM actor
ORDER BY last_name ASC , first_name ASC
LIMIT 5 ;
Man kann für jede Spalte einzeln festlegen, ob die Daten absteigend (DESC) sortiert
werden sollen. Dazu wird an den Stellen, wo jetzt das ASC steht, das DESC gesetzt.
Einführung in relationalen Datenbanken und SQL
49
DESC
3 Implementieren mit SQL
3.4 SQL-DML
Bei der Sortierung ist zu beachten, dass nicht zwischen Groß- und Kleinschreibung bei
zeichenbasierenden Datentypen unterschieden wird, wenn die Spalte nicht mit dem Modifier BINARY spezifiziert wurde.
BINARY
Wie man die passende Zeichenkodierung und die passende länderspezifische Sortierreihenfolge einstellt, muss man der Dokumentation des jeweiligen Servers entnehmen. Bei
MySQL geschieht dies durch die Collation.
3.4.5.4 Mehrfachausgaben unterdrücken
Die Ausgabe aller Nachnamen der actor-Tabelle enthält viele Mehrfachnennungen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT last_name FROM actor ORDER BY last_name LIMIT 10;
+ -- - - - - - - - - -+
| last_name |
+ -- - - - - - - - - -+
| AKROYD
|
| AKROYD
|
| AKROYD
|
| ALLEN
|
| ALLEN
|
| ALLEN
|
| ASTAIRE
|
| BACALL
|
| BAILEY
|
| BAILEY
|
+ -- - - - - - - - - -+
Insgesamt werden 200 Nachnamen ausgegeben. Möchte man aber nur die unterschiedlichen Nachnamen weiterverarbeiten, also Mehrfachnennungen unterdrücken, so fügt man
das Schlüsselwort DISTINCT unmittelbar hinter das SELECT ein.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT DISTINCT last_name FROM actor ORDER BY last_name LIMIT 10;
+ -- - - - - - - - - -+
| last_name |
+ -- - - - - - - - - -+
| AKROYD
|
| ALLEN
|
| ASTAIRE
|
| BACALL
|
| BAILEY
|
| BALE
|
| BALL
|
| BARRYMORE |
| BASINGER |
| BENING
|
+ -- - - - - - - - - -+
Ohne LIMIT würden nun nur noch 121 Nachnamen ausgegeben werden15 .
15
Die Verwendung von DISTINCT ist sehr rechenintensiv, wenn nicht indizierte Spalten verwendet werden.
Einführung in relationalen Datenbanken und SQL
50
DISTINCT
3 Implementieren mit SQL
3.4 SQL-DML
3.4.5.5 Verknüpfen mit INNER JOIN
In der Regel sind die Informationen innerhalb einer Datenbank auf verschiedene Tabellen verteilt (siehe Abbildung 2.5 auf Seite 19). So entstehen beispielsweise bei der
Normalisierung (siehe Kapitel 2.3.7 auf Seite 27) Tabellen, um Mehrfachangaben zu
vermeiden.
Für die Anzeige oder Weiterverarbeitung müssen diese Informationen wieder zusammengeführt werden. Betrachten Sie dazu das ER-Modell der sakila-Datenbank. Dort finden
Sie die beiden Tabellen staff und store. Die Verknüpfung erfolgt über die Spalte
store_id. Hier wird festgelegt, welcher Mitarbeiter in welchem Geschäft arbeitet ist.
Hier erst der Inhalt der Tabelle staff. Die Einschränkung auf wenige Spalten erfolgt
nicht nur wegen der Übersichtlichkeit, sondern auch, weil die Tabelle eine Spalte vom
Typ BLOB enthält. Den Inhalt solcher Spalten, kann man in der Regel nicht auf der
Konsole ausgeben.
1
2
3
4
5
6
7
8
mysql > SELECT staff_id , last_name , store_id FROM staff ;
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+
| staff_id | last_name | store_id |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+
|
1 | Hillyer
|
1 |
|
2 | Stephens |
2 |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+
2 rows in set (0.00 sec )
Nun der Inhalt von store:
1
2
3
4
5
6
7
8
mysql > SELECT * FROM store ;
+ -- - - - - - - - -+ - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
| store_id | manager_staff_id | address_id | last_update
|
+ -- - - - - - - - -+ - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
|
1 |
1 |
1 | 2006 -02 -15 04:57:12 |
|
2 |
2 |
2 | 2006 -02 -15 04:57:12 |
+ -- - - - - - - - -+ - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
2 rows in set (0.00 sec )
Aufgabe 3.18 In welcher Tabelle ist store_id ein Primärschlüssel und in welcher ein
Fremdschlüssel?
Aufgabe 3.19 Zeichnen Sie einen Pfeil vom Fremdschlüsselwert zum passenden Primärschlüsselwert.
Um zu verstehen, wie ein INNER JOIN funktioniert, wollen wir zunächst das Kartesische16
Produkt bilden.
16
Benannt nach René Descartes (1596 - 1650); er war ein französischer Philosoph, Mathematiker und
Naturwissenschaftler.
Einführung in relationalen Datenbanken und SQL
51
Kartesisches
Produkt
3 Implementieren mit SQL
3.4 SQL-DML
Definition 21 Kartesisches Produkt
Bei einem kartesischem Produkt wird jedes Elemente der Menge A mit allen
Elementen der Menge B verknüpft. Sind die beiden Menge endlich ist die
Anzahl der verknüpften Elemente: Anzahl = Anzahl(A) * Anzahl(B). Ein
anderer Name für kartesisches Produkt ist Kreuzprodukt.
Nun das Kartesische Produkt:
1
2
3
4
5
6
7
8
9
10
SELECT staff . staff_id , staff . last_name , staff . store_id , store . store_id , store . addre
FROM staff , store ;
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
| staff_id | last_name | store_id | store_id | address_id |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
|
1 | Hillyer
|
1 |
1 |
1 |
|
2 | Stephens |
2 |
1 |
1 |
|
1 | Hillyer
|
1 |
2 |
2 |
|
2 | Stephens |
2 |
2 |
2 |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
Was will uns dieser Befehl sagen: In den ersten beiden Zeilen werden die Spalten ausgewählt, die man sich anschauen möchte. Da man hier eine Auswahl über mehrere Tabellen vornimmt, ist es Konvention vor dem Spaltennamen immer den Tabellennamen oder
einen passenden Alias durch einen Punkt getrennt zu schreiben. Hier ist dies aber nicht
nur eine Konvention, sondern auch notwendig!
Aufgabe 3.20 Lassen Sie die Tabellennamen vor den Spaltennamen weg und interpretieren Sie die Fehlermeldung.
In der Bildschirmausgabe kann man nun gut erkennen, dass jeder Mitarbeiter mit allen
Geschäften verknüpft wurde. Deshalb werden auch 4 Datenzeilen ausgegeben. Aber wir
bemerken auch, dass dieses Ergebnis sinnlos ist. Wir wissen doch durch die Bearbeitung
der Aufgaben 3.19 auf der vorherigen Seite, dass z.B. Hillyer im Geschäft 1 und nicht 2
arbeitet.
Durch scharfes Anschauen der beiden store_id Spalten, zeichnet sich aber auch schon
eine Lösung ab:
1
2
3
4
5
6
7
8
9
SELECT a . staff_id , a . last_name , a . store_id , o . store_id , o . address_id
FROM staff a , store o
WHERE a . store_id = o . store_id ;
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
| staff_id | last_name | store_id | store_id | address_id |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
|
1 | Hillyer
|
1 |
1 |
1 |
|
2 | Stephens |
2 |
2 |
2 |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
Einführung in relationalen Datenbanken und SQL
52
3 Implementieren mit SQL
3.4 SQL-DML
Diese Art einen INNER JOIN zu bilden, hat einen entscheidenden Nachteil: Kommen
weitere Bedingungen in der WHERE Klausel vor, wird der Befehl schnell unübersichtlich
und damit fehleranfällig. Aus diesem Grund hat man für den INNER JOIN eine eigene
Syntax eingeführt:
1
2
3
SELECT a . staff_id , a . last_name , a . store_id , o . store_id , o . address_id
FROM
staff a INNER JOIN store o ON a . store_id = o . store_id ;
Links und rechts vom Schlüsselwort INNER JOIN stehen die beiden zu verknüpfenden
Tabellen. Anschließend folgt das Schlüsselwort ON und die Gleichheitsbedingung des
Primär-/Fremdschlüsselpaars.
Aufgabe 3.21 Vertauschen Sie im Befehl die Tabellennamen und vergleichen Sie das
Ergebnis.
Aufgabe 3.22 Vertauschen Sie im Befehl die Primär- und Fremdschlüsselspalte und
vergleichen Sie das Ergebnis.
Falls die Namen des Primärschlüssels und des Fremdschlüssels gleich sind, kann man das
auch deutlich kürzer schreiben:
1
2
3
SELECT a . staff_id , a . last_name , a . store_id , o . store_id , o . address_id
FROM
staff a INNER JOIN store o USING ( store_id );
Definition 22 INNER JOIN
Zwei Tabellen werden per INNER JOIN verknüpft, in dem man nur die
Zeilen des Kartesischen Produkts ausgibt, für welche ein passendes Primär/Fremdschlüsselpaar gefunden wird.
Was diese Definition genau bedeutet, wird erst klar, wenn wir die Daten ein wenig
verändern.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO staff ( staff_id , last_name , address_id , store_id )
VALUES (3 , ’ Adams ’ , 1 , 1);
INSERT INTO store ( store_id , manager_staff_id , address_id )
VALUES (3 , 3 , 1);
SELECT a . staff_id , a . last_name , a . store_id , o . store_id , o . address_id
FROM
staff a INNER JOIN store o USING ( store_id );
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
| staff_id | last_name | store_id | store_id | address_id |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
|
1 | Hillyer
|
1 |
1 |
1 |
|
3 | Adams
|
1 |
1 |
1 |
|
2 | Stephens |
2 |
2 |
2 |
+ -- - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - -+
Einführung in relationalen Datenbanken und SQL
53
INNER
JOIN
3 Implementieren mit SQL
3.4 SQL-DML
Es fällt auf, dass das Geschäft mit der store_id 3 nicht erscheint.
Aufgabe 3.23 Begründen Sie das Ergebnis mit der Definition 22 auf der vorherigen
Seite vom INNER JOIN.
Spätestens bei einer n:m-Verknüpfung muss man mehr als zwei Tabellen mit einander
verbinden. In der sakila Datenbank finden sich solche n:m-Verknüpfungen zwischen den
Tabellen actor und film und den Tabellen category und film.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT f . title , a . last_name
FROM
film f INNER JOIN film_actor USING ( film_id )
INNER JOIN actor a
USING ( actor_id )
LIMIT 10;
+ -- - - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| title
| last_name |
+ -- - - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| ACADEMY DINOSAUR | GUINESS
|
| ACADEMY DINOSAUR | GABLE
|
| ACADEMY DINOSAUR | TRACY
|
| ACADEMY DINOSAUR | PECK
|
| ACADEMY DINOSAUR | CAGE
|
| ACADEMY DINOSAUR | TEMPLE
|
| ACADEMY DINOSAUR | NOLTE
|
| ACADEMY DINOSAUR | KILMER
|
| ACADEMY DINOSAUR | DUKAKIS
|
| ACADEMY DINOSAUR | KEITEL
|
+ -- - - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
10 rows in set (0.00 sec )
Das LIMIT 10 ist der Größe der beiden Tabellen geschuldet.
Aufgabe 3.24 Erstellen Sie einen passenden INNER JOIN um die n:m-Verknüpfung
zwischen film und category aufzulösen. Begrenzen Sie die Ausgabe auf Filme mit den
Kategorien Music oder Horror.
Auch aus fachlicher Sicht kann eine Verknüpfung über mehrere Tabellen notwendig sein:
Möchte man beispielsweise wissen, in welchen Kategorien ein bestimmter Schauspieler
(last_name = ’zellweger’) schon mal einen gespielt hat, sind die Tabellen actor,
film_actor, film, film_category und category zu verknüpfen.
1
2
3
4
5
6
SELECT actor . last_name , category . name FROM
actor INNER JOIN film_actor
USING ( actor_id )
INNER JOIN film
USING ( film_id )
INNER JOIN film_category USING ( film_id )
INNER JOIN category
USING ( category_id )
WHERE actor . last_name = ’ zellweger ’
Aufgabe 3.25 Versuchen Sie diesen Befehl anhand des ER-Modells nachzuvollziehen.
Aufgabe 3.26 Wie verhindern Sie die Mehrfachausgabe von gleichen Ergebnissen?
Einführung in relationalen Datenbanken und SQL
54
Index
*, 47
1:1, 18
1:1-Verknüpfung, 19
1:n, 21
1:n-Verknüpfung, 21
3-Schichtenmodell, 46
A
Änderungsweitergabe, 26
Alias, 47
ALTER TABLE, 40
ASC, 49
Atomar, 28
Attribut, 11
B
Berechnungen, 46
BibTeX, 8
BINARY, 50
C
Chen-Notation, 15
COMMIT, 27
CONSTRAINT, 39
CREATE DATABASE, 33
CREATE TABLE, 34, 37
D
Datenfeld, 11
Datensatz, 11
Datentypen, 34
Datentypen: Datum und Zeit, 35
Datentypen: Text, 36
Datentypen: Zahlen, 34
deklarativ, 31
DELETE, 46
DESC, 49
DESCRIBE, 40
DISTINCT, 50
Domäne, 11
DROP TABLE, 38
E
Entität, 11
Entititätentyp, 11
Entity Relationship Model, 15
ER-Modell, 15
F
Feld, 11
FOREIGN KEY, 39
Fremdschlüssel, 16
I
imperativ, 31
INNER JOIN, 53
INSERT INTO, 42
Item, 11
K
Kartesisches Produkt, 51, 52
kaskadierende Änderung, 26
kaskadierendes Löschen, 26
Klasse, 11
konzeptionell eindeutig, 13
Kreuzprodukt, 52
L
LIMIT, 48
LOAD DATA INFILE, 41
Löschkennzeichen, 26
Löschweitergabe, 26
M
Matrix, 11
Einführung in relationalen Datenbanken und SQL
55
Index
Modifier, 37
MVC, 46
MySQL Client, 32
mysql.com, 31
N
n:m, 22
n:m-Verknüpfung, 22
Normalform 1, 28, 30
O
Objekt, 11
ORDER BY, 49
P
Primärschlüsselnamen, 16
Primärschlüssel, 13
Property, 11
R
Record, 11
Recordset, 11
REFERENCES, 39
Referentielle Integrität, 26
Referenz, 17
Relation, 11
Relationale Datenbank, 11
ROLLBACK, 27
Index
Tupel, 11
U
undo, 46
UPDATE, 43
USE, 34
V
Verknüpfung, 17
verletzten referentielle Integrität, 26
Voll- und teilfunktional, 29
vollfunktional, 29
W
WHERE, 43
Wiederholungsgruppefreiheit, 28
Z
Zeile, 10
Zusätze, 34
S
Sakila, 32
Schema, 11
Schlüssel, 12
SELECT, 46
SHOW DATABASES, 32
SHOW TABLES, 34
SHOW WARNINGS, 38
Spalte, 10
T
Tabelle, 10
Tabellenspalte, 10
Tabellenzeile, 10
teilfunktional, 29
Transaktion, 26
Transitiv, 30
Einführung in relationalen Datenbanken und SQL
56
Herunterladen