Datenbanksysteme Skriptum

Werbung
Mag. Walter Petrisch
Datenbanksysteme
Einführung
Stand: 11.09.2005
Copyright © Walter Petrisch
Datenbanksysteme
1.
2.
3.
Historische Entwicklung....................................................................................... 5
Anwendungsgebiete von Datenbanken ............................................................... 7
Skalierung gebräuchlicher Datenbanken............................................................. 8
3.1. Low-End DBMS............................................................................................ 8
3.2. Standard-DBMS ........................................................................................... 8
3.3. High-End DBMS ........................................................................................... 8
3.4. Embedded / Mobile DBMS ........................................................................... 9
4. Datenbanken Grundbegriffe .............................................................................. 10
4.1. Definitionen ................................................................................................ 10
4.2. Das 3-Ebenen-Konzept .............................................................................. 10
5. Datenmodellierung, Normalisierung .................................................................. 12
5.1. DB-Konzepte und Anforderungen .............................................................. 12
5.2. Relationales Modell .................................................................................... 13
5.2.1. Terminologie ....................................................................................... 13
5.2.2. Eigenschaften des relationalen Datenbankmodells............................. 14
5.3. Normalisierung und Normalformen............................................................. 15
5.3.1. Basistypen im relationalen Modell....................................................... 15
5.3.1.1.
Entitäten....................................................................................... 15
5.3.1.2.
Beziehungen ................................................................................ 16
5.3.2. Kardinalitäten ...................................................................................... 16
5.3.3. Anomalien ........................................................................................... 17
5.3.3.1.
Einfüge-Anomalie......................................................................... 17
5.3.3.2.
Lösch-Anomalie ........................................................................... 17
5.3.3.3.
Änderungs-Anomalie ................................................................... 17
5.3.4. Abhängigkeiten ................................................................................... 17
5.3.4.1.
Funktionale Abhängigkeit............................................................. 17
5.3.4.2.
Voll funktionale Abhängigkeit ....................................................... 18
5.3.4.3.
Transitive Abhängigkeit................................................................ 18
5.3.5. Normalisierungsprozess...................................................................... 18
5.3.5.1.
Obsthändler Krämers erste Datenbank........................................ 18
5.3.5.2.
Die 1. Normalform........................................................................ 19
5.3.5.3.
Die 2. Normalform........................................................................ 19
5.3.5.4.
Die 3. Normalform (3NF).............................................................. 20
5.3.5.5.
Weitere Normalformen (BCNF, 4NF, 5NF) .................................. 21
5.3.5.6.
Weitergehende Normalformen ..................................................... 22
5.3.5.7.
Zusammenfassung Normalformen............................................... 22
6. Praxisteil: Postleitzahlen mit MS Access ........................................................... 24
7. Codd’sche Regeln ............................................................................................. 26
7.1. Einleitung und Hintergrund......................................................................... 26
7.2. Die 13 Regeln ............................................................................................ 26
7.2.1. Basisregel ........................................................................................... 26
7.2.2. Logische Speicherung......................................................................... 27
7.2.3. Eindeutigkeit........................................................................................ 27
7.2.4. Unterstützung von NULL-Werten ........................................................ 27
7.2.5. Einbindung eines Systemkataloges .................................................... 28
7.2.6. Unterstützung von Abfragesprachen................................................... 28
7.2.7. Aktualisierungsmöglichkeiten .............................................................. 28
7.2.8. Abfragen und Bearbeiten ganzer Tabellen.......................................... 28
7.2.9. Physische Datenunabhängigkeit ......................................................... 28
Seite 2/88
11.09.2005 10:18
Datenbanksysteme
7.2.10.
Logische Datenunabhängigkeit ....................................................... 29
7.2.11.
Unabhängigkeit der Integrität........................................................... 29
7.2.12.
Verteilungsunabhängigkeit .............................................................. 29
7.2.13.
Unterwanderungsverbot .................................................................. 29
7.3. Codd’sche Regeln - Zusammenfassung .................................................... 30
8. ER-Diagramme.................................................................................................. 31
8.1. Entitäten ..................................................................................................... 31
8.2. Beziehungen .............................................................................................. 31
8.3. Beziehungen mit Kardinalitäten.................................................................. 31
8.4. Syntax von ER-Diagrammen...................................................................... 32
8.5. Umwandlung von ER-Diagrammen in das relationale Schema.................. 32
9. SQL (Structured Query Language).................................................................... 34
9.1. Historische Entwicklung ............................................................................. 34
9.2. Elemente von SQL ..................................................................................... 34
9.2.1. DDL (Data Definition Language) ......................................................... 34
9.2.2. DML (Data Manipulation Language) ................................................... 34
9.2.3. Eigenschaften von SQL ...................................................................... 35
9.3. SQL-Anweisungen ..................................................................................... 35
9.3.1. Übungsdatenbank in Access............................................................... 35
9.3.2. SELECT .............................................................................................. 35
9.3.2.1.
Übungsumgebung........................................................................ 35
9.3.2.2.
Grundsätzlicher Aufbau der Select-Anweisung............................ 36
9.3.2.3.
Schreibweise von Attributen......................................................... 36
9.3.2.4.
Select mit Konstanten .................................................................. 36
9.3.2.5.
Rechnen mit Attributen ................................................................ 37
9.3.2.6.
Priorität von Rechenoperationen.................................................. 37
9.3.2.7.
Arithmetische Vergleichsoperatoren ............................................ 38
9.3.2.8.
Zeichenkettenvergleich mit LIKE.................................................. 38
9.3.2.9.
Behandlung von Nullwerten ......................................................... 39
9.3.2.10. Zeichenverkettung ....................................................................... 40
9.3.2.11. Logische Operatoren ................................................................... 40
9.3.2.12. DISTINCT-Klausel ....................................................................... 41
9.3.2.13. Mengenoperationen ..................................................................... 42
9.3.2.13.1. UNION ................................................................................... 42
9.3.2.13.2. INTERSECT .......................................................................... 43
9.3.2.13.3. MINUS ................................................................................... 43
9.3.2.14. ORDER BY-Klausel ..................................................................... 44
9.3.2.15. Funktionen ................................................................................... 44
9.3.2.15.1. Arithmetische Funktionen ...................................................... 45
9.3.2.15.2. Zeichenkettenfunktionen........................................................ 46
9.3.2.15.3. Datumsfunktionen .................................................................. 47
9.3.2.15.4. Aggregatfunktionen................................................................ 47
9.3.2.16. Die Klausel GROUP BY ............................................................... 47
9.3.2.16.1. Verschiedene Funktionen ...................................................... 54
9.3.2.17. JOIN - Abfragen über mehrere Tabellen ...................................... 54
9.3.2.17.1. Einleitung ............................................................................... 54
9.3.2.17.2. EQUI-JOIN............................................................................. 56
9.3.2.17.3. OUTER-JOIN......................................................................... 57
9.3.2.17.4. SELF-JOIN ............................................................................ 62
9.3.2.17.5. Joins - Zusammenfassung..................................................... 66
9.3.2.18. Unterabfragen (Subqueries)......................................................... 67
11.09.2005 10:18
Seite 3/88
Datenbanksysteme
9.3.2.18.1. Unterabfragen - Zusammenfassung ...................................... 72
9.3.2.19. Korrelierte (synchronisierte) Unterabfragen ................................. 72
9.3.2.20. EXISTS ........................................................................................ 73
9.3.2.21. ANY und SOME ........................................................................... 74
9.3.2.22. ALL .............................................................................................. 74
9.3.2.22.1. Vorstellung der Datenbankstruktur „EDV-Inventar“................ 74
10.
Weitere elementare Datenbankkonzepte....................................................... 78
10.1.
Transaktionen ......................................................................................... 78
10.1.1.
Sperrmechanismen ......................................................................... 80
10.1.2.
Isolation-Level ................................................................................. 80
10.1.3.
Deadlocks........................................................................................ 81
10.2.
Zugriffsrechte und Rollen........................................................................ 82
10.2.1.
Rollen und Gruppen ........................................................................ 82
10.3.
Datenbankprozeduren ............................................................................ 83
10.4.
Funktionen .............................................................................................. 83
10.5.
Trigger .................................................................................................... 84
10.5.1.
Anwendungsmöglichkeiten von Triggern ......................................... 85
10.6.
Das Cursorkonzept ................................................................................. 85
11.
Overheadfolien .............................................................................................. 87
12.
Referenzen .................................................................................................... 88
12.1.
Abbildungsverzeichnis ............................................................................ 88
Seite 4/88
11.09.2005 10:18
Datenbanksysteme
1.
Historische Entwicklung
1890 Hermann Hollerith, Erfinder der Lochkarten, Volkszählung in USA
1950 Batchverarbeitung (Stapelbetrieb), Eingabe/Verarbeitung/Ausgabe –
verbunden mit langem Warten auf Ergebnisse
1970 Erste interaktive Systeme; Terminalbetrieb (häufig Anbindung über
Telefonleitungen (300bd! – heute 100MBit)
1970 Entwicklung des Hierarchischen Modells (IBM IMS)
Es besteht eine Hierarchie zwischen den Datensätzen (Owner -> Member)
Member gehört immer zu einer Hierarchie
Zugriff: Navigation nur von Owner zu Member (Zeigerstrukturen)
Beispiel (Abteilung – Mitarbeiter – Geräte – Projekte):
Abbildung 1-1: Hierarchisches Datenbankmodell
1971 Netzwerkmodell (Codasyl, Siemens UDS)
Netzwerk von Datensätzen
Binäre 1:n-Beziehungen (Owner/member)
11.09.2005 10:18
Seite 5/88
Datenbanksysteme
Zugriff: Navigation von Owner zu Member, erstmals aber auch umgekehrt
von Member zu Owner
Abbildung 1-2: Netzwerkmodell
1972 Transaktionsorientierte Systeme
Relationenmodell, RDBMS („SQL-Datenbanken“)
Vertreter:
IBM mit DB/2, Ingres, Oracle, Informix, Sybase, Microsoft SQL Server
Häufig: Datenbanken wurden selbst programmiert (Cobol, C). Dafür wurden
indexsequentielle Zugriffsmechanismen verwendet. Umständlich bei
Änderungen in der Datenstruktur, Performanceoptimierung sehr schwierig. Zu
Gunsten besserer Performance wurden häufig bewusst konzeptionelle
Schwächen in Kauf genommen.
80er und 90er Jahre:
Wissensbanksysteme (zb. Rechtsinformationsystem, http://www.ris.bka.gv.at)
Objektrelationale Datenbanksysteme (ORDBMS) (Informix, Oracle)
Trends heute:
Unterstützung spezieller Anwendungen:
• Multimediadatenbanken: Verwaltung multimedialer Objekte (Bilder, Audio,
Video)
• XML-Datenbanken: Semistrukturierte Daten (XML-Dokumente)
• Verteilte Datenbanken: Verteilung auf verschiedene Rechnerknoten
• Mobile Datenbanken: Datenverwaltung auf Kleinstgeräten (PDA, Handy
etc...)
Seite 6/88
11.09.2005 10:18
Datenbanksysteme
2.
Anwendungsgebiete von Datenbanken
Beispielanwendung:
SAP R/3-lnstallation der Deutschen Telekom AG (1998)
• Financial Accounting: Rechnungen, Zahlungsaufforderungen,
Lastschriften, Mahnungen etc.
• 15 SAP R13-Systerne; jedes verarbeitet 200.000 Rechnungen, 12.000
Mahnungen, 10.000 Änderungen von Kundendaten pro Tag
• bis zu jeweils 1000 Nutzer gleichzeitig
• über 13.000 Datenbanktabellen
• Hardware: 51 Unix Enterprise Servern, 34 EMC-Speichersysteme (30 TB),
68 Magnetbandsysteme für Backup (Backup in 2h)
Weitere Anwendungen:
Sloan Digital Sky Survey 40 TB
- Himmelsdaten (Bilder und Objektinformationen); bis 2004
WalMart Data Warehouse 24 TB
- Produktinfos (Verkäufe etc.) von 2.900 Märkten, 50.000.Anfragen/Woche
lndexierbares WWW (1999) 6 TB
- ca. 800 Mill. Dokumente
Microsofts TerraServer
3,5 TB
- Landkarten, unkomprimierte Bilder/Karten (komprimiert; ca. 1 TB); 174 Mill.
Tupel
Gentechnologie, DNS-Erkundung
11.09.2005 10:18
Seite 7/88
Datenbanksysteme
3.
Skalierung gebräuchlicher Datenbanken
3.1.
•
•
•
•
•
•
•
•
Low-End DBMS
Extremfall: „Excel as a database“
Benutzer: 1-n , n klein
- Betrieb ggf. auf gleichem Rechner wie Anwendungen Speicherung nur mit
Mitteln des Betriebssystems
- Verzicht auf Logging, Recovery
- Grobgranulare (oder keine) Sperren
+ Minimaler Overhead
+ Usability: komfortable GUIs, Wizards
+ Komfortable Aufbereitungsfunktionalität („Reports“)
Einsatz:
Marktsegment „SOHO“ (Small Office, Home Office)
Kleinst-Anwendungen, „Quick & dirty“-Lösungen, Rapid Prototyping
3.2.
•
•
•
•
•
•
•
•
•
Standard-DBMS
Mehrbenutzerbetrieb
Client-Server-Organisation
+ Standardisierte Schnittstellen und Sprachen (SQL) z.T. jedoch mit
proprietären Erweiterungen
+ Eigenständige Organisation der Speicherbereiche: Betriebssystem reserviert
lediglich Plattenplatz (Dateien oder eigene Partitionen)
+ Mitlaufende Protokollierung
+ Sicherung von Daten- und Log-Dateien
+ Mittlere Sperrgranularität (Blockebene)
+ Eigene Benutzer- und Rechteverwaltung
+Trennung von Laufzeit-System und Entwicklungswerkzeugen
Einsatz:
Betriebliche (kommerzielle) Anwendungen i.w.S.
Vertreter:
MS Access, mySQL
3.3.
•
•
•
•
•
•
•
•
High-End DBMS
+ Ausgefeilte Optimierer, umfangreiche Tuning-Möglichkeiten
+ Parallelisierung von Zugriffen
+ Replikation und Verteilung:
+ Synchronisierte Verwaltung von Teilen oder Kopien derselben Datenbank
auf verschiedenen Rechnern
+ Sperrgranularität auf einzelnen Datensatz möglich
+ Dienste-Integration: Web Server, Application Server
+ Hohe Ausfallsicherheit
+ Unterbrechungsfreie Wartung
Seite 8/88
11.09.2005 10:18
Datenbanksysteme
•
- Bindung an High-End-Betriebssysteme, zertifizierte Hardware
Einsatz:
Unternehmenskritische Anwendungen („24*7“-Betrieb)
Große Benutzerzahlen und Datenvolumina
Vertreter:
DB/2, SQL-Server, Oracle
3.4.
•
•
•
•
Embedded / Mobile DBMS
DBMS für mobile Geräte (Laptop, PDA’s, Handheld, Mobiltelefon, ...)
+ DBMS-Kern mit Standard-Schnittstellen (SQL)
- Einschränkungen hinsichtlich Concurrency Control
+ Zusatzfunktionalität: regelmäßiger Abgleich des Datenbestands mit Server
Einsatz:
Caching von zentral verwalteten Daten im Mobilgerät, zb Kalenderfunktion am PDA
11.09.2005 10:18
Seite 9/88
Datenbanksysteme
4.
4.1.
Datenbanken Grundbegriffe
Definitionen
Eine Datenbank repräsentiert einen bestimmten Aspekt der realen Welt („miniworld“).
Sie enthält Daten für einen bestimmten Zweck für bestimmte Anwender und
Applikationen.
Relation: Benannte Tabelle
Relationenschema: „Tabellenkopf“ und Strukturdefinition
Attribut: Benannte Spalte mit zugeordnetem Datentyp
Tupel: Zeile bzw. Datensatz; (ein Wert je Attribut)
Schlüssel: Teilmenge der Attribute, anhand derer jedes Tupel eindeutig identifiziert
werden kann
Primärschlüssel: Schlüssel, nach dem die Relation sortiert gespeichert ist
Fremdschlüssel: (referentielle Integrität, sh. später)
Beispieltabelle:
PERSON
Name, SVNR (Primärschlüssel), GebDat, Nationalität (Fremdschlüssel), Geschlecht
Darstellung:
Name
SVNR
GebDat
Nationalität
Geschlecht
Abbildung 4-1: Beispieltabelle
4.2.
•
•
•
Das 3-Ebenen-Konzept
Interne Ebene
Reservierung von Plattenplatz, Aufbau von Datensätzen, Packen von
Datensätzen mit Spielraum für Ausdehnung (z.B. varchar-Felder)
Sekundärspeicherstrukturen (Seiten/Blöcke, Sätze, Zeiger, Indizes, Speicher,
Adresse, Sektor etc.)
Satz- und seitenorientierte Operationen, Abarbeitungsstrategien
Sperrverwaltung, Protokollierung, Pufferung von Seiten im Hauptspeicher,
Ersetzung von Seiten (paging), Zurückschreiben nach Änderungen
Bewahrung von Transaktionszuständen
Indexerstellung und –pflege: Indizes sind zusätzliche Datenstrukturen zum
schnellen Wiederauffinden von Datensätzen (kontrollierte Redundanz,
transparent!); Z.B.: B-Bäume, Hash-Tabellen
Konzeptuelle Ebene
Datenbankschema (Datenstrukturen, Constraints)
‚Architektur’ des jeweiligen DB-Systems (Relationen, Attribute)
Operationen für satz- und mengenorientierte Zugriffe
Externe Ebene (Benutzerpräsentation, Views, GUI’s)
An die Bedürfnisse und Rechte von Benutzern/Anwendungen angepasste
Seite 10/88
11.09.2005 10:18
Datenbanksysteme
Sichten auf das konzeptuelle Schema. Überwachung von Besitz- und
Zugriffsrechten
Abbildung 4-2: 3-Ebenen-Konzept
11.09.2005 10:18
Seite 11/88
Datenbanksysteme
5.
5.1.
Datenmodellierung, Normalisierung
DB-Konzepte und Anforderungen
Abbildung 5-1: Struktur eines Datenbanksystems
Datenbank-Managementsystems (DBMS) zur Gewährleistung dieser Anforderungen
o Eine Datenbank besteht also aus DBMS und Datenbestand.
Strukturierte Daten, kontrollierte Redundanz
o Redundanz ist nur dort vorhanden, wo sie unbedingt nötig ist (etwa zum
schnelleren Zugriff)
Datenintegrität
o Datenkonsistenz: Eingabekontrollen müssen verhindern, dass
widersprüchliche Information erfasst wird
o Einhaltung von Wertebereichen
o Vollständigkeit von Datensätzen
o Eindeutigkeit identifizierender Merkmale (i.a. Schlüssel)
Seite 12/88
11.09.2005 10:18
Datenbanksysteme
o Referentielle Integrität: Existenz von Datensätzen, auf die andere Datensätze
verweisen
Datensicherheit
o Maßnahmen (z.B. Backup-Strategien) gegen Verlust durch Systemfehler.
Problem: Sicherung im lfd. Betrieb
Datenschutz
o Maßnahmen gegen unberechtigten Zugriff, z.B. abgestufte Zugriffsrechte,
spezielle Datensichten (views).
Parallele Benutzbarkeit:
o Setzt voraus, dass alle Transaktionen atomar sind.
Eindeutige Primärschlüsselwerte
Keine Duplikate
Einhaltung der referentiellen Integrität:
o Attribute, die als Fremdschlüssel verwendet werden, dürfen nur Werte
annehmen, zu denen in der anderen Relation ein Tupel existiert.
Konsistenzbedingungen:
o Updates, inklusive Einfügen und Löschen von Tupeln müssen
konsistenzerhaltend durchgeführt werden. Um dies sicherzustellen, werden
diese mittels Transaktionen implementiert
o Eine Transaktion wird entweder ganz oder gar nicht ausgeführt.
Bsp.: Buchung auf 2 Konten: Überweisung von Konto A auf Konto B von
10000€
Konto A: Saldo - 10000 / anschl. Systemabsturz ??
o Eine abgebrochene Transaktion muss vollständig annullierbar sein.
o Parallele Transaktionen (durch verschiedene Benutzer) dürfen sich nicht
stören - häufig Sperren verwendet - Gefahr eines deadlock, -> sh.
Transaktionen
o Ineffiziente Implementierung von Transaktionen bewirkt lange Sperrzeiten.
5.2.
Relationales Modell
Entwickelt von Edgar CODD 1970.
5.2.1. Terminologie
o Relationale Datenbank: Eine aus verschiedenen Relationen (Bestands- und
ggf. Beziehungsrelationen) aufgebaute Datenbank – alle Daten befinden sich
in Tabellen
o Relation: eine Tabelle, in der in zweidimensionaler Anordnung die
Datenelemente erfaßt sind
o Bestandsrelation (Entitätsrelation): bildet eine Objektklasse mit
identischen Merkmalen (Feldern) ab
o Beziehungsrelation: schafft eine Beziehung zwischen zwei
verschiedenen Bestandsrelationen
11.09.2005 10:18
Seite 13/88
Datenbanksysteme
o Tupel: ein Datensatz bzw. eine einzelne Zeile in der Tabelle; enthält alle auf
ein Objekt bezogenen Feldwerte bzw. Merkmalsausprägungen
o Attribut: einzelne Spalte in der Tabelle (Feld von einem bestimmten
Datenfeldtyp)
o Domäne: Menge der verschiedenen Feldwerte eines Attributs
o Schlüsselfeld: dient der eindeutigen Identifikation eines Tupels in einer
Relation und der Herstellung von Beziehungen zwischen verschiedenen
Relationen
o Abfrageergebnisse sind ebenfalls Tabellen (Transformationen von Tabellen)
o Selektion: Auswahl bestimmter Zeilen aus einer Tabelle
o Projektion: Auswahl bestimmter Spalten (Attribute) aus einer Tabelle
5.2.2. Eigenschaften des relationalen
Datenbankmodells
o
o
o
o
Feste Anzahl von Spalten, beliebige Anzahl von Zeilen
Reihenfolge der Zeilen und Spalten spielt keine Rolle
Die Spalten enthalten die Attribute des Datensatzes
Es kann keine zwei identischen Zeilen geben
Abbildung 5-2: Relationendarstellung allgemein
Seite 14/88
11.09.2005 10:18
Datenbanksysteme
Abbildung 5-3: Relationendarstellung am Beispiel eines Buchverleihs
Die Integritätsbedingungen lauten hier:
INV.NR ist Primärschlüssel für BUCH
INV.NR darf nicht doppelt vorkommen
INV.NR in AUSLEIH ist Fremdschlüssel bezüglich BUCH
INV.NR taucht in einem anderen Relationenschema als Schlüssel auf
5.3.
Normalisierung und Normalformen
Bei komplexen Systemen mit vielen Objekttypen und Beziehungen ist die
Modellierung der Datenstruktur nicht unproblematisch. Hierzu wurden Regeln
aufgestellt, nach denen man die Einträge in den Tabellen ordnet und aufteilt. Die
wichtigsten Ziele der Normalisierung einer oder mehreren Tabellen sind:
•
•
•
Vermeidung von Redundanzen (doppelt gespeicherten Werten)
Vereinfachung des Aufbaues von Tabellen
Einfache Datenpflege
5.3.1. Basistypen im relationalen Modell
5.3.1.1.
Entitäten
Eine Entität ist ein individuelles und identifizierbares Exemplar von Dingen, Personen
oder Begriffen der realen oder der Vorstellungswelt.
Beispiele:
Individuum (Person, Mitarbeiter, Einwohner, Schüler)
Reales Objekt (Maschine, Gebäude, Produkt, Artikel)
Abstraktes Konzept (Fachgebiet, Vorlesung)
Ereignis (Kursanmeldung, Bestellung, Lieferung einer Ware)
Eine Entität ist immer eine eindeutig identifizierbare Einheit.
11.09.2005 10:18
Seite 15/88
Datenbanksysteme
5.3.1.2.
Beziehungen
Eine Beziehung assoziiert wechselseitig zwei (möglicherweise aber auch mehr als
zwei) Entitäten.
Beispiele:
BETREUT (Arzt, Patient)
PRODUZIERT (Mitarbeiter, Werkstück)
PRÜFT (Professor, Student):
5.3.2. Kardinalitäten
a) 1:1 (Ein Student ist verheiratet mit einer Studentin)
b) 1:n bzw. n:1 (Mehrere Schüler gehören zu einer Klasse)
c) n:m (Mehrere Professoren prüfen mehrere Studenten)
Abbildung 5-4: Kardinalitäten
Seite 16/88
11.09.2005 10:18
Datenbanksysteme
5.3.3. Anomalien
5.3.3.1.
Einfüge-Anomalie
Ein Datensatz kann in einer Relation nur dann eingefügt werden, wenn auch
bestimmte Merkmale, welche in einer anderen Relation gespeichert sind, bekannt
sind.
Beispiel: Ein Kunde kann nur dann eingetragen werden, wenn er auch eine Ware
kauft.
5.3.3.2.
Lösch-Anomalie
Beim Löschen eines Tupels aus einer Relation werden Informationen, welche in
einer anderen Relation gespeichert sind, unbrauchbar oder ebenfalls gelöscht.
Beispiel: Wird die einzige Lieferung an einen Kunden gelöscht, weil diese zb nicht
angekommen ist, sind auch die Informationen über Wohnort, Anschrift des
Kunden verloren.
5.3.3.3.
Änderungs-Anomalie
Bei der Änderung eines Attributs in einer Relation sind mehrere Änderungen in
der Datenbank vorzunehmen.
Beispiel: Falls ein Kunde umzieht, so sind mehrere Tupel eventuell nachträglich
zu ändern, da ansonsten die Rechnungen sowohl an die alte sowie auch an die
neue Anschrift adressiert werden.
5.3.4. Abhängigkeiten
5.3.4.1.
Funktionale Abhängigkeit
Definition:
In einer Relation R(A,B) ist das Attribut B von dem Attribut A funktional abhängig,
falls zu jedem Wert des Attributs A genau ein Wert des Attributs B gehört.
Beispiele:
ISBN Titel (sprich: ‚ISBN bedingt Titel’)
weil: bei einer bestimmten ISBN ist Titel IMMER derselbe.
ISBN Verlag
weil: bei einer bestimmten ISBN ist Verlag IMMER derselbe.
NICHT funktional abhängig sind:
ISBN Autor
ISBN Stichwort
(es kann MEHRERE Autoren bei einem Buch geben, ein Buch hat mehrere
Stichwörter!)
Beispiel:
Ein Angestellter arbeitet in EINER Abteilung, eine Abteilung ist an EINEM Ort
(AngestNr, AbtNr, Ort)
AngestNr AbtNr
AbtNr Ort
11.09.2005 10:18
Seite 17/88
Datenbanksysteme
5.3.4.2.
Voll funktionale Abhängigkeit
Definition:
In einer Relation R(S1/S2,A) ist das Attribut A von den Attributen (Schlüsseln) S1,S2
voll funktional abhängig, wenn A von den zusammengesetzten Attributen (S1,S2)
funktional abhängig ist, nicht aber von einem einzelnen Attribut S1 oder S2.
Anders:
S1/S2 A
S1 nicht A
S2 nicht A
Beispiel:
Ein bestimmter Mitarbeiter braucht Zeit zur Herstellung eines bestimmten Produkts:
DAUER (MITARBEITER_ID, PROD_ID, ZEIT)
ZEIT ist nicht abhängig von MITARBEITER_ID („Ein Mitarbeiter braucht Zeit...“)
ZEIT ist nicht abhängig von PROD_ID („Ein Produkt benötigt Zeit...“)
5.3.4.3.
Transitive Abhängigkeit
Definition:
In einer Relation R(S,A,B) ist das Attribut B vom Attribut S transitiv abhängig, wenn A
von S funktional abhängig ist, und B von A funktional abhängig ist.
Anders:
S A B Daher: B ist von S transitiv abhängig
Beispiel: Relation (Person#, AbtNr#, AbtName)
Person AbtNr
AbtNr# AbtName
Daher: AbtName ist von Person# transitiv abhängig.
5.3.5. Normalisierungsprozess
5.3.5.1.
Obsthändler Krämers erste Datenbank
Wie eine völlig unerfahrene Person eine Datenbank planen würde... Obsthändler
Krämer hat folgenden Datenbankentwurf erstellt:
Auftragsnr.
1
1
2
2
2
3
3
3
4
4
Datum
1.1.99
1.1.99
1.1.99
1.1.99
1.1.99
2.2.99
2.2.99
2.2.99
2.2.99
2.2.99
Kunde
1 Schmitt, Bonn
1 Schmitt, Bonn
2 Müller, Köln
2 Müller, Köln
2 Müller, Köln
1 Schmitz, Bonn
1 Schmitz, Bonn
1 Schmitz, Bonn
45 Lehmann, Jülich
45 Lehmenn, Jülich
Artikelnr.
134
135
140
160
160
103
134
135
30
27
Bezeichnung
Coxorange
Kiwi
Butterbirne
Kürbis, rot
Kürbis, gelb
Johannisbeeren
Coxorange
Kiwi
Bananen
Ananas
Menge
4 Kisten
4 Kisten
2 Kisten
2 Stück
10 Stück
5 Kilo
12 Kisten
2 Kisten
12 Kilo
60 Stück
Abbildung 5-5: Unnormalisierte Datenbankrelation
Seite 18/88
11.09.2005 10:18
Datenbanksysteme
Herr Krämer hat die Datenbank nach seiner Intuition mit ACCESS erstellt. Wie man
sehen kann, hat er die Daten so eingegeben, wie er es seit vielen Jahren auf dem
Papier auch tut. Im Prinzip tut es dieser Datenbankentwurf auch, nur leider gibt es
hier viele Probleme:
1. Viele gleiche Einträge (Redundanz) sorgen nach ein paar Monaten dafür, dass
die Datenbank unnötig groß wird.
2. Tippfehler (letzte Zeile: Lehmenn) machen das Auffinden aller Lieferungen an
Lehmann, Jülich unmöglich.
3. In der Spalte Kunde sind sowohl Kundennummer, Name und Ort zugleich
eingetragen. Herr Krämer muss sich stets selber die Kundennummer merken und
alle Daten bei jedem neuen Auftrag stets neu eintippen.
4. Artikelnummer und Bezeichnung könnten als Synonyme verwendet werden, sind
aber hier jeweils für sich in getrennten Spalten gespeichert.
5. Die Farbe des Kürbis gibt eine andere Art an, die eine neue Artikelnummer
erfordert.
6. Die Spalte Menge enthält sowohl die Stückzahl als auch die Einheit der Ware
(Kiste, Stück, Kilo). Die Einheit ist aber stets an die Art der Ware gekoppelt.
Schwächen des DB-Entwurfs sind an den Anomalien (sh. oben) erkennbar:
Hier noch einmal der ursprüngliche Datenbankentwurf:
Auftragsnr. Datum
1
1.1.99
....
4
2.2.99
Kunde
Artikelnr. Bezeichnung
1 Schmitt, Bonn 134
Coxorange
Menge
4 Kisten
45 Lehmenn, Jül. 27
60 Stück
Ananas
Abbildung 5-6: Auszug unnormalisierte Datenbankrelation
5.3.5.2.
Die 1. Normalform
Umwandlung in die erste Normalform:
1NF:
AuftrNr. Datum
KundenNr.
Name
Ort
ArtNr.
Bez.
Menge
Es wurde in der Spalte Kunde die Abhängigkeit von Kundennummer, Name und
Ort aufgelöst. Dafür sind weitere Spalten entstanden.
Nach der Trennung entspricht der Entwurf der Forderung nach atomaren Werten
(von atomos = unteilbar).
Definition der 1. Normalform (1NF):
• Jedes Attribut ist eine atomare (nicht weiter zerlegbare) Dateneinheit.
• Jedes Attribut darf in einer Relation nur einmal vorkommen
• Es gibt einen Primärschlüssel (daher kann jeder Satz in einer Tabelle/Relation
nur einmal vorkommen). Es darf keine Wiederholungsgruppen geben.
5.3.5.3.
Die 2. Normalform
Nochmals die 1NF:
11.09.2005 10:18
Seite 19/88
Datenbanksysteme
AuftrNr. Datum KundenNr.
Name
Ort
ArtNr. Bez.
Menge
Umwandlung in die 2. Normalform:
AUFTR-KUNDE:
AuftrNr#
Datum
KundenNr.
Name
AUFTR-ART:
AuftrNr.
ArtNr.
Bez.
Menge
•
•
Ort
Was geschah? Aufteilung der Datenbank in 2 Teile.
Warum? Zum einen gehören Kundennummer, Name, Ort (und Anschrift)
einerseits und Artikelnummer, Bezeichnung und Menge andererseits jeweils
zusammen.
Primärschlüssel: Die Auftragsnummer in der 1. Tabelle
Fremdschlüssel: Auftragsnummer in der 2. Tabelle
Wir müssen diese beiden Tabellen durch eine Relation miteinander verknüpft
betrachten: Kunde x (kauft) Ware y. Diese Verknüpfung erfolgt über die
Auftragsnummer. Sie ist das Bindeglied zwischen den Tabellen und in beiden
Relationen enthalten. Sonst kann man die Waren nicht mehr dem Käufer zuordnen.
Die Forderung, dass alle Attribute von dem Schlüssel voll funktional abhängig sein
sollten, konnte nur dadurch erfüllt werden, dass die Tabelle in zwei Tabellen
aufgeteilt wurde, bei denen die Attribute von ihrem Schlüssel funktional voll abhängig
sind.
Definition der 2. Normalform (2NF):
Eine Relation befindet sich in 2. Normalform, wenn sie sich in erster Normalform
befindet und jedes Attribut, das nicht zum Primärschlüssel gehört, VOLL funktional
abhängig vom Primärschlüssel ist.
Zusammenfassung:
Die 2NF regelt die Beziehungen zwischen Schlüssel und Attributen einer Tabelle.
5.3.5.4.
Die 3. Normalform (3NF)
Nochmals die 2NF:
AUFTR-KUNDE:
AuftrNr.
Datum KundenNr.
AUFTR-ART:
AuftrNr.
ArtNr. Bez.
Name
Ort
Menge
Es gibt transitive Abhängigkeiten:
AuftrNr KundenNr Name
AuftrNr ArtNr Bez.
Seite 20/88
11.09.2005 10:18
Datenbanksysteme
Aufgabe der 3. Normalform ist die Entfernung von transitiven Abhängigkeiten.
Die Transitivität wird gebrochen, d.h. das transitiv abhängige Attribut ist in ein neues
Relationenschema zu übertragen:
ARTIKEL:
ArtNr.
Bez.
AUFTR-ART:
AuftrNr.
Menge
ArtNr. (FS)
AUFTR-KUNDE:
AuftrNr.
KundenNr. (FS)
Datum
KUNDE:
KundenNr.
Name
Ort
(Anschrift...)
Es werden nur die wirklich zusammengehörenden Attribute, wie Kundennummer,
Name, Ort, (Anschrift) in einer Tabelle gespeichert, und eines dieser Attribute wird
als Schlüsselattribut definiert.
Merke: Damit alle Attribute in 4 Tabellen miteinander abfragbar werden, müssen
zumindest 2 Tabellen jeweils über einen Primärschlüssel und einen Fremdschlüssel
verfügen, während die restlichen beiden nur über einen Primärschlüssel verfügen
müssen.
Definition der 3. Normalform (3NF):
Die 3. Normalform ist erfüllt, wenn die 2. Normalform erfüllt ist und die NichtSchlüssel-Attribute funktional unabhängig voneinander sind.
Merksatz:
Your attributes shall depend on the key,
the whole key and nothing but the key,
so help me Codd!”
Zusammenfassung:
Die 3NF regelt die Beziehungen von Attributen einer Relation untereinander.
5.3.5.5.
Weitere Normalformen (BCNF, 4NF, 5NF)
Die meisten Relationen, die sich in der zweiten und dritten Normalform befinden,
sind meistens auch schon in der Boyce-Codd-Normalform (BCNF). Eine
Ausnahme tritt nur dann ein, wenn:
•
•
•
der Primärschlüssel eine Zusammensetzung aus mehreren
Schlüsselattributen ist
es mehr als einen Schlüssel gibt (d.h. sowohl Primär- als auch
Fremdschlüssel)
die Schlüssel nicht disjunkt zueinander sind, d.h. mehrere Attributwerte der
Schlüssel den selben Wert haben.
Besonders die letzte Bedingung sagt aus, dass BCNF nur sehr selten vorkommt.
Z.B.: Relation (A#, B#, C, D)
B# ist außerdem Fremdschlüssel
11.09.2005 10:18
Seite 21/88
Datenbanksysteme
Auch hier werden Attribute extrahiert, die funktional abhängig sind.
Es ist jedoch zu beachten, dass solche Dekompositionen in manchen Fällen zu
erheblichen Schwierigkeiten führen können, die einen Verzicht als die bessere
Wahl erscheinen lassen.
Definition der BCNF:
Eine Relation ist dann in BCNF, wenn kein Attribut funktional abhängig von einer
Attributgruppe ohne Schlüsseleigenschaft ist.
5.3.5.6.
Weitergehende Normalformen
Über die dargestellten Normalformen hinaus, die sich mit der Eliminierung
funktionaler Abhängigkeiten befassen, existieren weitergehende Normalformen
(vierte und fünfte Normalform) zum Ausschluss mehrwertiger Abhängigkeiten und
sogenannter Join Dependencies, die aber in der Praxis ähnlich wie bereits die
BCNF kaum eine Rolle spielen.
Beispiel für die fünfte Normalform... (Quelle: C.J. Date/ Database Systems):
Abbildung 5-7: 5. Normalform
5.3.5.7.
Zusammenfassung Normalformen
Erste Normalform (1NF):
• Atomare Attribute (keine Wiederholungsgruppen)
Zweite Normalform (2NF):
• Attribute voll funktional abhängig vom Primärschlüssel
Dritte Normalform (3NF):
• Abhängigkeit der Nichtschlüsselattribute untereinander
Seite 22/88
11.09.2005 10:18
Datenbanksysteme
Boyce-Codd-Normalform (BCNF):
• Abhängigkeiten vom Schlüssel ausgehend
11.09.2005 10:18
Seite 23/88
Datenbanksysteme
6.
Praxisteil: Postleitzahlen mit MS Access
Ziel der Übungsaufgabe: Erstellen einer Kundentabelle; Bei Eingabe in das Feld PLZ
(Postleitzahl) in dieser Tabelle soll automatisch der dazu passende Ort erscheinen.
1) Benötigt werden daher 2 Basistabellen:
•
•
T_Name
T_Ort
NAME, PLZ
PLZ, ORT
2) Beziehungen zwischen den Tabellen anlegen:
Abbildung 6-1: Symbol für Beziehungsfenster
3) Beide Tabellen ins Beziehungsfenster einbinden und Verknüpfung zwischen den
PLZ-Attributen herstellen: Von Orte (das ist die 1:-Relation!) nach Name (das ist die
n-Relation) ziehen:
Abbildung 6-2: Beziehung zwischen zwei Tabellen herstellen
4) Testdaten in Tabelle Orte eingeben
5) Ein Formular (mit Formularassistent) anlegen. Die erforderlichen Felder sind:
Name, PLZ, Ort
Seite 24/88
11.09.2005 10:18
Datenbanksysteme
Abbildung 6-3: Eingabeformular für Namen
6) Datensätze in Formular eingeben bei gültiger PLZ erscheint entsprechender Ort
automatisch
7) Feld Ort auf Eingabe sperren
Das Feld ‚Ort’ wird direkt über die Eingabe der PLZ angesprochen und ausgegeben,
und sollte daher für allfällige Eingaben gesperrt werden:
Abbildung 6-4: Eigenschaftenfenster des Feldes „Ort“ im Formular
11.09.2005 10:18
Seite 25/88
Datenbanksysteme
7.
7.1.
Codd’sche Regeln
Einleitung und Hintergrund
E.F. Codd und seine Mitarbeiter benötigten von ihren ersten theoretischen Ansätzen
bis zur Formulierung der inzwischen berühmt gewordenen zwölf Regeln mehr als 15
Jahre. Rechnet man als Geburtsstunde des PC den ersten Rechner von IBM aus
dem Jahre 1982, so ist die Geschichte der Theorie wie auch der Praxis relationaler
Datenbanken deutlich länger. Im Oktober 1985 veröffentlichte E.F. Codd zum
ersten Mal in der "Computerworld" seine Regeln, die sein Mitarbeiter C.J. Date knapp
ein Jahr später um weitere zwölf Regeln für virtuelle RDBMS erweiterte.
Die seither entstandenen DBMS nähern sich dem relationalen Modell jedoch nur
sehr langsam. So gibt es heute noch kaum einen Hersteller, der das mit SQL92 per
Standard eingeführte Domänenpronzip umsetzt. Außerdem bieten nahezu alle
Hersteller als Abfragesprache SQL mit zahlreichen Abweichungen untereinander. Es
wird fast immer nur ein Teil der Relationalen Algebra unterstützt.
Dazu kommt noch, dass neben Datenbanken, die man als relational bezeichnen
kann, noch Systeme existieren, die ursprünglich eindeutig nicht-relational waren
und wo die Hersteller versuchten und versuchen, diese Schritt für Schritt zu "drehen".
Manche bezeichnen ihre Systeme schon als relational, weil sie ihnen eine SQLSchnittstelle verpassten. Andere Systeme hießen relational, weil sie die von Codd
als relational bezeichneten Tabellenstrukturen nachempfanden. Die im PC-Bereich
bisher weit verbreiteten x-Base-Systeme sind der beste Beweis für solche
Datenbanken. Dabei ist die Tabellenstruktur fast das einzige relationale Merkmal von
x-Base-Systemen wie FoxPro, dBase oder Clipper.
Um sich hier richtig zu orientieren und einschätzen zu können, in welchem Grad ein
DBMS relational ist oder nicht, sind die zwölf Regeln ein sehr nützliches und auch
einfaches Hilfsmittel. Deutlich aufwendiger wäre es, zu unterscheiden, inwieweit die
einzelnen DBMS das vollständige relationale Modell unterstützen.
Streng genommen sind es sogar dreizehn Regeln, doch E.F. Codd trennte die erste
ab, weil diese fundamental ist und alle anderen auf dieser "Regel" aufbauen.
7.2.
Die 13 Regeln
7.2.1. Basisregel
Jedes relationale Datenbanksystem muss in der Lage sein, die gesamte Datenbank
mit seinen relationalen Fähigkeiten, wie dies im relationalen Modell spezifiziert ist,
selbst zu verwalten. Dies muss auch dann möglich sein, wenn das DBMS zusätzlich
nichtrelationale Fähigkeiten unterstützt. Außerdem muss die Sprache, mit der auf die
Daten zugegriffen wird, auf relationalem Niveau sein, d.h. jedes Select, jedes
Commit, Update oder Delete (eben SQL als Zugriffssprache) muss den Zugriff auf
mehrere Datensätze (Tupel) gleichzeitig unterstützen. Die Auswahl eines oder keines
Datensatzes ist in diesem Zusammenhang als Spezialfall der Umschreibung
"mehrerer Datensätze" zu betrachten.
Seite 26/88
11.09.2005 10:18
Datenbanksysteme
7.2.2. Logische Speicherung
In einer relationalen Datenbank werden alle Informationen ausschließlich auf einer
logischen Ebene und nur auf genau eine Art und Weise durch Werte in Relationen
(Tabellen) dargestellt. Damit spielt es keine Rolle, wie das DBMS die Daten
physikalisch auf Server und Festplatten verteilt. Es wird ausdrücklich untersagt, auf
die logischen, dem Benutzer zugänglichen Ebene Mechanismen wie Pointer,
hardwarenahe Adressen, Sektornummern u.ä. zu benutzen.
Neben den Anwenderdaten, den eigentlichen Nutzinformationen, müssen auch die
Namen der Relationen, Spalten und Domänen einer Datenbank in Form von
Zeichenketten in Relationen dargestellt werden. Soche Relationen sind
normalerweise im sogenannten Systemkatalog abgelegt. Der Systemkatalog wird
somit praktisch ein Teil der Datenbank, er ist dynamisch veränderbar und während
jeder Datenbanksitzung aktiv.
Diese erste Regel wird oft auch al Informationsregel bezeichnet, denn mit ihr ist die
Datenbank-Administration (DBA) in der Lage, die Integrität der Datenbank zu
erhalten, ja sie vereinfacht seine Arbeit erheblich. Mit Hilfe des Systemkatalogs ist es
jederzeit möglich, Zustände der Datenbank abzufragen, Aussagen über den Umfang
der Tabellen, deren Indizierung und Struktur zu treffen.
7.2.3. Eindeutigkeit
Jedes einzelne Element in einer relationalen Datenbank ist immer durch eine
logische Kombination aus dem Namen der Relation, einem Primärschlüsselwert und
dem Spaltennamen erreichbar.
Der Zugriffsmechanismus findet auf der logischen Ebene statt, physikalische
Adressierungen sind nicht erlaubt. Fundamentale Bedeutung hat auch die
entsprechende Umsetzung des relationalen Modells, nach der jede Relation einen
eindeutigen Primärschlüssel ohne NULL-Werte besitzen muss.
7.2.4. Unterstützung von NULL-Werten
Das relationale System muss unabhängig vom Datentyp Indikatoren unterstützen,
die auf der logischen Ebene fehlende Informationen ersetzen. Sie müssen sich
außerdem von solchen Konstrukten wie leere Zeichenketten für Stringfelder, der
Ziffer Null für numerische Felder oder des Datums 01.01.0000 unterscheiden.
In der Praxis wird dieser Forderung durch die Unterstützung des sogenannten NULLWertes entsprochen. Die ursprünglich und in zahlreichen PC-Datenbanksystemen
heute noch üblichen speziellen Werte sind im relationalen Modell ungeeignet, da der
Benutzer für jede Spalte oder Domäne eine dem Datentyp angepasste Technik
anwenden müsste.
Beispiel:
In einem Formular wird ein Antragsteller nach der Zugehörigkeit zu einer bestimmten
Versicherungsorganisation gefragt. Falls er dort mit "ja" quittiert, muss er in einem
weiteren Feld das Beitrittsdatum angeben. Doch was macht die Erfassungsroutine,
falls der Antragsteller mit "nein" quittiert und es demzufolge kein Beitrittsdatum gibt ?
11.09.2005 10:18
Seite 27/88
Datenbanksysteme
Wird an dieser Stelle der eben erwähnte spezielle Wert 01.01.0000 (der übrigens
korrekt ist) gespeichert, müssen alle Operationen der Datenbank, die diese Spalte
benutzen, diesen Wert speziell abarbeiten. Dies kann bei großen oder verteilten
Systemen, bei zahlreichen Anwendern und Anwendungsprogrammen schwierig sein;
deshalb wird der NULL-Wert gespeichert.
Um die Integrität der Datenbank zu gewährleisten, muss es allerdings möglich sein,
Felder zwingend als "NOT NULL" zu definieren. Primärschlüsselfelder müssen z.B.
immer einen Wert enthalten.
7.2.5. Einbindung eines Systemkataloges
Die Beschreibung der Datenbank (der sogenannte Systemkatalog) erfolgt auf einer
logischen Ebene, und zwar in genau der gleichen Art und Weise wie die Darstellung
der Nutzdaten. Es muss daher für autorisierte Benutzer möglich sein, mit der
gleichen Zugriffssprache auf diese Systemdaten zuzugreifen wie auf die normalen
Daten.
Dies ist ein Feature, das nicht-relationale Datenbanken normalerweise nicht bieten.
Jeder Anwender, egal ob End-User, Programmierer oder Administrator, muss nur
eine Sprache lernen. Autorisierte Benutzer können den Katalog leicht erweitern.
7.2.6. Unterstützung von Abfragesprachen
Um auf die gespeicherten Datenbestände zugreifen zu können, muss das DBMS
mindestens eine Abfragesprache unterstützen, um die Daten geeignet ansprechen
zu können.
Die Sprache muss umfassend sein und Kommandos zur Daten- und Viewdefinition,
zur Manipulation der Daten, zur Autorisierung des Zugriffs, zur Sicherung der
Integrität und zum Verpacken in Pakete (Transaktionen) enthalten.
7.2.7. Aktualisierungsmöglichkeiten
Das relationale DBMS enthält einen Algorithmus, mit dem zum Definitionszeitpunkt
einer View festgelegt werden kann, ob in dieser View Datensätze eingefügt oder
gelöscht und welche Spalten verändert werden dürfen. Die Definition dieser
Eigenschaft muss im Systemkatalog gespeichert werden.
7.2.8. Abfragen und Bearbeiten ganzer Tabellen
Eine Basis- oder Ergebnistabelle kann man in einem relationalen DBMS wie einen
Operanden benutzen. Daher besteht die Möglichkeit, ganze Tabellen einzufügen, zu
ändern oder zu löschen.
Ziel dieser Regel ist es, dem System einen größeren Spielraum bei der Optimierung
seiner Laufzeitaktionen zu geben.
7.2.9. Physische Datenunabhängigkeit
Anwendungsprogramme und deren Oberfläche bleiben für den Benutzer logisch
unverändert, auch wenn Veränderungen an der Speicherstruktur oder der
Zugriffsmethode vorgenommen werden.
Das bedeutet nichts anderes, als dass das relationale DBMS die hardwarenahen
Momente (wie Speicherausstattung, CPU, schnelles Netzwerk usw.) ganz klar vom
logischen Aufbau der Datenbank abkoppelt. Dies hat zur Folge, dass beispielsweise
Seite 28/88
11.09.2005 10:18
Datenbanksysteme
ein Tuning der Datenbank vorgenommen werden kann oder die Datenbank auf ein
größeres leistungsfähigeres System portiert wird, ohne dass ein
Anwendungsprogramm verändert werden muss. Damit ist auch eine strikte Trennung
der Aufgaben des Server-Systems von denen des Client-Systems möglich.
Die Benutzung und Verwaltung der Indizes ist Sache des DBMS.
7.2.10. Logische Datenunabhängigkeit
Manche Änderungen an der Struktur der Datenbank können vor den
Anwendungsprogrammen verborgen werden, indem einfach eine View definiert wird,
die der alten Struktur entspricht.
Anwendungsprogramme bleiben logisch unbeeinträchtigt von Veränderungen an den
Basisrelationen, wenn es theoretisch möglich ist, diese Unabhängigkeit zu
gewährleisten.
So kann es beispielsweise notwendig werden, dass eine sehr große Tabelle
physisch auf zwei oder gar mehr Festplatten verteilt werden muss. Das kann
entweder zeilenweise über den Zeileninhalt oder spaltenweise über den
Spaltennamen vorgenommen werden. Damit bleiben die Primärschlüssel in beiden
Teilrelationen erhalten.
Auch das Gegenteil, die Zusammenführung zweier Relationen in eine Tabelle ist
denkbar. Dieser Vorgang wird auch „verlustfreier Join“ genannt.
Mit der 9. Regel kann das logische Datenbankdesign regelmäßig verändert werden,
um etwa das Performance-Verhalten zu verbessern, ohne dass dies Auswirkungen
auf ein Anwenderprogramm hat.
7.2.11. Unabhängigkeit der Integrität
Alle Integritätsbedingungen, die spezifisch für eine Datenbank gelten, müssen mit
Hilfe der relationalen Datenbankbeschreibungssprache definierbar sein. Außerdem
müssen sie im Systemkatalog (im sog. Data Dictionary) abgelegt werden. Ihre
Definition in den Anwendungsprogrammen ist unzulässig.
Damit ist eine Verwaltung der Integritätsregeln an zentraler Stelle möglich.
7.2.12. Verteilungsunabhängigkeit
Ein relationales Datenbank-Managementsystem mit einer Zugriffssprache bleibt
logisch unbeeinträchtigt, wenn entweder die verteilte Datenhaltung eingeführt oder
umgekehrt verteilte Daten auf einem System zusammengeführt werden.
7.2.13. Unterwanderungsverbot
Es darf keine Möglichkeiten geben, die Regeln für relationale System zu
unterwandern.
Falls also ein relationales System über eine sogenannte Low-Level-Sprache verfügt,
so dürfen damit nicht die mit der High-Level-Sprache ausgedrückten Integritätsregeln
und Zwangsbedingungen verletzt oder umgangen werden. Unter Low-Level-Sprache
wird eine Sprache verstanden, die einen satzweisen Zugriff auf die Datenbestände
erlaubt, während eine High-Level-Sprache mengenorientiert arbeitet.
11.09.2005 10:18
Seite 29/88
Datenbanksysteme
An dieser Regel scheitern die meisten nicht-relationalen Systeme, da sie häufig eine
Sprache oder Programmierschnittstelle unterhalb der relationalen Sprache besitzen.
Auch wenn mit Zugangsregeln geprüft wird, wer die Low-Level-Sprache benutzen
darf, bleibt die Regel nach Codd verletzt.
7.3.
Codd’sche Regeln - Zusammenfassung
Auch wenn es hin und wieder gar nicht einfach ist, zu bestimmen, welches System
den Regeln gemäß relational oder nicht-relational sind, für den größten Teil der
existierenden Datenbanksysteme lassen sich die relationalen Regeln anwenden oder
erweisen sich als Hürden.
Dies trifft auf die meisten PC-Datenbanken zu. Diese wurden ursprünglich für den
Einsatz in einer Single-User-Umgebung entworfen, und auch die Speicherung von
Daten auf einem Fileserver macht solch ein System nicht relational.
Vorsichtig muss man weiters bei der Auswahl der Front-End-Systeme sein. Es gibt
Systeme, die auf Tabellen eines relationalen Systems zugreifen können. Doch diese
binden die Tabellen nur ein, bei einem Zugriff wird die Tabelle in den Speicher des
PC geladen, damit dort satzweise zugegriffen werden kann.
Für Verwirrung sorgt in diesem Zusammenhang immer wieder der sogenannte
ODBC-Standard von Microsoft. Es wird als die Standardschnittstelle für relationale
Systeme gepriesen. Es müsste jedoch genauer heißen, dass man mit Hilfe von
Windows-Anwendungen über eine einheitliche Schnittstelle auf relationale DBMS
zugreifen kann.
Um ein DBMS darauf zu prüfen, ob es relational ist oder nicht, genügen auch die
vorgenannten zwölf Regeln nicht. Sie geben jedoch wichtige Kriterien, die fast immer
die Spreu vom Weizen trennen.
Seite 30/88
11.09.2005 10:18
Datenbanksysteme
8.
8.1.
ER-Diagramme
Entitäten
Entität
Entität
X
X, Y, Z
Y
Z
Abbildung 8-1: Darstellung von Entitäten im ER-Diagramm
Attribute der Entität sind X, Y und Z.
Schlüsselattribute (hier: zusammengesetzte Attribute) sind X und Y.
8.2.
Beziehungen
Entität A
Entität B
Beziehung
Abbildung 8-2: Beziehungen im ER-Diagramm
Beziehungen zwischen zwei Entitäten (hier: binäre Beziehung)
Anmerkung: Die Attribute der Entitäten wurden aus Vereinfachungsgründen hier
nicht dargestellt.
8.3.
Beziehungen mit Kardinalitäten
Entität A
1,n
11.09.2005 10:18
Entität B
Beziehung
0,2
Seite 31/88
Datenbanksysteme
Abbildung 8-3: Beziehungen mit Kardinalitäten (ER-Diagramm)
Folgende Aussagen können obenstehendem ER-Diagramm entnommen werden:
•
Ein Element (i.a. Tupel) der Entität A steht in Beziehung zu keinem, einem
oder (maximal) zwei Elementen der Entität B.
•
Ein Element der Entität B steht in Beziehung zu mindestens einem oder
beliebig vielen Elementen der Entität A.
A
B
Abbildung 8-4: Beziehungen mit Kardinalitäten (Mengendarstellung)
8.4.
Syntax von ER-Diagrammen
•
Zwei Entitätsmengen (Rechtecke) dürfen nie direkt nebeneinander liegen; sie
dürfen nur über eine Beziehungsmenge (Raute) miteinander verbunden
werden.
•
Zwei Beziehungsmengen (Rauten) dürfen nie direkt nebeneinander liegen,
dazwischen muss immer eine Entitätsmenge (Rechteck) liegen.
•
Attribute (Ellipsen) können nur direkt entweder an eine Entitätsmenge
(Rechteck) oder eine Beziehungsmenge (Raute) angehängt werden.
8.5.
Umwandlung von ER-Diagrammen in das
relationale Schema
1. Aus jeder Entität entsteht eine Relation (Tabelle)
2. Aus Beziehungen können auch Relationen entstehen
Nicht notwendig ist dies, wenn
- die Kardinalität 1:1 bzw. 1:n ist (siehe Abbildung 8-5: Kardinalität und Tabelle)
und
- wenn es keine Beziehungsattribute an diesem Beziehungstyp gibt (siehe Abbildung
8-6: Beziehungsattribute und Tabelle)
Seite 32/88
11.09.2005 10:18
Datenbanksysteme
Beziehung
Entität A
Entität B
Beziehungstyp:
1
N
1
N
:
:
:
:
Keine Tabelle
Keine Tabelle
Keine Tabelle
Tabelle
1
1
N
M
Abbildung 8-5: Kardinalität und Tabelle
Entität A
Beziehung
Entität B
Beziehungsattribute
Abbildung 8-6: Beziehungsattribute und Tabelle
Wenn aus einer Beziehung eine neue Tabelle entsteht, enthält diese:
•
beide benachbarten Schlüssel der Entitäten (wieder als Schlüssel
gekennzeichnet) und
•
alle (evtl.) vorhandenen Beziehungsattribute (bei n:m müssen diese nicht
vorhanden sein).
11.09.2005 10:18
Seite 33/88
Datenbanksysteme
9.
SQL (Structured Query Language)
9.1.
Historische Entwicklung
1974
1977
1978
1981
1982
1985
1986
1992
1999
2003
9.2.
SEQUEL – ein erster Entwurf einer Datenbankabfragesprache
Oracle implementiert SQL auf Mainframes
Oracle liefert SQL aus
IBM liefert SQL/DS aus
IBM stellt DB/2 vor
Ingres und Informix stellen auf SQL um
X/Open entscheidet sich für SQL
SQL-92 wird veröffentlicht
SQL:1999 wird veröffentlicht und löst SQL-92 ab
SQL:2003 wird im Entwurfsstadium präsentiert
Elemente von SQL
9.2.1. DDL (Data Definition Language)
•
•
•
•
•
Anlage und Verwaltung von Schemata
Definition von Domänen
Relationsdefinition inkl. Konsistenzbedingungen
Definition von Views
Benutzerverwaltung und Zugriffsorganisation
Bausteine der DDL:
CREATE (Table, View, Index)
ALTER (Table, Sequence)
DROP (Table, View, Synonym)
GRANT; REVOKE
9.2.2. DML (Data Manipulation Language)
• Eingabe von Daten in eine (bestehende) Tabelle
• Ändern und Löschen von Daten in Tabellen
• Abfragen über mehrere Tabellen hinweg
Weiters:
• Transaktions- und Sessionsteuerung
• Indexdefinition
Bausteine der DML:
SELECT
INSERT
UPDATE
DELETE
Bei der Transaktionssteuerung werden verwendet:
COMMIT
Seite 34/88
11.09.2005 10:18
Datenbanksysteme
ROLLBACK
SAVEPOINT
SET TRANSACTION
9.2.3. Eigenschaften von SQL
SQL ist nichtprozedural:
Es wird nicht der Ablauf der Datengewinnung beschrieben (wie in üblichen
Programmiersprachen wie z.B. C++). Vielmehr wird das gewünschte Ergebnis
beschrieben.
9.3.
SQL-Anweisungen
9.3.1. Übungsdatenbank in Access
Zur Ausführung der in diesem Kapitel beschriebenen Übungen dient die MS AccessDatenbank ‚Austria 97’. Sie besteht aus 3 Relationen mit folgenden Attributen:
Abbildung 9-1: Relationen von Austria 97
9.3.2. SELECT
9.3.2.1.
Übungsumgebung
Für die hier angeführten Beispiele wird eine neue Abfrage erstellt, und das Fenster
‚Tabellen anzeigen’ ohne Hinzufügung von Tabellen geschlossen:
11.09.2005 10:18
Seite 35/88
Datenbanksysteme
Abbildung 9-2: Einbindung von Tabellen in den Abfrageentwurf
Die SQL-Ansicht der Abfrage erreicht man über die Menüleiste ‚Ansicht’ oder das
Symbol SQL in der Symbolleiste:
Abbildung 9-3: Umschalten auf SQL-Ansicht
9.3.2.2.
Grundsätzlicher Aufbau der Select-Anweisung
SELECT attribut(e)
FROM tabelle(n)
[WHERE kriterien]
[ORDER BY attribut(e)];
9.3.2.3.
WAS soll angezeigt werden?
WO sind die Informationen zu finden?
WELCHE Einschränkungen gibt es?
WIE sollen die Daten dargestellt werden?
Schreibweise von Attributen
SELECT VORWAHL, [VORWAHL], [ORTE].[VORWAHL]
FROM orte;
Alle drei Schreibweisen liefern in diesem Fall das selbe Ergebnis.
Die Schreibweise mit eckigen Klammern ist jedoch bei Attributsbezeichnungen
erforderlich, welche Sonderzeichen oder Leerzeichen enthalten:
[Personal-Nr]
[Personal Nr]
Die sogenannte ‚volle Qualifizierung’ (zusätzliche Angabe des Tabellennamens) ist
erforderlich, wenn in einer Datenbank dasselbe Attribut mit gleichem Namen in
mehreren Tabellen vorkommt.
In unserer Datenbank ist dies das Attribut ORT, welches sowohl in Orte als auch in
der Tabelle PLZ vorkommt.
Daher müssen wir schreiben:
orte.ort
bzw.
plz.ort
9.3.2.4.
Select mit Konstanten
Rechenoperationen:
SELECT 3*5 + 18;
Seite 36/88
11.09.2005 10:18
Datenbanksysteme
Select 19 mod 7;
Modulo (Divisionsrest):
Select 3*5 +18 mod 12;
(warum erscheint hier 21 und nicht 9?)
Select (3*5 +18) mod 12;
String-Concatenation:
Select „Daten“ + „bank“;
Abfrage von Tabellenattributen:
Select “Klein” + ORT + “chen”
FROM ORTE;
Benennung von Ausgabespalten:
Select “Klein” + ORT + “chen” AS städtchen
FROM ORTE;
9.3.2.5.
Rechnen mit Attributen
Addition/Subtraktion:
Höhe aller Orte über Wien:
SELECT Meereshöhe, [Meereshöhe]-171
FROM ORTE;
Vorzeichenwechsel:
Select -PLZ AS negativ_plz
FROM orte;
Multiplikation/Division:
Höhenangabe in Fuss:
SELECT Meereshöhe, Meereshöhe * 3,28
FROM ORTE;
oder
SELECT Meereshöhe, Meereshöhe / 0,295879
FROM ORTE;
Select PLZ*10 AS zehnfachplz
FROM orte;
Nördliche Breite in Bogenmass umrechnen:
SELECT Nördl_Breite, Nördl_Breite * 3.14 / 180 AS rad
FROM ORTE;
Mehrere Konstanten in einem SQL-Statement:
Select 8+5, „a“ + „b“, 8 mod 3, 3.14159 + 2.71828; (Dezimalstelle als Punkt!)
9.3.2.6.
Priorität von Rechenoperationen
Höchste Priorität:
11.09.2005 10:18
Klammersetzung
Vorzeichenoperator (-PLZ)
Seite 37/88
Datenbanksysteme
MOD
Punktrechnung
Niedrigste Priorität: Strichrechnung
9.3.2.7.
Arithmetische Vergleichsoperatoren
Diese liefern als Ergebnis True oder False oder Unknown.
Vergleichsoperatoren sind:
=
> , >=
< , <=
<> oder !=
LIKE
BETWEEN
Gleichheit
Größer als, größer gleich
Kleiner als, kleiner gleich
Ungleichheit
Zeichenkettenvergleich
Numerische Wertebereiche
Beispiele:
SELECT *
FROM orte;
(7214 Tupel)
SELECT *
FROM orte
WHERE meereshöhe > 0;
(4911)
SELECT *
FROM orte
WHERE meereshöhe = 0;
(2303) (Kontrolle: 2303+4911=7214)
Modulo:
Jene Orte anzeigen, bei denen der Divisionsrest der Meereshöhe durch 100 den
Wert 50 ergibt:
SELECT Meereshöhe
FROM ORTE
WHERE (Meereshöhe Mod 100)=50; (133)
9.3.2.8.
Zeichenkettenvergleich mit LIKE
Folgende Wildcardoperatoren werden unterstützt:
*
keines oder beliebig viele Zeichen
?
Genau ein beliebiges Zeichen
Implementierungsabhängig:
#
Numerisches Zeichen
[a-z] Bereich von Characters
[!a-z] Kein Buchstabe
[!0-9] Keine Ziffer
Orte anzeigen, die alphabetisch hinter Wien liegen:
SELECT *
FROM orte
WHERE ort >”Wien”;
(321)
Orte anzeigen, die mit ‚Wien’ beginnen:
SELECT *
Seite 38/88
11.09.2005 10:18
Datenbanksysteme
FROM orte
WHERE ort LIKE ”Wien*”; (7)
Orte anzeigen, die ‚Wien’ beinhalten:
SELECT *
FROM orte
WHERE ort LIKE >”*Wien*”;
(10)
Orte anzeigen, die ‚berg’ beinhalten, gefolgt von genau zwei Buchstaben:
SELECT *
FROM orte
WHERE ort LIKE "berg??";
(2)
Orte anzeigen, die ‚berg’ beinhalten, gefolgt von mindestens zwei Buchstaben:
SELECT *
FROM orte
WHERE ort LIKE "berg??*";
(16)
Orte anzeigen, die ‚Wien’ beinhalten, gefolgt von zumindest einem Buchstaben:
SELECT *
FROM orte
WHERE ort LIKE >”*Wien*[a-z]”; (9, Schottwien fällt weg)
9.3.2.9.
Behandlung von Nullwerten
Der Wert NULL ist ein spezieller Datenwert, der anzeigt, dass kein Wert vorhanden
ist. Dieser Wert ist nicht identisch mit einer numerischen Null oder mit einem
Leerzeichen!
Wenn eine Spalte den Wert NULL nicht annehmen darf, muss dies beim Erstellen
der Tabelle mit der Eigenschaft "NOT NULL" (ungleich Null) spezifiziert werden.
Wenn Werte abgefragt werden müssen, bei welchen Nullwerte eingetragen sein
könnten (NULL), ist der Operator IS NULL (bzw. IS NOT NULL) zu verwenden.
Falsch wäre also z.B. folgende Schreibweise: VORNAME=NULL
SELECT *
FROM orte;
(7214)
SELECT *
FROM orte
WHERE PLZ = 0;
(167)
SELECT *
FROM orte
WHERE PLZ > 0;
(1193)
SELECT *
FROM orte
WHERE PLZ IS NULL;
(5854; Kontrolle: 5854+1193+167=7214)
SELECT *
FROM orte
WHERE PLZ IS NOT NULL;
(1360, ist 167+1193))
11.09.2005 10:18
Seite 39/88
Datenbanksysteme
9.3.2.10.
Zeichenverkettung
Diese erfolgt mit „|“ (Pipe) bzw. in Access mit „&“.
Beispiel:
SELECT plz & " " & ort AS plzort
FROM orte;
9.3.2.11.
Logische Operatoren
Um mehrere Bedingungen miteinander zu verknüpfen, verwenden wir
Vergleichsoperatoren. Wir kennen 3 logische Operatoren:
AND
Alle Ausdrücke müssen TRUE ergeben
OR
Mindestens einer der Ausdrücke muss TRUE ergeben
NOT
Der Aussagewert eines Ausdrucks wird invertiert
Beispiele:
Liste jene Orte, die über 400 Meter Seehöhe liegen und mehr als 10.000 Haushalte
haben.
Select *
FROM orte
WHERE meereshöhe > 400 AND haushalte > 10000;
(4)
Liste jene Orte, die über 2000 Meter Seehöhe liegen sowie zusätzlich alle, die im
Bundesland Wien liegen:
SELECT *
FROM orte
WHERE Meereshöhe>2000 OR Bdld="w";
(55)
Liste alle Orte in Kärnten über 700m Seehöhe, und zusätzlich alle Orte in Tirol mit
mehr als 5000 Haushalten:
SELECT *
FROM orte
WHERE (Meereshöhe>700 AND bdld="k") OR (bdld="t" AND
haushalte>5000);
(13)
Orte im Burgenland mit mehr als 2000 Haushalten:
Select *
from Orte
WHERE bdld = „B“ and haushalte >2000;
(5)
Verwendung von BETWEEN:
Gesucht sind jene Orte, die Haushalte zwischen 5000 und 10000 haben:
SELECT * FROM orte
WHERE haushalte BETWEEN 5000 and 10000;
Hinweis: Die Grenzwerte (in unserem Beispiel 5000 bzw. 10000) werden in die
Abfrage mit einbezogen.
Die obige Abfrage ist daher ident mit folgender:
SELECT * FROM orte
WHERE haushalte >= 5000 AND haushalte <=10000;
Kombinierte Abfragen:
Seite 40/88
11.09.2005 10:18
Datenbanksysteme
Liste jene Orte in NÖ, die nicht mit der PLZ 2xxx beginnen und die mehr als 10.000
Haushalte haben, und zusätzlich jene Südtiroler Orte (PLZ-Bereich 9xxx), die über
1400m Seehöhe liegen:
SELECT *
FROM orte
WHERE (BDLD="N" AND PLZ Not Like "2*" AND HAUSHALTE>10000) OR
(BDLD="T" AND Meereshöhe>1400 AND PLZ Like "9*"); (St. Pölten,
Obertilliach)
Liste jene Orte, die zwar ein Bundesland, aber keine PLZ eingetragen haben:
SELECT *
FROM orte
WHERE PLZ Is Null AND BDLD Is Not Null;
(73)
Finde jenen Ort in der Steiermark (160), der mehr als 8000 Haushalte hat (4), nicht
mit ‚K’ beginnt (2) und nicht mit ‚mur’ endet
SELECT *
FROM orte
WHERE BDLD="st" AND HAUSHALTE>8000
AND Ort Not Like "k*" AND Ort Not Like "*mur";
(Leoben)
Liste jene Orte, bei welchen eine gültige (!) PLZ eingetragen ist (1193), die mit ‚Ma’
beginnen (29)‚ die Zeichenkette ‚am’ im Ortsnamen tragen, und mit der Vorwahl 5***
beginnen.
SELECT *
FROM orte
WHERE PLZ Is Not Null AND PLZ>0 AND Ort Like "ma*" AND Ort Like "*am*"
AND VORWAHL Like "5*";
(Matrei am Brenner)
9.3.2.12.
DISTINCT-Klausel
Die Option DISTINCT in der SELECT-Klausel schließt doppelt vorkommende
(redundante) Zeilen aus der abgerufenen Menge aus. Nur die einmaligen (unique)
Zeilen werden bei der Abfrage ausgegeben.
SELECT DISTINCT attribut(e)
FROM relation(en)
WHERE bedingung(en).
Der DISTINCT-Operator sortiert bei den meisten SQL-Implementierungen die
Ausgabe aufsteigend.
Beispiel:
Aus der Tabelle ORTE sollen alle vorkommenden Eintragungen zum Attribut ‚BDLD’
(Bundesland) angezeigt werden.
SELECT DISTINCT bdld
FROM ORTE;
11.09.2005 10:18
Seite 41/88
Datenbanksysteme
Wir erhalten, je Attribut jeweils nur ein einziges Vorkommen desselben.
In einem späteren Kapitel werden wir klären, wie viele Datensätze in dieser Relation
je Bundesland gespeichert sind (sh. COUNT-Funktion).
9.3.2.13.
Mengenoperationen
( Sollten erst später bei den Joins gebracht werden!!)
9.3.2.13.1.
UNION
Union fasst zwei oder mehr Relationen spaltenweise zusammen und entfernt gleiche
Tupel aus der Ergebnisrelation.
Beispiel:
In der Abbildung 9-4 sind auf der linken Seite zwei Relationen Tabelle1 und
Tabelle1a dargestellt.
Die Union-Operation
SELECT a, b FROM tabelle1
UNION
SELECT a, b FROM tabelle1a;
liefert das unten rechts abgebildete Ergebnis.
Abbildung 9-4 UNION
Seite 42/88
11.09.2005 10:18
Datenbanksysteme
9.3.2.13.2.
INTERSECT
Intersect liefert jene Tupel, welche in zwei Relationen ident auftreten. Die Syntax ist
analog zum UNION-Statement.
Intersect ist in MS Access nicht implementiert, es muss daher wie folgt realisiert
werden:
SELECT a
FROM tabelle1
WHERE a In
(SELECT a FROM tabelle1a);
Als Ergebnis (unter Heranziehung der Tabellen aus obigem Beispiel) erhalten wir die
bezüglich Attribut a identen Zeilen:
Abbildung 9-5 INTERSECT
Schwieriger ist die Abfrage, wenn alle Tupel in das Ergebnis einbezogen werden
sollen. Mit der Abfrage
SELECT a & b
FROM tabelle1
WHERE a & b IN
(SELECT a & b FROM tabelle1a):
erhalten wir:
Abbildung 9-6 INTERSECT für alle Tupel
9.3.2.13.3.
MINUS
MINUS liefert jene Tupel, welche zwar in einer Basisrelation, nicht jedoch in einer
anderen Relationen auftreten. Die Syntax lautet:
SELECT a, b FROM tabelle1
MINUS
SELECT a, b FROM tabelle1a;
Auch MINUS ist in MS Access nicht implementiert, die Umsetzung wird in diesem
Skriptum später behandelt.
11.09.2005 10:18
Seite 43/88
Datenbanksysteme
9.3.2.14.
ORDER BY-Klausel
Die ORDER BY-Klausel bestimmt die Kriterien der Zeilensortierung bei
Abfrageergebnissen.
Standard ist aufsteigende Reihenfolge (ASC – Ascending), aber auch absteigende
Reihenfolge (DESC – Descending) ist möglich.
Die Sortierung erfolgt in dieser Form:
• für ASCII-Codes: 0 bis 9, A bis Z (von links nach rechts Zeichen für Zeichen),
• für EBCDIC-Codes (Großrechner): A bis Z, O bis 9
• für Zahlen (Ganzzahlen, reelle Zahlen): - unendlich bis + unendlich
NULL-Werte werden bei aufsteigender Sortierung am Ende angezeigt; bei
absteigender Sortierung werden sie zuerst dargestellt.
Die ORDER BY-Klausel:
• kann Ausdrücke von Spaltenwerten enthalten
• kann Spaltenaliasnamen (AS...) enthalten
• kann ein mehrfach verschachteltes Kriterium enthalten
• Priorität von links nach rechts.
Beispiel:
Sortiere jene Orte, wo ein Bundesland angegeben ist, aufsteigend nach Bundesland
und anschließend absteigend nach der Anzahl der Haushalte.
SELECT *
FROM orte
WHERE bdld Is Not Null
ORDER BY bdld, haushalte DESC;
9.3.2.15.
Funktionen
Diese werden in Ausdrücken verwendet, die Spaltenwerte enthalten.
Beispiele:
• SELECT-Klausel
• WHERE -Klausel
• ORDER BY-Klausel
Es gibt folgende Typen von Funktionen:
• Arithmetische Funktionen
• Zeichenkettenfunktionen
• Datumsfunktionen
• Aggregatfunktionen
• Verschiedene
Die Syntax von Funktionen ist immer nach folgendem Muster aufgebaut:
funktionsname (Argument)
Sind in der Klammer mehrere Argumente zulässig, sind sie durch Kommata
voneinander getrennt.
Seite 44/88
11.09.2005 10:18
Datenbanksysteme
Das Argument kann ein Wert, eine Zeichenkette, ein Ausdruck, eine Spalte oder
wieder eine Funktion sein.
9.3.2.15.1.
Achtung:
Arithmetische Funktionen
Bei allen trigonometrischen Funktionen ist der Winkel im
Bogenmaß anzugeben!
ABS (n)
Ermittelt wird der Absolutwert (vorzeichenlose Wert) einer Zahl.
abs(-3)=3
COS (n)
Ermittelt den Cosinus einer Zahl.
COSH (n)
Ermittelt wird der Kosinus hyperbolicus einer Zahl.
cosh (0) = 1
EXP (n)
Ist die Funktion e hoch "n", mit e = 2.71828183
exp (4) = 54.59815
LN (n)
Ermittelt wird der natürliche Logarithmus einer Zahl.
In (95) = 4.55387689
LOG (m,n)
Ermittelt wird der Logarithmus "n" zur Basis "m". Beide Zahlen
müssen positiv und größer als 0 und die Basis m ungleich 1 sein.
log (10, 100) = 2
MOD (m,n)
Ermittelt wird der Rest der ersten Zahl geteilt durch die zweite Zahl.
mod(12,7)
12 mod 7
=5
mod(12.3, 7.1) 12.3 mod 7.1
= 5.2
oder
M MOD n
POWER (m,n)
Ermittelt wird die n-te Potenz von m. Wenn m negativ ist, muss n
ganzzahlig sein.
power (64,1/3) = 4
ROUND (n [,m]) Rundet auf Anzahl Stellen, die mit m angegeben wird. Wird m nicht
angegeben, wird 0 angenommen.
round(327.8292,2) = 327.83
round(327.8292,-2) = 300
round(327.8292) = 327
SIGN (n)
Liefert das Vorzeichen des Arguments.
SIGN(13)=1
SIGN(-13)=-1
SIGN(0)=0
SIN (n)
Ermittelt wird der Sinus einer Zahl
SINH(n)
Sinus Hyperbolicus
sinh (1) = 1. 17520119
11.09.2005 10:18
Seite 45/88
Datenbanksysteme
SQRT (n)
Ermittelt wird die Quadratwurzel einer Zahl mit n >= 0.
TAN (n)
Ermittelt wird der Tangens einer Zahl.
tan (45 * 3.14159265359/180) = 1
TANH (n)
Ermittelt den Tangens hyperbolicus einer Zahl.
tanh (0.5) = 0.462117157
TRUNC (n [,m]) Abschneiden von Dezimalstellen. Wenn m nicht definiert ist, wird
beim Dezimalpunkt abgeschnitten. Die zweite Zahl kann auch einen
negativen Wert annehmen, um die Stellen links vom Dezimalpunkt
abzuschneiden.
trunc (327.2) = 327
trunc (3.2789,2) = 3.27
trunc (327.89,-2) = 300
TRUNC ist in MS Access als FIX() implementiert.
9.3.2.15.2.
Zeichenkettenfunktionen
CHR(a)
Liefert den Buchstaben, der durch den ASCII-Code ‚a’ repräsentiert
wird.
UCASE(str)
Wandelt den String ‚str’ in Grossbuchstaben um
LCASE(str)
Wandelt den String ‚str’ in Kleinbuchstaben um
LEN(str)
Liefert die Länge des Strings ‚str’ zurück
MID(str,m,n)
Liefert einen Teilstring von ‘str’, der an Position m beginnt und n
Zeichen lang ist
LEFT(str.m)
Liefert den linken Teil von ‘str’ in der Länge m
RIGHT(str.m)
Liefert den rechten Teil von ‘str’ in der Länge m
CSTR(m)
Wandelt die Zahl ‚m’ in einen String um
Str(str)
Wandelt den String ‚str’ in eine Zahl um
Beispiele:
Das SQL-Statement
SELECT chr(66), UCase("ABCdef") ,lCase("ABCdef"), len("länge"), mid
("abcdef",2,3), left("abcdef",2), right ("abcdef",2), cstr(30), str("238");
liefert folgendes Ergebnis:
Seite 46/88
11.09.2005 10:18
Datenbanksysteme
9.3.2.15.3.
Datumsfunktionen
To be continued ☺...
9.3.2.15.4.
AVG
COUNT
MAX
MIN
SUM
STDDEV
VAR
Aggregatfunktionen
Mittelwert einer Spalte
Anzahl der selektierten Zeilen
Größter Wert einer Spalte
Kleinster Wert einer Spalte
Summe aller Werte einer Spalte
Standardabweichung
Varianz
Die Funktionen COUNT, MAX und MIN sind anwendbar auf Daten vom Typ CHAR,
DATE und NUMBER.
Die übrigen Gruppenfunktionen sind lediglich auf Daten vom Typ NUMBER
anwendbar.
Beispiele:
Wie hoch ist die durchschnittliche Meereshöhe aller Orte in Österreich?
SELECT avg(meereshöhe)
FROM ORTE;
(345,77m)
Wie viele Orte gibt es, die mehr als 20.000 Haushalte haben?
SELECT count(ort)
FROM ORTE
WHERE haushalte > 20.000;
(5)
Wie hoch liegt der höchste Ort Österreichs?
SELECT max(meereshöhe)
FROM ORTE;
(2.837m)
Wie viele Haushalte gibt es im Burgendland?
SELECT sum(haushalte)
FROM ORTE
WHERE bdld=“B“;
9.3.2.16.
(71.934 Haushalte)
Die Klausel GROUP BY
Zur Aggregierung (Zusammenfassung) von Daten wird die Klausel GROUP BY
benutzt, um die Eigenschaften einer Menge von Zeilen zu ermitteln.
11.09.2005 10:18
Seite 47/88
Datenbanksysteme
Wenn mehr als eine Menge (d.h. Relation) abgefragt wird, steuert die GROUP BYKlausel die Gruppierung der Zeilen aus der ursprünglichen Tabelle in eine neue
virtuelle temporäre Tabelle.
Die HAVING-Klausel wieder entscheidet, welche Gruppenergebnisse ausgegeben
werden sollen. Die Klauseln werden zur Laufzeit in folgender Reihenfolge ausgeführt:
•
•
•
•
WHERE
GROUP BY
HAVING
ORDER BY
Filtern von Zeilen
Erstellung einer neuen Gruppentabelle
Filtern von Gruppenergebnissen
Sortieren der Ausgabe
Erläuterungen:
Mit ‚WHERE’ werden zunächst die Sätze der Relation gefiltert. Nur diese gefilterte
Ergebnismenge wird dann der Klausel ‚GROUP BY’ übergeben.
Mittels ‚GROUP BY’ wird nun nach jenen Attributen gruppiert, die in der Klausel
angeführt sind.
‚HAVING’ filtert in den bereits gruppierten Ergebnissen nur jene Tupel heraus, die in
dieser Bedingung definiert sind.
‚ORDER BY’ schließlich sortiert die übrig bleibende Ergebnismenge nach den
angegebenen Attributen.
Beispiele:
(Anmerkung: Die nun folgenden Beispiele beziehen sich wieder auf die Datenbank
‚Austria 97’.)
1) Wie viele Datensätze je Bundesland gibt es in der Relation Orte?
SELECT BDLD, Count(BDLD) AS [Anzahl von BDLD]
FROM ORTE
GROUP BY BDLD;
Warum erscheinen hier in Summe nur einige hundert Sätze, obwohl die Relation
über 7.000 Tupel beinhaltet?
Die Funktion COUNT zählt den Wert NULL nicht mit, es sei denn, die NVL-Funktion
(‚Null values’) wird verwendet.
Seite 48/88
11.09.2005 10:18
Datenbanksysteme
Wie hätte nun das SELECT-Statement lauten müssen, wenn wir (ohne Verwendung
der NVL-Funktion) alle Sätze in der Relation zählen wollten?
SELECT BDLD, Count(*) AS [Anzahl von BDLD]
FROM ORTE
GROUP BY BDLD;
Der *-Operator bezieht sich auf sämtliche Attribute eines Tupels und kann somit
keine Nullwerte enthalten.
2) Liste je Bundesland den in der Datenbank höchsten eingetragenen Wert der
Meereshöhe sowie den durchschnittlichen gerundeten Wert je Bundesland
SELECT BDLD, Max(Meereshöhe) AS [Max von Meereshöhe],
round(Avg(Meereshöhe)) AS [Mittelwert von Meereshöhe]
FROM ORTE
GROUP BY BDLD;
3) Adaptiere obige Abfrage so, dass nur jene Bundesländer aufgelistet werden,
deren höchster Ort über 1200m Meereshöhe liegt. Sortiere das Ergebnis absteigend
nach Meereshöhe.
SELECT BDLD, Max(Meereshöhe) AS [Max von Meereshöhe],
round(Avg(Meereshöhe)) AS [Mittelwert von Meereshöhe]
FROM ORTE
GROUP BY ORTE.BDLD
HAVING Max(Meereshöhe)>1200
ORDER BY Max(Meereshöhe) DESC;
11.09.2005 10:18
Seite 49/88
Datenbanksysteme
4) Erstelle eine Liste, welche je Bundesland die Anzahl der Haushalte auflistet.
SELECT BDLD, Sum(HAUSHALTE) AS [Summe von HAUSHALTE]
FROM ORTE
GROUP BY BDLD;
5) Modifiziere die obige Abfrage so, dass die leeren Eintragungen und die Einträge
von ‚Wien’ nicht erscheinen.
SELECT BDLD, Sum(HAUSHALTE) AS [Summe von HAUSHALTE]
FROM ORTE
GROUP BY BDLD
HAVING Sum(HAUSHALTE)>0;
Seite 50/88
11.09.2005 10:18
Datenbanksysteme
6) Erstelle eine Liste je Bundesland, in der die durchschnittliche gerundete
Meereshöhe aller Orte dieses Bundeslandes dargestellt wird. Nicht berücksichtigt
werden dürfen jedoch Orte, deren Meereshöhe 0 oder unbekannt ist.
SELECT BDLD, round(Avg([Meereshöhe]))
FROM ORTE
WHERE Meereshöhe>0 Or Meereshöhe Is Null
GROUP BY BDLD
HAVING Avg(Meereshöhe) >100;
7) Wieviele Orte gibt es, die jeweils zwischen 0-1000, 1000-2000, und 2000-3000m
Meereshöhe liegen?
SELECT round(Fix([Meereshöhe]/1000)) & "xxx" , Count(Meereshöhe) AS [Anzahl
von Meereshöhe]
FROM ORTE
GROUP BY round(Fix([Meereshöhe]/1000));
Hinweis: Die nun folgenden Beispiele beziehen sich auf die Beispieldatenbank
“EDV-Inventar”!
8) Gesucht ist eine Abfrage, in der die Gehaltssummen der Mitarbeiter je Abteilung
aufgelistet werden.
SELECT [person].[Abteilung-ID], Sum(Gehalt) AS [Summe von Gehalt]
FROM Person
11.09.2005 10:18
Seite 51/88
Datenbanksysteme
GROUP BY [person].[Abteilung-ID];
Anmerkung: Bei diesem Select-Statement ist die referenzierte Tabelle zusätzlich
anzugeben, da das Attribut „Abteilung-ID“ in mehr als einer Tabelle vorkommt.
9) Ermittle das durchschnittliche Jahresgehalt der Mitarbeiter in jeder Abteilung
SELECT Person.[Abteilung-ID], Avg(Person.Gehalt) AS [Mittelwert von Gehalt]
FROM Person
GROUP BY Person.[Abteilung-ID];
10) Ermittle das durchschnittliche Gehalt je Abteilung mit mindestens 5 Mitarbeitern
SELECT [Abteilung-ID], Avg(Person.Gehalt) AS [Mittelwert von Gehalt]
FROM Person
GROUP BY [Abteilung-ID]
HAVING Count(PersonalNr) > 5;
11) Wie viele Mitarbeiter jedes Tätigkeitsbereichs gibt es je Abteilung? Wie hoch ist
deren mittleres Jahresgehalt?
Seite 52/88
11.09.2005 10:18
Datenbanksysteme
SELECT [Abteilung-ID], Tätigkeit, Avg(Gehalt) AS [Mittelwert von Gehalt]
FROM Person
GROUP BY [Abteilung-ID], Tätigkeit;
12) In welcher Abteilung arbeitet mehr als ein Mitarbeiter je Tätigkeitsfeld, und wie
hoch ist das mittlere Gehalt dieser Mitarbeiter? Ausgabe nach Mittelwerten der
Gehälter absteigend sortiert.
SELECT [Abteilung-ID], Tätigkeit, Count(PersonalNr) AS [Anzahl von PersonalNr],
Avg(Gehalt) AS [Mittelwert von Gehalt]
FROM Person
GROUP BY [Abteilung-ID], Tätigkeit
HAVING Count(PersonalNr) > 1
ORDER BY Avg(Gehalt) DESC;
11.09.2005 10:18
Seite 53/88
Datenbanksysteme
Anmerkung: Chef, Leiter und Chefsekretärin scheinen hier nicht auf, da diese
Tätigkeit nur einmal vertreten ist.
13) Zusammenfassendes Beispiel zu GROUP BY:
Gesucht sind jene Abteilungen (Abteilung-ID), in denen das durchschnittliche Gehalt
der Verkäufer größer als 30.000 ist. Sortiere absteigend nach diesem
Durchschnittsgehalt.
a) Einschränkung auf Tätigkeit als Verkäufer:
SELECT [Abteilung-ID]
FROM Person
WHERE Tätigkeit="Verkäufer";
b) Anzeigen des durchschnittlichen Gehalts in jeder einzelnen Abteilung:
SELECT [Abteilung-ID], AVG(Gehalt)
FROM Person
WHERE Tätigkeit="Verkäufer"
GROUP BY [Abteilung-ID], Tätigkeit;
Anmerkung:
Frage: Warum muss ‚Tätigkeit’ in der GROUP BY-Klausel stehen?
Antwort: ALLE in der WHERE-Klausel befindlichen Attribute müssen in der GROUP
BY-Klausel wieder aufgezählt werden.
c) Einschränkung auf Gehalt > 30.000 (das ist eine Einschränkung auf eine
aggregierte Größe!)
SELECT [Abteilung-ID], Avg(Gehalt)
FROM Person
WHERE Tätigkeit="Verkäufer"
GROUP BY [Abteilung-ID], Tätigkeit
HAVING AVG(Gehalt)>30000;
d) Sortiere absteigend nach dem Durchschnittsgehalt
SELECT [Abteilung-ID], Avg(Gehalt)
FROM Person
WHERE Tätigkeit="Verkäufer"
GROUP BY [Abteilung-ID], Tätigkeit
HAVING Avg(Gehalt)>30000
ORDER BY AVG(Gehalt) DESC;
9.3.2.16.1.
Verschiedene Funktionen
t.b.c. ☺
9.3.2.17.
9.3.2.17.1.
JOIN - Abfragen über mehrere Tabellen
Einleitung
Bisher wurden sämtliche Abfragen basierend auf einer einzigen Relation
durchgeführt. SQL bietet jedoch die Möglichkeit, Abfragen über beliebig viele
Seite 54/88
11.09.2005 10:18
Datenbanksysteme
Tabellen in einem DBMS zu formulieren. Derartige Abfragen werden über sog. Joins
(Verbindung, Kombination) realisiert.
Ein Join ist immer dann notwendig, wenn Daten in mehreren Tabellen gehalten
werden, diese Tabellen aber in einer Beziehung zueinander stehen und daher
zusammen angezeigt werden müssen. Diese Beziehung wird meist über die
Primärschlüssel- und Fremdschlüsselspalten realisiert.
Die Verbindung der Tabellen über passende Attribute ist besonders wichtig, da es
sonst zur Bildung des kartesischen Produkts zweier oder mehrerer Tabellen kommt.
In letzterem (zumeist ungewünschten) Fall werden alle Tupel der einen Tabelle mit
allen Tupeln der anderen Tabelle in allen Kombinationsmöglichkeiten verknüpft. Die
Ergebnisrelation zweier Tabellen mit 100 bzw. 250 Datensätzen hat bei Bildung
eines kartesischen Produkts bereits 25.000 Datensätze!
Folgende Joins können unterschieden werden:
a) Inner Joins und Outer Joins
Beim INNER-Join werden nur die Ergebnisse zweier abgefragter Tabellen
präsentiert, bei denen in beiden Tabellen entsprechende Tupel vorhanden sind.
MS Access: INNER JOIN
Im Gegensatz dazu werden im OUTER-Join auch Datensätze, die der JoinBedingung nicht in beiden verknüpften Tabellen genügen, in den Ergebnisreport mit
einbezogen.
Der Outer Join wird in der aktuellen Implementierung von SQL (definiert in der
Spezifikation ‚SQL 92’) noch wie folgt unterteilt:
Outer Joins
Left Outer Join
Right Outer Join
Full Outer Join
Implementierung in MS Access
LEFT JOIN
RIGHT JOIN
-
b) Equi-Joins und Non-Equi-Joins
EQUI-Join bedeutet, dass die Join-Bedingung mit dem Gleichheitsoperator (=)
gebildet wurde, was sicherlich den bei weitem häufigsten Fall darstellt.
NON EQUI-Join bedeutet, dass ein beliebiger Operator (<,>,<>) in der JoinBedingung vorkommt.
Jeder Join ist somit entweder ein Inner oder Outer Join, welcher als Equi Join oder
als Non Equi Join ausgelegt sein kann.
Sonderfall: Self Joins
SELF-Join bedeutet, dass eine Tabelle mit sich selbst verknüpft wird. Hier ist es
notwendig, den Tabellen in der FROM-Klausel des SELECT-Statements alternative
Tabellenbezeichnungen (table aliases) zuzuweisen.
Sonderfall: Natural Joins
11.09.2005 10:18
Seite 55/88
Datenbanksysteme
Bei Natural Joins müssen die zu verbindenden Attribute in den beiden Tabellen den
selben Namen haben. Dann werden nur noch die zu verknüpfenden Tabellen
definiert, die entsprechenden Attribute werden automatisch aufgrund dieser
Namensgleichheit ausgewählt.
In der Praxis hat sich die Erstellung von Natural Joins nicht sehr bewährt, da bei
kleinen Änderungen in der Datenbankstruktur oder in der Namensgebung von
Attributen schwere Fehler in bereits einwandfrei laufenden Programmteilen auftreten
können.
In der Beispieldatenbank „EDV-Inventar“ sind die Tabellen „Person“ und „Abteilung“
über die Spalte „Abteilung-ID“ modelliert, die in der Abteilung-Tabelle
Primärschlüssel und in der Person-Tabelle Fremdschlüssel ist.
In einer Joinabfrage können auch mehr als zwei Tabellen vorkommen. Bei n
Tabellen müssen mindestens jedoch n -1 Join-Bedingungen formuliert werden.
9.3.2.17.2.
EQUI-JOIN
Im folgenden werden nun SELECT-Statements vorgestellt, die auf mehr als eine
Tabelle zugreifen.
1) Erstelle eine Liste aller Mitarbeiter (Vorname, Zuname) sowie der Bezeichnung
der Abteilung, in welcher dieser Mitarbeiter beschäftigt ist.
SELECT Person.Vorname, Person.Zuname, Abteilung.Bezeichnung
FROM Abteilung, person
WHERE Abteilung.[Abteilung-ID] = Person.[Abteilung-ID];
Die oben angeführte Syntax des Select-Statements war in älteren SQLImplementierungen die einzige Möglichkeit, Joins abzufragen.
Seit der Definition des SQL-Standards 1992 (‚SQL 92’) wird verstärkt zu folgender
Schreibweise übergegangen:
SELECT Person.Vorname, Person.Zuname, Abteilung.Bezeichnung
Seite 56/88
11.09.2005 10:18
Datenbanksysteme
FROM Abteilung INNER JOIN Person
ON Abteilung.[Abteilung-ID] = Person.[Abteilung-ID];
Beachte: Bei der neuen SQL-Schreibweise wird das die beiden Tabellen
verbindende gemeinsame Attribut durch die ON-Bedingung (statt wie bisher durch
die WHERE-Klausel) definiert.
Anmerkung: In dieser Darstellung erscheinen nur 40 Mitarbeiter, obwohl im
Unternehmen 44 Mitarbeiter angestellt sind. Ein Blick in die Tabelle Person zeigt uns,
dass diese 4 fehlenden Mitarbeiter keiner Abteilung zugewiesen sind.
Um auch die fehlenden Mitarbeiter anzuzeigen, müssen wir einen Outer Join
verwenden.
9.3.2.17.3.
OUTER-JOIN
2a) Modifiziere obiges Beispiel so, dass sämtliche Mitarbeiter dargestellt werden.
SELECT Vorname, Zuname, Bezeichnung, Standort
FROM person LEFT JOIN Abteilung
ON person.[Abteilung-ID] = Abteilung.[Abteilung-ID];
Durch die Formulierung
FROM Person LEFT JOIN Abteilung
werden alle Mitarbeiter der Tabelle Person ausgegeben, unabhängig davon, ob sie
einer Abteilung angehören. Der Begriff ‚LEFT’ bezieht sich auf jene (linksstehende
Tabelle, von der alle Tupel ausgegeben werden sollen (hier: ‚Person’).
Das obige SELECT-Statement ist daher gleichbedeutend mit jenem:
FROM Abteilung RIGHT JOIN Person
11.09.2005 10:18
Seite 57/88
Datenbanksysteme
2b) Ändere obiges Beispiel so, dass sämtliche Abteilungen dargestellt werden.
SELECT Vorname, Zuname, Bezeichnung, Standort
FROM Abteilung LEFT JOIN Person
ON person.[Abteilung-ID] = Abteilung.[Abteilung-ID];
Durch die Formulierung
FROM Abteilung LEFT JOIN Person
bzw.
FROM Person RIGHT JOIN Abteilung
werden alle Abteilungen der Tabelle Abteilung ausgegeben, unabhängig davon, ob
sie einen Mitarbeiter haben oder nicht.
Es ist daher sehr wesentlich zu analysieren, welches Ergebnis von der Abfrage
erwartet wird, und dementsprechend den Outer-Join zu formulieren.
3) Der Computer mit dem Betriebssystem „win 3.11“ soll nun endlich upgegradet
werden. An welchen Standort muss der Techniker fahren?
Hinweis: Das Betriebsystem finden wir in Tabelle Computer.
Der Standort liegt in Tabelle Abteilung.
Die beiden Tabellen sind über Person miteinander verbunden.
Wir bauen die Lösung somit über die Reihenfolge der Abfrage der Tabellen auf:
In einem ersten Schritt soll jene Person und deren Abteilungs-ID angezeigt werden,
wo der Computer steht:
SELECT Zuname, person.[Abteilung-ID]
FROM
Computer LEFT JOIN Person ON Computer.Person_ID = person.PersonalNr
WHERE Betriebssystem="win 3.11";
Seite 58/88
11.09.2005 10:18
Datenbanksysteme
Da diese Abfrage richtig läuft, erweitern wir sie um die Tabelle Abteilung:1
1
2
3
4
5
SELECT Zuname, person.[Abteilung-ID], standort
FROM
(Computer LEFT JOIN Person ON Computer.Person_ID = person.PersonalNr)
LEFT JOIN Abteilung ON person.[abteilung-id] = abteilung.[abteilung-id]
WHERE Betriebssystem="win 3.11";
Es ist unschwer zu erkennen, dass der Ausdruck aus Zeile 3 aus der vorherigen
Abfrage übernommen wurde. Diese Ergebnismenge wurde nun mit einem weiteren
LEFT Join mit der Tabelle Abteilung verknüpft (Zeile 4).
Auch für den zweiten Join ist das verbindende Attribut (hier die Abteilungs-ID) in der
ON-Klausel anzugeben.
Als Ergebnis obiger Abfrage erhalten wir nun die gewünschte Information:
4) Liste alle Monitore, die im Shop stehen!
Diese Abfrage erstreckt sich nun über 4 Tabellen:
Vom Standort ‚Shop’ in der Abteilung gelangen wir zu Person, und von dort über
Computer schließlich zu Monitor.
Wir können auch diese Abfrage sukzessive aufbauen:
4a) Welche Personen arbeiten im Shop?
SELECT PersonalNr, Zuname, Standort
FROM
Abteilung RIGHT JOIN Person ON Abteilung.[Abteilung-ID] = Person.[Abteilung-ID]
WHERE Standort="SHOP";
1
Anmerkung: Die Zeilennummerierung dient lediglich der besseren Dokumentation, bei Ausführung
der Abfrage in MS Access ist sie zu entfernen.
Es gibt jedoch Systeme (z.B. Oracle), bei denen das System während der Erstellung von SQLStatements ebenfalls eine derartige Nummerierung automatisch durchführt. Diese Nummerierung ist
jedoch nie Bestandteil des eigentlichen Statements.
11.09.2005 10:18
Seite 59/88
Datenbanksysteme
So weit, so gut.
4b) Welche Inventarnummern haben die Computer der Personen, die im Shop
arbeiten 2?
SELECT PersonalNr, Zuname, Standort, Computer.[Inv-Nr]
FROM
(Abteilung RIGHT JOIN Person ON Abteilung.[Abteilung-ID] = Person.[Abteilung-ID])
LEFT JOIN
Computer ON person.PersonalNr = computer.Person_ID
WHERE Standort="SHOP"
ORDER BY computer.[inv-nr];
Auch hier lässt sich aus der dritten Zeile gut erkennen, wie das SQL-Statement aus
dem vorhergegangenen (4a)) abgeleitet wird.
Wir erhalten:
Nur die zwei Mitarbeiter Waltl und Leinthaler haben je einen PC.
4c) Welche Monitore hängen nun an den obigen PC’s?
SELECT PersonalNr, Zuname, Abteilung.Standort,
2
Zur leichteren Lesbarkeit werden mehr Attribute dargestellt, als in der Frage formuliert wurden.
Seite 60/88
11.09.2005 10:18
Datenbanksysteme
Computer.[Inv-Nr], Monitor.InvNr, Bauart, Hersteller, Type
FROM
(
(Abteilung RIGHT JOIN Person ON Abteilung.[Abteilung-ID] =
Person.[Abteilung-ID]
)
LEFT JOIN Computer ON Person.PersonalNr = Computer.Person_ID
)
LEFT JOIN Monitor ON Computer.[Inv-Nr] = Monitor.Comp_ID
WHERE Standort="SHOP"
ORDER BY Computer.[Inv-Nr];
Womit wir das eingangs gefragte Ergebnis erhalten:
4d) Bitte nur die Monitore, keine Mitarbeiter, die gar keinen Computer haben!
Wir erweitern die WHERE-Klausel
WHERE Standort="SHOP" AND (Monitor.Invnr IS NOT NULL)
und erhalten schließlich:
Die letzte Aufgabenstellung hätten wir auch mit einem EQUI-Join realisieren können,
wie uns das nun folgende Beispiel zeigen wird:
5) Welche Drucker stehen in Abteilungen, die über weniger als 20.000€ Budget
verfügen können?
Hinweis:
Diese Abfrage involviert die Tabellen Abteilung (wegen des dort stehenden Budgets),
Person, Computer, Comp_Druck und Drucker.
SELECT Drucker.InvNr, Hersteller, Drucker.Bezeichnung, Bauart, Farbdrucker
FROM
Drucker INNER JOIN
11.09.2005 10:18
Seite 61/88
Datenbanksysteme
(
(
(Abteilung INNER JOIN Person
ON Abteilung.[Abteilung-ID] = Person.[Abteilung-ID]
)
INNER JOIN Computer
ON Person.PersonalNr = Computer.Person_ID
)
INNER JOIN Comp_Druck
ON Computer.[Inv-Nr] = Comp_Druck.Comp
)
ON Drucker.InvNr = Comp_Druck.Druck
WHERE Abteilung.Budget < 20000;
Wir erhalten:
9.3.2.17.4.
SELF-JOIN
Beim Self-Join wird – wie bereits erwähnt – ein und dieselbe Tabelle mehrfach
verknüpft.
Betrachten wir dazu folgendes Beispiel:
1) Mitarbeiter inklusive ihrem Vorgesetzten auflisten
In der Tabelle Person gibt es ein Attribut, welches den jeweiligen Vorgesetzten der
einzelnen Mitarbeiter abbildet.
Wenn wir nun eine Liste aller Mitarbeiter mit Angabe ihres jeweiligen Chefs
benötigen, listen wir die Tabelle Person auf, müssen aber dann vom Attribut
Vorgesetzter nochmals auf die Tabelle Person referenzieren, um nun auch den
Namen des Vorgesetzten zu erhalten.
Anhand eines Equi-Joins verknüpfen wir die Tabelle Person zwei mal. Für jede
Verknüpfung legen wir einen eigenen Aliasnamen (Mitarb, Vorges) fest, um die
Tabellen in der Abfrage besser unterscheiden zu können (beachte die FROM-Klausel
des Select-Statements):
SELECT Mitarb.PersonalNr, Mitarb.Vorname, Mitarb.Zuname,
Mitarb.[Abteilung-ID], Mitarb.Tätigkeit, Mitarb.Vorgesetzter, Vorges.Zuname
FROM Person AS Mitarb , Person AS Vorges
WHERE Mitarb.Vorgesetzter = Vorges.PersonalNr;
Als Ergebnis erhalten wir (auszugsweise):
Seite 62/88
11.09.2005 10:18
Datenbanksysteme
Obwohl wir 44 Mitarbeiter in der Firma haben, erscheinen hier nur 39. Jene
Mitarbeiter, die keinen Chef haben, werden nicht aufgelistet. Ein Outer Join hilft uns
auch hier:
SELECT Mitarb.PersonalNr, Mitarb.Vorname, Mitarb.Zuname, Mitarb.[Abteilung-ID],
Mitarb.Tätigkeit, Mitarb.Vorgesetzter, Vorges.Zuname
FROM Person AS Mitarb LEFT JOIN Person AS Vorges
ON Mitarb.Vorgesetzter = Vorges.PersonalNr;
Nun sehen wir auch, wo die ‚fehlenden’ Mitarbeiter verblieben sind:
2) Welche Mitarbeiter verdienen mehr als ihr unmittelbarer Vorgesetzter? Sortiere die
Ausgabe absteigend nach dem Differenzbetrag der Gehälter.
11.09.2005 10:18
Seite 63/88
Datenbanksysteme
SELECT Mitarb.Zuname, Mitarb.Gehalt, Vorges.Zuname, Vorges.Gehalt
FROM Person AS Mitarb LEFT JOIN Person AS Vorges
ON Mitarb.Vorgesetzter = Vorges.PersonalNr
WHERE Mitarb.Gehalt > Vorges.Gehalt
ORDER BY Mitarb.Gehalt - Vorges.Gehalt DESC;
3) Wer verdient mehr oder gleich viel wie Nico Erlacher?
Diese Abfrage könnte natürlich in Stufen erfolgen:
a) Was verdient Nico Erlacher?
b) SELECT-Statement mit dem entsprechenden WHERE-Kriterium.
In einer Abfrage werden wir jedoch wie folgt vorgehen:
SELECT Person.Gehalt, Person.Vorname, Person.Zuname
FROM Person, Person AS Nico
WHERE Person.Gehalt >= nico.gehalt AND Nico.Zuname="erlacher"
ORDER BY Person.gehalt;
Auch hier wurde ein Self-Join verwendet, der Aliasname der zweiten Tabelle ist Nico.
Seite 64/88
11.09.2005 10:18
Datenbanksysteme
4) Welche Personen in unserer Firma sind am selben Tag geboren?
Hier verwenden wir einen Self-Join auf Person, der als Equi-Join ausgeprägt ist.
Die beiden Auspägungen von Person nennen wir z1 bzw. z2.
SELECT DISTINCT z1.Zuname, z1.Vorname, z1.PersonalNr, z1.Geburtsdatum
FROM Person AS z1 INNER JOIN Person AS z2
ON z1.Geburtsdatum = z2.Geburtsdatum
WHERE
z1.PersonalNr <> z2.personalnr AND
z2.Geburtsdatum = z1.geburtsdatum;
Warum ist in der WHERE-Klausel die zusätzliche Bedingung z1.PersonalNr <>
z2.personalnr notwendig? Jeder Mensch hat schliesslich am selben Tag Geburtstag
wie er selbst – wir würden ohne dieser Zusatzbedingung alle Mitarbeiter erhalten.
Warum ist die DISTINCT-Klausel hier erforderlich? Bei unseren Drillingen würde
sonst ein kartesisches Produkt gebildet werden.
5) Welche Mitarbeiter im ‚SHOP’ verdienen mehr als der Durchschnitt (Mittelwert)
ihrer Kollegen in der eigenen Abteilung?
Um den Standort ‚SHOP’ einzubeziehen, ist die Tabelle Abteilung notwendig. Das
Gehalt der einzelnen Mitarbeiter erhalten wir aus der Tabelle Person.
Für den Mittelwert je Abteilung bilden wir einen Self-Join auf Person (Tabelle mw).
SELECT mw.[Abteilung-ID], Avg(mw.Gehalt) AS [Mittelwert von Gehalt],
Person.Gehalt, Person.Zuname, Person.Vorname, Abteilung.Standort
FROM Person AS mw, Person INNER JOIN Abteilung ON Person.[Abteilung-ID] =
Abteilung.[Abteilung-ID]
WHERE Standort = "shop"
GROUP BY mw.[Abteilung-ID], Person.[Abteilung-ID], Person.Gehalt,
Person.Zuname, Person.Vorname, Abteilung.Standort
HAVING Avg(mw.Gehalt) < [person].[gehalt] AND
Person.[Abteilung-ID]=[mw].[abteilung-id];
Erläuterungen:
11.09.2005 10:18
Seite 65/88
Datenbanksysteme
FROM-Klausel:
Person wird einerseits als Equi-Join auf Abteilung abgebildet, wobei die
Abteilungsnummer in der Personentabelle mit jener aus der Abteilungstabelle
übereinstimmen muss.
Für den Mittelwert der Gehälter wird der bereits oben erwähnte Self-Join mit dem
Tabellenalias mw gebildet.
Die WHERE-Bedingung schränkt die Ergebnismenge ein. Ohne dieser würde die
Auskunft über sämtliche Mitarbeiter der Firma laufen. Somit kommen nur die
Abteilungen 2 und 3 in die Ergebnistabelle.
SELECT: Die Abteilung, das Durchschnittsgehalt der Abteilung, das Gehalt der
slektirtern Person, Name und Standort sind auf der Ergebnisrelation auszugeben.
GROUP BY:
Eine Gruppierung hat auf die Abteilung sowie auf alle zu der Person auszugebenden
Kriterien zu erfolgen.
HAVING:
Der Mittelwert der Gehälter einer Abteilung hat kleiner zu sein als das Gehalt des
einzelnen Mitarbeiters.
Die letzte Bedingung in HAVING schränkt insoferne ein, dass nur Gehälter und deren
Mittelwerte zu vergleichen sind, wenn der Mitarbeiter auch in dieser Abteilung
arbeitet.
9.3.2.17.5.
•
•
•
•
Joins - Zusammenfassung
Joins können beliebig viele Tabellen umfassen
In der SELECT-Klausel können Spalten aus mehreren Tabellen angegeben
werden. Wenn die Bezeichnung nicht eindeutig ist (z.B. weil ein Attribut mit
dem selben Namen in mehreren Tabellen vorkommt), ist eine Qualifizierung
des Attributs in der Form tabellenname.attribut erforderlich.
Das JOIN-Kriterium wird beim EQUI-Join in der WHERE-Klausel angegeben,
beim OUTER-Join in der ON-Bedingung.
Das JOIN-Kriterium für zwei Tabellen kann auch mehrere Spalten umfassen.
Seite 66/88
11.09.2005 10:18
Datenbanksysteme
•
•
•
•
•
•
•
Als Verbindungsmerkmal zwischen zwei Tabellen sind entsprechende
Attribute zu selektieren. Andernfalls kommt es zur Bildung des kartesischen
Produkts zweier Tabellen.
Equi-Joins (hier wird als Join-Kriterium das „=“-Zeichen verwendet)
Non Equi-Joins (Join-Kriterium ist nicht das „=“-Zeichen)
Self-Join (Verknüpfung einer Tabelle mit sich selbst)
Outer-Join (auch Tabellenwerte, die in einer anderen Tabelle keine
Entsprechung haben, werden angezeigt und ggf. mit NULL-Werten aufgefüllt)
Bei n Tabellen sind im Normalfall n-1 Bedingungen erforderlich, um die
Tabellen miteinander zu verknüpfen
Ein Join kann immer durch eine Unterabfrage (siehe Kapitel 9.3.2.18)
ausgedrückt werden. Eine Unterabfrage kann oft, aber nicht immer durch
einen Join ausgedrückt werden.
9.3.2.18.
Unterabfragen (Subqueries)
Bei Unterabfragen wird die Ergebnismenge einer SELECT-Abfrage (die innere
Abfrage) an eine übergeordnete Abfrage (äußere Abfrage) zur weiteren Auswertung
übergeben. Damit lässt sich eine praktisch beliebige Schachtelungstiefe erreichen.
Betrachten wir dazu nochmals das Beispiel aus dem Kapitel ‚Self-Join’ (siehe Seite
64):
1) Wer verdient mehr oder gleich viel wie Nico Erlacher?
Wie bereits erwähnt, könnte die Abfrage mehrstufig erfolgen:
SELECT Gehalt
FROM PERSON
WHERE Zuname="erlacher";
Wir erhalten als Ergebnis den Wert 37.000€.
Im zweiten Schritt könnte das SELECT-Statement nun so lauten:
SELECT ZUNAME, VORNAME
FROM PERSON
WHERE GEHALT >= 37000;
Es ist leicht einzusehen, dass dieser Weg nicht besonders gelungen ist und in
manchen Fällen (z.B. bei vorgefertigten Abfragen) nicht zum Ziel führt.
Wir fassen daher beide obigen Statements zu einem einzigen wie folgt zusammen:
SELECT ZUNAME, VORNAME, GEHALT
FROM PERSON
WHERE GEHALT >= (
SELECT GEHALT
FROM PERSON
WHERE ZUNAME = 'Erlacher');
11.09.2005 10:18
Seite 67/88
Datenbanksysteme
Die in Klammern gesetzte ‚innere’ SELECT-Anweisung wird zuerst ausgeführt und
liefert als Ergebnismenge in unserem Beispiel lediglich einen einzigen Wert zurück –
nämlich 37000€.
Diese Menge wird nun an die darüber liegende Anweisung weitergegeben, sodass
diese wie folgt ausgeführt wird:
SELECT ZUNAME, VORNAME, GEHALT
FROM PERSON
WHERE GEHALT >= (37000);
Das Ergebnis der zusammengesetzten Abfrage:
2) Welche Mitarbeiter sind im ‘Shop’ beschäftigt?
Die innere Abfrage lautet hier:
SELECT Abteilung.[Abteilung-ID]
FROM Abteilung
WHERE Abteilung.Standort="shop";
Hier liefert die Abfrage mehr als einen Wert: Wir erhalten als Ergebnismenge für die
Abteilungen: {2,3,6}
Dies sind jene Abteilungen, die den Standort ‚Shop’ haben.
Wollen wir nun die in diesen Abteilungen beschäftigten Mitarbeiter listen, würden wir
schreiben:
SELECT Person.Zuname, Person.[Abteilung-ID]
FROM Person
WHERE person.[Abteilung-ID] IN (2,3,6);
Die entsprechende Unterabfrage lautet somit:
SELECT Person.Zuname, Person.[Abteilung-ID]
FROM Person
WHERE person.[Abteilung-ID] IN (
SELECT Abteilung.[Abteilung-ID]
Seite 68/88
11.09.2005 10:18
Datenbanksysteme
FROM Abteilung
WHERE Abteilung.Standort="shop");
3) Aufzulisten sind Name, Geburtsdatum und Tätigkeit von Mitarbeitern der Abteilung
Nr. 2, die die gleiche Tätigkeit ausüben wie ein beliebiger Mitarbeiter der Abteilung 3.
Die ‚innere’ Abfrage lautet:
SELECT DISTINCT Tätigkeit
FROM Person
WHERE [Abteilung-ID] = 3;
und liefert: {Hotline, Leiter, Verkäufer}.
Die gesamte Abfrage:
SELECT Zuname, Geburtsdatum, Tätigkeit, [abteilung-ID]
FROM Person
WHERE [Abteilung-ID] = 2 AND Tätigkeit IN
(SELECT DISTINCT Tätigkeit
FROM Person
WHERE [Abteilung-ID] = 3);
4) Welche Drucker stehen am Standort ‚Zentrale’?
Diese Abfrage ist in ähnlicher Form bereits im Kapitel ‚Joins’ behandelt worden – nun
wollen wir sie mit einer geschachtelten Unterabfrage lösen:
Ein erster iterativer Ansatz, der die Tabellen Abteilung, Person und Computer
einbezieht, sieht so aus:
select [inv-nr]
from computer
where person_ID
in
(select personalNr
from person
where person.[abteilung-id]
11.09.2005 10:18
Seite 69/88
Datenbanksysteme
in
(select abteilung.[abteilung-id]
from abteilung
where standort = 'zentrale'));
Als Zwischenergebnis erhalten wir die Inventarnummer des Computers, der dem
Mitarbeiter gehört, der in einer Abteilung mit dem Standort ‚Shop’ arbeitet:
Nehmen wir nun auch noch die Tabellen Comp_Druck und Drucker hinzu, erhalten
wir:
select invnr, hersteller, bezeichnung
from drucker
where invnr
in
(select druck
from comp_druck
where comp
in
(select [inv-nr]
from computer
where person_ID
in
(select personalNr
from person
where person.[abteilung-id]
in
(select abteilung.[abteilung-id]
from abteilung
where standort = 'zentrale'
)
)
)
);
(Die Klammersetzung wurde in diesem Beispiel nur wegen der besseren
Übersichtlichkeit gewählt.)
und führt zum gewünschten Endergebnis:
Seite 70/88
11.09.2005 10:18
Datenbanksysteme
5) Welche Mitarbeiter arbeiten in der Zentrale oder verdienen mehr als ihr direkter
Vorgesetzter?
Die Mitarbeiter in der Zentrale erhalten wir über:
SELECT Person.PersonalNr
FROM Person
WHERE Person.[Abteilung-ID] IN (SELECT Abteilung.[Abteilung-ID]
FROM Abteilung
WHERE Standort="zentrale");
Als Zwischenergebnis die Menge der zutreffenden Personalnummern:
{2, 10, 20, 21, 27, 34, 35, 37, 39, 43}
Jene Mitarbeiter, die mehr als ihr direkter Vorgesetzter verdienen, bilden wir diesmal
in Form einer Unterabfrage ab (siehe dazu auch das Beispiel auf Seite 63, wo wir
einen Left-Join verwendet haben):
SELECT Person.PersonalNr
FROM Person, Person AS Vorges
WHERE
Person.Gehalt > [vorges].[gehalt] AND
Person.Vorgesetzter = [vorges].[personalnr];
Die Ergebnismenge obiger Abfrage: {7, 14, 18, 22, 23, 25, 32, 39}.
Verpacken wir die beiden obigen SELECT-Statements nun in eines und verknüpfen
mit ‚oder’, erhalten wir:
SELECT Person.PersonalNr, Person.Vorname, Person.Zuname
FROM Person, Person AS Vorges
WHERE
(Person.[Abteilung-ID] IN (SELECT Abteilung.[Abteilung-ID]
FROM Abteilung
WHERE Standort="zentrale"
)
)
OR
(Person.Gehalt > [Vorges].[Gehalt] AND
Person.Vorgesetzter = [Vorges].[Personalnr]
);
11.09.2005 10:18
Seite 71/88
Datenbanksysteme
9.3.2.18.1.
•
•
•
•
•
•
•
Unterabfragen - Zusammenfassung
Bei einer Unterabfrage wird eine (innere) SELECT-Anweisung in die WHEREoder HAVING-Klausel einer anderen (äußeren) SELECT-Anweisung
‚eingebaut’.
Die innere (untergeordnete) Unterabfrage wird zuerst ausgeführt und das
Ergebnis in Form einer Mengenoperation in das übergeordnete SELECT
eingesetzt.
Die innere Abfrage kann sich auch auf Informationen aus einer anderen
Tabelle beziehen
Die von der inneren Abfrage ausgegebenen Attribute müssen hinsichtlich
Anzahl und Datentyp mit jenen übereinstimmen, die in der nächst äußeren
Abfrage verwendet werden.
Ist von der inneren Abfrage eine Menge von Werten zu erwarten, ist das
Schlüsselwort ‚IN’ zu verwenden.
Unterabfragen können praktisch beliebig tief verschachtelt werden (meistens
bis zu 255 Ebenen).
In einer Unterabfrage darf keine ORDER BY-Klausel verwendet werden (dies
hätte auch nicht viel Sinn, da die Unterabfrage nur eine Menge zurückliefert;
Mengen sind jedoch definitionsgemäß unsortiert).
9.3.2.19.
Korrelierte (synchronisierte) Unterabfragen
Eine Unterabfrage kann auch für wiederholte Ausführung aufgebaut sein. In diesem
Fall wird sie einmal je Zeile der übergeordneten Abfrage ausgeführt.
Synchronisierte Unterabfragen werden eingesetzt, wenn eine verschachtelte
Unterabfrage für jede Zeile, die von der äußeren Abfrage selektiert wird, ein anderes
Ergebnis bzw. eine andere Ergebnismenge ausgeben muss.
Seite 72/88
11.09.2005 10:18
Datenbanksysteme
Die Unterabfrage hängt somit vom Ablauf der äußeren Abfrage ab.
Eine korrelierte Unterabfrage ist daran erkennbar, dass in der WHERE-Klausel der
Unterabfrage auf eine Tabelle zugegriffen wird, welche auch in der äußeren Abfrage
angesprochen wird.
Der aktuelle Wert der relevanten Spalte in der äußeren SELECT-Anweisung
1) Welche Mitarbeiter verdienen mehr als der Durchschnitt in ihrer Abteilung?
Das DBMS muss also, je nachdem, welche Mitarbeiter in der äußeren Abfrage
gerade ‚an der Reihe’ ist, den Abteilungsdurchschnitt ermitteln, und diesen mit dem
Gehalt des Mitarbeiters vergleichen.
SELECT Zuname, Gehalt, [Abteilung-ID]
FROM Person
WHERE Gehalt > (SELECT AVG(Gehalt)
FROM Person AS Mittelw
WHERE Person.[Abteilung-Id] = Mittelw.[Abteilung-ID]
);
9.3.2.20.
EXISTS
SDO54
Liste alle Mitarbeiter, die jemandem anderen vorgesetzt sind.
SELECT Zuname
FROM Person AS Vorges
WHERE EXISTS
11.09.2005 10:18
Seite 73/88
Datenbanksysteme
(SELECT * FROM Person WHERE Vorgesetzter = Vorges.Personalnr);
9.3.2.21.
ANY und SOME
SDO55
9.3.2.22.
ALL
SDO56
Zu diesem Zweck verwenden wir eine neue Musterdatenbank ‚EDV-Inventar’,
anhand der dies dargestellt werden kann.
9.3.2.22.1.
Vorstellung der Datenbankstruktur „EDV-Inventar“
Im vorliegenden Beispiel besteht die Anforderung, die EDV-Landschaft einer kleinen
Firma zu inventarisieren und in einer Datenbank zu dokumentieren. Des weiteren soll
eine kleine Mitarbeiterverwaltung enthalten sein.
Seite 74/88
11.09.2005 10:18
Datenbanksysteme
Es gibt Workstations (Tabelle ‚Computer’), die normalerweise von einer Person
benutzt werden. Es kann jedoch auch vorkommen, dass ausrangierte Computer
keinem Mitarbeiter zugeordnet sind.
Ein Monitor ist i.a. einer oder auch keiner Workstation zugeordnet.
Von den Workstations ist eine Inventarnummer (sehr gut als primary key
verwendbar), ein Workstationname, die darauf arbeitende Person, der Standort, das
Betriebssystem und der Hauptspeicher zu erfassen.
Beim Monitor interessieren uns ebenfalls die Inventarnummer, die Bauart (Röhre ‚R’
oder Flachbildschirm ‚F’), Hersteller, Type und Bildschirmdiagonale sowie ggf. der
Computer, an dem dieser Monitor angeschlossen ist.
Von den Mitarbeitern soll in diesem Datenmodell die Personalnummer sowie der
Name, das Geburtsdatum, die Abteilung, die Tätigkeit und das Gehalt sowie den
jeweiligen Vorgesetzten gespeichert werden. Abteilungen haben neben ihrer
eindeutigen Nummer eine Bezeichnung, sie befinden sich an einem bestimmten
Standort und haben ein vorgegebenes Budget.
Bei den Druckern ist die Sache etwas komplizierter:
An einem Computer können mehrere Drucker angeschlossen werden, ein Drucker
kann jedoch mittels Druckerumschaltboxen auch mehrere Computer servicieren.
Trotzdem gibt es Drucker, die nirgendwo angeschlossen sind (z.b. defekte), und
manche Computer haben auch keinen Drucker.
Attribute der einzelnen Drucker sind die Inventarnummer, Hersteller, Bezeichnung,
Bauart und ein Kennzeichen (J/N), ob es sich um einen Farbdrucker handelt.
Nach der Analyse der Problemstellung und Normalisierung ergibt sich somit
folgendes Relationenmodell:
11.09.2005 10:18
Seite 75/88
Datenbanksysteme
Die Beziehungen Computer <> Monitor sowie Computer <> Person sind so
aufgebaut, dass keine referentielle Integrität gefordert ist. Das Feld Comp_ID in
Monitor bzw. Person_ID in Computer kann daher auch leer bleiben.
Zwischen Computer und Drucker wurde eine Beziehungsrelation Comp_Druck
eingeschoben, welche die m:n-Beziehung zwischen den beiden Entitäten Computer
und Drucker jeweils auf 1:n-Entitäten abbildet.
Sowohl zwischen Computer und Comp_Druck als auch zwischen Comp_Druck und
Drucker wird referentielle Integrität erzwungen. In Comp_Druck kann daher kein nicht
existierender Computer bzw. Drucker eingetragen werden.
Letztgenannte referentielle Integritäten wurden auch als lösch- und aktualisierbar
definiert. Würde sich die Inv-Nr eines Computers ändern, wird diese Änderung auch
in Comp_Druck nachvollzogen (also entsprechende geändert werden). Wird ein
Computer in der Relation ‚Computer’ gelöscht, werden die entsprechenden Tupel
auch in Comp_Druck gelöscht.
Analoges gilt zwischen den Relationen Drucker und Comp_druck.
Die meisten Mitarbeiter des Unternehmens haben keinen Computer, da sie im
Außendienst tätig sind. Weiters gibt es Mitarbeiter, die keiner Abteilung zugeordnet
sind (z.B. Karenz), und es gibt Abteilungen, welche keine Mitarbeiter (mehr) haben.
Die Beziehungen Computer  Person sowie Person  Abteilung wurde daher
ohne Durchsetzung der referentiellen Integrität modelliert.
Für die folgenden Abfragen über mehrere Tabellen wird die Datenbank wie folgt
befüllt:
Seite 76/88
11.09.2005 10:18
Datenbanksysteme
In unserem Beispiel haben wir es also mit 5 Computern zu tun, einer davon ist nicht
in Verwendung. Es gibt viele Mitarbeiter, jedoch nur 4 davon haben einen PC
zugewiesen.
Von den 3 Druckern wird einer von 2 Computern angesprochen (#1), einer wird von 1
Computer angesprochen (#2), und Drucker Nr. 3 ist stillgelegt.
Wir haben schließlich 5 Monitore, Nr. 5 ist jedoch nicht in Verwendung.
ICH BIN MIR NICHT SICHER; OB DIESES BEISPIEL NOCH WEITER
ENTWICKELT WERDEN SOLLTE UND WENN JA, WOHIN.
11.09.2005 10:18
Seite 77/88
Datenbanksysteme
10. Weitere elementare Datenbankkonzepte
10.1. Transaktionen
Bei Datenbanken, die von mehreren Benutzern gleichzeitig benutzt werden, muss
der Zugriff und die (fast) gleichzeitige Änderung von Daten berücksichtigt werden.
Transaktionen werden immer dann eingesetzt, wenn in einer Datenbank mehrere
Änderungen gleichzeitig durchzuführen sind, welche zu einer logischen Einheit
zusammengefasst sind. Würde nur ein Teil dieser Änderungen durchgeführt, wäre
die Konsistenz der gesamten Datenbank gefährdet. Erst dann, wenn alle
Einzelschritte erfolgreich umgesetzt worden sind, ist die Datenbank wieder in einem
konsistenten Zustand.
Mit dem Begriff der Transaktion ist das ACID-Konzept stark verbunden:
ACID:
Atomicity – Atomarität:
Änderungstransaktionen werden nur entweder ganz oder gar nicht wirksam
Consistency – Konsistenzsicherung:
Eine Transaktion führt ein DBMS von einem konsistenten Datenbankzustand in einen
anderen konsistenten Datenbankzustand über.
Änderungen finden daher nur so statt, dass das System konsistent bleibt.
Die Forderung nach Konsistenz steht in starkem Widerspruch zum
Mehrbenutzerbetrieb (‚Concurrency’). Konsistenz bedeutet in seiner Extremform,
dass eine Datenbank zu einem Zeitpunkt nur einem einzigen Benutzer zur Verfügung
steht.
Lösung: Zu ändernde Daten werden dem Zugriff durch andere Benutzern während
einer Transaktion entzogen.
Probleme:
- Wie weit geht diese Sperre (gesamte Datenbank – Relation – ausgewählte Tupel,
ausgewählte Spalten, bis auf die einzelne Feldebene)? Je differenzierter, desto
aufwändiger die Verwaltung und der damit verbundene Datenbank-Overhead.
- Die erforderliche Sperre ergibt sich nur aus der logischen Betrachtung des
Sachverhalts. Wie soll das DB-System wissen, was nun wirklich zu sperren ist?
Lösungsansätze:
- Kompromisse
- Optimistische Methoden: „Die Wahrscheinlichkeit, dass Konflikte auftreten ist relativ
gering, daher werden eher weniger Sperren vorgenommen, erst im Konfliktfall
werden Maßnahmen zur Konsistenzsicherung ergriffen. Worst case: Ein Benutzer
muss eine Transaktion nochmals durchführen...“.
Isolation – Isoliertheit:
Nebenläufige (d.h. zeitgleich ablaufende) Transaktionen (z.B. von anderen
Benutzern) beeinflussen sich nicht wechselseitig: Zwischenzustände einer
Transaktion bleiben anderen verborgen.
Seite 78/88
11.09.2005 10:18
Datenbanksysteme
Erreicht wird die Isolation durch die Serialisierbarkeit von Transaktionen: Mehrere
gleichzeitig ablaufende Transaktionen bewirken dasselbe Resultat, als wären sie in
zeitlicher Abfolge hintereinander abgelaufen.
Durability – Dauerhaftigkeit, Beständigkeit:
Wenn eine Transaktion erfolgreich ausgeführt wurde (Commit) und der Folgezustand
konsistent ist, ist diese Transaktion auch dauerhaft (und durch Recovery
wiederherstellbar).
Beispiele für transaktionsorientierte Prozesse:
a) Geldbehebung am Bankomat:
Auch wenn der Geldautomat nach der Auszahlung abstürzt, taucht die Auszahlung
am Kontoauszug auf.
b) Banküberweisung: Buchung eines bestimmten Geldbetrages von Konto A
(Verringerung des Kontostandes) auf Konto B (Erhöhung des Kontostandes).
Konsistenz: Nach der Änderung des ersten Kontostandes ist die Datenbank in einem
inkonsistenten Zustand.
Atomarität: Die beiden Buchungen werden komplett oder gar nicht ausgeführt.
Isoliertheit: Wenn während unserer Transaktion eine andere Transaktion auf eines
der beiden Konten zugreift, muss am Ende dasselbe Ergebnis in der Datenbank
gespeichert sein, wie wenn diese beiden Transaktionen hintereinander abgelaufen
wären.
Dauerhaftigkeit:
Nach der zweiten Buchung werden die neuen Kontostände gespeichert, die
Änderungen können nicht mehr verloren gehen.
Achtung: DB-Transaktionen schützen nicht vor der Notwendigkeit regelmäßiger
Datensicherungen! Backups sind immer dann erforderlich, wenn eine Datenbank
physisch zerstört wurde (z.B. Betriebssystemfehler, Hardwarefehler, Stromausfall
etc.).
Das Konsistenthalten von Datenbanken ist insbesondere bei (regional) verteilten
Datenbanken eine technische Herausforderung.
Das Wiederaufsetzen von Datenbanken bedient sich zweier Methoden:
After Image-Protokolle:
Von einem konsistenten Zustand ausgehen, werden alle Transaktionen in einem
Logfile mitgeschrieben. Nach einem Systemabsturz wird das Backup (Image) wieder
hergestellt und nur noch die einzelnen Transaktionen aus dem After Image-Protokoll
nachverarbeitet.
Before Image-Protokolle:
Wenn eine Datenbank inkonsistent wird, werden dieses Logdaten verwendet, um die
Datenbank auf den letzten konsistenten Zustand ‚zurückzurollen’.
Transaktionen in SQL:
Start:
Erfolgreiche Beendigung:
Zurücksetzen der Transaktion:
11.09.2005 10:18
START TRANSACTION
COMMIT
ROLLBACK
Seite 79/88
Datenbanksysteme
Weiter erwähnenswert sind hierbei (speziell bei längeren Transaktionen) sog.
Savepoints. Es werden gesicherte Zwischenstati der Datenbank gebildet, um bei
einem Systemabsturz möglichst wenige Schritte nochmals durchführen zu müssen.
Problem hierbei: Wann besteht ein gesicherter Zwischenstatus?
Bei Transaktionen im programmierten Bereich kann die Programmlogik entscheiden,
wie eine Transaktion in der DB abgeschlossen werden soll:
COMMIT:
Alle innerhalb der Transaktion durchgeführten Änderungen sollen in der Datenbank
wirksam werden
ROLLBACK:
Die Transaktion muss zur Gänze zurückgerollt werden und hat somit nicht
stattgefunden
10.1.1. Sperrmechanismen
Zwei Typen von Sperren (‘locks’) sind üblich:
Exclusive locks (X-lock)
Shared locks (S-lock)
S-lock erlaubt die gleichzeitige Bearbeitung von Objekten durch eine andere
Transaktion, die ebenfalls ein s-lock benötigt.
X-lock entzieht das Objekt jeglichem anderen Zugriff.
Beispiele:
- Transaktion A hat s-lock:
Transaktion B kann ebenfalls s-lock setzen und den Zugriff ausführen
B kann kein x-lock mehr setzen.
- A hat x-lock gesetzt:
B kann weder s-lock noch x-lock setzen.
10.1.2. Isolation-Level
Damit wird dem DB-System bei Transaktionen mitgeteilt, welche Auswirkungen
nebenläufige Transaktionen haben können bzw. welche ausgeschlossen sind.
Wir kennen folgende Isolation Levels:
READ UNCOMMITTED
Transaktion A kann Objekte (Tupel) lesen, die von einer zweiten Transaktion (B)
geändert werden, obwohl diese noch nicht mit COMMIT festgeschrieben wurden.
Wenn B mit ROLLBACK die Änderungen zurücknimmt, hat A ebenfalls falsche
Informationen erhalten. Dieser Isolation level wird auch als ‚dirty read’ bezeichnet.
Anwendungsbereiche: Aggregatbildung von Daten aus der Datenbank, z.B.
statistische Auswertungen, Management Information System, Data Warehousing.
READ COMMITTED
Dirty read ist hier ausgeschlossen. Transaktion A sieht nur jene Daten, die von B
auch mit COMMIT in die DB eingestellt wurden. Bei diesem Isolation level ist es
jedoch möglich, dass innerhalb einer Transaktion A eine Abfrage, zu zwei
Seite 80/88
11.09.2005 10:18
Datenbanksysteme
verschiedenen Zeitpunkten ausgeführt, zu unterschiedlichen Ergebnissen führen
kann.
REPEATABLE READ
Das obige Problem ist bei diesem Isolation level ausgeschlossen. Hier kann es
jedoch zu einem neuen Problem kommen: A selektiert gewisse Tupel, B fügt ein
Tupel ein, und eine zweite Selektion in A ‚sieht’ nun auch dieses Tupel. Dieses
Phänomen bezeichnet man auch als „phantom read“.
SERIALIZABLE
Diese Anforderung ist die strengste bezüglich Isolation Levels. Nur sie gewährleistet
die volle Erfüllung aller Eigenschaften einer Transaktion, die im ACID-Prinzip
beschrieben sind.
Tabellarisch dargestellt ergeben sich somit folgende Zusammenhänge zwischen dem
Isolation level und den möglichen Verstößen gegen das ACID-Prinzip:
Isolation level
Dirty read
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
J
N
N
N
Nonrepeatable
read
J
J
N
N
Phantom read
J
J
J
N
10.1.3. Deadlocks
Wenn mehrere Transaktionen wechselseitig auf die Freigabe von Ressourcen
warten, spricht man von einer Verklemmung („deadlock“).
Beispiel:
Transaktion A
Transaktion B
Liest einen Satz aus der Relation Kunde
und setzt einen s-lock
Liest den gleichen Satz aus der Relation
Kunde und setzt ebenfalls einen s-lock
Ändert den Inhalt des Tupels und will die
Änderung zurückschreiben, will also xlock setzen – dies ist nicht möglich, da B
bereits ein s-lock hat.
Prozess muss warten....
Auch B ändert den Satz und will ihn
zurückschreiben – x-lock ist wegen A
erfolglos
Prozess muss warten...
.......
.......
Behandlung von Deadlocks:
Ein DBMS muss deadlocks automatisch erkennen und so weit beheben können,
dass zumindest eine der beteiligten Transaktionen erfolgreich zu Ende geführt
werden kann. Die benachteiligte Transaktion wird mittels Rollback eliminiert und eine
entsprechende Meldung an den Benutzer bzw. das Anwendungsprogramm
gesendet. Im Idealfall wird jene Transaktion abgebrochen, die am wenigsten
fortgeschritten war.
11.09.2005 10:18
Seite 81/88
Datenbanksysteme
10.2. Zugriffsrechte und Rollen
Im Mehrbenutzerbetrieb sind die Zugriffsrechte auf eine Datenbank i.a. durch eine
Benutzerverwaltung geregelt.
Im betrieblichen Umfeld ist es erforderlich, den Zugriff von Benutzern auf die
Datenbank in feinen Stufen („hohe Granularität“) zu definieren.
Grundprinzip: Niemand hat in einem DBMS Zugriff auf Daten, außer dies ist explizit
erlaubt (Privilegien, „privileges“). Benutzer haben daher in einer entsprechenden
Anmeldeprozedur ihre Berechtigungen nachzuweisen.
Spezielle Benutzer sind die DB-Administratoren, welche z.B.
auf alle DB-Objekte zugreifen und diese ändern kann
anderen Benutzern Privilegien erteilen und widerrufen kann
Änderungen an der physikalischen Datenorganisation vornehmen kann
(Partitionierung, Indizierung, Verlegung von Objekten auf andere
Destinationen bei verteilten Datenbanken)
Zugriffssynonyme vergeben kann
Sicherungen der Datenbank durchführen und bestimmte Objekte exportieren
kann.
10.2.1. Rollen und Gruppen
Bei größeren DBMS kann die Verwaltung der Benutzerrechte ein sehr aufwändiger
Prozess sein. Im praktischen Umfeld ist es sehr häufig erforderlich, einer Vielzahl
von Benutzern (z.B. die Mitarbeiter einer ganzen Abteilung) identische Privilegien auf
das DBMS zu gewährleisten.
Im DBMS werden die grundlegenden Objektklassen Benutzer und Privileg
unterschieden.
Ein Benutzer identifiziert eine physische Person, welche bestimmte Tätigkeiten in
einem DBMS ausführen kann.
Ein Privileg stellt eine bestimmte Funktionalität in einem DBMS dar. Mögliche
Privilegien sind beispielsweise (nach aufsteigender Granularität sortiert):
Vollständiger Zugriff auf das gesamte DBMS
Vollständiger Zugriff auf alle Relationen der Marketingabteilung
Vollständiger Zugriff auf die Relation Kunde
Lesezugriff auf ‚Kunde’
Lesezugriff auf Kunde, jedoch ohne der Spalte ‚Umsatz’
Lesezugriff auf Kunden im eigenen Verantwortungsbereich (z.B:
Sachbearbeiter in einer Filiale des Unternehmens)
Benutzer
Privileg
Aus Vereinfachungsgründen und aus Gründen der Übersichtlichkeit wird zwischen
die beiden Objekttypen eine weitere Schicht eingeschoben: Rollen bzw. Gruppen.
Seite 82/88
11.09.2005 10:18
Datenbanksysteme
Das dahinter stehende Prinzip ist das gleiche, die Konzeption ist aber
unterschiedlich.
Eine Rolle fasst mehrere Privilegien zusammen, während eine Gruppe mehrere
Benutzer subsummiert.
In der Praxis häufiger im Einsatz ist das Rollenkonzept (z.B. bei Oracle).
Es ergibt sich somit folgendes Systemkonzept aus der Sicht der
Zugriffsmechanismen:
Benutzer
Rolle bzw.
Gruppe
Privileg
10.3. Datenbankprozeduren
Um Benutzern mit beschränkten Rechten die Möglichkeit zu geben, bestimmte
Änderungen am DBMS vorzunehmen (z.B. gekoppelte Datenänderungen), werden
Datenbankprozeduren (sog. „stored procedures“) verwendet.
Der Benutzer kann damit jene Aufgaben erledigen, die für seinen Tätigkeitsbereich
erforderlich sind, er kann aber die zugrundliegenden Daten nicht direkt manipulieren
(Beispiel: Buchungen und Gegenbuchung auf Konten).
Für DB-Prozeduren gibt es keine allgemeingültige Norm, diese sind von der
jeweiligen Implementierung des DBMS abhängig, elementare Konzepte sind jedoch
in SQL/PSM (Persistent Stored Modules) definiert worden.
Sehr häufig erfolgt mittels den in SQL/PSM beschriebenen Konzepten auch ein
Zugriff auf ein DBMS mittels imperativer Programmiersprachen (Cobol, C, C++,
Pascal, Java).
Anwendungsmöglichkeiten von Datenbankprozeduren
Unterstützung der Datenbankkonsistenz
Komplexe, aus mehreren elementaren Operationen bestehende
Funktionalitäten sind zu implementieren
Effizientere Ausführung komplexer Operationen
Z.B. die Daten werden in Form der Prozedur nur einmal zum Server gesandt,
dort verarbeitet und eine (relativ) kleine Ergebnismenge wird dem Benutzer
wieder aufbereitet.
Erweiterung der Möglichkeiten des relationalen Datenmodells
Die DML von SQL beinhaltet gewisse Einschränkungen, die auf diese Weise
umgangen werden können (z.B. keine Möglichkeit, prozedurale Abläufe zu
formulieren, keine rekursiven Techniken).
10.4. Funktionen
Funktionen in Datenbanken haben einen ähnlichen Aufbau wie Prozeduren.
Sie werden mit Eingabeargumenten befüllt und liefern nur einen einzelnen Wert
zurück.
11.09.2005 10:18
Seite 83/88
Datenbanksysteme
Funktionen können überall dort eingesetzt werden, wo auch Ausdrücke erlaubt sind
(d.h. speziell auch in der SELECT-Klausel).
Funktionen stellen häufig vereinfachte Methoden der Abfrageprogrammierung dar
(z.B. wenn bestimmte gleichbleibende Aufrufe sehr häufig benötigt werden, wird
dafür eine Funktion nur ein einziges Mal erstellt, getestet und ggf. gewartet).
Sie sind jedoch auch dort sehr nützlich, wo nicht-standardisierte Abfrageergebnisse
benötigt werden:
Spezifische Umwandlung von Codes in Elementen der Datenbank in Langtext
Berechnung von betriebsinternen Werten (z.B. komplexe Formeln für die
Ermittlung des Rohaufschlags bestimmter Produkte in einem Unternehmen)
Berechnung von Standardfunktionen (z.B. Ermittlung der Oster-abhängigen
Feiertage eines Kalenderjahres, Ermittlung von innerbetrieblichen Feiertagen
etc.)
Bildung eines Nummerierungssystem nach betriebsintern vorgegebenen
Regeln (z.B. System zur Vergabe von Artikelnummern, Kundennummern etc.)
10.5. Trigger
Während Datenbankprozeduren bewusst vom Benutzer (oder von anderen
Anwendungsprogrammen) aufgerufen werden, sind Trigger an Ereignisse innerhalb
des DBMS gekoppelt und werden bei Eintreten des Ereignisses zwangsläufig
ausgelöst („getriggert“).
Ein Trigger kann – aus Sicht des Ereignisses - folgendermaßen definiert werden:
TRIGGER BEFORE
Der Trigger wird verarbeitet, bevor ein bestimmtes Ereignis
eintritt
TRIGGER INSTEAD OF Die Triggerprozedur wird anstelle des Ereignisses
ausgeführt (z.B. wird anstelle der tatsächlichen Löschung
eines Satzes nur ein Flag gesetzt, dass dieser Satz als
gelöscht zu betrachten ist)
TRIGGER AFTER
Der Trigger wird verarbeitet, nachdem ein bestimmtes
Ereignis eingetreten ist
Bezüglich der Art der angeforderten Funktion lassen sich Trigger setzen auf:
TRIGGER INSERT
TRIGGER UPDATE
TRIGGER DELETE
Beim Einfügen eines neuen Satzes, z.B. Prüfung des
Satzes auf bestimmte Elemente und Nebenbedingungen
Optional: Angabe der Spaltenbezeichnung.
Wenn sich ein Tupel in der/den angegebenen Spalte(n)
ändert, wird der Trigger aktiviert
Beim Löschen eines Tupels
Bezüglich des Mehrfachaufrufs von Triggern kann unterschieden werden:
TRIGGER ROW
Wenn mehrere Zeilen gleichzeitig geändert werden sollen
(z.B. samthafte Änderung aller Preise), wird der Trigger für
jede einzelne Änderung aufgerufen – auch die
entsprechende Aktion basiert auf Zeilenebene.
Seite 84/88
11.09.2005 10:18
Datenbanksysteme
TRIGGER STATEMENT Hier wird dem Trigger der Zustand einer Relation vor und
nach der Änderung zur Verfügung gestellt, die beliebig
ausgewertet werden kann.
10.5.1. Anwendungsmöglichkeiten von Triggern
Konsistenzbedingungen
Bezüglich der Konsistenzbedingungen von DBMS bestehen häufig nur
eingeschränkte Möglichkeiten. Bei Triggern kann in eigenen
Anwendungsprogrammen genau bestimmt werden, welche Konsistenzbedingungen
eine Änderung in der DB zu erfüllen hat.
File Transfer
Wenn das Bankkonto eines Kunden aufgelöst (gelöscht) wird, werden alle
dazugehörigen Daten an die Zentrale der Bank übermittelt.
Notrufsignalisierung
Wenn am Helpdesk eines großen Unternehmens (Telekommunikationsanbieter) in
einem kurzen Zeitabschnitt vermehrt viele Anfragen einlangen (z.B. durch Störung
eines wichtigen Übertragungsbereichs), wird über ein GSM-Modul automatisch ein
diensthabender Techniker herbeigerufen.
Kommerzielle Anwendung
Bei Unterschreitung eines bestimmten (definierten) Mindestbestandes eines Artikels
wird automatisch eine Mail an den Lieferanten des Artikels und auch an den
verantwortlichen Einkäufer im Unternehmen gesandt.
10.6. Das Cursorkonzept
Worin liegen die Unterschiede zwischen dem relationalen Ansatz und der
imperativen Programmierung?
Relational:
Verknüpfung von Relationen, Selektion der erforderlichen Daten, Verknüpfung der
Ergebnisrelation mit anderen Relationen, so lange, bis das gewünschte Ergebnis
vorliegt.
Imperative Programmierung:
Lesen eines Satzes aus einer Datei, bis der gewünschte Satz gefunden ist,
Zwischenergebnisse berechnen, am Dateiende Zwischenergebnisse ausgeben
Dies bewirkt eine Paradigmenkluft, die auch als „impedance mismatch“ bezeichnet
wird.
Natürlich wäre es theoretisch möglich, eine Relation in einem Programm wie eine
sequentielle Datei zu sehen, und diese abzuarbeiten, das Programm müsste jedoch
alle Rahmenbedingungen, die im DBMS gespeichert sind, zusätzlich berücksichtigen
(wie z.B. referentielle Integrität, Schlüsselabhängigkeiten, Wertebereiche, Domänen
etc.).
Hier kommt der sog. „Cursor“ zur Wirkung (nicht zu verwechseln mit der Marke in
11.09.2005 10:18
Seite 85/88
Datenbanksysteme
z.B. Textverarbeitungsprogrammen).
Mittels des Cursors wird ein beliebiges SQL-Statement aufgesetzt, dessen Ergebnis
dem Anwendungsprogramm zur Verfügung steht und dort sequentiell abgearbeitet
werden kann.
Der Cursor stellt somit eine logische Verbindung zum DBMS dar (wie in vielen EDVSystemen innerhalb von Programmen auch mittels logischer Verknüpfungen auf
Dateien zugegriffen wird).
Syntax für Definition eines Cursors:
DECLARE curs CURSOR FOR ...
OPEN curs
FETCH curs
CLOSE curs
Seite 86/88
Hier wird ein logischer Name des Cursors
(curs) mit einem beliebig komplexen SQLStatement vergeben (FOR…)
Die DB-Engine bereitet die Bereitstellung der
vom Cursor angeforderten Daten vor
Der erste (oder nächste, letzte, beliebige) Satz
wird an das aufrufende Programm übergeben
Die DB-Engine wird informiert, dass keine
weitere Anforderung mehr benötigt wird
11.09.2005 10:18
Datenbanksysteme
11. Overheadfolien
EDV-INVENTAR
Computer
InventarNr, Computername, Mitarbeiter, Standort,
Betriebssystem, Hauptspeichergröße (in MB)
Monitore
InventarNr, Bauart (Röhre/TFT), Hersteller, Type,
Bildschirmdiagonale (cm), Computer
Mitarbeiter
Personalnummer, Name, Geburtsdatum,
Abteilung, Vorgesetzter, Gehalt
Abteilung
AbteilungsNr, Bezeichnung, Standort, Budget
Drucker
InventarNr, Hersteller, Bezeichnung, Bauart
(Matrix/Laser/Tinte), Farbdrucker (J/N)
11.09.2005 10:18
Seite 87/88
Datenbanksysteme
12. Referenzen
12.1. Abbildungsverzeichnis
Abbildung 1-1: Hierarchisches Datenbankmodell ....................................................... 5
Abbildung 1-2: Netzwerkmodell .................................................................................. 6
Abbildung 4-1: Beispieltabelle .................................................................................. 10
Abbildung 4-2: 3-Ebenen-Konzept............................................................................ 11
Abbildung 5-1: Struktur eines Datenbanksystems .................................................... 12
Abbildung 5-2: Relationendarstellung allgemein....................................................... 14
Abbildung 5-3: Relationendarstellung am Beispiel eines Buchverleihs .................... 15
Abbildung 5-4: Kardinalitäten.................................................................................... 16
Abbildung 5-5: Unnormalisierte Datenbankrelation .................................................. 18
Abbildung 5-6: Auszug unnormalisierte Datenbankrelation ...................................... 19
Abbildung 5-7: 5. Normalform................................................................................... 22
Abbildung 6-1: Symbol für Beziehungsfenster.......................................................... 24
Abbildung 6-2: Beziehung zwischen zwei Tabellen herstellen.................................. 24
Abbildung 6-3: Eingabeformular für Namen.............................................................. 25
Abbildung 6-4: Eigenschaftenfenster des Feldes „Ort“ im Formular ......................... 25
Abbildung 8-1: Darstellung von Entitäten im ER-Diagramm ..................................... 31
Abbildung 8-2: Beziehungen im ER-Diagramm ........................................................ 31
Abbildung 8-3: Beziehungen mit Kardinalitäten (ER-Diagramm) .............................. 32
Abbildung 8-4: Beziehungen mit Kardinalitäten (Mengendarstellung) ...................... 32
Abbildung 8-5: Kardinalität und Tabelle .................................................................... 33
Abbildung 8-6: Beziehungsattribute und Tabelle ...................................................... 33
Abbildung 9-1: Relationen von Austria 97 ................................................................ 35
Abbildung 9-2: Einbindung von Tabellen in den Abfrageentwurf .............................. 36
Abbildung 9-3: Umschalten auf SQL-Ansicht............................................................ 36
Abbildung 9-4 UNION............................................................................................... 42
Abbildung 9-5 INTERSECT ...................................................................................... 43
Abbildung 9-6 INTERSECT für alle Tupel ................................................................ 43
Seite 88/88
11.09.2005 10:18
Herunterladen