SQL Datendefinition und Datenmanipulation in SQL 2002 Prof. Dr. Rainer Manthey Informationssysteme 1 SQL: Geschichte SQL (Structured Query Language) ist heute die bei weitestem populärste und verbreitetste relationale Datenbanksprache. Jedes relationale DBMS "versteht" SQL! SQL wurde Anfang der 1970er Jahre bei IBM entwickelt (als Sprache für das relationale Prototyp-DBMS "System R"). ursprüngliche Bezeichnung: SEQUEL (Strutured English Query Language) erste SQL-Normung (SQL 1) 1986 durch ANSI in den USA, revidiert 1989 wesentliche Erweiterung 1992: SQL2 bzw. SQL92 (standardisiert, heute üblich) seit 1999 neuer Standard: SQL3 bzw. SQL:1999 (Neuerungen erst ansatzweise in kommerziellen Systemen zu finden) Vorsicht! Nahezu jedes kommerzielle DB-Produkt hat seinen eigenen "Dialekt" von SQL, der mehr oder weniger gut mit dem Standard kompatibel ist! 2002 Prof. Dr. Rainer Manthey Informationssysteme 2
SQL: Literatur "klassische" (und vermutlich immer noch beste) Quelle zu SQL: Chris Date, Hugh Darwen: "SQL - Der Standard" ISBN 3-8273-1345-7 Addison Wesley, 1998 44,95 im Kemper-Buch: relativ kurze Abhandlung von SQL in Kapitel 4 gutes neues Buch zum neuen SQL-Standard: Melton/Simon: "SQL:1999 Understanding Relational Language Components", Academic Press, 2002 2002 Prof. Dr. Rainer Manthey Informationssysteme 3 Grundbegriffe für relationale DB im "SQL-Dialekt" SQL hat seine eigene Terminologie für die relationalen Grundbegriffe, die von der Access-Terminologie deutlich abweicht: Spalte Tabelle Spiele2002 Heim ToreH Auswärts ToreA Datum Hertha 2 Nürnberg 1 5.10.02... Zeile Wertebereich Text Zahl Text Zahl Datum Wichtig sind die englischen Formen dieser Grundbegriffe, weil SQL mit englischen Schlüsselworten arbeitet: Tabelle table Spalte column wie in Access: Zeile row Duplikate erlaubt (d.h. keine "echte" Relation) Wertebereich domain 2002 Prof. Dr. Rainer Manthey Informationssysteme 4
SQL = DDL + DML SQL setzt sich aus zwei Teilsprachen zusammen (wie fast jede DB-Sprache): einer Datendefinitionssprache (engl. "data definition language" DDL ) einer Datenmanipulationssprache (engl. "data manipulation language" DML ) Die DDL enthält Befehlsformate, mit denen man Datenbankschemata definieren und manipulieren kann (Schemaevolution). Die DML dagegen bietet Befehle zum Formulieren von Anfragen an und Änderungen von Datenbankzuständen. Alle Befehle in SQL werden textuell ausgedrückt; es gibt keine graphische Unterstützung à la QBE. Das "Gerüst" jedes SQL-Befehls besteht aus englischen Schlüsselworten, z.b.: SELECT... FROM... WHERE... für einfache Anfragen. Schlüsselworte sind "reserviert" und dürfen nicht an anderer Stelle verwendet werden (etwa als Tabellen- oder Spaltennamen). 2002 Prof. Dr. Rainer Manthey Informationssysteme 5 3.1 SQL-DDL Datendefinition und Datenmanipulation in SQL 3.1 Datendefinition in SQL 2002 Prof. Dr. Rainer Manthey Informationssysteme 6
SQL-DDL zunächst: intensivere Beschäftigung mit Datendefinitionsmöglichkeiten in SQL hier, wie im ganzen Kapitel: weitgehend angelehnt an SQL92 (mit gelegentlicher Beeinflussung durch den "Access-Dialekt") leider: Access bietet keine mit dem QBE-Entwurf synchronisierte, automatisch generierte SQL-Darstellung des DB-Schemas aber: Access akzeptiert textuelle Schemadefinitionsbefehle in SQL zu erreichen im Anfrage-Entwurfsmodus Menü 'Abfrage' - Menüpunkt 'SQL-spezifisch' - Unterpunkt 'Datendefinition' erscheint Textfenster zur Eingabe von SQL-DDL-Befehlen Ausführung des CREATE TABLE-Befehls führt zum Anlegen der Tabelle resultierende Tabelle steht dann im QBE-Entwurfsmodus zur Verfügung spezielle Form der Abfrage in Access: Datendefinitionsabfrage im gesamten : Kein Anspruch auf Vollständigkeit der Darstellung! (SQL ist viel zu komplex; Details siehe Literatur) 2002 Prof. Dr. Rainer Manthey Informationssysteme 7 CREATE SCHEMA Format des allgemeinen Schemadefinitionsbefehls (bleibt oft implizit): SQL-Schlüsselworte optional CREATE SCHEMA [ schema-name ] [ AUTHORIZATION user-name ] [ DEFAULT CHARACTER SET character-set ] [ list-of-schema-elements ] Nichtterminal- Symbole Mindestens Schemaname oder Benutzerautorisierung sind erforderlich. wesentlicher Bestandteil: sogenannte Schemaelemente domain-definitionen (base) table-definitionen view-definitionen privilege-definitionen constraint-definitionen (zusätzlich: character set-, collation-, translation-definitionen) 2002 Prof. Dr. Rainer Manthey Informationssysteme 8
CREATE TABLE: Prinzip wichtigster Datendefinitionsbefehl: Einrichten/Erzeugen einer neuen Tabelle CREATE TABLE table-name ( lists-of-table-elements) ; eindeutig innerhalb desselben Schemas "table elements" (Tabellenelemente) sind Festlegungen von Spaltennamen und deren Datentypen Integritätsbedingungen, die sich auf die neue Tabelle beziehen daraus resultierende "Grobstruktur" einer Tabellendefinition: CREATE TABLE table-name column 1 [ column-constraints 1 ], column 2 [ column-constraints 2 ],... column n [ column-constraints n ], [table-constraints] Integritätsbedingungen für einzelne Spalten die ganze Tabelle 2002 Prof. Dr. Rainer Manthey Informationssysteme 9 CREATE TABLE: Bundesliga-Beispiel Beispiel: SQL-Befehl zur Definition der Tabelle 'Spiele2002' der Bundesliga-DB: Tabellenname Tabellenelemente CREATE TABLE Spiele2002 ( Datum date, Heim text, ToreH number(15) DEFAULT NULL Auswärts text, ToreA number(15) DEFAULT NULL Spieltag number(15) NOT NULL CHECK ( > 0 AND < 35), PRIMARY KEY (Datum, Heim), FOREIGN KEY ( Heim ) REFERENCES Vereine2002, FOREIGN KEY ( Auswärts ) REFERENCES Vereine2002 ) ; 2002 Prof. Dr. Rainer Manthey Informationssysteme 10
CREATE TABLE: genereller Aufbau Jede Tabellendefinition besteht aus zwei Teilen: den Definitionen der einzelnen Spalten und (eventuell noch) Beschränkungen, die für die ganze Tabelle gelten: Spaltendefinitionen Tabellenbeschränkungen CREATE TABLE Spiele2002 ( Datum date, Heim text, ToreH number(15) DEFAULT NULL Auswärts text, ToreA number(15) DEFAULT NULL Spieltag number(15) NOT NULL CHECK ( > 0 AND < 35), PRIMARY KEY (Datum, Heim), FOREIGN KEY ( Heim ) REFERENCES Vereine2002, FOREIGN KEY ( Auswärts ) REFERENCES Vereine2002 ) ; 2002 Prof. Dr. Rainer Manthey Informationssysteme 11 CREATE TABLE: Spaltendefinitionen Jede Spaltendefinition besteht ihrerseits aus zwei Teilen: der Festlegung von Spaltenname und Typ der Werte (eventuell) speziellen Beschränkungen für Werte der Spalte CREATE TABLE Spiele2002 ( Datum date, Heim text, ToreH number(15) DEFAULT NULL Auswärts text, ToreA number(15) DEFAULT NULL Spieltag number(15) NOT NULL CHECK ( > 0 AND < 35),... ) Syntax von Spaltendefinitionen: eindeutig innerhalb derselben Tabelle column-name { data-type domain } [ column-constraints ] Alternative 2002 Prof. Dr. Rainer Manthey Informationssysteme 12
Datentypen und "Domains" wie in jeder Programmiersprache: zahlreiche vordefinierte Datentypen für Spalteneinträge (in Felder der Tabelle) Vorsicht! Datentypbezeichnungen in Access-SQL weichen von denen des SQL- Standards ab (Details siehe weiterführende Literatur) daneben: Möglichkeit zur Definition eigener, anwendungsspezifischer Wertebereiche ("domains") mittels separater Domain-Definitionen, z.b. CREATE DOMAIN big_eu_capitals AS text(15) Standardwert DEFAULT??? CHECK ( VALUE IN ( Paris, London, Berlin, domain Rome, Madrid, Brussels, constraint Vienna,??? ) ) Selbstdefinierte Domains können ansonsten analog zu ihren Basistypen verwendet werden. in dieser Einführung: keine weitere Vertiefung des Domain-Konzepts 2002 Prof. Dr. Rainer Manthey Informationssysteme 13 CREATE TABLE: Spaltenbeschränkungen Jede Spaltendefinition besteht ihrerseits aus zwei Teilen: der Festlegung von Spaltenname und Typ der Werte (eventuell) speziellen Beschränkungen für Werte der Spalte CREATE TABLE Spiele2002 ( Datum date, Heim text, ToreH number(15) DEFAULT NULL Auswärts text, ToreA number(15) DEFAULT NULL Spieltag number(15) NOT NULL CHECK ( > 0 AND < 35),... ) Syntax von Spaltenbeschränkungen (column-constraints): [ NOT NULL UNIQUE ] [ PRIMARY KEY ] [ DEFAULT { literal NULL } ] [ REFERENCES table-name ] [ CHECK condition ] 2002 Prof. Dr. Rainer Manthey Informationssysteme 14
CREATE TABLE: Tabellenbeschränkungen Der zweite Teil einer Tabellendefinition ist optional; er besteht aus einer oder mehreren Tabellenbeschränkungen, die i.a. für mehrere Spalten gelten: CREATE TABLE Spiele2002 (... PRIMARY KEY (Datum, Heim), FOREIGN KEY ( Heim ) REFERENCES Vereine2002, FOREIGN KEY ( Auswärts ) REFERENCES Vereine2002 ) Syntax von Tabellenbeschränkungen (table-constraints): [ UNIQUE ( list-of-column-names ) ] [ PRIMARY KEY ( list-of-column-names ) ] [ FOREIGN KEY ( list-of-column-names ) REFERENCES table-name ] [ CHECK ( condition ) ] 2002 Prof. Dr. Rainer Manthey Informationssysteme 15 Integritätsbedingungen in Tabellendefinitionen Tabellendefinitionen (CREATE TABLE) enthalten zwei sehr ähnliche Arten von Integritätsbedingungen (constraints): Spaltenbeschränkungen (column constraints) Tabellenbeschränkungen (table constraints, auch: row constraints) Spaltenbeschränkungen sind Abkürzungen von Tabellenbeschränkungen, bei denen stets die gerade betrachtete Spalte implizit bleibt, z.b.: Spaltenbeschränkung: Spieltag number(15) CHECK ( > 0 AND < 35 ), Tabellenbeschränkung: CHECK ( Spieltag > 0 AND Spieltag < 35 ), Der Bedingungsteil einer solchen - allgemein 'CHECK constraint' genannten - Beschränkung muss in jedem zulässigen Zustand der DB erfüllt sein. 2002 Prof. Dr. Rainer Manthey Informationssysteme 16
CREATE TABLE: Constraints (1) UNIQUE-Option: Vereinbarung von Schlüsseln (auch: Schlüsselkandidaten) einspaltiger Schlüsselkandidat: in Spaltendefinition: column-name... UNIQUE mehrspaltiger Schlüsselkandidat: eigene UNIQUE-Klausel: UNIQUE ( list-of-column-names) Bedeutung: Keine zwei Zeilen haben dieselben Werte in Spalten, die zu einem Schlüsselkandidaten gehören. Ausnahme: Nullwerte - NULL darf in einer UNIQUE-Spalte mehrfach auftreten Herkunft des Bezeichners: engl. unique dt. "eindeutig" pro Tabelle: beliebig viele UNIQUE-Deklarationen möglich In einer Tabelle mit UNIQUE-Deklarationen können keine Duplikate (identische Zeilen) auftreten! Verbot von Nullwerten für einzelne Spalten: column-name... NOT NULL 2002 Prof. Dr. Rainer Manthey Informationssysteme 17 CREATE TABLE: Constraints (2) pro Tabelle: Höchstens ein Schlüsselkandidat darf als Primärschlüssel deklariert werden. einspaltige Primärschlüssel: in Spaltendefinition: column name... PRIMARY KEY mehrspaltige Primärschlüssel: eigene Klausel: PRIMARY KEY ( list-of-column-names ) zusätzlich: Keine Spalte innerhalb eines Primärschlüssels darf einen Nullwert NULL enthalten! PRIMARY KEY ist nicht dasselbe wie UNIQUE NOT NULL! (zusätzlich: Eindeutigkeit des P. innerhalb der Tabelle) keine echte "Beschränkung", aber trotzdem hier behandelt: Vereinbarung von Standardwerten für Spalten von Tabellen: Werte, die automatisch eingesetzt werden, wenn keine explizite Angabe beim Eingeben der jeweiligen Zeile erfolgt (engl.: "DEFAULTS") 2002 Prof. Dr. Rainer Manthey Informationssysteme 18
CREATE TABLE: Constraints (3) zweite spezielle Form von Integritätsbedingung innerhalb einer Tabellendeklaration: Fremdschlüssel (engl.: "foreign key") Situation: Spalte(n) der gerade deklarierten Tabelle A referenziert (d.h.: enthält Werte von einem) Schlüsselkandidaten oder Primärschlüssel einer zweiten ( fremden ) Tabelle B A B Spalten, die Fremdschlüssel bilden Bedingung: A-Spalten enthalten nur Werte, die aktuell in den referenzierten B-Spalten vorkommen! 2002 Prof. Dr. Rainer Manthey Informationssysteme 19 CREATE TABLE: Constraints (4) Syntax der zugehörigen Beschränkung (als Tabellenbeschränkung): FOREIGN KEY ( list-of-column-names ) REFERENCES table-name [ ( list-of-column-names ) ] z.b.: CREATE TABLE t 1 ( a 1 INT PRIMARY KEY,..... ) b 1 referenziert a 1 wenn Zielspalten fehlen: Primärschlüssel angenommen abgekürzte Form als Spaltenbeschränkung CREATE TABLE t 2 ( b 1 INT REFERENCES t 1,..... ) 2002 Prof. Dr. Rainer Manthey Informationssysteme 20
CREATE TABLE: Constraints (5) Vollständige Syntax dieser referential constraints sieht diverse optionale Ergänzungen vor: FOREIGN KEY ( list-of-column-names ) REFERENCES base-table-name [ ( list-of-column-names ) ] [ MATCH { FULL PARTIAL } ] [ ON DELETE { NO ACTION CASCADE SET DEFAULT SET NULL} ] [ ON UPDATE { NO ACTION CASCADE SET DEFAULT SET NULL} ] referential actions spezifizieren, was bei Integritätsverletzungen passiert Detailliertere Diskussion dieses Konzepts folgt noch. ganz analog zu Access-Optionen bei referentieller Integrität: mit Änderungsweitergabe: ON UPDATE CASCADE mit Löschweitergabe: ON DELETE CASCADE 2002 Prof. Dr. Rainer Manthey Informationssysteme 21 andere DDL-Befehle Vordefinierte Anfragen zur Berechnung von abgeleiteten Tabellen ("derived tables") wie in Access können auch in SQL-Schemata definiert werden. SQL-Bezeichnung dafür: Sicht (engl. "view") zugehöriger DDL-Befehl: CREATE VIEW (wird in Kap. 3.2 näher behandelt) Sichtdefinitionen sind nichts weiter als SQL-Anfragen, denen ein Name gegeben wird: Name CREATE VIEW millionenstädte AS ( SELECT Kfz, Name, Einwohner, Land FROM stadt, stadt_in_land WHERE Einwohner >= 1000 ) ; Anfrage Nähere Diskussion erst dann sinnvoll, wenn Anfragesprache von SQL bekannt ist. Befehle zur Gewährung von Zugriffsrechten ("privilege") ebenfalls in 3.2. 2002 Prof. Dr. Rainer Manthey Informationssysteme 22
Schemaevolution (1) bis hierher: nur initialer Schemaaufbau diskutiert (Komponenten eines Schemas) jetzt: SQL-Features zum inkrementellen Schemaaufbau und zur Schemaevolution zunächst: Veränderung von Bereichsdefinitionen (prototypisch) Löschen von "Domains": DROP DOMAIN domain-name { RESTRICT CASCADE} zwei Optionen (Auswahl obligatorisch): RESTRICT: DROP-Befehl schlägt fehl, wenn Schema noch Referenzen auf jeweiligen Domain enthält CASCADE: DROP-Befehl ist erfolgreich, und den Domain referenzierende Views und Constraints werden gelöscht referenzierende Spalten bleiben erhalten und erben Datentyp, Defaults und Constraints (als lokale Vereinbarungen) ("Löschung wird kaskadierend weitergereicht!") 2002 Prof. Dr. Rainer Manthey Informationssysteme 23 Schemaevolution (2) Änderungen bestehender DOMAIN-Deklarationen: ALTER DOMAIN domain-name domain-alteration-action DROP DEFAULT SET DEFAULT default-definition ADD CONSTRAINT domain-constraint Defaults werden vor der Löschung auf referenzierende Spalten übertragen Constraints werden nicht übertragen (nur bei DROP DOMAIN!) DROP CONSTRAINT constraint-name kann für jede Constraint vereinbart werden 2002 Prof. Dr. Rainer Manthey Informationssysteme 24
Schemaevolution (3) nach analogem Prinzip: Änderungen von TABLE-Deklarationen DROP TABLE table-name { RESTRICT CASCADE } ALTER TABLE base-table-name base-table-alteration-action Änderungen von Spaltendefinitionen: ADD COLUMN column-definition ALTER COLUMN column-name { SET default-definition DROP DEFAULT } DROP COLUMN column-name { RESTRICT CASCADE } Änderungen von Constraints: wie bei Domains mit ADD und DROP Löschen von Sichtdefinitionen ebenfalls analog: DROP VIEW (aber: kein ALTER VIEW!) 2002 Prof. Dr. Rainer Manthey Informationssysteme 25