Datenbanksysteme Kapitel: SQL Data Definition Language Prof. Dr. Peter Chamoni Mercator School of Management Lehrstuhl für Wirtschaftsinformatik, insb. Business Intelligence Prof. Dr. Peter Chamoni - Prof. Datenbanksysteme Dr. Peter Chamoni - Wintersemester 2014/2015 1 Gliederung 1 Grundlagen - Datenbanksysteme 2 SQL Data Definition Language 3 Datenorganisation 4 Datenintegrität und Transaktionsverwaltung 5 SQL Data Manipulation Language 6 Neue Konzepte der Datenbanktechnologie Prof. Dr. Peter Chamoni Datenbanksysteme 2
Gliederung 2 SQL Data Definition Language 2.1 SQL Relationale Datenbanksprache Prof. Dr. Peter Chamoni Datenbanksysteme 3 2.1 SQL Relationale Datenbanksprache SQL (1) In der Praxis ist SQL (Structured Query Language) die wichtigste relationale Datenbanksprache. SQL beruht wesentlich auf der math. Relationenalgebra. Vereinfachtes Standard-Abfrageschema Hauptunterschiede zwischen SQL und der Relationenalgebra - Operatoren bei SQL nicht beliebig schachtelbar. - Jeder Operator hat seinen festen Platz. - Duplikate von Tabellenzeilen in SQL erlaubt! - Zusätzliche Auswertungsmöglichkeiten in SQL (Aggregation, Sortieren) Bekannte auf SQL basierende DBMS: Oracle, IBM DB2, MS SQL Server, Access, Prof. Dr. Peter Chamoni Datenbanksysteme 4
2.1 SQL Relationale Datenbanksprache SQL (2) Sprachumfang Data Definition Language (DDL) Erstellen und Bearbeiten von Relationen, Views, Indizes Data Manipulation Language (DML) Einfügen, Ändern und Löschen von Tupeln in einer Relation (siehe Kapitel: SQL Data Manipulation Language) Data Query Language (DQL) integriert in DML Abfrage auf Datenbanken (siehe Kapitel: SQL Data Manipulation Language) Data Control Language (DCL) Anlegen von Benutzern und Vergabe von Zugriffsrechten Prof. Dr. Peter Chamoni Datenbanksysteme 5 Gliederung 2 SQL Data Definition Language 2.1 SQL - Relationale Datenbanksprache Prof. Dr. Peter Chamoni Datenbanksysteme 6
Überblick zu Datendefinitionsanweisungen in SQL Konzeptuelle Ebene CREATE TABLE, ALTER TABLE, DROP TABLE Relationen werden definiert durch Angabe - ihres Namens - ihrer Attribute mit Wertebereichen - ihrer Integritätsbedingungen: Schlüssel-Definitionen, Entity-Integrität, Referentielle Integrität Interne Ebene CREATE INDEX, ALTER INDEX, DROP INDEX Die Festlegung von sog. Sekundärschlüsseln soll die DB-Performance verbessern! Externe Ebene CREATE VIEW, DROP VIEW, SELECT VIEW Prof. Dr. Peter Chamoni Datenbanksysteme 7 Relationen erzeugen (I) Syntax* CREATE TABLE <Tabellenname> (<Spaltenname1> SQL-Datentyp1 [Spaltenbedingung1] [ ], <Spaltenname2> SQL-Datentyp2 [Spaltenbedingung1] [ ], [Tabellenbedingung1], [ ]); Relation Abteilung (AbtNr, Bezeichnung) CREATE TABLE Abteilung (AbtNr INTEGER NOT NULL PRIMARY KEY, Bezeichnung VARCHAR(20)); *Auszug(!) aus der Befehlssyntax, der für das Anlegen von Spalten und Integritätsbedingungen relevant ist. Prof. Dr. Peter Chamoni Datenbanksysteme 8
Relationen erzeugen (II) Basis-Datentypen in SQL (1) Numerische Datentypen in SQL Datentyp Bezeichnung Gültigkeitsbereich SMALLINT Small Integer Ganzzahl: -32768 bis 32767 INTEGER INT Large Integer Ganzzahl: -2147483648 bis 2147483647 DECIMAL (x,y) DEC NUMERIC (x,y) FLOAT (x) Decimal Single-Precision Floating-Point Stellen vor und nach dem Komma -10**31+1 bis 10**31+, max. 31 Gleitpunktzahl mit x Nachkommastellen Prof. Dr. Peter Chamoni Datenbanksysteme 9 Relationen erzeugen (III) Basis-Datentypen in SQL (2) Zeichenketten in SQL Datentyp Bezeichnung Gültigkeitsbereich CHARACTER (n) CHAR (n) CHARACTER VARYING (n) VARCHAR (n) Zeichenkette mit fester Länge Zeichenkette mit variabler Länge Länge bis max. 254 Byte Länge bis max. 4000 Byte Zeit-Datentypen SQL Datentyp Bezeichnung Gültigkeitsbereich DATE TIME Datum Uhrzeit Datum (Jahr, Monat, Tag) 01.01.0001 bis 31.12.9999 Uhrzeit (Stunde, Minute, Sekunde) 00:00:00 bis 24:00:00 Prof. Dr. Peter Chamoni Datenbanksysteme 10
Relationen erzeugen (IV) Spaltenbedingungen (column constraints) (1) Jedes einzelne Attribut kann wahlweise durch einen oder mehrere aufeinanderfolgende einfache Zusätze (Integritätsbedingungen) eingeschränkt werden. NOT NULL Das Attribut darf nicht undefiniert sein. Eingabe eines Attributwerts wird erzwungen. DEFAULT a Definiert den Wert a als Vorgabe für den Attributwert, falls bei der Eingabe kein Attributwert angegeben wird. UNIQUE Das Attribut ist Schlüsselkandidat. PRIMARY KEY Das Attribut ist Primärschlüssel der Relation. Für Primärschlüssel ist NOT NULL unbedingt anzugeben! Zusammengesetzte Schlüssel dürfen nicht als Spaltenbedingung, sondern müssen als Tabellenbedingung angegeben werden! Prof. Dr. Peter Chamoni Datenbanksysteme 11 Relationen erzeugen (V) Spaltenbedingungen (2) Erzeugen Sie eine Relation Techniker mit den folgenden Attributen: Personalnummer (PNr), Name, Vorname, Geburtsdatum und Lohn. Die Personalnummer stellt den Primärschlüssel dar. Relation Techniker (PNr, Name, Vorname, Geburtsdatum, Lohn) CREATE TABLE Techniker Spaltenbedingung(en) (PNr INTEGER NOT NULL PRIMARY KEY, Name Vorname Geburtsdatum DATE Lohn NUMERIC (8,2)); Prof. Dr. Peter Chamoni Datenbanksysteme 12
Relationen erzeugen (VI) Tabellenbedingungen (table constraints) (1) Tabellenbedingungen sind Bedingungen, die sich auf mehrere Attribute (Spalten) der Relation beziehen. Sie können keinem einzelnen Attribut zugeordnet werden. Notwendig sind Tabellenbedingungen z.b. für die Definition von zusammengesetzten Primär- oder Fremdschlüsseln. Syntax [ CONSTRAINT <ConstraintName> ] <Tabellenbedingungsausdruck> Tabellenbedingungsausdruck PRIMARY KEY ( Spaltenname1,... ) UNIQUE ( Spaltenname1,... ) FOREIGN KEY ( Spaltenname1,... ) REFERENCES Tabelle T (Spaltenname1,... ) Zusammengesetzter Primärschlüssel Zusammengesetzter Schlüsselkandidat Zusammengesetzter Fremdschlüssel, der auf die angegebenen Spalten der Tabelle T referenziert. Prof. Dr. Peter Chamoni Datenbanksysteme 13 Relationen erzeugen (VII) Tabellenbedingungen (table constraints) (2) Erzeugen Sie eine Relation Techniker1, deren Primärschlüssel sich aus einer Kombination der Attribute PNr und Geburtsdatum ergibt. Relation Techniker 1 (PNr, Name, Vorname, Geburtsdatum, Lohn) Tabellenbedingung ODER CREATE TABLE Techniker1 Spaltenbedingung (PNr INTEGER NOT NULL, Name Vorname Geburtsdatum DATE NOT NULL, Lohn NUMERIC (8,2), PRIMARY KEY(PNr, Geburtsdatum)); CONSTRAINT PKey1 PRIMARY KEY(PNr, Geburtsdatum)); Prof. Dr. Peter Chamoni Datenbanksysteme 14
Relationen erzeugen (VIII) Tabellenbedingungen (table constraints) (3) Relationen Jeder Techniker gehört zu einer Abteilung. Erstellen Sie eine Relation Techniker3, die den gleichen Aufbau hat wie die Relation Techniker. Abteilung (AbtNr, Abteilungsbezeichnung) Techniker3 (PNr, Name, Vorname, Geburtsdatum, Lohn, AbtNr) CREATE TABLE Techniker 3 (PNr INTEGER NOT NULL PRIMARY KEY, Name Vorname Geburtsdatum DATE NOT NULL, Lohn NUMERIC (8,2), AbtNr INTEGER NOT NULL, CONSTRAINT FKey1 FOREIGN KEY(AbtNr) REFERENCES Abteilung (AbtNr)); Prof. Dr. Peter Chamoni Datenbanksysteme 15 Integritätsbedingungen (I) Integritätsbedingungen dienen dazu, aus der Menge der möglichen Zustände einer Datenbank die gültigen auszufiltern. Sie stellen semantische Bedingungen aus dem Anwendungsbereich dar und werden explizit während des Datenbankentwurfs festgelegt. Die Einhaltung und Überwachung dieser geforderten Integritätsbedingungen wird i.d.r. durch das DBMS kontrolliert. Viele dieser Integritätsbedingungen sind in SQL deklarierbar, z.b. - (Primär-) Schlüsselbedingungen - Referentielle Integrität und Fremdschlüssel - Attribut-Bedingungen als NOT NULL-Zusatz oder als CHECK-Klausel - Tupel-Bedingungen als CHECK-Klausel Prof. Dr. Peter Chamoni Datenbanksysteme 16
Integritätsbedingungen (II) - CHECK Beim Erstellen einer Relation kann mittels der CHECK-Anweisung bereits festgelegt werden, welche Bedingungen die Werte eines Attributs erfüllen müssen (z.b. Gültigkeitsprüfung). Bei der Eingabe werden nur Werte gespeichert, die die Bedingung erfüllen. Eine Bedingung muss tupelweise in der Relation überprüfbar sein, so sind z. B. Aggregatfunktionen nicht erlaubt. Syntax CREATE TABLE <Tabellenname> (<Spaltenname1> SQL-Datentyp1 [Spaltenbedingung], <SpaltennameN> SQL-DatentypN [Spaltenbedingung], CONSTRAINT <ConstraintName> CHECK(<Bedingung>)); Prof. Dr. Peter Chamoni Datenbanksysteme 17 Integritätsbedingungen (III) - CHECK Erzeugen Sie eine Relation Techniker2, die den gleichen Aufbau hat wie die Relation Techniker, aber zusätzlich überprüft, ob der Lohn zwischen 1.000 EUR und 10.000 EUR liegt. Relation Techniker 2 (PNr, Name, Vorname, Geburtsdatum, Lohn) CREATE TABLE Techniker2 (PNr INTEGER NOT NULL PRIMARY KEY, Name Vorname Geburtsdatum DATE NOT NULL, Lohn NUMERIC (8,2) CONSTRAINT Lohncheck CHECK (Lohn > 1000,00 AND Lohn < 10000,00)); Prof. Dr. Peter Chamoni Datenbanksysteme 18
Integritätsbedingungen (IV) Referentielle Integrität Fremdschlüssel (1) Relation Techniker PNr Nachname Vorname Stundenlohn AbtNr 27 Schulz Gerhard 17,50 1 63 Müller Dieter 16,80 2 75 Maier Werner 26,50 2 Relation Abteilung AbtNr Abteilungsname 1 Kundendienst 2 Werkstatt Fragen! Darf ein Fremdschlüsselwert in der Relation Techniker undefiniert sein? Darf ein Tupel in der Relation Abteilung gelöscht oder geändert werden, auf das sich ein Fremdschlüssel bezieht? Prof. Dr. Peter Chamoni Datenbanksysteme 19 Integritätsbedingungen (V) Referentielle Integrität Fremdschlüssel (2) Relation Techniker PNr Nachname Vorname Stundenlohn AbtNr 27 Schulz Gerhard 17,50 NULL 63 Müller Dieter 16,80 2 75 Maier Werner 26,50 2 Relation Abteilung AbtNr Abteilungsname 1 Kundendienst 2 Werkstatt Darf ein Fremdschlüsselwert in der Relation Techniker undefiniert sein? c:m - Es kann durchaus sinnvoll sein, den Fremdschlüsselwert auf Null zu setzen. (In einer Firma muss nicht jede Person einer Abteilung angehören!) 1:m - ABER: z.b. Eine Rechnung wird immer einem Kunden zugestellt. Deswegen sollte in einer Relation Rechnung die Kundennummer immer gefüllt sein! Prof. Dr. Peter Chamoni Datenbanksysteme 20
Integritätsbedingungen (VI) Referentielle Integrität Fremdschlüssel (3) Relation Techniker PNr Nachname Vorname Stundenlohn AbtNr 27 Schulz Gerhard 17,50 1 63 Müller Dieter 16,80 2 75 Maier Werner 26,50 2 Relation Abteilung AbtNr Abteilungsname 2 Werkstatt Darf ein Tupel in der Relation Abteilung gelöscht oder geändert werden, auf das sich ein Fremdschlüssel bezieht? Mit Bezug auf die geforderte Einhaltung der Referentiellen Integritätsregel Jeder Fremdschlüsselwert (ungleich Null) muss sich auf einen existierenden Eintrag beziehen. würde eine Löschung oder Änderung diese Regel verletzen! Prof. Dr. Peter Chamoni Datenbanksysteme 21 Integritätsbedingungen (VII) Referentielle Integrität Fremdschlüssel (4) Das Löschen eines Tupels mit Referenzen ist nicht möglich. Es existieren jedoch verschiedene Zusätze, die es ermöglichen, ein Tupel zu löschen unter Einhaltung der referentiellen Integritätsregel. FOREIGN KEY (s1, ) REFERENCES Tab(s1, ) ON DELETE NO ACTION Das Löschen des Tupels wird zurückgewiesen, wenn mindestens ein Fremdschlüsselwert auf dieses Tupel verweist. FOREIGN KEY (s1, ) REFERENCES Tab(s1, ) ON DELETE CASCADE Mit dem Löschen des Tupels werden auch in den referenzierenden Relationen alle Tupel gelöscht, die in ihrem Fremdschlüssel sich auf dieses Tupel beziehen. FOREIGN KEY (s1, ) REFERENCES Tab(s1, ) ON DELETE SET NULL Beim Löschen des Tupels werden in den referenzierenden Relationen alle Fremdschlüssel auf Null gesetzt, die auf dieses Tupel referenzieren. Prof. Dr. Peter Chamoni Datenbanksysteme 22
Integritätsbedingungen (VIII) Referentielle Integrität Fremdschlüssel (5) Die Änderung eines Tupels mit Referenzen ist nicht möglich. Es existieren jedoch auch hier verschiedene Zusätze, die es ermöglichen, ein Tupel zu ändern unter Einhaltung der referentiellen Integritätsregel. FOREIGN KEY (s1, ) REFERENCES Tab(s1, ) ON UPDATE CASCADE Das Ändern des Tupels führt zur entsprechenden Anpassung aller Fremdschlüssel in den referenzierenden Relationen, die sich auf dieses geänderte Tupel beziehen. Prof. Dr. Peter Chamoni Datenbanksysteme 23 Aufgabe Integritätsbedingungen Erläutern Sie die möglichen Auswirkungen, die das Löschen oder das Ändern eines referenzierten Tupels in der Relation Abteilung auf die Fremdschlüsselwerte in der Relation Techniker 3 hat? CREATE TABLE Techniker 3 (PNr INTEGER NOT NULL PRIMARY KEY, Name Vorname Geburtsdatum DATE NOT NULL, Lohn NUMERIC (8,2), AbtNr INTEGER NOT NULL, CONSTRAINT FKey1 FOREIGN KEY(AbtNr) REFERENCES Abteilung(AbtNr) ON DELETE SET NULL ON UPDATE CASCADE); Prof. Dr. Peter Chamoni Datenbanksysteme 24
Relationen ändern (I) Syntax ALTER TABLE <Tabellenname> ADD <Spaltenname> SQL-Datentyp [Spaltenbedingung]; Fügen Sie zur Relation Techniker das Attribut Wohnort hinzu. Relation Techniker (PNr, Name, Vorname, Geburtsdatum, Lohn, Wohnort) ALTER TABLE Techniker ADD Wohnort VARCHAR(20); Prof. Dr. Peter Chamoni Datenbanksysteme 25 Relationen ändern (II) Folgende Änderungen können an einer Relation vorgenommen werden: - neue Attribute können hinzugefügt werden (ADD), - Attribute können verändert werden (MODIFY) oder - Attribute können gelöscht werden (DROP) Syntax ALTER TABLE <Tabellenname> ADD <Spaltenname> SQL-Datentyp; MODIFY <Spaltenname> SQL-Datentyp; DROP <Spaltenname>; Prof. Dr. Peter Chamoni Datenbanksysteme 26
Relationen löschen Syntax DROP TABLE Tabellenname; Löschen Sie die Relation Techniker 2. DROP TABLE Techniker2; Prof. Dr. Peter Chamoni Datenbanksysteme 27 Aufgabe: Datenbankentwurf Aufgabe Datenbankentwurf: RDM ins Logische DB-Schema Definieren Sie das relationale Datenmodell Waschmaschinenhersteller in SQL-DDL. Berücksichtigen Sie hierbei auch die jeweiligen Fremdschlüsselbeziehungen! Verwenden Sie numerische, alphanumerische Attribute wie auch Datumsattribute. Relationales Datenmodell Waschmaschinenhersteller Dokument (DokNr, Dok.Typ, Titel, Autor, TypNr) Waschmaschinentyp ( TypNr, Bezeichnung, UVP) Waschmaschine (SerienNr, Herstelldatum, TypNr, KdNr) Kunde (KdNr, Zuname, Vorname, Tel.Nr) Techniker (PNr, Vorname, Nachname, Std.lohn, AbtNr) Abteilung (AbtNr, Bezeichnung) Wartung ( PNr, SerienNr, Wart.datum, Anzahl Arb.Std.) Prof. Dr. Peter Chamoni Datenbanksysteme 28
Sichten erstellen (I) Sichten (Views) definieren einen benutzerspezifischen Ausschnitt aus dem Datenbestand. Es sind sog. logische Relationen, d.h. diese Relationen werden aus einer oder mehreren Basistabellen abgeleitet. Es wird nicht der Dateninhalt des Views in der Datenbank zusätzlich abgespeichert, sondern nur die jeweilige Ableitungsregel. Da für den Nutzer der View wie eine Relation erscheint, wird auch häufig die Bezeichnung virtuelle Relation verwendet. Ein View wird erst zur Laufzeit einer Abfrage ausgewertet! Es wird dadurch möglich, auf der externen DB-Ebene Daten nach bestimmten Kriterien sichtbar bzw. unsichtbar zu halten. Prof. Dr. Peter Chamoni Datenbanksysteme 29 Sichten erstellen (II) Syntax CREATE VIEW <Sichtname> AS SELECT * FROM <Tabellenname> [WHERE Bedingung]; Durch die SQL-Anfrage SELECT FROM WHERE wird die Ableitungsregel für den View definiert. Sie darf folgende Klauseln nicht enthalten: GROUP-BY und HAVING, ORDER BY, UNION Erstellen Sie die Sicht FRA auf der Relation Flugstrecke, in der alle Flugstrecken ab Frankfurt enthalten sind. CREATE VIEW FRA AS SELECT * FROM Flugstrecke WHERE Abflugort = 'Frankfurt'; Prof. Dr. Peter Chamoni Datenbanksysteme 30
Sichten erstellen (III) Automatisch sind in einem View alle Tupel der Basisrelation, die die Selektionsbedingung erfüllen. An diesen View können beliebige Anfragen gestellt werden, auch in Kombination mit anderen Tabellen (Join) etc. Bei der Ausführung einer Anfrage an einen View wird zunächst systemintern die View-Definition, die SELECT-Klausel, ergänzend in die Anfrage eingesetzt. Dann erst erfolgt die Auswertung der Anfrage. Bei Updates in der Basisrelation ändert sich auch die virtuelle Relation. Umgekehrt können (mit Einschränkungen) auch Änderungen am View durchgeführt werden, die sich dann auf die Basisrelation auswirken! Prof. Dr. Peter Chamoni Datenbanksysteme 31 Sichten erstellen (IV) Die Attributnamen in einer Sicht müssen - gerade beim Verbund mehrerer Tabellen - eindeutig sein. Daher müssen ggf. die Attributnamen im View umbenannt werden. Erstellen Sie eine Sicht Verdienst auf der Relation Pilot mit den Attributen Name und GKID. Das Attribut Name soll dabei in Nachname unbenannt werden. CREATE VIEW Verdienst (Nachname, GKID) AS SELECT Name, GKID FROM Pilot; Bei Abfragen kann statt des Tabellennamens der Sichtname verwendet werden. Zeigen Sie mit Hilfe der Sicht FRA alle Flugstrecken ab Frankfurt an. SELECT * FROM FRA WHERE Abflugort = 'Frankfurt'; Prof. Dr. Peter Chamoni Datenbanksysteme 32
Sichten löschen Syntax DROP VIEW <Sichtname>; Löschen Sie die Sicht FRA. DROP VIEW FRA; Prof. Dr. Peter Chamoni Datenbanksysteme 33