SQL HOTEL - Interbase

Werbung
AKAD HOCHSCHULEN FÜR BERUFSTÄTIGE
SQL – Structured Query Language
Beispiel Hotel
Prof. Thomas Müller
Seminartext für das
Diplomandenseminar Wirtschaftsinformatik
Alle SQL-Beispiele dieses Seminartextes wurden unter dem
Datenbanksystem INTERBASE® von Borland entwickelt und
getestet. Die SQL-Beispiele lassen sich jedoch auch mit dem
Datenbanksystem MS ACCESS® von Microsoft ausführen.
Sie finden die Hoteldatenbank HOTEL.MDB zum Download
unter der Adresse www.profmueller.de/akad
ST/HfBR/DS-EDV K9039
2
AKAD Diplomandenseminar Wirtschaftsinformatik
Übersicht über die Seminarinhalte
1.
Systemanalyse
2.
Datenbanksysteme
1.1
Systembegriff
2.1
1.2
Ansätze zur Systemanalyse
Ziele und Strategien der Datenorganisation, Datenbankbegriffe
2.2
Das relationale Datenbankmodell (RDBMS)
2.3
Einsatzbeispiel RDBMS (Hoteldatenbank)
1.2.1 Konventioneller Ansatz und Kritik am Lifecycle-Konzept
1.2.2 Prototyping
2.3.1 Relationenmodell und Normalisierung
1.3
2.3.2 Selektion, Projektion und Join
Erhebungs- und Darstellungstechniken
1.3.1 Beobachtung, Interview
2.3.3 Weitere Anfragetypen
1.3.2 Structured (System) Analysis
2.4
1.3.3 Entscheidungstabellentechnik (mit Übungsaufgabe)
Semantische Datenmodelle (EntityRelationship-Diagramm)
2.5
Übungsaufgabe Datenbanken
1.4
3.
Individuelle Datenverarbeitung
1.4.1 Hilfsmittel des Algorithmendesigns
3.1
Begriff und Abgrenzung
1.4.2 Graphische Darstellung von Algorithmen
(Struktogramme)
3.2
Ausgewählte IDV-Anwendungen
Systemimplementierung
1.4.3 Stepwise Refinement
1.5
Projektplanung mit Netzplantechnik
1.5.1 Vorgang, Ereignis, Knoten, Kanten
1.5.2 Beispiel eines Netzplanes
3.2.1 Textverarbeitung
3.2.2 Hypertext
3.2.3 Groupware
3.2.4 Tabellenkalkulation
1.5.3 Übungsaufgabe Netzplantechnik
Die in der obigen Übersicht hervorgehobenen Abschnitte werden in diesem Seminartext ausführlich behandelt und vertieft.
© Copyright
Prof. Thomas Müller, Grundhof / AKAD, 1995, 1999, 2001, 2002, 2003
Alle Rechte vorbehalten.
Vervielfältigung sowie sonstige Verbreitung und Verwertung – auch auszugsweise –
nur mit schriftlicher Genehmigung des Autors.
ST/HfBR/DS-EDV K9039
3
Inhaltsverzeichnis
1.
Strukturierung der Daten (Normalisierung)
4
1.1. Relationenmodell
4
1.2. Daten in unnormalisierter Form
5
1.3. Speichereffizienz der unnormalisierten Form durch Mengen
5
1.4. Redundanzprobleme
6
1.5. Anomalieprobleme
6
1.5.1.
Einfügeanomalien
6
1.5.2.
Änderungsanomalien
7
1.5.3.
Löschanomalien
7
1.6. Problem der Nullwerte
8
1.7. Normalformen von Relationen
8
1.7.1.
Arten der Abhängigkeit
8
1.7.2.
Erste Normalform (1NF)
9
1.7.3.
Zweite Normalform (2NF)
10
1.7.4.
Dritte Normalform (3NF)
12
1.8. Integritätsbedingungen
13
1.8.1.
Referentielle Integrität durch Fremdschlüsselbeziehungen
13
1.8.2.
Weitere Integritätsbedingungen
15
2.
Einrichtung der Datenbank (DDL)
18
3.
Erfassung von Daten (DML)
22
4.
Anfragen an die Datenbasis (Retrieval)
24
4.1. DML Statement SELECT
24
4.2. Anfragetypen Selektion, Projektion und Join
25
4.3. Operatoren in SELECT-Statements
28
4.4. SQL-Funktionen
29
4.5. Subqueries
30
4.6. SQL-Klauseln
32
4.6.1.
ORDER BY-Klausel
32
4.6.2.
GROUP BY-Klausel
33
4.6.3.
HAVING-Klausel
36
4.6.4.
UNION-Klausel
36
4.7. Verwendung von Literalen
38
5.
Änderung und Löschung von Daten
39
6.
Entwicklung von Views für die Datenbank
41
7.
Hinweise zu den normalisierten Relationen
45
8.
Literaturhinweise
46
9.
Stichwortverzeichnis
47
10. Daten des Beispiels
49
11. ER-Diagramm zum Hotelbeispiel
50
12. Abbildungsverzeichnis
51
ST/HfBR/DS-EDV K9039
4
Strukturierung der Daten (Normalisierung)
1.
Strukturierung der Daten (Normalisierung)
1.1. Relationenmodell
Das hier darzustellende Relationenmodell stellt reale Sachverhalte (Daten) in tabellarischer Form dar.
Zu den zu betrachtenden Sachverhalten gehören
die Objekte (Entitäten, entities) mit ihren Eigenschaften (Attributen),
die Beziehungen (relationship) zwischen diesen Objekten, ebenfalls mit ihren Eigenschaften (Beziehungsattribute).
Attribute
Entitytyp
Attributwerte
KdNr
Name
Wohnort
100
Müller
Hagen
101
AKAD
102
Meier
103
Schmidt
Pinneberg
Flensburg
Entities
Kiel
Domänen
z.B.:
KdNr:
Name: Zeichenkette mit 40 Zeichen
Abb. 1: Begriffe des Relationenmodells
Jeder Sachverhalt entspricht einer Zeile (Tupel oder Entities) in einer solchen Tabelle. Eine Relation
ist also eine Menge solcher Tupel. Jedes Tupel wird dabei durch eine endliche Menge gleicher Eigenschaften (Attribute) beschrieben und durch unterschiedliche Eigenschaftswerte (Attributwerte) spezifiziert. Die Attribute entsprechen dabei den Spaltenüberschriften der Tabelle, die Attributwerte den
jeweiligen Eintragungen in einer Zeile.
1
Ausgehend von einer unnormalisierten Form werden die Daten durch schrittweise Zerlegung (Aufspaltung), den Normalisierungsprozess, in mehrere Relationen aufgeteilt, die den spezifischen Notwendigkeiten der betrachteten Objekte und insbesondere ihrer Beziehungen untereinander gerecht
werden.
Die Normalisierung der Relationen dient folgenden Zielen:
1. Vermeidung von Redundanz (mehrmaliges Festhalten ein- und desselben Sachverhaltes).
2. Vermeidung der infolge von Redundanz entstehenden Anomalien und NULL-Werte (Probleme
bei der Datenmanipulation wie Einfügungen, Löschungen in bzw. Aktualisierung der Datenbasis).
3. Sicherung der Daten-Integrität (Speichern realitätskonformer Sachverhalte).
4. Einsparung von Speicherplatz.
Wichtig dabei ist jedoch, dass sich aus jeder im Rahmen des Prozesses gebildeten Form der Daten
(Relationen) die ursprünglich in der unnormalisierten Form vorhandene Information wieder rekon-
1
Von unnormalisierter Form spricht man, wenn alle benötigten Daten unabhängig von ihren jeweiligen Beziehungen sich in einer Tabelle befinden.
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
5
struieren lässt2: Die Normalisierung darf also nicht zu Informationsverlusten führen. Unter Normalisierung versteht man also die verlustfreie Zerlegung einer Relation in mehrere Relationen. Dies wird
dadurch erreicht, dass alle durch Teilung verlorengehenden Beziehungen durch Aufnahme der identifizierenden Eigenschaften (Primärschlüssel) in beide neuen Relationen und Aufbau von Fremd3- und
Primärschlüsselbeziehungen bzw. -verweisen festgehalten werden.
Zusätzlich erhält jede Relation im Rahmen der Normalisierung ein Schlüsselattribut, dessen Attributwert einen Tupel eindeutig identifiziert (Bedingung der Entitätsintegrität). Als Schlüssel kommen
dabei entweder ein einzelnes Attribut einer Relation oder auch eine Kombination mehrerer Attribute in
Betracht (zusammengesetzter Schlüssel). Einen solchen Schlüssel nennt man Primärschlüssel.
1.2. Daten in unnormalisierter Form
Daten in unnormalisierter Form sind daran erkennbar, dass sie Attribute besitzen, die sich aus mehreren Elementen zusammensetzen (z.B. Gast mietet Zimmer mehrmals hintereinander). Daher können
in der unnormalisierten Relation am Kreuzungspunkt von Spalten und Zeilen mehrere Werte (sog.
Mengen) auftreten.
Die Ausgangsrelation für die Datenbank Hotel, die jeweils ein Vermietverhältnis beschreibt, kann in
unnormalisierter Form wie folgt abgebildet werden:
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Abb. 2: Unnormalisierte Relation Vermietung
Beispieldaten (Tupel) der Relation Vermietung zeigen dabei die Möglichkeit des Auftretens von Mengen in der Relation:
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Müller
Hagen
Weg 1
100
EZ
DBF
{1,4}
60.00
Abb. 3: Unnormalisierte Relation Vermietung mit Mengen
Die in dieser Tabelle beschriebenen Sachverhalte besagen, dass der Gast Müller aus Hagen zweimal
das Zimmer 100 gemietet hat. Einmal betrug die Mietdauer einen, das zweite Mal vier Tage.
In dieser unnormalisierten Form die nachfolgend beschriebenen Probleme auf.
1.3. Speichereffizienz der unnormalisierten Form durch Mengen
In der Relation R.Vermietung treten Mengen auf: Im Beispiel können in der Spalte Dauer mehrere
Einträge erfolgen, da ja ein Gast mehrfach hintereinander ein Zimmer mieten kann. Dies widerspricht
rein formal der Forderung, dass Werte im Kreuzungspunkt von Spalten (Attributen) und Zeilen (Enti4
ties) atomar (nicht weiter zerlegbar) sein müssen . Darüber hinaus ist damit das Problem weiterer
Kombinationen (selber Gast, selbes Zimmer, selbe Dauer) noch gar nicht angesprochen; Dies würde
dazu führen, dass alle Attribute zweier Tupel identisch wären. Da unbekannt ist, wieviele Attributwerte
entstehen können, müsste ein entsprechend ausreichender Speicherplatz für diese Mengen bevorratet werden. Dieser müsste bei der Speicherung eines jeden Satzes vorgesehen werden, da der Direktzugriff auf Daten jeweils zur Berechnung der Speicheradresse eine feste Satzlänge voraussetzt.
2
Man nennt diese Bedingung die Referentielle Integritätsbedingung.
3
Vgl. dazu Seite 13.
4
Technisch gesehen müßte hier für alle denkbaren weiteren Vermietungen an denselben Gast entsprechend Speicherplatz freigehalten bzw. bevorratet werden (vgl. AKAD-Heft Datenbanken).
ST/HfBR/DS-EDV K9039
6
Strukturierung der Daten (Normalisierung)
Die gezeigten Mengen ließen sich jedoch einfach wie folgt auflösen:
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Müller
Hagen
Weg 1
100
EZ
DBF
1
60.00
Müller
Hagen
Weg 1
100
EZ
DBF
4
60.00
Abb. 4: Auflösung von Mengen
Im engeren Sinne enthält die obige Relation dennoch eine Menge: Die Ausstattungsmerkmale kennzeichnen ja eigentlich Mengen von Ausstattungsdetails wie Dusche, Bad ... u.s.w.. Genau genommen
müssten auch diese Werte zerlegt werden und für jedes Ausstattungsmerkmal ein neues Attribut in
die Relation aufgenommen werden. Erkennbar ist diese Eigenschaft auch an der entsprechend notwendigen Formulierung zum Auffinden eines Tupels mit dem Merkmal D wie Dusche: Hier ist ein Auffinden nur unter Formulierung einer SELECT...WHERE Ausstattung like '%D%' möglich, einer Selektion, die unterhalb der eigentlichen relationalen Abfrageebene liegt. Damit wären die Ausstattungswerte nicht mehr atomar und würden so den Grundsätzen der Normalformen nicht entsprechen.
In unserem Beispiel betrachten wir jedoch alle Einträge der Art DBFT, DFT,... als unteilbare Menge,
die im Bereich der Domäne ( = Wertebereich) von Ausstattung liegen.
1.4. Redundanzprobleme
Redundanzprobleme ergeben sich durch mehrfache Speicherung ein- und derselben Sachverhaltes
an unterschiedlichen Stellen (Spalten) der unnormalisierten Relation. Sofern ein Gast mehrmals die
Dienste unseres Hotels in Anspruch nimmt (s. Abb. 4), sind alle Gastattribute zu wiederholen. Bei
jeder erneuten Vermietung eines Zimmers sind alle Attribute des Zimmers zu wiederholen. In der
Abb. 4 wären also sowohl die Gastattribute Wohnort und Strasse als auch die Zimmerattribute Art,
Ausstattung und Miete redundant.
Redundanz zieht nicht nur einen erhöhten Speicherbedarf nach sich, sondern führt auch zu weiteren
Probleme im Zusammenhang mit den grundlegenden Speicheroperationen des Einfügens, Löschens
und Änderns. Bei vorliegender Datenstruktur können durch diese Operationen Anomalien entstehen,
die dazu führen, dass der reale Sachverhalt nicht mehr korrekt abgebildet wird. Schließlich treten bei
Redundanz auch oftmals unbestimmte (Null-) Werte auf.
1.5. Anomalieprobleme
1.5.1. Einfügeanomalien
Auch das Einfügen nicht realitätskonformer Sachverhalte führt zur Inkonsistenz der Datenbasis. So
stellt in vorstehender Relation der folgende Einschub keine Verletzung des Relationenprinzips dar:
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Müller
Hagen
Weg 1
110
DZ
DBFR
10
75.00
Meier
Grundhof
Turmweg 7
110
EZ
DBFT
3
75.00
Abb. 5: Inkonsistenzen durch Einfügeanomalien
Die Einfügung des Tupels (Meier, Grundhof, Turmweg 7, 110, DZ, DBFT) führt zur Abbildung des
realitätsfremden Sachverhalts, dass das Zimmer 110 sowohl ein Einzel- als auch ein Doppelzimmer
sein kann.
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
7
1.5.2. Änderungsanomalien
Ändern sich die Ausstattungsmerkmale eines Zimmers (z.B. Zimmer 100 hat nun die Ausstattung Dusche/Bad/Fernsehen/Telefon = DBFT), so wäre sicherzustellen, dass in allen Tupeln (Zeilen) der Relation die Änderungen vorgenommen werden. Werden die Preise für Einzelzimmer (EZ) bspw. generell um 10 % erhöht, so sind diese Änderungen an allen betroffenen Tupeln vorzunehmen. Andernfalls wird die Datenbasis inkonsistent, da sie Widersprüche beinhaltet.
Z.B. kostet das Zimmer 100 für Herrn Müller aus Hagen dann 60.00 €, für Herrn Müller aus Pinneberg
jedoch 66.00 €. Zieht bspw. ein Gast um (von Hagen nach Flensburg), so wäre auch hier eine mehrfache Änderung der Daten (alle Tupel von Müller aus Hagen) erforderlich. Ein Unterlassen der Änderungen in einigen Tupeln würde zur Inkonsistenz der Datenbasis führen.
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Müller
Flensburg
Aue 14
100
EZ
DBF
1
75.00
Müller
Hagen
Weg 1
100
EZ
DBFT
4
60.00
Abb. 6: Inkonsistenzen durch Änderungsanomalien
1.5.3. Löschanomalien
Diese entstehen beim Entfernen von Informationen aus der Datenbasis. Storniert z.B. Herr Meier aus
Grundhof eine Zimmerreservierung für ein neues Zimmer, so sind mit der Stornierung gleichfalls alle
Zimmerattribute verloren, sofern sie nicht "zufällig" in einem anderen Tupel auftreten. Zugleich ist
auch die Adresse des Gastes (sofern er zum ersten Mal bei uns als Gast auftritt) nicht mehr bspw. für
Werbeaktionen verfügbar.
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Meier
Grundhof
Hof 25
109
EZ
DBFR
5
75.00
Müller
Hagen
Weg 1
100
EZ
DBFT
4
60.00
Abb. 7: Inkonsistenzen durch Löschanomalien
Letztendlich dient die Vermeidung von Anomalien der Sicherstellung der Integrität der Datenbasis. So
muss z.B. sichergestellt sein, dass bei Löschungen z.B. aller Vermietverhältnisse mit dem Gast Müller nicht auch zugleich ein Zimmer vollständig gelöscht wird oder dass z.B. bei Löschung eines Gastes alle noch nicht abgerechneten Leistungen erhalten bleiben. Die Sicherung der (referentiellen)
Integrität wird von unterschiedlichen DBMS mehr oder weniger unterstützt.
So kann es sinnvoll sein, im Rahmen der Implementierung einer Anwendung zu definieren, was bei
der Löschung von Gästen mit noch offenen Rechnungen (z.B. definiert durch bestehende Fremd5
schlüsselbeziehung zur Tabelle Rechnung) passieren soll. Im wesentlichen lassen sich hier drei
Optionen anführen:
Abweisung des Löschauftrages
RESTRICT
Löschung aller Vermietverhältnisse
CASCADE
Löschung der Beziehung
NULLIFY
Abb. 8: Optionen des DELETE-Kommando
Zur Vermeidung von Redundanz und in deren Folge entstehenden Anomalieproblemen ist die bisherige Relation R.Vermietung weiter zu zerlegen. Prinzipiell werden dabei die durch die Zerlegung einer
5
Vgl. dazu Seite 13.
ST/HfBR/DS-EDV K9039
8
Strukturierung der Daten (Normalisierung)
Relation verlorengehenden Beziehungen durch verknüpfte Primärschlüssel (gleiche Spalten in unterschiedlichen Relationen) festgehalten (Sicherstellung der Integrität).
1.6. Problem der Nullwerte
Bei näherer Betrachtung der obigen Relation sind folgende Probleme ersichtlich: Soll in die obige
Relation R.Vermietung ein neues Zimmer eingefügt werden, das gerade fertiggestellt wurde, so ergibt
sich das Problem der Null-Werte. Null-Werte können dabei als unbekannte oder auch als nicht zutreffende Werte aufgefasst werden. Da evtl. noch kein Gast für das Zimmer vorhanden ist, müssten in
die Tabelle für alle Gastattribute NULL-Werte eingetragen werden. Desgleichen müssten z.B. bei
telefonischen Bestellungen, denen nicht sofort ein Zimmer zugeordnet werden kann (oder denen
mehrere mögliche Zimmer zugeordnet werden könnten) ebenfalls NULL-Werte für die Zimmerattribute Verwendung finden. Dabei entsteht das Problem der Selektion nach diesen Werten: Beim
Suchen, Ändern oder Löschen kann nur noch nach dem Kriterium "Ist Null" oder "Ist nicht Null" selektiert werden.
R.Vermietung
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
Dauer
Miete
Müller
Hagen
Weg 1
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
110
EZ
DBFT
NULL
75.00
Abb. 9: Beispieldatensätze mit NULL-Werten
Im Rahmen des Normalisierungsprozesses, der zur Vermeidung von Anomalie- und Nullwertproblemen durchgeführt wird, werden in der Praxis drei Normalformen unterschieden, die nachfolgend
anhand unseres Beispiels erläutert werden.
1.7. Normalformen von Relationen
1.7.1. Arten der Abhängigkeit
Zum besseren Verständnis der Definitionen sei hier zunächst der Begriff der Abhängigkeit definiert.
Dabei geht es immer um die Abhängigkeiten zwischen solchen Attributen, die ein Entity eindeutig und
vollständig beschreiben (sog. Schlüsselkandidaten bzw. Schlüsselattribute) und solchen, die diese
Eigenschaft nicht aufweisen (sog. Nichtschlüsselattribute).
Funktionale Abhängigkeit: Funktional abhängig sind Attribute einer Relation, die sich nicht unabhängig voneinander ändern können. Funktionale Abhängigkeit impliziert also, dass zu jedem unabhängigen Attribut 1 genau ein Wert des abhängigen Attributes 2 gehört. Aus der Kenntnis des Wertes des
Attributes 1 kann also der Wert des Attributs 2 abgeleitet werden.
Sei S ein Schlüsselattribut der Relation R(S,A) und A ein weiteres (Nichtschlüssel-) Attribut der Relation: Dann gilt A als funktional abhängig von S, wenn genau zu jedem Wert von S exakt ein Wert von
A gehört:
R.Funktional
S (Kfz-Fahrgestellnummer)
A (Halter)
23479-WX-4576
Müller, Thomas
4456-RDT-3456-W
Müller, Sylvia
Abb. 10: Beispiel Funktionale Abhängigkeiten
Volle funktionale Abhängigkeit: Voll funktional abhängig sind Attribute einer Relation immer dann,
wenn mit einer bestimmten Wertekombination zweier oder mehrerer unabhängiger Attribute genau 1
Wert des abhängigen Attributes einhergeht. Volle funktionale Abhängigkeit impliziert also die Abhängigkeit eines Attributes von einer Attributskombination.
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
9
Seien S1 und S2 ein zusammengesetzter Schlüssel der Relation R(S1, S2, A), dann gilt A als voll
funktional abhängig, wenn zu jeder zulässigen Wertekombination von S1 und S2 genau 1 Wert des
Attributes A gehört.
R.Voll Funktional
S1 (Model)
S2 (Typ)
A (Preis)
Mazda 626
Fließheck
27.856,00
Mazda 626
Kombi
30.800,00
Abb. 11: Beispiel Voll funktionale Abhängigkeiten
Transitive Abhängigkeit: Transitive Abhängigkeiten beschreiben indirekte Abhängigkeiten zwischen
Nichtschlüsselattributen.
Sei S1 ein Schlüssel der Relation R(S1, A, B), dann gilt B als transitiv abhängig, wenn A von S1, S1
aber nicht von A funktional abhängt, B jedoch von A funktional abhängig ist. Im Beispiel ist Halter und
Wohnort von der Fahrgestellnummer funktional abhängig (nicht aber umgekehrt, da eine Person
mehrere Kfz halten kann). Dagegen ist das Bundesland nicht von der Fahrgestellnummer, sondern
vom Wohnort funktional abhängig.
R.Transitiv
S (Kfz-Fahrgestellnummer)
Halter
B (Bundesland)
A (Wohnort)
23479-WX-4576
Müller, Thomas
Schleswig-Holstein
Grundhof
4456-RDT-3456-W
Müller, Sylvia
Hessen
Frankfurt
Abb. 12: Beispiel Transitive Abhängigkeiten
1.7.2. Erste Normalform (1NF)
An die erste Normalform sind die folgenden Bedingungen geknüpft:
Die Attribute dürfen nur einfache Werte aufweisen, d.h., sie müssen atomar (nicht weiter zerlegbar) sein. Am Kreuzungspunkt von Spalten und Zeilen darf höchstens ein skalarer Wert stehen.
Jede Relation erhält einen eindeutigen Schlüssel oder eine eindeutige Schlüsselkombination (Primärschlüssel), der das Tupel eindeutig identifiziert. D.h., es gibt keinen zweiten Tupel mit dem
selbem Primärschlüssel, der eine andere Attributskombination beschreibt.
Die Forderungen der 1NF können durch Aufspaltung der Relation R.Vermietung in 2 neue Relationen
erfüllt werden (Primärschlüssel sind doppelt unterstrichen):
R.Gast
Name
Wohnort
Strasse
R.Vermietung
Name
ZiNr
Art
Ausst.
Dauer
Miete
Abb. 13: Neue Relationen Gast und Vermietung zur Erreichung der 1 NF
Als Primärschlüssel wurde hier der Name des Gastes und - in der Relation R.Vermietung - zusätzlich
die Zimmernummer gewählt. Verlorengehende Beziehungen zu übergeordneten Relationen werden
durch Übernahme des/der Primärschlüssel/-kombination (hier Name) erhalten.
Dies führt jedoch in unserem Beispiel zu folgenden Problemen:
1.
Da ein Primärschlüsselattribut eine Relation eindeutig und vollständig beschreiben soll und er
damit ein eindeutiges Identifizierungsmerkmal darstellt, scheint der Name allein dafür nicht geeignet. Zwei Gäste mit dem Namen Müller wären dadurch nicht voneinander zu unterscheiden.
Denkbar wäre eine Kombination aus Name und Wohnort (zusammengesetzter Schlüssel); je-
ST/HfBR/DS-EDV K9039
10
Strukturierung der Daten (Normalisierung)
doch könnten auch hier offensichtlich Probleme entstehen (2 Gäste Müller aus Frankfurt sind
leicht vorstellbar). Dies könnte Veranlassung geben, auch den Straßennamen in den Schlüssel
aufzunehmen. Es entstünde dadurch jedoch die ursprünglich zerlegte Relation.
2.
Wesentlich vereinfachen lässt sich die Aufspaltung von Relationen jedoch durch die Einführung
eines "künstlichen" Schlüssels, der die Unterscheidung einzelner Entities durch ein Attribut ermöglicht und damit erheblich verkürzt und vereinfacht. Eine solche Möglichkeit bietet z.B. die
Einführung einer eindeutigen Kundennummer (KdNr). Diese wird nur je einmal für einen ganz
bestimmten Gast vergeben und unterscheidet Gäste voneinander. Erst dann ist es möglich,
Gäste mit gleichem Namen, Wohnort und Strasse (Zweifamilienhaus mit Vater und Sohn) zu unterscheiden.
3.
Die Verbindung zwischen den aufgeteilten Relationen lässt sich dann ebenfalls mit nur einer
Spalte in der zweiten Relation abbilden.
4.
Die Definition von Primärschlüsseln in der Datenbank setzt zugleich rein technisch gesehen voraus, dass diese Werte nicht wiederholt auftreten können (UNIQUE-Klausel). Bei der Wahl der
Schlüsselkombination Name, Wohnort, Strasse ist dies jedoch wie gezeigt nicht immer sicherzustellen.
Daraus ergibt sich eine verbesserte Aufteilung der Ursprungsrelation in die neuen Relationen
R.Gast
KdNr
Name
Wohnort
Strasse
ZiNr
Art
Ausst.
R.Vermietung
KdNr
Dauer
Miete
Abb. 14: Verbesserung der 1NF durch künstlichen Schlüssel Kundennummer (KdNr)
Die Redundanz- und Anomalieprobleme für Gastdaten wurden damit entfernt: Jede erneute Vermietung an einen Gast, der bereits einmal da war, würde nur zu einem neuen Datensatz in der Vermietung mit der entsprechenden (vorhandenen) Kundennummer führen. Die Gastattribute treten nun nur
noch einmalig in der Relation Gast auf. Die durch die Aufteilung verlorene Beziehung (Gast Müller
hat Einzelzimmer 100 mit der Ausstattung DBF zu einem Preis von € 60.00 gemietet) wird über die
Aufnahme des Primärschlüssels Kundennummer in die Relation Vermietung erhalten.
Betrachtet man die Relation Vermietung genauer, so bleibt festzustellen, dass auch hier ein Teil der
geschilderten Anomalie- und Redundanzprobleme fortbestehen. Wird ein Zimmer gelöscht, so lassen
sich die Vermietverhältnisse nicht rekonstruieren (Löschanomalie). Art und Ausstattung der Zimmer
können durch Änderungen bei gleicher Zimmernummer verschieden sein (Änderungsanomalie). Gibt
es für ein Zimmer keine offene Rechnung, d.h., keinen Eintrag in der Relation Vermietung mehr, sind
die Zimmerinformationen endgültig verloren (Löschanomalie). Auch tritt weiterhin das Problem der
NULL-Werte auf (Neues Zimmer ohne Vermietung).
Diese Überlegungen führen zur Bildung der 2. Normalform (2NF) einer Relation.
1.7.3. Zweite Normalform (2NF)
Allgemein lässt sich formulieren, dass sich eine Relation in der 2. Normalform (2NF) befindet,
wenn sie sich in der ersten Normalform befindet und zur Beschreibung der Abhängigkeit vom
Primärschlüssel für jedes Nicht-Primärschlüsselattribut alle Attribute des Primärschlüssels und
nicht nur Teile davon gehören (volle funktionale Abhängigkeit der Nichtschlüssel von den Schlüsselattributen). Daraus ergibt sich, dass die 2NF nur bei Vorliegen zusammengesetzter Primärschlüssel (wie im Falle der Relation Zimmer) relevant wird. Relationen mit nur einem Primärschlüsselattribut sind automatisch bei Vorliegen der 1NF auch und der Form der 2NF.
Die Relation Vermietung widerspricht dieser Forderung, da sich hier die Attribute Art, Ausstattung und
Miete bereits aus dem Primärschlüssel Zimmernummer ergeben; Die Kundennummer ist dafür nicht
erforderlich. Dies trifft jedoch nicht für die Mietdauer zu: Diese ist vom Gesamtschlüssel (Kundenund Zimmernummer) abhängig.
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
11
Daher ist die Relation erneut aufzuteilen. Aus der Relation Vermietung ergeben sich nun die beiden
neuen Relationen
R.Zimmer
ZiNr
Art
Ausst.
Miete
Abb. 15: Relation Zimmer in 2NF
R.Vermietung
ZiNr
KdNr
Dauer
Abb. 16: Neue Relation Vermietung
Die Relation Vermietung birgt jedoch einen Nachteil in sich: Da die Attribute Kundennummer und
Zimmernummer als Primärschlüsselkombination jeweils nur einmal eine ganz bestimmte Attributkombination erlauben, wird es hier nicht möglich sein, die zweimalige Vermietung ein- und demselben Zimmers an ein- und denselben Gast historisch abzubilden. Darin zeigt sich eine gewisse
Schwäche des Relationenmodells schlechthin: sollen Historien abgebildet werden, müsste für diese
Relation ein neuer Schlüssel gefunden werden. Vorstellbar wäre hier die Aufnahme des Vermietdatums in den Primärschlüssel, da ja ein Zimmer nicht am gleichen Tag doppelt vermietet sein kann
oder auch die Vergabe einer Ereignisnummer wie Buchungsnummer.
Soll jedoch nicht eine Historie, sondern der jeweilige Zustand (im Sinne eines Platzbuchungssystems)
abgebildet werden, so ergeben sich hier keine Nachteile: Ein- und dasselbe Zimmer kann ja nicht zur
gleichen Zeit zweimal vermietet sein. Die Belegung des Zimmers wird erst wieder möglich, wenn es
frei gegeben wurde (durch Löschung der Vermietung).
In unserem Beispiel soll jedoch die Historie (zur Speicherung aller offenen Posten) abbildbar sein.
Ohne Einführung eines "künstlichen" Schlüssels und unter Verzicht auf einen Primärschlüssel
entstünden die folgenden Relationen, die jedoch eine Verletzung der Entitätsintegrität darstellen.
R.Vermietung
ZiNr
KdNr
Dauer
Abb. 17: Relation Vermietung ohne Primärschlüssel (Struktur)
Diese Vorgehensweise erlaubt nun auch die Abbildung gleicher Attributskombinationen:
R.Vermietung
KdNr
ZiNr
Dauer
100
100
1
100
100
4
100
100
1
Abb. 18: Relation Vermietung ohne Primärschlüssel (Daten)
Aus obiger Tabelle wird zugleich deutlich, dass diese Vorgehensweise erhebliche Nachteile mit sich
führt: Bei allen Datenbankoperationen auf diese Tabelle wäre Zeile 1 nicht mehr von Zeile 3 zu unterscheiden. D.h., Löschungen, Änderungen oder Selektionen würden immer beide Zeilen zugleich
betreffen, da hier kein eindeutiges Unterscheidungsmerkmal vorhanden ist.
Daher fügen wir auch in diese Relation einen künstlichen Schlüssel ein, dessen einzige Aufgabe es
ist, die Tupel eindeutig voneinander zu unterscheiden. Es wird hier die Einführung einer Buchungsnummer (BuNr) als Primärschlüssel vorgeschlagen. Damit ist zugleich einer grundsätzlichen Forderung des Datenbankentwurfs Rechnung getragen: Jede Relation verfügt über einen Primärschlüssel
(Bedingung der Entitätsintegrität).
ST/HfBR/DS-EDV K9039
12
Strukturierung der Daten (Normalisierung)
Aus den genannten Gründen ergibt sich folgende neue Relation Vermietung:
R.Vermietung
ZiNr
BuNr
KdNr
Dauer
Abb. 19: Primärschlüssel Buchungsnummer in der Relation Vermietung
1.7.4. Dritte Normalform (3NF)
Die Forderung der 3. Normalform (3NF) betrifft die direkte Abhängigkeit aller Nichtschlüssel- vom
Schlüsselattribut. Eine Relation befindet sich in der 3NF, wenn sie sich in der 2NF befindet und
alle Nichtschlüsselattribute direkt vom Primärschlüssel abhängen. Das heißt, dass alle Nichtschlüsselattribute wechselseitig voneinander unabhängig sind und damit auch keine indirekten Abhängigkeiten (Transitivität) der Nichtschlüsselattribute untereinander bestehen.
Die Relation Zimmer des Beispiels weist eine solche indirekte Abhängigkeit auf: Die Zimmermiete
wird in unserem Beispiel zunächst direkt von der Ausstattung bestimmt, nicht jedoch vom Primärschlüssel Zimmernummer. Daher ist hier die Miete in eine neue Relation Preis auszugliedern,
was zu folgenden neuen Relationen führen würde:
R.Preis
Ausst.
Miete
Abb. 20: Neue Relation Preis
R.Zimmer
ZiNr
Art
Ausst.
Abb. 21: Relation Zimmer in 3NF
Andererseits ist die Abhängigkeit des Preises nur von der Ausstattung in unserem Beispiel nicht realitätsnah: Zusätzlich müsste noch die Art des Zimmers in der Miete berücksichtigt werden (Doppelzimmer mit DBF teurer als Einzelzimmer mit DBF). Daher ist in die Preisrelation die Art als Schlüssel
mit aufzunehmen, was zu einem zusammengesetzten Schlüssel führt:
R.Preis
Art
Ausst.
Miete
Art
Ausst.
R.Zimmer
ZiNr
Abb. 22: Verbesserte Relationen Preis und Zimmer in 3NF
In diesem Beispiel ist zugleich ersichtlich, dass die Redundanz der Primärschlüssel sehr stark ansteigt. Damit steigt z.B. zugleich der Aufwand bei einer entsprechenden Abfrage der Tabellen (z.B.
SELECT ZiNr, Zimmer.Ausstattung, Zimmer.Art, Miete FROM Zimmer, Preis WHERE Zimmer.Ausstattung = Preis.Ausstattung AND Zimmer.Art = Preis.Art)6.
Bei weiterer Prüfung der Relationen zeigt sich, dass nun durch Einfügen, Ändern und Löschen keine
Anomalien mehr erzeugt werden können. Daher wurde die 3. Normalform erreicht.
Ein letztes Problem besteht allerdings noch bezüglich solcher Attributwerte, die sich zum Zwecke der
Verbindung der Relationen untereinander in einer weiteren Relationen befinden. Für alle diese Werte
muss gelten: Es muss ein entsprechender Wert in der anderen Relation existieren. Folgende zwei
Beispiele mögen den Zusammenhang erhellen:
6
Vgl. dazu Kapitel Anfragen an die Datenbasis (Retrieval) auf Seite 24.
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
13
1. Niemals darf in der Relation Vermietung eine Kundennummer existieren, für die sich in der Relation Gast nicht ein entsprechender Wert finden lässt. Der Adressat einer Rechnung ließe sich nicht
ermitteln.
2. Niemals darf sich in der Relation Vermietung ein Zimmer befinden, das nicht in der Relation Zimmer existiert. Art und Ausstattung würden damit nicht feststellbar sein, womit auch eine Preisermittlung unmöglich wäre.
Man nennt diese Bedingungen auch die Bedingungen zur Sicherung der referentiellen Integrität. Ein
mögliches Instrument zur Sicherung der referentiellen Integrität, das von den meisten Datenbanksystemen unterstützt wird, ist die Möglichkeit zur Formulierung von Fremdschlüsselbeziehungen7.
1.8. Integritätsbedingungen
1.8.1. Referentielle Integrität durch Fremdschlüsselbeziehungen
Fremdschlüsselbeziehungen erleichtern die Erhaltung der Integrität, insbesondere der referentiellen
Integrität, einer Datenbank.
Ein Fremdschlüssel ist ein Attribut, dass in einer anderen Relation ein Primärschlüsselattribut ist.
Zwischen beiden baut das DBMS eine besondere Beziehung auf, die sicherstellt, dass zu jeder Zeit
für alle Fremdschlüsselattribute ein entsprechendes Primärschlüsselattribut gefunden wird. Dies ist
bei allen Verbunden8 von Tabellen relevant.
Beispiel: Gegeben sei folgendes, leicht verkürzte Relationenschema:
R.Vermietung (BuNr, KdNr, ZiNr, Dauer)
R.Gast (KdNr, Name, Wohnort, Strasse);
R.Zimmer (ZiNr, Ausstattung, Ausstattung);
Ohne Formulierung von Fremdschlüsselbeziehungen wären folgende Einschübe in die Relationen
möglich, die eine Rekonstruktion der Gesamtinformation nicht mehr ermöglichen würden:
•
Einfügen/Ändern einer KdNr in Vermietung, für die in R.Gast kein Datensatz/kein Entity existiert.
•
Einfügen/Ändern einer ZiNr in Vermietung, für die in R.Zimmer kein Datensatz existieren.
•
Löschen eines Zimmers/Gastes, für das in Relation Vermietung eine (vielleicht noch nicht abgerechnete) Vermietung verzeichnet ist; Es wäre bei Rechnungsstellung kein Zimmer und damit
auch kein Preis bestimmbar bzw. kein Rechnungsadressat mehr vorhanden.
Im obigen Beispiel wäre es also sinnvoll, zwischen der Relation Gast bzw. der Relation Zimmer und
der Relation Vermietung eine Fremdschlüsselbeziehung aufzubauen. Die Fremdschlüsselattribute
sind die, die in beiden Relationen enthalten sind und in der referenzierten Relation Primärschlüsseleigenschaft haben. In den referenzierenden Relationen sind diese Attribute die Fremdschlüsselattribute:
Relation
Primärschlüssel
Fremdschlüssel
referenzierte Relationen
Gast
KdNr
-
-
Zimmer
Vermietung
Preis
ZiNr
BuNr
Art, Ausstattung
Art, Ausstattung
KdNr, ZiNr
-
Preis
Gast, Zimmer
-
Abb. 23: Primär- und Fremdschlüssel des Relationenschemas Hotel
Die Formulierung von Fremdschlüsselbeziehungen sorgt dafür, dass zu einer Vermietung immer und
zu jeder Zeit ein Gast in der Relation Gast und ein Zimmer in der Relation Zimmer gefunden wird
(referentielle Integritätsbedingung), da sie zur Folge hat, dass Änderungen/Einfügungen/Löschungen,
die die Integrität zerstören würden, i.d.R. zurückgewiesen würden oder zumindest die korrekte Rei-
7
Eine Alternative dazu stellt die Verwendung von Datenbank-Triggern da, die die Einhaltung der
beschriebenen Regeln überwachen.
8
Ein Verbund selektiert Daten aus mehreren Tabellen und wird auch als Join bezeichnet.
ST/HfBR/DS-EDV K9039
14
Strukturierung der Daten (Normalisierung)
henfolge der Operationen einzuhalten wäre. Gleiches gilt für die Beziehungen zwischen Zimmer und
Preis.
Folgende Tabelle zeigt, welche Operationen auf mit Fremdschlüsselbeziehungen versehene Tabellen
erlaubt bzw. abgewiesen werden. Dabei ist beispielsweise Vermietung die referenzierende, Gast bzw.
Zimmer die referenzierte Relation, d.h., Vermietung.KdNr referenziert Gast.KdNr und Vermietung.ZiNr referenziert Zimmer.ZiNr. Gleiches gilt für Zimmer (referenzierende) und Preis (referenzierte Relation). Dabei wird die Option RESTRICT unterstellt.
Operation Granularität9
Vermietung
Gast
Zimmer
Preis
INSERT
Tupel
erlaubt, wenn in erlaubt, z.B.
neuer Gast
Gast ein Entity
mit KdNr und in
Zimmer ein
Entity mit ZiNr
vorhanden ist,
sonst wird abgewiesen
erlaubt, wenn
die beschriebene
Art/ Ausstattung
in der Relation
Preis enthalten
ist, sonst wird
abgewiesen
erlaubt, z.B.
neue Art/Ausstattungskombination mit
einem Preis
DELETE
Tupel
erlaubt
erlaubt, wenn
in Vermietung
kein Gast mit
dieser KdNr
mehr existiert,
sonst wird abgewiesen
erlaubt, wenn in
Vermietung kein
Zimmer mit dieser ZiNr mehr
existiert, sonst
wird abgewiesen
erlaubt, wenn in
Zimmer kein Tupel mehr mit der
entsprechenden
Art/Ausstattung
existiert, sonst
wird abgewiesen
UPDATE
Nichtschlüsselattribut
erlaubt, z.B.
Dauer
erlaubt, z.B.
Wohnort
nicht vorhanden
erlaubt, z.B.
Miete
Primärschlüsselattribut
wird abgewiesen
wird abgewiesen
wird abgewiesen
wird abgewiesen
Fremdschlüsselattribut
erlaubt, wenn in nicht vorhanden
Gast ein Entity
mit KdNr und in
Zimmer ein
Entity mit ZiNr
vorhanden ist,
sonst wird abgewiesen
erlaubt, wenn
die geänderte
Art/ Ausstattung
in der Relation
Preis enthalten
ist, sonst wird
abgewiesen
nicht vorhanden
Abb. 24: Operationentableau bei Fremdschlüsselbeziehungen
Daraus, dass eine Operation abgewiesen wird, ist jedoch nicht endgültig zu schließen, dass diese
Operation überhaupt nicht möglich wäre: Entscheidend ist - wie beim Einfügen auch (s. Kapitel 3:
Erfassung der Daten) bereits verdeutlicht - die Reihenfolge der Operationen und die bei der Einrichtung der Relationen vereinbarten Optionen von Update/Delete, die RESTRICT, CASCADE oder
NULLIFY sein können.
INSERT in eine referenzierende Relation (z.B. Vermietung) erfordert erst das Einfügen der/des entsprechenden Tupels in der/die referenzierten Tabelle/n (Gast und Zimmer); m.a.W. ist zuerst ein
Gast mit der entsprechenden KdNr und (es handelt sich ja hier um eine zusammengesetzte Fremdschlüsselbeziehungen) ein Zimmer mit der entsprechenden ZiNr einzufügen, dann kann in Vermietung das Tupel mit der entsprechenden KdNr und ZiNr (für die dann ja Werte in Gast.KdNr und Zimmer.ZiNr gefunden werden) eingefügt werden.
9
Granularität = kleinste, mit einer Datenbankoperation erreichbare Attributmenge. Man unterscheidet dabei einmal die Zeile (z.B. Löschen mindestens einer Zeile, nicht aber eines Attributes) und
den Attributwert (z.B. Ändern nur eines Attributwertes, die übrigen Attributwerte bleiben unverändert).
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
15
DELETE in einer referenzierten Relation (Gast und Zimmer) erfordert erst das Löschen der/des
entsprechenden Tupels in der/den referenzierenden Relation/en (Vermietung); m.a.W. ist bspw.
zuerst die Vermietung mit der entsprechenden KdNr/ZiNr-Kombination zu löschen; erst dann kann der
Gast mit der entsprechenden KdNr und (es handelt sich ja hier um eine zusammengesetzte
Fremdschlüsselbeziehungen) das Zimmer mit der entsprechenden ZiNr gelöscht werden. Andernfalls
würde ja auch bspw. eine Rechnung für eine Vermietung keine Gastadresse mehr finden.
UPDATE erfordert dagegen eine differenzierte Betrachtung: Zum einen könnte man die Änderung
des Wertes eines Primärschlüsselattributes, zum anderen auch die eines Nichtschlüsselattributs und
drittens auch die eines Fremdschlüsselattributs vornehmen wollen.
Die Änderung des Wertes eines Nichtschlüsselattributes in referenzierender und referenzierter
Relation (z.B. Vermietung.Dauer und Zimmer.Art oder Gast.Name) stellt uns vor keine Probleme, da
die Fremdschlüsselbeziehungen dadurch nicht berührt werden.
Die Änderung eines Primärschlüsselattributwertes wird in der/den referenzierten Relation/en
(Gast/Zimmer) auf jeden Fall abgewiesen, da sich - wie beim Ändern - ein Informationsverlust einstellen würde (nicht für alle Tupel in der referenzierenden Relation (Vermietungen) würde dann ein
Gast/Zimmer in der/den referenzierten Relation/en (Gast/Zimmer) gefunden. Gleiches gilt für die
Primärschlüsselattribute der referenzierenden Relation/en (Vermietung). In diesem Falle wäre nur ein
Löschen und ein anschließendes Einfügen (in der jeweils oben beschriebenen Reihenfolge) möglich.
Für den Wert eines Fremdschlüsselattributs in der (ja nur dort vorkommenden) referenzierenden
Relation (Vermietung) ist in den oben genannten Grenzen (KdNr und ZiNr müssen in Gast/Zimmer
vorhanden sein) eine Änderung möglich: eine in Gast vorhandener KdNr kann ja jederzeit ein in
Zimmer vorhandene ZiNr buchen; da jedoch hier die Fremd- zugleich auch die Primärschlüsselkombination der Relation Vermietung ist, scheitert dies an der Nichtänderbarkeit der Primärschlüssel
(s.o.)! Zu lösen wäre dieses Problem, wenn in Vermietung eine fortlaufende Buchungsnummer (BuNr)
als Primärschlüsselattribut eingefügt würde (wie dies ja bereits geschehen ist) und die Primärschlüsseleigenschaft der Attribute KdNr sowie ZiNr in Vermietung aufgehoben würden. Dann wäre hier eine
Änderung von Vermietung.KdNr und Vermietung.ZiNr möglich.
1.8.2. Weitere Integritätsbedingungen
Im Rahmen der Entwicklung des obigen Datenbankschemas wurde bisher auf die Bedeutung der
referentiellen Integrität sowie die der Entitätsintegrität hingewiesen. Neben diesen ist darüber hinaus
auch die benutzerdefinierte Integrität von Bedeutung.
Im Rahmen der Sicherstellung der benutzerdefinierten Integrität ist es oft wünschenswert, die Einhaltung von Werten einer Domäne (Wertebereich) sicherzustellen, um "unsinnige" Eingaben zu verhindern. Eine solche Sicherung könnte auf unterschiedliche Art und Weise bewirkt werden: Zum
einen sind zu verschiedenen Datenbanken Werkzeugprogramme (TOOLS) erhältlich, die über solche
Sicherungsmechanismen verfügen (z.B. SQL-Forms für das DB-System ORACLE). Weiterhin könnten über die Verwendung von Views (s. unten) unter Einsatz der CHECK OPTION Wertebereiche
eingegrenzt werden (sog. Constraints). Sofern solche Mechanismen jedoch in dem verwendeten
Datenbanksystem nicht implementiert sind, hilft oft der "Umweg" über die Nutzung der Instrumente
zur Sicherstellung der referentiellen Integrität. Ein Beispiel mag den Zusammenhang erhellen:
Nehmen wir an, unsere Relation Gast sollte für die Zwecke der Serienbrieferstellung ein zusätzliches
Attribut Anrede erhalten: m für männlich (Anrede: Herrn), w für weiblich (Anrede: Frau) und f für Firma (Anrede: keine spezielle). Bei der Erfassung neuer Gäste kann es nun vorkommen, dass dem
Erfasser der Daten die Kürzel nicht präsent sind. Er könnte bspw. für männlich H (Anrede: Herrn) und
für weiblich F (Anrede: Frau) eingeben. Bei entsprechender Selektion durch ein Textverarbeitungssystem, das Serienbriefanschriften aus unserer Datenbank entnimmt, könnten die Tupel, die mit H oder
F gekennzeichnet sind, nicht korrekt verarbeitet werden, da die Tupel ja nach Anrede=m oder Anrede=w oder Anrede=f selektiert würden.
Zur Lösung eines solchen (oder ähnlichen Problems) könnte man eine zusätzliche Relation Floskel in
die Datenbank aufnehmen. Diese weist einen Grad von 1 auf (d.h., sie hat genau 1 Attribut, das wir
Bezeichnung nennen wollen). Wir nehmen dazu genau 3 Tupel (Kardinalität der Relation ist dann 3)
in die Relation auf: Nämlich die Werte "m" , "w" und "f" (für Herrn/ Frau/Firma). Was haben wir nun
erreicht? Wenn wir zwischen dem Attribut Gast.Anrede und dem Attribut Floskel.Bezeichnung eine
Fremdschlüsselbeziehung aufbauen (Gast.Anrede referenziert Floskel.Bezeichnung), so wird die
Aufnahme einer Anrede bei der Erfassung des neuen Gastes, deren Wert nicht in Flos-
ST/HfBR/DS-EDV K9039
16
Strukturierung der Daten (Normalisierung)
kel.Bezeichnung enthalten ist, abgewiesen. Es kann somit nicht zu einer falschen Erfassung von
Werten für die Anrede kommen.
Das geschilderte Problem erscheint relativ trivial. Ein ähnliches Problem jedoch könnte die Erfassung
von Rechtsformen gespeicherter Unternehmen sein. Wer will dann aber noch zwischen den (identischen) Rechtsformen "GmbH + .CO" bzw. "GmbH & CO" oder auch "GmbH & CO.KG" bei einer
Selektion nach Rechtsformen unterscheiden?
Insgesamt ergeben sich folgende Relationen, die nun unmittelbar in die Datenbanksprache SQL umgesetzt werden können. Die Relationennamen entsprechen den Tabellennamen, die Attributbezeichnungen den der Spaltennamen der Datenbank. Primärschlüssel sind doppelt, Fremdschlüsselbeziehungen einfach unterstrichen:
R.Gast
(KdNr, Name, Wohnort, Strasse)
R.Zimmer
(ZiNr, Ausstattung, Art )
R.Preis
(Ausstattung, Art, Miete)
R.Vermietung
(BuNr, KdNr, ZiNr, Dauer)
Abb. 25: Relationenschema zur Datenbank Hotel mit Primär- und Fremdschlüsseln
Ungelöst ist allerdings noch das Problem der Postleitzahlen. Soll die Adresse um eine Postleitzahl
ergänzt werden, müsste genau genommen zusätzlich die Relation PLZ
R.PLZ
(Ort, PLZ)
Abb. 26: Ergänzungen zum Relationenschema Hotel
als eigenständige Relation errichtet werden. Andernfalls würde - bei Aufnahme der PLZ in die Relation Gast - die Forderung der 3NF (Nicht-Transitivität, d.h., keine wechselseitige Abhängigkeit der
Nichtschlüsselattribute) nicht erfüllt: Die PLZ ist funktional abhängig vom Ort, nicht aber vom Primärschlüssel der Relation, der Kundennummer des Gastes. Sichtbar würde dies nicht nur am Datenbankschema, sondern auch an einem möglichen Inhalt der Datenbasis. Hier wären dann nämlich folgende
Entities vorstellbar:
R.Gast_Mit_PLZ
KdNr
PLZ
Wohnort
...
1
24977
Grundhof
...
2
24997
Grundhof
...
...
...
...
...
Abb. 27: Relation Gast mit Verstoß gegen die 3NF
Es ist unmittelbar einsichtig, dass bei Änderungen des Wohnortes des Gastes mit der KdNr 1 (z.B. in
den Ort Hagen) und "vergessener" Änderung der PLZ (in 58093) Mutationsanomalien entstehen. Dies
kann durch Auslagerung in die Relation PLZ einfach verhindert werden, da sich dort dann die korrekte
Postleitzahl für Hagen finden würde. Dadurch würde zugleich das Auftreten einer transitiven Abhängigkeit zwischen PLZ und Wohnort (wechselseitige Abhängigkeit, keine direkte Abhängigkeit vom Primärschlüssel) verhindert.
Die Beziehung zwischen Postleitzahl und Ort ist in der Bundesrepublik wie folgt zu beschreiben:
Jeder Ort hat genau eine Postleitzahl; eine Postleitzahl kann jedoch zu mehreren Orten gehören.
Daher wurde der Ort(sname) als Primärschlüssel für die Relation PLZ verwendet. Die wenigen Ausnahmen, dass ein Ort auch mehrere Postleitzahlen haben kann, vernachlässigen wir hier. Dieser
Umstand könnte aber durch Bildung der Primärschlüsselkombination PLZ, ORT berücksichtigt werden.
Nach der Einführung des neuen Postleitzahlsystems ändert sich die Situation allerdings: Größere
Orte können nun über mehrere Postleitzahlen verfügen. Außerdem gibt es die an ein Postfach gekoppelte Postleitzahl und zusätzlich die Postleitzahl von Großkunden. Dies würde letztlich bedeuten,
dass das Gesamtverzeichnis der Postleitzahlen jeweils als eigenständige Relation vorzuhalten wäre.
ST/HfBR/DS-EDV K9039
Strukturierung der Daten (Normalisierung)
17
Es müsste eine Fremdschlüsselbeziehung zwischen Ort und Straße bzw. Postfach hergestellt werden.
Dies bedeutet jedoch, dass auch bei einem geringem Adressenbestand eine große Datenmengen (im
Prinzip das gesamte Verzeichnis der Postleitzahlen in Deutschland) in einer Relation vorzuhalten
wären. Daher erscheint es in diesen Fällen sinnvoll, die Postleitzahl als Attribut zur (Gast-) Adressen
aufzunehmen und die Redundanz in Kauf zu nehmen.
ST/HfBR/DS-EDV K9039
18
Einrichtung der Datenbank (DDL)
2.
Einrichtung der Datenbank (DDL)
Vor der konkreten Einrichtung der Relationen in der Datenbank muss die Wahl geeigneter Datentypen erfolgen. Die Wahl der Datentypen für die Attribute hängt in hohem Maße von dem verwendeten DBMS ab. Die hier gezeigten Typen werden u.a. vom Datenbanksystem INTERBASE10
unterstützt. Vor der Errichtung der Tabellen lassen sich entsprechende Domänen im DBMS einrichten, die eine exakte Abgrenzung von möglichen Wertemengen erlauben.
Domäne
Datentyp
Check
DomKdNr
Integer
Values Between 100 and 999
DomZiNr
Integer
Values Between 100 and 300
DomArt
VarChar(2)
Values in (‘EZ’, ‘DZ’)
Abb. 28: Domänen der Datenbank HOTEL
Spalte
Datentyp
Inhalt
Primärschlüssel
Fremdschlüssel
KdNr
DomKdNr
Kundennummer
Gast
Vermietung
Name
VarChar(50)
Name des Gastes
-
-
Wohnort
VarChar(50)
Wohnort des Gastes
-
PLZ
Strasse
VarChar(50)
Strasse des Gastes
ZiNr
DomZiNr
Zimmernummer
Zimmer
Vermietung
Art
DomArt
Einzel-/Doppelzimmer
Preis
Zimmer
Ausstattung
Varchar(10)
Ausstattungskürzel
Preis
Zimmer
Miete
Double Precision
€-Betrag je Nacht und Person -
-
BuNr
Integer
Buchungsnummer
Vermietung
-
Dauer
Integer
Aufenthalt in Tagen
-
-
-
Abb. 29: Datentypen der Attributswerte der Relationen
Die Einrichtung der Datenbank erfolgt mit den DDL11 Statements von SQL; diese lassen sich wie folgt
strukturieren:
(a) Bildung physikalischer Strukturen
CREATE|OPEN|CLOSE|DROP
DATABASE
CREATE|ALTER|DROP
TABLESPACE|INDEXSPACE
CREATE
BUFFERSPACE
(b) Bildung logischer Strukturen
CREATE|ALTER|DROP
TABLE|VIEW
CREATE|DROP
INDEX|SCHEMA
10
Das Datenbanksystem Interbase wird als lokale Datenbank von Inprise (Borland) mit der Entwicklungsumgebung DELPHI ausgeliefert und ist mittlerweile auch unter Open Source verfügbar. Für
die Beispiele wurde die Version: WI-V5.1.1.680 verwendet.
11
DDL = Data Definition Language (CREATE, DROP, ...)
DCL = Data Control Language (GRANT, REVOKE: Verwaltung von Rechten der Benutzer).
ST/HfBR/DS-EDV K9039
Einrichtung der Datenbank (DDL)
19
(c) Datenbankerweiterung/Rekonstruktion
CREATE|DROP
SYNONYM
Abb. 30: DDL Befehle von SQL
Die Datenbank wird nun mit der folgenden Anweisung eingerichtet:
CREATE DATABASE HOTEL USER „xyz“ PASSWORD „mypassword“
Damit wird die Datenbank auch zugleich eröffnet. Nach Verlassen mit EXIT und neuer Nutzung kann
diese dann mit CONNECT DATABASE Hotel adressiert werden. Anschließend wird ist der physikalische Speicherplatz zu reservieren:
CREATE TABLESPACE Dateiname;
CREATE INDEXSPACE Dateiname;
Die Einrichtung und Strukturierung der Tabellen erfolgt mit der CREATE TABLE-Anweisung. Das
DDL Statement CREATE TABLE ist ein extrem komplexer Befehl, der je nach SQL-Implementierung
über eine Vielzahl von Optionen z.B. zur Sicherung der referentiellen Integrität der Datenbasis verfügt.
CREATE TABLE [creator].Tabellenname
(Spaltenname Spaltentyp,
[NOT NULL [UNIQUE]
[DEFAULT literal | NULL | USER]
[PRIMARY KEY]
[REFERENCES [creator.]Tabellenname
[ON UPDATE RESTRICT
[ON DELETE | RESTRICT | CASCADE | SET NULL]]
{,repeat}
[,UNIQUE (Liste von Spaltennamen)]
[,PRIMARY KEY(Liste von Spaltennamen)]
[,FOREIGN KEY (Liste von Spaltennamen)]
REFERENCES [creator.]Tabellenname
[ON UPDATE RESTRICT
[ON DELETE | RESTRICT | CASCADE | SET NULL]]
{,repeat}
[IN | TABLESPACE | INDEXSPACE Dateiname]
[CHECK (Spaltenname Restriktion)
{,repeat}
Abb. 31: DDL Befehl CREATE TABLE von SQL
Dabei gelten die folgenden Konventionen:
[]
Optionale Angaben
{}
wiederholbare Angaben
|
alternative Angaben/Optionen
Die Bedeutung der wichtigsten Schlüsselwörter dabei sind:
NOT NULL
keine Null-Werte erlaubt, kein Leerfeld
UNIQUE
identische Werte in unterschiedlichen Tupeln nicht erlaubt
PRIMARY KEY
definiert das/die Schlüsselfelder
FOREIGN KEY/
REFERENCES
Festlegung einer Fremdschlüsselbeziehung durch Angabe der referenzierten Tabelle; Spaltenname muss identisch sein.
ON DELETE/ON UPDATE
Statements zur Sicherung der referentiellen Integrität der Datenbank
Abb. 32: Schlüsselwörter des CREATE TABLE Befehls von SQL
ST/HfBR/DS-EDV K9039
20
Einrichtung der Datenbank (DDL)
Die entworfenen Relationen können damit wie folgt eingerichtet werden:
CREATE TABLE Gast (KdNr
Name
Wohnort
Strasse
DomKdNr NOT NULL PRIMARY KEY,
Varchar(50) NOT NULL,
Varchar(50),
Varchar(50));
Abb. 33: Einrichtung der Relation Gast
Zusätzlich könnte die Spalte Gast.Wohnort auch die Spalte PLZ.Ort als Fremdschlüssel referenzieren. Dies hätte den Vorteil, dass ein neuer Gast nur dann eingefügt werden könnte, wenn sich in der
Tabelle PLZ auch der entsprechende Ortsname finden würde. Das Weglassen dieser Option führt
dann dazu, dass bei einer Anfrage nach der vollständigen Adresse eines Gastes (inkl. Postleitzahl)
ein solcher Gast nicht selektiert würde. Vermeiden ließe sich dies durch die Formulierung der Anfrage
als Outerjoins, einer speziellen Form des Joins (zum Join siehe unten). Andererseits lässt sich durch
das hier gewählte Relationenschema auch ein Gast ohne PLZ erfassen.
Dann kann die Relation Preis erfasst werden, da sie ebenfalls keine Fremdschlüsselbeziehung aufweist.
CREATE TABLE Preis (Ausstattung Varchar(10) NOT NULL,
Art
DomArt
NOT NULL,
Miete
Double Precision NOT NULL,
PRIMARY KEY (Ausstattung, Art));
Abb. 34: Einrichtung der Relation Preis
Nun kann die Relation Zimmer formuliert werden, da sie die Relation Preis referenziert und diese bereits implementiert ist.
CREATE TABLE Zimmer(ZiNr
Dom ZiNr
NOT NULL PRIMARY KEY,
Ausstattung Varchar(10) NOT NULL,
Art
DomArt
NOT NULL,
FOREIGN KEY (Ausstattung, Art)
REFERENCES Preis);
Abb. 35: Einrichtung der Relation Zimmer
Die Angabe REFERENCES Preis baut eine Fremdschlüsselbeziehung zu dem gleichnamigen Attribut
Ausstattung der Relation Preis auf. Dabei könnten entsprechende Optionen für das Löschen (z.B.
Löschen einer Ausstattungs-/Preisrelation führt zur Ablehnung [Option ON DELETE | RESTRICT), so
dass die referentielle Integrität sichergestellt bleibt) formuliert werden. Das Weglassen einer solchen
Option impliziert hier jedoch automatisch die RESTRICT Option.
Es fehlen noch die Tabellen Vermietung und PLZ für die Datenbank HOTEL:
CREATE TABLE Vermietung(BuNr Integer
NOT NULL PRIMARY KEY,
KdNr DomKdNr
NOT NULL
REFERENCES Gast,
ZiNr DomZiNr
NOT NULL
REFERENCES Zimmer,
Dauer Integer
NOT NULL);
Abb. 36: Einrichtung der Relation Vermietung
CREATE TABLE PLZ
(PLZ
Ort
Numeric(4),
VarChar(50) NOT NULL PRIMARY KEY);
Abb. 37: Einrichtung der Relation Postleitzahl
ST/HfBR/DS-EDV K9039
Einrichtung der Datenbank (DDL)
21
Für jeden Schlüssel einer Relation kann nun Indexfile angelegt werden. Vorteil: Schnellerer Zugriff
auf die Schlüssel der Relationen über einen Index (z.B. bei einem Equi-Join).
CREATE [UNIQUE] INDEX
[creator.] Indexname
ON
Tabellenname [ASC|DESC] {repeat,][Cluster]}
[INDEXSPACE
Indexspace-Name];
Abb. 38: DDL Befehl CREATE INDEX von SQL
ST/HfBR/DS-EDV K9039
22
Erfassung von Daten (DML)
3.
Erfassung von Daten (DML)
Die Erfassung der Daten erfolgt über die DML-Statements12 von SQL (Data Manipulation Language).
Diese sind:
INSERT
Einfügen von Daten in eine Tabelle/ein View
UPDATE
Ändern von Daten einer Tabelle/eines Views
DELETE
Löschen von Daten aus einer Tabelle/einem View
Abb. 39: DML Befehle von SQL
Als Quelle zur Neuerfassung von Daten kommen die Tastatur, aber auch der Import von Daten in Betracht. Zusätzlich ist es jedoch auch möglich, in Tabellen Werte aus anderen Tabellen einzufügen.
Zum Einfügen von Daten in die Tabellen steht das DML Sprachelement INSERT zur Verfügung. Die
Übernahme von Daten aus anderen Dateien (Import) setzt die entsprechende Formatierung der Eingangsdaten voraus. Diese Formatierung hängt von der verwendeten SQL-Implementierung ab.
Prinzipiell hängt die Syntax des INSERT-Kommando von der Quelle der Daten ab:
Tastatur
INSERT INTO Tabellenname VALUES (Wert1[,Wert2..,WertN]);
Datei
INSERT INTO Tabellenname FILE Dateiname;
andere DB-Tabelle
INSERT INTO Zieltabelle
SELECT Spalten
FROM Quelltabelle
WHERE Bedingung
ORDER BY | GROUP BY | ...
Abb. 40: Optionen des INSERT-Kommandos
Bei der Erfassung der Daten spielt - zumindest in der hier verwendeten SQL-Implementierung - bereits der Datenbankentwurf eine wesentliche Rolle: Die Daten können nicht in beliebiger Folge in die
Tabellen eingefügt werden (s. 1.9.1). Die referentielle Integrität wird durch das System INTERBASE
auf Grund der Angaben der Fremdschlüsselbeziehung in den DDL Statements automatisch überwacht. In anderen DBMS wie bspw. ORACLE werden die Integritätsbedingungen erst nach Abschluss
einer Transaktion (vollständige Eingabe der Daten) geprüft.
Hier können jedoch aufgrund der Verweise in der Relation Vermietung auf andere Relationen Einträge in die Relation Vermietung erst erfolgen, wenn die entsprechenden referenzierten Spalten der
Tabellen Gast und Zimmer die einzufügenden Werte aufweisen. Beispiel: Einfügen der Vermietung
(1,102,3) erfordert einen vorherigen entsprechenden Eintrag in den Tabellen Gast (1,'...') und Zimmer
(102,...)!
Ebenso ist es nicht möglich, ein neues Zimmer einzufügen, wenn in der Preisrelation nicht die entsprechende Ausstattungs-/Artkombination mit seinem Preis beschrieben ist. Ist in der Relation Preis
beispielsweise derzeit nur der Tupel ('DBT','EZ',55) enthalten, so können in Zimmer die Werte
(100,'DBT','EZ'), nicht aber Werte wie (100,'DBT','DZ') oder (100, 'DBFT','EZ') eingefügt werden (Foreign Key, No matching value in referenced table).
Die Daten könnten bspw. wie folgt in die Tabellen eingefügt werden:
INSERT INTO Plz
VALUES ('Husby',24989);
INSERT INTO Plz
VALUES ('Grundhof',24977);
...
INSERT INTO Gast
VALUES (100,'Müller','Grundhof','Aukjer Strasse 17');
INSERT INTO Gast
VALUES (102,'Paessens','Husby','Am Polldamm 1A');
...
INSERT INTO Zimmer VALUES (100,'DBF','EZ');
12
DML = Data Manipulation Language (SELECT, INSERT, DELETE, UPDATE)
ST/HfBR/DS-EDV K9039
Erfassung von Daten (DML)
INSERT
...
INSERT
INSERT
...
INSERT
INSERT
...
23
INTO Zimmer
VALUES (101,'DBT','EZ');
INTO Preis
INTO Preis
VALUES ('DBT','EZ',52.00);
VALUES ('DBF','EZ',60.00);
INTO Vermietung VALUES (1,1,102,12);
INTO Vermietung VALUES (2,1,101,10);
Gleiches gilt für alle späteren Änderungen in der Datenbasis: Auch hier werden Änderungen in Tabellen, die Fremdschlüsselbeziehungen aufweisen, zurückgewiesen, wenn sich in der referenzierten
Tabelle kein entsprechender Primärschlüsselwert befindet13.
13
Vgl. dazu Referentielle Integrität durch Fremdschlüsselbeziehungen auf der Seite 13.
ST/HfBR/DS-EDV K9039
24
Anfragen an die Datenbasis (Retrieval)
4.
Anfragen an die Datenbasis (Retrieval)
4.1. DML Statement SELECT
Nach Erfassung der Daten sind erste Anfragen an die Datenbasis mit dem DML Statement SELECT
möglich. SELECT ist je nach Implementierung ein sehr komplexer Befehl, der über eine Reihe von
Optionen verfügt. Dem Retrieval von SQL-Daten dient der DML Befehl
SELECT
Auswahl aus einer Tabelle/einem View
Abb. 41: DML Befehl SELECT von SQL
Aus syntaktischer Sicht ist der SELECT Befehl von INTERBASE14 wie folgt aufgebaut:
SELECT
[DISTINCT | ALL] [Funktion,][POINTER,]Kommaliste von Spaltennamen|*
FROM
Kommaliste von [creator.]Tabellennamen | ViewNamen
[WHERE
Bedingungen, die Tupel (Zeilen) spezifizieren]
[GROUP BY
Kommaliste von Spaltennamen, nach denen gruppiert wird
[HAVING
Bedingungen]]
[UNION [ALL]
SELECT Anfrage {,repeat}]
[ORDER BY
Spaltenname | Spaltennummer[order format] {,repeat}];
Abb. 42: SELECT Befehlsoptionen von SQL
Dabei gelten die folgenden Konventionen:
[]
Optionale Angaben
{}
zu wiederholende Angaben
|
alternative Angaben/Optionen
Die Bedeutung der wichtigsten Schlüsselwörter dabei sind:
DISTINCT
ignoriert doppelt vorhandene Datensätze, die die Retrieval-Bedingungen erfüllen
ALL
auch doppelte Datensätze werden gefunden (Default-Option)
WHERE
Selektion spezifischer Tupel (Zeilen) durch Formulierung von Bedingungen, die
wahr oder falsch werden, wie Bool'sche Operatoren (AND, OR, NOT), Relationaloperatoren (>,<,=...) sowie spezielle Operatoren (BETWEEN,IN,IS
NULL,LIKE,EXISTS) oder auch Unteranfragen (SELECT...)
GROUP BY
Gruppenbildung bei gleichen Werten in der angegebenen Spalte
HAVING
Selektion spezifischer Gruppen, vergleichbar mit WHERE-Bedingungen
ORDER BY
sortiert die gefundenen Sätze nach den angegebenen Spalte[n], order format:
ASC|DESC (auf-/absteigend)
Abb. 43: Bedeutung der Schlüsselwörter des DML Befehls SELECT
14
Alle nachfolgend verwendeten SQL-Beispiele lassen sich ebenfalls unter MS ACCESS ausprobieren. Die Hoteldatenbank im Access-Format finden Sie unter www.wi.fh-flensburg.de/wi/mueller/a.
ST/HfBR/DS-EDV K9039
Anfragen an die Datenbasis (Retrieval)
25
4.2. Anfragetypen Selektion, Projektion und Join
Bei Anfragen werden prinzipiell die Selektion, Projektion und der Join unterschieden.
Eine Projektion wählt aus einer Tabelle eine Anzahl von Spalten (Attributwerten) zur Anzeige aus. Für
die ausgewählten Spalten enthält die Ergebnisrelation die Werte aller Zeilen (Entities, Tupel,
Datensätze).
A1
A2
A3
A4
E1
E2
E3
E4
E5
E5
E7
Abb. 44: Schematische Darstellung einer Projektion
Die Projektion erfolgt durch Angabe der ausgewählten Spaltennamen in einer Kommaliste. Somit
entsteht als Ergebnisrelation eine gleich lange, jedoch schmalere Relation als die Ausgangsrelation:
SELECT
ZiNr, Art
{PS_1}
FROM
Zimmer;
ZiNr
Art
100
EZ
101
EZ
102
EZ
205
DZ
210
DZ
215
DZ
Es werden für alle Datensätze (d.h., alle Zimmer) die Zimmernummer und die Art (DZ|EZ) angezeigt.
Bei der Selektion werden prinzipiell bestimmte Entities/Datensätze zunächst mit allen Spalten (Attributen), die einer vorgegebenen Bedingung genügen, ausgewählt. Die Selektion erfolgt anhand einer
mit dem Bezeichner WHERE bzw. nach einer Gruppierung mittels HAVING formulierten Bedingung.
Somit entsteht gegenüber der Grundrelation eine um Zeilen verkürzte Relation, die alle Spalten enthält:
A1
A2
A3
A4
E1
E2
E3
E4
E5
E5
E7
Abb. 45: Schematische Darstellung einer Selektion
SELECT
FROM
WHERE
*
Zimmer
ZiNr >= 200;
{PS_2}
ST/HfBR/DS-EDV K9039
26
Anfragen an die Datenbasis (Retrieval)
ZiNr
Ausstattung
Art
205
DBFT
DZ
210
DBT
DZ
215
DT
DZ
Es werden alle Datensätze mit allen Attributen (*) aus der Relation Zimmer selektiert, deren Zimmernummer größer/gleich 200 ist.
Selbstverständlich lassen sich Projektion und Selektion miteinander in einer Anfrage kombinieren:
SELECT
FROM
WHERE
ZiNr, Art
Zimmer
ZiNr >= 200;
ZiNr
Art
205
DZ
210
DZ
215
DZ
{PS_3}
Es werden nun für alle Zimmer, deren Nummer größer/gleich 200 ist, die Zimmernummer und die Art
angezeigt.
Weitere Beispiele für Projektionen/Selektionen sind:
SELECT
FROM
Name
Gast;
{PS_4}
Name
Gast
Wohnort > 'Flensburg';
{PS_5}
Wohnort
Gast
Wohnort >='Pinneberg';
{PS_6}
Name
Müller
Paessens
Dr. Schmidt
Müller-Lüdenscheid
AKAD
IBM
FH Flensburg
Meier
Meier
Timm
SELECT
FROM
WHERE
Name
Müller
Paessens
Dr. Schmidt
Müller-Lüdenscheid
AKAD
IBM
Meier
Meier
Timm
SELECT
FROM
WHERE
ST/HfBR/DS-EDV K9039
Anfragen an die Datenbasis (Retrieval)
27
Wohnort
Pinneberg
Schleswig
Schleswig
Stuttgart
SELECT
FROM
WHERE
ZiNr, Art
Zimmer
Ausstattung LIKE '%T%';
ZiNr
Art
101
EZ
205
DZ
210
DZ
215
DZ
{PS_7}
Bei einem Join (Zusammensetzen von Tabellen) werden im Gegensatz zu den obigen Beispielen der
Selektion und Projektion nicht nur einer Tabelle, sondern gleichzeitig mehreren Tabellen Daten entnommen. Dabei ist jedoch zu beachten, dass für die Auswahl der Daten jeweils eine Spalte beider Tabellen identische Einträge aufweisen muss; andernfalls ist das Ergebnis der Anfrage das kartesische
Produkt beider Tabellen (Kombination eines jeden Entities aus Relation R1 mit allen Entities aus
Relation R2).
Beispiel für eine zusammengesetzte Anfrage (Equi-Join):
SELECT
FROM
WHERE
Name, Dauer
{JOIN_1}
Gast, Vermietung
Gast.KdNr = Vermietung.KdNr;
Beachten Sie, dass bei dieser Anfrage nur Gäste in der Ergebnisrelation enthalten sind, die auch
wirklich einmal als Gast ein Zimmer gemietet hatten, da die Relation Vermietung einbezogen wird;
Daher ist der Gast IBM nicht in der Ergebnisrelation enthalten.
Es ist also jeweils zu überdenken, ob man alle Gäste oder nur nutzende Gäste in die Ergebnisrelation
einbeziehen will!
Name
Dauer
Müller
12
Müller
10
Paessens
3
Dr. Schmidt
5
Müller-Lüdenscheid
5
AKAD
10
FH Flensburg
2
Meier
5
Meier
1
Timm
3
Die Spalten Gast.KdNr und Vermietung.KdNr heißen Joinspalten. Diese in der Abfrage ja mit unterschiedlichem Bezug zu Relationen genannten Attribute müssen zur Unterscheidung dann durch die
Angabe Relation.Attribut ergänzt werden. Der Join, der letztlich alle in der Ausgangsrelation enthaltenen Daten wieder zu einer Ergebnisrelation zusammenfügt, würde demnach wie folgt zu formulieren
sein:
SELECT
FROM
WHERE
AND
AND
AND
Name, Wohnort, Strasse,
Zimmer.ZiNr, Zimmer.Art, Zimmer.Ausstattung,
Miete, Dauer
Gast, Vermietung, Zimmer, Preis
Gast.KdNr = Vermietung.KdNr
Zimmer.ZiNr = Vermietung.ZiNr
Zimmer.Art = Preis.Art
Zimmer.Ausstattung = Preis.Ausstattung;
ST/HfBR/DS-EDV K9039
28
Anfragen an die Datenbasis (Retrieval)
Die Bedingung der Inhaltsgleichheit von Spalten unterschiedlicher Relationen wird Equi-Join genannt.
Der Theta-Join ist ein Verbund, der eine andere Selektionsbedingung als die Gleichsetzung von Spalten vornimmt. Hier können Vergleichsoperatoren (<,>,<>,>=,<=) oder auch Operatoren wie BETWEEN eingesetzt werden.
4.3. Operatoren in SELECT-Statements
Im Rahmen von SELECT-Anfragen an eine Datenbasis lassen sich eine Vielzahl von Operatoren zur
Beschreibung der auszuwählenden Tupel verwenden. Die Anwendung ausgewählter Operatoren
zeigen folgende beispielhafte Anfragen:
Zimmervermietungen mit einer Dauer zwischen einem und drei Tagen:
SELECT
FROM
WHERE
ZiNr
Vermietung
Dauer BETWEEN 1 AND 3;
{OPER_1}
ZiNr
100
102
215
210
Alle Gastadressen aus Orten mit Postleitzahl kleiner 4000:
SELECT
FROM
WHERE
AND
Name, Wohnort, Strasse
Gast, Plz
Gast.Wohnort = Plz.Ort
Plz.Plz < 40000;
Name
Wohnort
FH Flensburg
Flensburg
Kanzleistraße 91-92
Müller
Grundhof
Aukjer Straße 17
Paessens
Husby
Am Polldamm 1A
Timm
Kiel
Ostufer 93
AKAD
Pinneberg
Am Bahnhof 10
{OPER_2}
Straße
Dr. Schmidt
Schleswig
Landberg 18
Meier
Schleswig
Wikingturm 18
Alle Zimmer, deren Preis nicht zwischen 50 und 60 € liegen:
SELECT
ZiNr, Miete
{OPER_3}
FROM
Zimmer, Preis
WHERE
Miete NOT BETWEEN 50 AND 60
AND
Zimmer.Art = Preis.Art
AND
Zimmer.Ausstattung = Preis.Ausstattung;
ZiNr
Miete
205
100
210
80
215
75
Alle Gäste, deren Namen vorne mit "Müll" anfangen:
SELECT
FROM
WHERE
Name
Gast
Name LIKE 'Müll%';
Name
Müller
Müller-Lüdenscheid
ST/HfBR/DS-EDV K9039
{OPER_4}
Anfragen an die Datenbasis (Retrieval)
29
Alle Gäste, deren Namen mit Buchstaben zwischen A und B anfangen:
SELECT
FROM
WHERE
Name
Gast
Name BETWEEN 'A%' AND 'B%';
{OPER_5}
Name
AKAD
4.4. SQL-Funktionen
Die Ergebnisse (=selektierte Tupel) von Selektionen lassen sich weiter aufbereiten; dazu dienen
Funktionen. SQL verfügt über eine Vielzahl solcher Funktionen, deren Erläuterung diesen Rahmen
sprengen würde. Einen kurzen Überblick gibt nachfolgende Aufstellung:
FUNKTION
Beispiel
arithmetische
ROUND, TRUNC
arithm. Gruppen-
AVG, COUNT, MAX, MIN, SUM
Text-
LOWER, UPPER, SUBSTR
Datum/Zeit
ADD_MONTHS, SYSDATE
Umwandlung
TO_CHAR, TO_DATE
Abb. 46: Wichtige Standardfunktionen von SQL
Die genannten SQL-Funktionen selektieren dabei jeweils einen Wert eines Attributes (z.B. Summe,
Maximum, Minimum). Das Selektionsergebnis besteht also aus einer einspaltigen und einzeiligen Relation.
Beispiele:
Die größte Zimmermiete:
SELECT
FROM
MAX(Miete)
Preis;
{FKT_1}
Max
100.00
Die kleinste Zimmermiete:
SELECT
FROM
MIN(Miete)
Preis;
{FKT_2}
MAX(Dauer)
Vermietung;
{FKT_3}
Min
48.00
Die längste Mietdauer:
SELECT
FROM
Max
12
Umsatzsumme aller Vermietungen:
SELECT
SUM(Miete * Dauer)
FROM
Umsatzliste;
Häufig sollen jedoch neben diesen Werten zusätzliche Informationen selektiert werden. So wäre es
sinnvoll, nicht nur die längste Mietdauer, sondern den dazugehörenden Gast mit seinem Namen zu
selektieren. Oder es sind alle Gäste, deren Mietdauer unterhalb der durchschnittlichen Mietdauer
liegen, zu suchen.
ST/HfBR/DS-EDV K9039
30
Anfragen an die Datenbasis (Retrieval)
Das erste Beispiel betrifft die Relationen Gast und Vermietung. Ein erster Versuch zur Selektion des
Gastes mit der längsten Mietdauer könnte wie folgt aussehen:
Gast mit der längsten Mietdauer: (fehlerhaft)
SELECT
FROM
WHERE
Name, MAX(Dauer)
{FKT_4}
Gast, Vermietung
Gast.KdNr = Vermietung.KdNr;
Diese Query liefert in einigen Datenbanksystemen folgendes Ergebnis:
Name
Dauer
Timm
12
Diese Query erbringt zwar die korrekte maximale Mietdauer, ordnet jedoch diese nicht dem richtigen
Gast zu; damit ist diese Query fehlerhaft. Das liegt daran, dass bei der Selektion des Namens nicht
die richtige Bedingung (Namen mit der längsten Vermietdauer) formuliert wurde. Vielmehr erscheint
hier der letzte selektierte Name der Relation Gast. Die Lösung des Problems liegt in der Formulierung
einer Unterabfrage (Subquery).
4.5. Subqueries
Queries (Anfragen) können auch selbst wieder Queries enthalten. Die enthaltenen Queries werden
dann als Subqueries (Unterabfrage) bezeichnet. Dabei wird der Vergleichswert für die Selektion einer
anderen Tabelle entnommen. Die Subquery wird dabei zuerst ausgeführt, das Ergebnis geht dann
(z.B. als Bedingung) in die übergeordnete Query ein.
Kehren wir zu obigem Beispiel zurück: Wir müssen den Namen des Gastes korrekt selektieren. Dies
gelingt in diesem Beispiel durch Bildung einer Unterabfrage (Subquery), in der zunächst das Maximum der Dauer und mit diesem Wert dann der Name des Gastes selektiert wird:
Gast mit der längsten Mietdauer:
SELECT
FROM
WHERE
AND
Name, Dauer
{SUB_1}
Gast, Vermietung
Dauer = (SELECT MAX(Dauer) FROM Vermietung)
Gast.KdNr = Vermietung.KdNr;
Name
Dauer
Müller
12
Die Anfrage löst sich wie folgt auf: zuerst wird in der Unterabfrage das Maximum der Mietdauer bestimmt; An die Stelle der Unterabfrage tritt in unserem Falle der Wert 12 (= Maximum der Mietdauer),
so dass sich die bis dahin aufgelöste Anfrage wie folgt darstellt:
SELECT
FROM
WHERE
AND
Name, Dauer
{SUB_2}
Gast, Vermietung
Dauer = 12
Gast.KdNr = Vermietung.KdNr;
Somit werden in der äußeren Query alle Gäste selektiert, deren Mietdauer 12 Tage beträgt. Weitere
Beispiele zur Anwendung von Funktionen mit Subqueries sind:
Alle Gäste, deren Mietdauer unterhalb der durchschnittlichen Mietdauer liegen:
SELECT
FROM
WHERE
AND
Name, Dauer
{SUB_3}
Gast, Vermietung
Dauer < (SELECT AVG(Dauer) FROM Vermietung)
Gast.KdNr = Vermietung.KdNr;
ST/HfBR/DS-EDV K9039
Anfragen an die Datenbasis (Retrieval)
31
Name
Dauer
Paessens
3
Dr. Schmidt
5
Müller-Lüdenscheid
5
FH Flensburg
2
Meier
5
Meier
1
Timm
3
Alle Gäste, deren Mietdauer oberhalb der durchschnittlichen Mietdauer liegen:
SELECT
FROM
WHERE
AND
Name, Dauer
{SUB_4}
Gast, Vermietung
Dauer > (SELECT AVG(Dauer) FROM Vermietung)
Gast.KdNr = Vermietung.KdNr;
Name
Dauer
Müller
12
Müller
10
AKAD
10
Alle Gäste, deren Wohnorte noch nicht in der Tabelle PLZ eingetragen sind15:
SELECT
Name
{SUB_5}
FROM
Gast
WHERE
NOT EXISTS (SELECT * FROM PLZ WHERE
Gast.Wohnort=Ort);
Name
Dr. Schmidt
Meier
Alle Gäste, deren Wohnorte in der Tabelle PLZ eingetragen sind:
SELECT
FROM
WHERE
Name
{SUB_6}
Gast
EXISTS (SELECT * FROM PLZ WHERE
Gast.Wohnort=Ort);
Name
Müller
Paessens
Müller-Lüdenscheid
AKAD
IBM
FH Flensburg
Meier
Timm
Alle Gäste, die den Wohnort mit der PLZ 24944 haben:
SELECT
Name, Wohnort
{SUB_7}
FROM
Gast
WHERE
Wohnort IN (SELECT Ort FROM Plz WHERE
Plz=24944);
Name
Wohnort
FH Flensburg
Flensburg
Alle Gäste mit den gleichen Wohnorten wie die Gäste Meier:
15
Liefert im Beispiel leere Relation, da im DB-System INTERBASE und ACCESS jeweils Fremdschlüssel in Gast auf PLZ zeigen und somit keine Wohnorte ohne PLZ existieren können.
ST/HfBR/DS-EDV K9039
32
Anfragen an die Datenbasis (Retrieval)
SELECT
FROM
WHERE
Name, Wohnort
{SUB_8}
Gast
Wohnort IN (SELECT Wohnort FROM Gast WHERE Name='Meier');
Name
Wohnort
Dr. Schmidt
Schleswig
Müller-Lüdenscheid
Hagen
Meier
Schleswig
Meier
Hagen
Unteranfragen sind im Zusammenhang mit Einfügungen, Änderungen und Löschungen im Datenbestand ebenfalls hilfreich16.
4.6. SQL-Klauseln
Schließlich können auf die Ergebnisse Klauseln angewendet werden. Dies sind die Klauseln ORDER
BY, GROUP BY und HAVING.
4.6.1. ORDER BY-Klausel
ORDER BY sortiert die Tupeln nach dem oder den hinter BY angegebenen Attributen (Name oder
Nummer einer Spalte). Standardmäßig wird aufsteigend (ASC) sortiert, durch Angabe von DESC
kann die Sortierreihenfolge umgekehrt werden.
Beispiele für sortierte Ergebnisrelationen sind:
Alle Gäste mit allen Gastattribute, sortiert nach Name:
SELECT
FROM
ORDER BY
KdNr
*
Gast
Name;
Name
{ORDER_1}
Wohnort
Strasse
104 AKAD
Pinneberg
Am Bahnhof 10
102 Dr. Schmidt
Schleswig
Landberg 18
106 FH Flensburg
Flensburg
Kanzleistraße 91-92
105 IBM
Stuttgart
Watsonstraße 23
107 Meier
Schleswig
Wikingturm 243
108 Meier
Hagen
Volmestraße 12
100 Müller
Grundhof
Aukjer Straße 17
103 Müller-Lüdenscheid
Hagen
Am Waldesrand 3A
101 Paessens
Husby
Am Polldamm 1A
109 Timm
Kiel
Ostufer 93
Alle Preise, sortiert nach der Zimmerart und Ausstattung:
SELECT
FROM
ORDER BY
16
Miete
{ORDER_2}
Preis
Art ASC, Ausstattung DESC;
Vgl. dazu Kapitel 5 auf Seite 39.
ST/HfBR/DS-EDV K9039
Anfragen an die Datenbasis (Retrieval)
33
Miete
90.00
100.00
75.00
80.00
75.00
60.00
75.00
55.00
52.00
48.00
4.6.2. GROUP BY-Klausel
GROUP BY fasst eine Teilmenge von Tupeln zu einem neuen Tupel zusammen (Gruppenbildung):
Damit lassen sich Ergebnisse nach beliebigen Kriterien gruppieren. Dazu werden bezüglich des
Gruppierungsmerkmals identische Entities zusammengefasst. Voraussetzung ist die Verwendung
einer Gruppenfunktion wie Summe oder Anzahl.
Wir wollen eine Liste unserer Gastnamen und die Häufigkeit des Vorkommens gleicher Namen
erzeugen, wobei gleiche Namen zu einer Gruppe zusammengefasst werden. Unerheblich soll zunächst dabei sein, ob die verzeichneten Gäste wirklich schon einmal bei uns ein Zimmer gemietet
haben (d.h., ob sie in der Tabelle Vermietung auch enthalten sind):
SELECT
FROM
GROUP BY
Name, COUNT(*)
Gast
Name;
Name
*
AKAD
1
Dr. Schmidt
1
FH Flensburg
1
IBM
1
Meier
2
Müller
1
Müller-Lüdenscheid
1
Paessens
1
Timm
1
{GROUP_1}
Das Ergebnis zeigt, dass der Name Meier zweimal in Gast vorkommt. Nach der Bedingung, dass
jeder Gast in der Relation Gast nur einmal verzeichnet sein darf, müsste es sich hier also um zwei
unterschiedliche Gäste mit dem Namen Meier handeln. Wir können dies prüfen, indem wir nicht den
Gastnamen, sondern das unterscheidende Kriterium Gast.KdNr zur Gruppierung verwenden. Zu17
sätzlich müssen alle weiteren, nicht gruppierten Attribute in der Gruppierung genannt werden . Dabei
dürften dann keine Häufigkeiten über 1 aufzufinden sein:
SELECT
FROM
GROUP BY
17
Name, COUNT(*)
Gast
KdNr, Name;
{GROUP_2}
Rein theoretisch könnten ja zwei Gäste unter der selben Kundennummer existieren. Daher müßte
dann hier nach dem Namen weiter gruppiert werden. Das Datenbanksystem kann die semantische
Bedeutung von KdNr (eindeutiger Primärschlüssel) hier ja nicht überprüfen.
ST/HfBR/DS-EDV K9039
34
Anfragen an die Datenbasis (Retrieval)
Name
*
AKAD
1
Dr. Schmidt
1
FH Flensburg
1
IBM
1
Meier
1
Meier
1
Müller
1
Müller-Lüdenscheid
1
Paessens
1
Timm
1
Eine Gruppierung nach einem anderen als dem Namensattribut zeigt folgende Anfrage:
SELECT
FROM
GROUP BY
Wohnort, COUNT(*)
Gast
Wohnort;
Wohnort
*
Flensburg
1
Grundhof
1
Hagen
2
Husby
1
Kiel
1
Pinneberg
1
Schleswig
2
Stuttgart
1
{GROUP_3}
Uns interessiert aber vermutlich weniger eine Aufstellung aller Gastnamen als vielmehr eine Liste, in
der nur die Gäste, die bei uns schon einmal ein Zimmer gemietet haben, verzeichnet sind. Diese
Information ist in der Tabelle Vermietung enthalten, die wir deshalb als weiteres Selektionskriterium heranziehen müssen. Gleichzeitig wollen wir dabei die Ergebnisrelation nach Häufigkeit der Vermietung (höchste Vermietung zuerst, d.h., absteigend) und, bei gleicher Häufigkeit, aufsteigend nach
Namen sortieren. Auch hier muss das Gruppierungskriterium wieder die KdNr sein, da andernfalls
der Gast Meier mit je 2 Vermietungen doppelt erscheinen würde:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
Name, COUNT(*)
{GROUP_4}
Gast, Vermietung
Gast.KdNr = Vermietung.KdNr
Vermietung.KdNr, Name
COUNT(*) DESC, Name ASC;
Name
*
Müller
2
AKAD
1
Dr. Schmidt
1
FH Flensburg
1
Meier
1
Meier
1
Müller-Lüdenscheid
1
Paessens
1
Timm
1
Es erfolgt hier eine Sortierung zunächst nach der Häufigkeit, dann nach dem Namen. Die Tabelle
zeigt auch nun, dass es sich bei den Gästen Meier um unterschiedliche Entities handelt und dass der
Gast IBM nun nicht mehr in der Ergebnisrelation enthalten ist, da er bei uns zwar in der Relation Gast
enthalten ist, aber noch keine Vermietung zu verzeichnen hat.
ST/HfBR/DS-EDV K9039
Anfragen an die Datenbasis (Retrieval)
35
Ähnliche Auswertungen lassen sich nun mit der Group-Klausel für andere Gruppierungsmerkmale
erstellen: So könnte es von Interesse sein, aus welchem Einzugsbereich unsere Kunden kommen.
Wir gruppieren die Vermietungen an unsere Gäste also nach dem Wohnort:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
Wohnort
Wohnort, COUNT(*)
{GROUP_5}
Gast, Vermietung
Gast.KdNr=Vermietung.KdNr
Wohnort
COUNT(*), Wohnort;
*
Grundhof
2
Hagen
2
Schleswig
2
Flensburg
1
Husby
1
Kiel
1
Pinneberg
1
Beachten Sie, dass wir hier nach dem Wohnort gruppiert haben, d.h., dass der Wohnort von identischen Gästen, die mehrfach ein Zimmer bei uns gemietet haben, auch mit der entsprechenden Häufigkeit in der Ergebnisrelation auftreten. Dies gilt hier für die Vermietungen an Gäste aus Grundhof:
Es handelt sich hier um ein- und denselben Gast Müller, der zweimal ein Zimmer gemietet hatte.
Dagegen stehen hinter den Vermietungen an Hagener und Schleswiger jeweils zwei unterschiedliche
Gäste.
Wollen wir dagegen diese Mehrfachvermietungen ausschließen und nur die Zahl der unterschiedlichen nutzenden Gäste aus den unterschiedlichen Orten selektieren, ist die Anfrage wie folgt zu formulieren:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
DISTINCT(Wohnort), COUNT(*)
Gast,Vermietung
Gast.KdNr = Vermietung.KdNr
Wohnort
COUNT(*), Wohnort;
Wohnort
*
Hagen
2
Schleswig
2
Flensburg
1
Grundhof
1
Husby
1
Kiel
1
Pinneberg
1
{GROUP_6}
Die Ergebnisrelation zeigt, dass nun der Ort Grundhof nur mit einer Häufigkeit 1 erscheint, da in wir
nur einen nutzenden Gast aus Grundhof hatten.
Folgende Anfragen zeigen weitere Beispiele für Gruppenfunktionen.
Gesamtmietdauer, Miethäufigkeit und durchschnittliche Mietdauer aller Vermietungen aus den
jeweiligen Gastwohnorten:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
Wohnort, SUM(Dauer), COUNT(*), AVG(Dauer)
Gast, Vermietung
Gast.KdNr=Vermietung.KdNr
Wohnort
AVG(Dauer) DESC;
{GROUP_7}
ST/HfBR/DS-EDV K9039
36
Anfragen an die Datenbasis (Retrieval)
Wohnort
Dauer
*
Dauer
Grundhof
22
2
11.0
Pinneberg
10
1
10.0
Schleswig
10
2
5.0
Hagen
6
2
3.0
Husby
3
1
3.0
Kiel
3
1
3.0
Flensburg
2
1
2.0
Namen aller Gäste, ihre Gesamtmietdauer und Miethäufigkeit:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
Name, SUM(Dauer), COUNT(*)
Gast, Vermietung
Gast.KdNr=Vermietung.KdNr
Gast.KdNr, Name
Name, SUM(Dauer) DESC;
Name
*
AKAD
{GROUP_8}
*
10 1
Dr. Schmidt
5 1
FH Flensburg
2 1
Meier
5 1
Meier
1 1
Müller
22 2
Müller-Lüdenscheid
5 1
Paessens
3 1
Timm
3 1
4.6.3. HAVING-Klausel
Die HAVING-Klausel, die nur in Verbindung mit der GROUP BY-Klausel Einsatz findet, nimmt aus
den gebildeten Gruppen weitere Selektionen vor. Dadurch können die Gruppierungsmerkmale als
Selektionsbedingung der Ergebnisrelation Anwendung finden.
Wie oft und wie lange
insgesamt da:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
waren "gute" Kunden (Kunden mit Gesamtmietdauer von mehr als 4 Tagen)
Name, SUM(Dauer), COUNT(*)
Gast, Vermietung
Gast.KdNr=Vermietung.KdNr
Gast.KdNr, Name
SUM(Dauer) > 4
Name, SUM(Dauer) DESC;
Name
1
2
AKAD
10
1
Dr. Schmidt
5
1
Meier
5
1
Müller
22
2
5
1
Müller-Lüdenscheid
{HAVE_1}
4.6.4. UNION-Klausel
Zuletzt ist es auch möglich, das Ergebnis mehrerer Selektionen zu einem gemeinsamen Ergebnis
zusammenzufassen. Voraussetzung dazu ist, dass alle Selektionen einen typgleichen Aufbau der
selektierten Relation aufweisen. Die Vereinigung solcher typgleicher Selektionsergebnis werden mit
der UNION-Klausel erreicht.
Beispiel: Wir wollen zunächst eine einfache ABC-Analyse der Mietverhältnisse erstellen. Dazu selektieren wir alle Vermietverhältnisse, deren Dauer über 10 Tagen (A-Vermietungen), dann solche, deren
Dauer zwischen 3 und 10 Tagen (B-Vermietungen) und schließlich solche, deren Dauer unter 3 Tagen liegen. Alle drei Ergebnisse sollen gemeinsam in einer Ergebnisrelation erscheinen:
ST/HfBR/DS-EDV K9039
Anfragen an die Datenbasis (Retrieval)
Klasse
37
Anzahl
Vermietungen über 10 Tage
1
Vermietungen zwischen 3 und 10 Tagen
7
Vermietungen unter 3 Tagen
2
Eine solche Selektion wäre durch die UNION-Klausel möglich:
SELECT
'Vermietungen
FROM Vermietung
WHERE
Dauer > 10
GROUP BY
KdNr
UNION
SELECT
'Vermietungen
FROM Vermietung
WHERE
Dauer BETWEEN
GROUP BY
KdNr
UNION
SELECT
'Vermietungen
FROM Vermietung
WHERE
Dauer < 3
GROUP BY
KDNR;
über 10 Tagen',COUNT(*)
von 3 bis 10 Tage',COUNT(*)
3 AND 10
unter 3 Tagen',COUNT(*)
{UNION_1}
Selbstverständlich sind auch komplexere ABC-Anaylsen denkbar, die auf der Basis der kundenbezogenen Vermiettage einen Kunden jeweils zu einer Kundenklasse zuordnen. Gehen wir dazu von
folgenden Prämissen aus: Ein Kunde sei ein A-Kunde, wenn die Summe seiner Miettage 30% aller
Miettage überschreitet. Liegt die Summe zwischen 10% und 30%, soll es sich um einen B-Kunden
handeln. Schließlich sind alle Kunden C-Kunden, deren Gesamtmiettage weniger als 10% betragen.
Zur Berechnung lassen sich Subqueries und Ausdrücke in SQL verwenden.
Die folgende komplexe SQL-Abfrage erzeugt eine ABC-Kundenanalyse auf der Basis der gesamten
Miettage:
/* A-Kunden bestimmen, mehr als 30% aller Miettage */
SELECT
NAME, 'A-KUNDE' AS Klasse,
SUM(DAUER) AS Miettage,
SUM(DAUER)/(SELECT SUM(DAUER) FROM VERMIETUNG) * 100 AS Anteil
FROM
VERMIETUNG, GAST
WHERE
VERMIETUNG.KDNR=GAST.KDNR
GROUP BY KDNR, NAME
HAVING
SUM(DAUER) > ((SELECT SUM(DAUER) FROM VERMIETUNG) * 0.3)
UNION
/* B-Kunden bestimmen, zwischen 10 und 30% aller Miettage */
SELECT
NAME, 'B-KUNDE' AS Klasse,
SUM(DAUER),
SUM(DAUER)/(SELECT SUM(DAUER) FROM VERMIETUNG) * 100 AS Anteil
FROM
VERMIETUNG, GAST
WHERE
VERMIETUNG.KDNR=GAST.KDNR
GROUP BY KDNR, NAME
HAVING
SUM(DAUER) between
((SELECT SUM(DAUER) FROM VERMIETUNG) * 0.1)
AND
((SELECT SUM(DAUER) FROM VERMIETUNG) * 0.3)
UNION
/* C-Kunden bestimmen, weniger als 10 % aller Miettage */
SELECT
NAME, 'C-KUNDE' AS Klasse,
SUM(DAUER),
SUM(DAUER)/(SELECT SUM(DAUER) FROM VERMIETUNG) * 100 AS Anteil
FROM
VERMIETUNG, GAST
WHERE
VERMIETUNG.KDNR=GAST.KDNR
GROUP BY KDNR, NAME
HAVING
SUM(DAUER) < ((SELECT SUM(DAUER) FROM VERMIETUNG) * 0.1)
ST/HfBR/DS-EDV K9039
38
Anfragen an die Datenbasis (Retrieval)
ORDER BY 3 DESC;
{ABC_0.SQL}
Die Anfrage liefert folgende Ergebnisrelation:
NAME
KLASSE
MIETTAGE
ANTEIL
Müller
A-KUNDE
22
39,2857142857143
AKAD
B-KUNDE
10
17,8571428571429
Meier
C-KUNDE
5
8,92857142857143
Dr. Schmidt
C-KUNDE
5
8,92857142857143
Müller-Lüdenscheid
C-KUNDE
5
8,92857142857143
Timm
C-KUNDE
3
5,35714285714286
Paessens
C-KUNDE
3
5,35714285714286
IBM
C-KUNDE
2
3,57142857142857
Meier
C-KUNDE
1
1,78571428571429
4.7. Verwendung von Literalen
Zur Verbesserung der Verständlichkeit der Ergebnisrelation ist es möglich, zusätzlich erklärenden
Text (Literale) in eine zusätzliche Spalte der Tabelle einzufügen. Folgende SQL-Anfrage verdeutlicht
Ziel und Vorgehen dabei:
SELECT
'Gast', NAME, 'war insgesamt', SUM(DAUER),
'Tage da und zwar', COUNT(DAUER), 'mal'
FROM
VERMIETUNG,GAST
WHERE
GAST.KDNR=VERMIETUNG.KDNR
GROUP BY
VERMIETUNG.KDNR, Name
ORDER BY
NAME ASC;
{LITER_1}
1
Name
2
5
6
Gast
AKAD
war insgesamt
10 Tage da und zwar
1
mal
Gast
Dr. Schmidt
war insgesamt
5 Tage da und zwar
1
mal
Gast
FH Flensburg
war insgesamt
2 Tage da und zwar
1
mal
Gast
Meier
war insgesamt
5 Tage da und zwar
1
mal
Gast
Meier
war insgesamt
1 Tage da und zwar
1
mal
Gast
Müller
war insgesamt
22 Tage da und zwar
2
mal
Gast
Müller-Lüdenscheid
war insgesamt
5 Tage da und zwar
1
mal
Gast
Paessens
war insgesamt
3 Tage da und zwar
1
mal
Gast
Timm
war insgesamt
3 Tage da und zwar
1
mal
ST/HfBR/DS-EDV K9039
3
4
Änderung und Löschung von Daten
5.
39
Änderung und Löschung von Daten
In der Datenbank befindliche Daten können über die DML Statements UPDATE bzw. DELETE geändert bzw. gelöscht werden. Änderungen und Löschungen können durch entsprechende Optionen bei
der Einrichtung der Tabellen/Views an Passwörter gebunden werden.
Die Änderung der Inhalte von Datensätzen erfolgt über das DML Kommando:
UPDATE
[creator.]Tabellen-Name|View-Name
SET
Spaltenname = neuer Wert {repeat,}
[WHERE
Bedingungen|SELECT Unteranfrage]
Abb. 47: DML Befehl UPDATE von SQL
Beispiel: Alle Preise der Doppelzimmer erhöhen sich um 5 %
UPDATE
SET
Preis
Miete=Miete*1.05;
{UPDATE_1}
Die Löschung der Inhalte von Datensätzen erfolgt über das DML Kommando:
DELETE FROM
[creator.]Tabellen-Name|View-Name
WHERE
Bedingungen|SELECT Unteranfrage
Abb. 48: DML Befehl DELETE von SQL
Beispiel: Alle Zimmer, deren Zimmernummer > 215 ist, sollen gelöscht werden
DELETE
FROM Zimmer
WHERE ZiNr > 215;
{DELETE_1}
Auch hier wirken die bei der Einrichtung der Tabellen genutzten Optionen zur Sicherung der Integrität
der Datenbank: Würde bspw. ein Entity in Preis gelöscht, auf das noch eine Fremdschlüsselbeziehung verweist (z.B. Preis ('DBT','EZ',55)), so würde die Löschung auf Grund der Option RESTRICT
abgewiesen (No update, foreign key exists with restrict).
Ähnliches gilt bei der Änderung von Tupeln. Angenommen, die Preisrelation enthalte folgende Entites:
R.Preis
Ausstattung
Art
Miete
DBT
EZ
55.00
DBT
DZ
75.00
Abb. 49: Tupel in Preis
Nun kann ein "DBT"-Zimmer nur auf ein Doppelzimmer, im Moment aber nicht auf ein Einzelzimmer
mit der Ausstattung 'DBFT' geändert werden, da eine solche Kombination in Preis derzeit nicht enthalten ist und damit die Fremdschlüsselbeziehung nicht aufgebaut werden könnte (s. 1.9.1, Reihenfolge des Einfügens).
Sollen ein oder mehrere Entities gelöscht oder geändert werden und ist deren Primärschlüsselwert
nicht bekannt, so hilft hier wiederum eine Unteranfrage zur Bestimmung des Primärschlüsselwertes.
Beispiel: Lösche die Vermietung des Gastes AKAD im Zimmer 205, die Buchungsnummer der Vermietung ist im Moment unbekannt:
ST/HfBR/DS-EDV K9039
40
Änderung und Löschung von Daten
DELETE
FROM
WHERE
{DELETE_2}
Vermietung
KdNr = (SELECT
FROM
WHERE
AND
KdNr
Gast
Name = 'AKAD'
ZiNr = 205);
Beispiel: Ändere die Mietdauer des Gastes Müller im Zimmer 101 von 10 auf 20 Tage, die Buchungsnummer der Vermietung und Kundennummer Müller sind im Moment unbekannt:
UPDATE
Vermietung
{UPDATE_2}
SET
Dauer = 20
WHERE
Dauer = 10
AND
KdNr = (SELECT
KdNr
FROM
Gast
WHERE
Name = 'Müller');
Beispiel: Erfasse eine neue Vermietung des Gastes AKAD (Kundennummer im Moment unbekannt)
im Zimmer 205 mit der Dauer 30 unter der nächstfolgenden Buchungsnummer, wobei die aktuell
nächste Buchungsnummer ebenfalls unbekannt ist.
INSERT INTO Vermietung
{INSERT_1}
SELECT
MAX(BuNr)+1,
Gast.KdNr,
205, 30
FROM
Vermietung, Gast
WHERE
Name = 'AKAD';
ST/HfBR/DS-EDV K9039
Entwicklung von Views für die Datenbank
6.
41
Entwicklung von Views für die Datenbank
Views sind gespeicherte und damit wieder abrufbare Anfragen an die Datenbasis. Sie bilden zugleich
den normalen Weg eines Benutzers zu seinen Daten. Vorteil: Wiederkehrende und evtl. komplizierte
Anfragen werden gespeichert und "auf Knopfdruck" (d.h., Aufruf des Views) durchführbar (Konzept
der virtuellen Tabellen). Mit Views sind alle Data Manipulation Language-Operationen erlaubt (z.B.
SELECT, INSERT, DELETE), sofern bestimmte Regeln eingehalten werden.
Neben dem genannten Ziel der Verfügbarkeit komplizierter Anfragen auf "Knopfdruck" (Vereinfachung und Fehlerreduktion) lassen sich mit Views weitere Ziele verfolgen: Zum einen sind sie ein
Instrument des Datenschutzes, indem sie dem jeweiligen Benutzer Zugriff nur auf solche Daten, für
die er eine Zugriffsberechtigung hat, gewähren. Außerdem lassen sich damit Teilmengen aus Relationen abbilden; für die Aufgabenstellung unnötige Daten werden unterdrückt (information hiding,
Datenschutz). Schließlich kann in Views bewusst (virtuelle) Redundanz, die beim Datenbankentwurf
verhindert wird, erzeugt werden, um damit dem Benutzer weitere Anfragen zu ersparen. So ist denkbar, dass eine Relation die Attribute Menge und Preis, nicht aber das Attribut Umsatz erhält, da dieses ja jederzeit aus Menge X Preis erzeugt werden kann (also redundant wäre). Für den Benutzer
kann jedoch in seinem View die virtuelle Spalte Umsatz durch Aufnahme des Umsatzattributes und
Bildung der Werte Menge X Preis mit ausgegeben werden. Schließlich erhöhen Views die physikalische Datenunabhängigkeit, da nach Änderung einer Datenbankstruktur nur die Definition bestehender Views in der Datenbank adaptiert werden müssen. Der Datenstrom, der bspw. über diesen View
an ein Anwendungsprogramm fließt (z.B. Daten zur monatlichen Lohnabrechnung), kann damit ohne
Änderung des Anwendungsprogramms selbst angepasst werden.
Views lassen sich mit folgenden DDL-Befehl einrichten:
CREATE VIEW
[creator.]View-Name [(Spaltenname {repeat,})]
AS
Subquery [WITH CHECK OPTION];
Abb. 50: CREATE VIEW Befehl von SQL
Die Subquery kann eine wie unter SELECT beschriebene Anfrage enthalten.
Beispiel: Erstellen des Views Vermietungen, das eine komplette Liste aller Mietverhältnisse (auch
Mehrfachbesuche derselben Gäste) mit Gastdaten, Zimmernummer und Mietdauer ausgibt.
Prinzip : Die Anfrage wird "normal" formuliert, allerdings wird sie mit einem Namen versehen, unter
dem sie künftig abrufbar ist:
CREATE VIEW Vermietungen
AS SELECT
Name, Wohnort, ZiNr, Dauer
FROM
Gast, Vermietung
WHERE
Gast.KdNr=Vermietung.KdNr
ORDER BY
Name;
Damit wird die virtuelle Tabelle Vermietungen erzeugt. Auf sie kann mit normalen DML-Befehlen
zugegriffen werden:
SELECT
FROM
ORDER BY
*
Vermietungen
Name;
Name
Wohnort
ZiNr
Dauer
AKAD
Pinneberg
205
10
Dr. Schmidt
Schleswig
102
5
FH Flensburg
Flensburg
102
2
Meier
Schleswig
101
5
Meier
Hagen
215
1
Müller
Grundhof
102
12
Müller
Grundhof
101
10
Müller-Lüdenscheid
Hagen
210
5
Paessens
Husby
100
3
Timm
Kiel
210
3
ST/HfBR/DS-EDV K9039
42
Entwicklung von Views für die Datenbank
SELECT
FROM
ORDER BY
Name, ZiNr
Vermietungen
ZiNr;
Name
ZiNr
Paessens
100
Meier
101
Müller
101
Dr. Schmidt
102
FH Flensburg
102
Müller
102
AKAD
205
Müller-Lüdenscheid
210
Timm
210
Meier
215
Jedoch kann dieser View auch in weiteren Anfragen als "Grunddatenmenge" zum Zwecke weiterer
Selektionen verwendet werden. Selbst Views können dabei auf Views aufbauen.
Anfrage aller Mieteradressen (ohne doppelte Gäste)
SELECT
FROM
DISTINCT Name, Wohnort
Vermietungen;
Name
Wohnort
AKAD
Pinneberg
Dr. Schmidt
Schleswig
FH Flensburg
Flensburg
Meier
Schleswig
Meier
Hagen
Müller
Grundhof
Müller-Lüdenscheid
Hagen
Paessens
Husby
Timm
Kiel
Anfrage aller "Müller"-Besuche:
SELECT
FROM
WHERE
*
Vermietungen
Name = 'Müller';
Name
Wohnort
ZiNr
Dauer
Müller
Grundhof
102
12
Müller
Grundhof
101
10
Aufgabe: Erstellen eines Views für eine Preisliste mit Ausstattungsmerkmalen:
CREATE VIEW
AS SELECT
FROM
WHERE
AND
Preisliste
ZiNr,Zimmer.Art,Zimmer.Ausstattung,Miete
Preis, Zimmer
Zimmer.Ausstattung=Preis.Ausstattung;
Zimmer.Art=Preis.Art;
Anfrage:
SELECT
*
FROM Preisliste;
ST/HfBR/DS-EDV K9039
Entwicklung von Views für die Datenbank
43
ZiNr
Art
Ausstattung
Miete
205
DZ
DBFT
100
210
DZ
DBT
80
215
DZ
DT
75
100
EZ
DBF
60
101
EZ
DBT
52
102
EZ
DBR
55
Aufgabe: Erstellen eines Views für eine Umsatzliste aller Zimmer:
CREATE VIEW
AS SELECT
FROM
WHERE
AND
AND
AND
Umsatzliste (Name, ZiNr, Miete, Dauer, Umsatz)
Name, Zimmer.ZiNr, Miete, Dauer, Miete*Dauer
Gast, Vermietung, Zimmer, Preis
Gast.KdNr=Vermietung.KdNr
Vermietung.ZiNr=Zimmer.ZiNr
Zimmer.Ausstattung=Preis.Ausstattung
Zimmer.Art=Preis.Art;
Anfrage:
SELECT
*
FROM Umsatzliste;
Name
ZiNr
Miete
Dauer
Umsatz
AKAD
205
100
10
1000
Dr. Schmidt
100
55
5
275
FH Flensburg
102
55
2
110
Meier
101
52
5
260
Meier
210
75
1
75
Müller
102
55
12
660
Müller
101
52
10
520
Müller-Lüdenscheid
210
80
5
400
Paessens
100
60
3
180
Timm
210
80
3
240
Zusätzlich lassen sich die ausgegebenen Spalten eines Views mit einer Überschrift versehen. Dies ist
insbesondere dann empfehlenswert, wenn es sich um im Rahmen des Views gebildete virtuelle Spalten handelt. Die Spaltenüberschriften werden bei INTERBASE hinter dem Viewnamen in Klammern
angegeben. Bei ORACLE werden diese jeweils hinter der selektierten Spalte direkt angegeben.
Aufgabe: Erstellen eines Views mit Gastnamen, deren gesamte Mietdauer und Miethäufigkeit mit
entsprechenden Überschriften:
CREATE VIEW
AS SELECT
FROM
WHERE
GROUP BY
ORDER BY
Statistik_1 (Gast, Mietdauer, Haeufigkeit)
Name, SUM(Dauer), COUNT(*)
Gast, Vermietung
Gast.KdNr=Vermietung.KdNr
KdNr, Name
Name;
Anfrage:
SELECT
*
FROM Statistik_1:
ST/HfBR/DS-EDV K9039
44
Entwicklung von Views für die Datenbank
Gast
Mietdauer
Haeufikgeit
AKAD
10
1
Dr. Schmidt
5
1
FH Flensburg
2
1
Meier
5
1
Meier
1
1
Müller
22
2
Müller-Lüdenscheid
5
1
Paessens
3
1
Timm
3
1
Darüber hinaus lassen sich in Anfragen auch mathematische Operatoren und Literale verwenden:
CREATE VIEW Auslastung (Auslastung, Tage)
AS SELECT
'Bisherige Auslastung : ',SUM(Dauer)
FROM
Vermietung;
Anfrage:
SELECT * FROM Auslastung;
Auslastung
Tage
Bisherige Auslastung
56
CREATE VIEW D_Dauer (mittl_Dauer)
AS SELECT
AVG(Dauer)
FROM
Vermietung;
Anfrage:
SELECT * FROM D_Dauer;
Mitll_Dauer
5.600
Views lassen sich - wie Tabellen - ebenfalls löschen. Dazu dient der SQL-Befehl DROP VIEW:
DROP VIEW
ViewName;
Beispiel: DROP VIEW Zimmerliste;
Views können auch als Basis für die Datenmanipulation via Einfügen, Ändern und Löschen eingesetzt
werden. Dafür gelten jedoch spezielle Regeln, die den Rahmen dieses Beitrags übersteigen würden.
Oftmals lassen sich jedoch DML-Befehle nur dann über Views realisieren, wenn diese Views jeweils
nur 1 Relation adressieren (d.h., keine Views, die einen JOIN enthalten).
ST/HfBR/DS-EDV K9039
Hinweise zu den normalisierten Relationen
7.
45
Hinweise zu den normalisierten Relationen
Scheinbar muss bei einer Änderungen in der Ausstattung eines Zimmers eine doppelte Änderung der
Datenbasis vorgenommen werden: Nämlich in der Relation Zimmer und in der Relation Preis. Dies ist
aber nicht korrekt! Folgende Fälle sind vorstellbar:
1. Das veränderte Zimmer erhält eine "Standardausstattung", die bereits in Preis beschrieben ist.
Dann wird ab sofort der richtige Preis angezeigt.
2. Das veränderte Zimmer erhält eine neue Ausstattung, die bisher noch nicht in Preis beschrieben
war. Daraus können sich zwei mögliche Folgen, die durchaus erwünscht sein können, ergeben:
a) Besteht zwischen der Relation Zimmer und der Relation Preis über Ausstattung und Art
eine Fremdschlüsselbeziehung, so wird das Einfügen eines Tupels in Zimmer mit einer
Ausstattungs-/Art-Kombination, die derzeit nicht in Preis beschrieben ist, abgewiesen (Foreign Key, no matching value in referenced table Preis). Zuerst wäre hier ein entsprechender Eintrag in der Relation Preis erforderlich.
b) Besteht jedoch eine solche Beziehung nicht, kann ein Eintrag in die Relation Zimmer auch
unabhängig von einer entsprechenden Preisrelation vorgenommen werden. Allerdings wird
dann das Zimmer bei einem Join mit der Relation Preis nicht selektiert:
SELECT
Zimmer.Art, Zimmer.Ausstattung, Miete
FROM
Zimmer, Preis
WHERE
Preis.Ausstattung = Zimmer.Ausstattung
AND
Preis.Art=Zimmer.Art;
Das neue Zimmer wird nicht aufgeführt, da die neuen Ausstattungsmerkmale in der Relation
Preis noch nicht implementiert sind; somit wird die Bedingung Preis.Ausstattung = Zimmer.Ausstattung nicht TRUE. Erst nach Aufnahme in die Preisrelation erfolgt eine vollständige
Ausgabe. Dazu ein Beispiel:
INSERT INTO ZIMMER VALUES (160,'DTFV','DZ');
V = Videorekorder
SELECT
FROM
WHERE
Zimmer.Art, Zimmer.Ausstattung, Miete
Zimmer, Preis
Preis.Ausstattung = Zimmer.Ausstattung:
oder Nutzung des Views ZIMMERLISTE
SELECT
*
FROM Zimmerliste;
•
Das neue Zimmer wird nicht mit angezeigt, da für diese Ausstattung noch kein Preis vorgesehen ist.
INSERT INTO Preis
VALUES
('DTFV','62.00');
SELECT
FROM
•
*
Zimmerliste;
Das neue Zimmer wird mit angezeigt, da für diese Ausstattung jetzt ein Preis vorgesehen ist.
ST/HfBR/DS-EDV K9039
46
8.
Literaturhinweise
Literaturhinweise
AKAD-Lektionen
Großer, Rainer, Renkl, Cornelius
Wirtschaftsinformatik, Lektion 1, Modelle betrieblicher Informationssysteme, hrsg. V. AKAD,
Seite 63 - 65
Fuchs, Gerhard, Bauer, Jürgen, Jaquart, Sabine
Wirtschaftsinformatik, Lektion 5, Individuelle Datenverarbeitung, hrsg. V. AKAD, Seite 48 - 51
Stelck, Klaus
Wirtschaftsinformatik, Lektion 3, Datenbanken, hrsg. V. AKAD, Seite 37 - 85
Stickel, Eberhard
Wirtschaftsinformatik, Lektion 6, Software-Entwicklung, hrsg. V. AKAD, Seite 40 - 42
Weiterführende Literatur
Dürr/Rademacher
Einsatz von Datenbanksystemen, Springer 1990, ISBN 3-540-52080-5
Diverse Autoren
Handbuch der modernen Datenverarbeitung (HMD), Schwerpunktheft Datenmodellierung,
Heft 152 vom März 1990 (27. Jg), Forkel 1990, ISSN 0723-5208
Eilers/Jansen/de Volder
SQL in der Praxis, Addison-Wesley 1990, ISBN 3-925118-59-4
Finkenzeller/Kracke/Unterstein
Systematischer Einsatz von SQL ORACLE, Addison-Wesley 1989, ISBN 3-89319-117-8
Hansen, H.R.,
Wirtschaftsinformatik I, 7. Auflage, UTB 1992, ISBN 3-8252-0802-8
Korth/Silberschatz
Database System Concepts, McGraw-Hill 1986, ISBN 0-07-100529-3
Moos/Daues
SQL-Datenbanken - Der Weg vom Konzept zur Realisierung, Vieweg 1991,
ISBN 3-528-05183-3
Reese, Joachim
Wirtschaftsinformatik, eine Einführung, Gabler 1990, ISBN 3-409-13380-1
Sauer
Relationale Datenbanken, Theorie und Praxis, Addison-Wesley 1991, ISBN 3-89319-167-4
Schäfer
Datenstrukturen und Datenbanken, Vieweg 1989, ISBN 3-528-04612-0
Stahlknecht, Peter
Einführung in die Wirtschaftsinformatik, 6. Auflage, Springer 1993, ISBN 3-540-56370-9
Van der Lans
Das SQL-Lehrbuch, Addison-Wesley 1990, ISBN 3-925118-77-2
Vetter
Der Aufbau betrieblicher Informationssysteme mittels konzeptioneller Datenmodellierung,
5. Aufl., Teubner 1989, ISBN 3-519-42464-9
Vetter
Konzeptionelle Datenmodellierung, in: Handbuch Wirtschaftsinformatik, hrsg. v. Kurbel/Strunz,
Seite 383 - 401, Poeschel 1990, ISBN 3-7910-0499-9
ST/HfBR/DS-EDV K9039
Stichwortverzeichnis
9.
47
Stichwortverzeichnis
-11. Normalform ..................................................... 9
1NF ..................................................................... 9
-22. Normalform ................................................... 10
2NF ................................................................... 10
-33. Normalform ................................................... 12
3NF ................................................................... 12
Fremdschlüsselbeziehung .................................. 22
Fremdschlüsselbeziehung .................................. 39
Fremdschlüsselbeziehung .................................. 39
Fremdschlüsselbeziehung .................................. 45
Funktion
arithmetische................................................. 29
AVG .............................................30, 31, 35, 44
COUNT ...................... 33, 34, 35, 36, 37, 38, 43
Datum/Zeit .................................................... 29
Gruppen- ....................................................... 29
MAXimum ............................................... 29, 30
MINimum ...................................................... 29
SUMme ............................ 29, 35, 36, 38, 43, 44
Text ............................................................... 29
Umwandlung ................................................. 29
-G-AAbhängigkeit........................................................ 8
funktionale ...................................................... 8
transitive ..............................................9, 12, 16
voll funktionale ............................................ 8, 9
Anomalie ......................................................... 4, 6
Änderungs- ..................................................... 7
Einfüge- .......................................................... 6
Lösch-........................................................7, 10
Anomalieprobleme..........................................7, 10
Attribut
Fremdschlüssel-............................................ 15
Nichtschlüssel- .............................................. 15
Primärschlüssel- ........................................... 15
Attribute............................................................... 4
-BBeziehungen ........................................................ 4
Beziehungsattribute ............................................. 4
-DDaten
Ändern von.................................................... 22
Datentypen.................................................... 18
Einfügen von ................................................. 22
Löschen von.................................................. 22
DDL.................................................. 18, 19, 21, 22
DML.................................................. 22, 24, 39, 41
-EEinrichtung der Datenbank ................................. 18
Entity ................................................................... 4
Entity-Relationship-Diagramm ........................... 50
-FFremdschlüssel.........................................5, 13, 20
Fremdschlüsselbeziehung .................................. 20
Fremdschlüsselbeziehung .............................13, 16
Fremdschlüsselbeziehung .................................. 20
Granularität........................................................ 14
-HHistorien
Abbbildung von.............................................. 11
-IIndex.................................................................. 21
Integrität .......................................................... 4, 7
benutzerdefinierte .......................................... 15
Entitäts-............................................... 5, 11, 15
referentielle........... 4, 7, 8, 13, 15, 19, 20, 22, 23
-JJoin.........................................................20, 25, 27
Equi- ....................................................... 21, 28
Equi- ............................................................. 27
Joinspalten .................................................... 27
Theta- ........................................................... 28
-KKartesisches Produkt ......................................... 27
Klausel............................................................... 32
DISTINCT...........................................24, 35, 42
GROUP BY ...................... 24, 32, 33, 34, 35, 36
HAVING .......................................24, 25, 32, 36
ORDER BY...................................24, 32, 34, 35
ORDER BY.................................................... 32
UNION ...............................................24, 36, 37
UNIQUE .............................................10, 19, 21
-LLiterale............................................................... 38
-MMengen............................................................ 5, 6
ST/HfBR/DS-EDV K9039
48
Stichwortverzeichnis
Auflösung von..................................................6
-NNichtschlüsselattribute..........................................8
Normalisierung .....................................................4
Null-Werte........................................................ 4, 8
-OOperator............................................................. 28
< 28
= 32
AND............................................................... 24
BETWEEN......................................... 24, 28, 29
EXISTS.................................................... 24, 31
IN 24, 31
IS NULL......................................................... 24
LIKE .................................................. 24, 27, 28
mathematisch ................................................ 44
NOT ........................................................ 24, 28
NOT NULL............................................... 19, 20
OR................................................................. 24
Relational- ..................................................... 24
Option
ASC............................................. 21, 24, 34, 38
CASCADE ........................................... 7, 14, 19
DESC .....................................21, 24, 34, 35, 36
NULLIFY.................................................... 7, 14
ON DELETE .................................................. 19
ON UPDATE.................................................. 19
RESTRICT................................7, 14, 19, 20, 39
-PPrimärschlüssel .........................8, 9, 10, 11, 12, 16
verknüpfter..................................................... 10
Primärschlüsselkombination ............................... 11
Problem der Postleitzahl ..................................... 16
Projektion ............................................... 25, 26, 27
-RRedundanz................................................. 4, 7, 12
Redundanzprobleme....................................... 6, 10
Relation.................................................. 4, 5, 9, 10
Relationenmodell..................................................4
Relationship .........................................................4
ST/HfBR/DS-EDV K9039
-SSchlüssel ...................................... 5, 10, 11, 12, 21
künstlicher ...............................................10, 11
zusammengesetzter ...............................5, 9, 10
Schlüsselkandidaten .............................................8
Selektion ............................................................25
Selektion ............................................................25
Selektion ............................................................26
Selektion ............................................................27
SQL
ALL................................................................24
CREATE
DATABASE ...............................................19
INDEX .......................................................21
INDEXSPACE ...........................................19
TABLE.................................................19, 20
TABLESPACE ...........................................19
DELETE........................7, 13, 15, 19, 20, 22, 39
FOREIGN KEY ........................................19, 20
Funktion.........................................................29
INDEX............................................................21
INSERT ................................. 13, 14, 22, 23, 45
POINTER.......................................................24
PRIMARY KEY.........................................19, 20
REFERENCES.........................................19, 20
SELECT................ 12, 24, 25, 26, 27, 29, 39, 45
Subquery ........................................... 30, 37, 39
UPDATE ................................ 13, 15, 19, 22, 39
WHERE ......................12, 24, 25, 26, 27, 39, 45
-TTupel ....................................................................4
-VView ................................................. 41, 42, 43, 44
CHECK OPTION............................................15
DELETE.........................................................41
INSERT .........................................................41
Löschen .........................................................44
ORDER BY-Klausel..................................41, 42
SELECT....................................... 41, 42, 43, 44
Selektion ........................................................42
Spaltenüberschriften ......................................43
WHERE ............................................. 41, 42, 43
Ziele...............................................................41
VIEW
DROP ............................................................44
Daten des Beispiels
10.
49
Daten des Beispiels
KdNr
1
2
3
4
5
6
7
8
9
10
ZiNr
100
101
102
205
210
215
Name
Müller
Paessens
Dr. Schmidt
Müller-Lüdenscheid
AKAD
IBM
FH Flensburg
Meier
Meier
Timm
Ausstattung
DBF
DBT
DBR
DBFT
DBT
DT
BuNr
1
2
3
4
5
6
7
8
9
10
KdNr
100
100
101
102
103
104
105
107
108
109
Ausstattung
DBF
DBF
DBFT
DBFT
DBR
DBR
DBT
DBT
DT
DT
PLZ
24944
24977
58093
24957
24113
25421
24921
70469
ZiNr
102
101
100
102
210
205
102
101
215
210
Art
EZ
EZ
EZ
DZ
DZ
DZ
Wohnort
Grundhof
Husby
Schleswig
Hagen
Pinneberg
Stuttgart
Flensburg
Schleswig
Hagen
Kiel
Strasse
Aukjer Straße 17
Am Polldamm 1A
Landberg 18
Am Waldesrand 3A
Am Bahnhof 10
Watsonstraße 23
Kanzleistraße 91-92
Wikingturm 243
Volmestraße 12
Ostufer 93
Relation Gast
Relation Zimmer
Dauer Relation Vermietung
12
10
3
5
5
10
2
5
1
3
Art
EZ
DZ
EZ
DZ
EZ
DZ
EZ
DZ
EZ
DZ
Ort
Flensburg
Grundhof
Hagen
Husby
Kiel
Pinneberg
Schleswig
Stuttgart
Miete Relation Preis
60
90
75
100
55
75
52
80
48
75
Relation Postleitzahl
sofern nicht in Gast enthalten
ST/HfBR/DS-EDV K9039
50
ER-Diagramm zum Hotelbeispiel
11.
ER-Diagramm zum Hotelbeispiel
Nachfolgend sehen Sie das Entity-Relationship-Diagramm für das Datenbankschema Hotel. Entitytypen werden als Rechtecke, Beziehungstypen als Rauten, Attribute werden als Ellipsen dargestellt.
Entities haben immer Attribute, Beziehungen können Attribute aufweisen. Die Beziehungen werden
entsprechend ihres Komplexitätsgrades klassifiziert, wobei man die Komplexitätsgrade 1:1, 1:N, N:1
und M:N unterscheidet.
KdNr
PLZ,
Wohnort
Name
Strasse
Gast
M
BuNr
nutzt
Dauer
N
ZiNr
Art
Zimmer
N
hat
Ausst.
1
Art
Preis
Ausstat.
Miete
Abb. 51: ER-Diagramm Hotelbeispiel
Erläuterung zu den Komplexitätsgraden:
•
Ein Gast kann viele (N) Zimmer genutzt haben.
•
Ein Zimmer kann von vielen (M) Gästen genutzt worden sein.
•
Ein Zimmer hat genau einen (1) Preis.
•
Ein Preis, z.B. 52,-- €, kann zu mehreren (M) Zimmern gehören.
ST/HfBR/DS-EDV K9039
Abbildungsverzeichnis
12.
51
Abbildungsverzeichnis
Abb. 1: Begriffe des Relationenmodells
Abb. 2: Unnormalisierte Relation Vermietung
Abb. 3: Unnormalisierte Relation Vermietung mit Mengen
Abb. 4: Auflösung von Mengen
Abb. 5: Inkonsistenzen durch Einfügeanomalien
Abb. 6: Inkonsistenzen durch Änderungsanomalien
Abb. 7: Inkonsistenzen durch Löschanomalien
Abb. 8: Optionen des DELETE-Kommando
Abb. 9: Beispieldatensätze mit NULL-Werten
Abb. 10: Beispiel Funktionale Abhängigkeiten
Abb. 11: Beispiel Voll funktionale Abhängigkeiten
Abb. 12: Beispiel Transitive Abhängigkeiten
Abb. 13: Neue Relationen Gast und Vermietung zur Erreichung der 1 NF
Abb. 14: Verbesserung der 1NF durch künstlichen Schlüssel Kundennummer (KdNr)
Abb. 15: Relation Zimmer in 2NF
Abb. 16: Neue Relation Vermietung
Abb. 17: Relation Vermietung ohne Primärschlüssel (Struktur)
Abb. 18: Relation Vermietung ohne Primärschlüssel (Daten)
Abb. 19: Primärschlüssel Buchungsnummer in der Relation Vermietung
Abb. 20: Neue Relation Preis
Abb. 21: Relation Zimmer in 3NF
Abb. 22: Verbesserte Relationen Preis und Zimmer in 3NF
Abb. 23: Primär- und Fremdschlüssel des Relationenschemas Hotel
Abb. 24: Operationentableau bei Fremdschlüsselbeziehungen
Abb. 25: Relationenschema zur Datenbank Hotel mit Primär- und Fremdschlüsseln
Abb. 26: Ergänzungen zum Relationenschema Hotel
Abb. 27: Relation Gast mit Verstoß gegen die 3NF
Abb. 28: Domänen der Datenbank HOTEL
Abb. 29: Datentypen der Attributswerte der Relationen
Abb. 30: DDL Befehle von SQL
Abb. 31: DDL Befehl CREATE TABLE von SQL
Abb. 32: Schlüsselwörter des CREATE TABLE Befehls von SQL
Abb. 33: Einrichtung der Relation Gast
Abb. 34: Einrichtung der Relation Preis
Abb. 35: Einrichtung der Relation Zimmer
Abb. 36: Einrichtung der Relation Vermietung
Abb. 37: Einrichtung der Relation Postleitzahl
Abb. 38: DDL Befehl CREATE INDEX von SQL
Abb. 39: DML Befehle von SQL
Abb. 40: Optionen des INSERT-Kommandos
Abb. 41: DML Befehl SELECT von SQL
Abb. 42: SELECT Befehlsoptionen von SQL
Abb. 43: Bedeutung der Schlüsselwörter des DML Befehls SELECT
Abb. 44: Schematische Darstellung einer Projektion
Abb. 45: Schematische Darstellung einer Selektion
Abb. 46: Wichtige Standardfunktionen von SQL
Abb. 47: DML Befehl UPDATE von SQL
Abb. 48: DML Befehl DELETE von SQL
Abb. 49: Tupel in Preis
Abb. 50: CREATE VIEW Befehl von SQL
Abb. 51: ER-Diagramm Hotelbeispiel
ST/HfBR/DS-EDV K9039
4
5
5
6
6
7
7
7
8
8
9
9
9
10
11
11
11
11
12
12
12
12
13
14
16
16
16
18
18
19
19
19
20
20
20
20
20
21
22
22
24
24
24
25
25
29
39
39
39
41
50
Herunterladen