DB1-Datenbanksysteme DB-13 042-SQL-DDL 1 Mario Neugebauer Einführung Informationsmodellierung Relationales Datenbankmodell Datenbanksprache SQL Einführung Daten-Abfrage-Sprache Daten-Definitions-Sprache Tabellen Daten-Manipulations-Sprache - DQL - DDL - DML
DDL - Daten-Definitions-Sprache DB-13 042-SQL-DDL 2 Mario Neugebauer Data Definition Language Anweisungen zum Anlegen, Ändern und Löschen von Datenbankobjekte SCHEMA DATABASE TABLE VIEW INDEX SYNONYM CREATE X X X X X X ALTER X X DROP X X X X X
DDL-TABLE: Create DB-13 042-SQL-DDL 3 Mario Neugebauer Anlegen einer Tabellen mit: einer definierten Spaltenliste definierten Integritätsbedingungen einem eindeutigen Tabellen-Namen CREATE TABLE tabname ( spaname datentyp [feldeinschränkung] [... ] ) ; CREATE TABLE Abteilung ( AbtNr INTEGER NOT NULL, Bezeichnung VARCHAR(50), PRIMARY KEY (AbtNr) ) ; Abteilung AbtNr Bezeichnung
DDL-TABLE: Integritätsregeln / Constraints integrity constraints / Beschränkung werden verwendet, um: die Verwaltung von Tabellen zu erleichtern die Integrität einer Datenbank zu sichern mögliche Constraints: Primärschlüssel ein Datensatz kann eindeutig angesprochen werden Fremdschlüssel eindeutige Verknüpfung von Tabellen im relationalen DB-Modell UNIQUE verhindert, dass doppelte Werte gespeichert werden CHECK Prüfungsregeln bei Dateneingabe Vermeidung von Fehleingaben DEFAULT Standardwerte die gesetzt werden, wenn nichts angegeben wird NOT NULL legt fest, dass eine Spalte nicht NULL sein kann DB-13 042-SQL-DDL 4 Mario Neugebauer
DDL-TABLE: Integritätsregeln / Constraints DB-13 042-SQL-DDL 5 Mario Neugebauer Syntax für die DBMS: Firebird/Interbase, OpenOffice, SQL-Server CREATE TABLE tabname ( spadefinition [... ] [CONSTRAINT conname] PRIMARY KEY(spaListe), UNIQUE (spaliste), [CONSTRAINT conname] FOREIGN KEY(spaName) REFERENCES tabname(spaname) [ON DELETE aktion] [ON UPDATE aktion] CHECK (bedingung) ) ;
DDL-TABLE: Integritätsregeln - Primärschlüssel DB-13 042-SQL-DDL 6 Mario Neugebauer PRIMARY KEY (spaliste) Bestimmung der als Primärschlüssel (PS) dienenden Spalte/n CONSTRAINT gibt dem PS einen Namen, über den er angesprochen werden kann (z.b. zum Ändern oder Löschen der PS-Eigenschaft) Varianten: am Ende des CREATE-Befehls Tabellenbedingung CREATE TABLE tabname ( spaname1 datentyp NOT NULL, spaname2 datentyp, [... ] [CONSTRAINT constraintname_für_primärschlüssel] PRIMARY KEY (spaliste)) ; nach der Spaltendefinition Spaltenbedingung nur möglich, wenn nur eine Spalte den PS bildet CREATE TABLE tabname ( spaname datentyp PRIMARY KEY, [ ] ) ;
DDL-TABLE: Integritätsregeln - Primärschlüssel DB-13 042-SQL-DDL 7 Mario Neugebauer Systemseitige Erzeugung eindeutiger Primärschlüssel Syntax: MS Access: spname datentyp AUTOWERT MySQL: spname datentyp NOT NULL AUTO_INCREMENT SQL-Server: spname datentyp NOT NULL IDENTITY SQLite: spname datentyp AUTOINCREMENT Firebird: Realisierung mittels Trigger DB2: Realisierung mittels Trigger Oracle: CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10 INSERT INTO Persons (P_Id, FirstName, LastName) VALUES (seq_person.nextval,'lars', 'Monsen')
DDL-TABLE: Integritätsregeln - Primärschlüssel A Gesucht: Definition der Tabelle Geburtstag mit den Informationen: laufende Nummer gebnr als PS Name, Vornamen Zeichenanzahl jeweils 50 Geburtstag CREATE TABLE GeburtsTag( gebnr INTEGER NOT NULL, Name VARCHAR(50) NOT NULL, Vorname VARCHAR(50), Geburtstag DATE, CONSTRAINT ps_geburtstag PRIMARY KEY (gebnr) ); die Constraint-Definition ermöglicht das Ändern und Löschen der PS-Eigenschaft der Spalten Testen DB-13 042-SQL-DDL 8 Mario Neugebauer
DDL-TABLE: Integritätsregeln - Primärschlüssel A Gesucht: Definition der Tabelle Urlaub mit den Informationen: UrlaubNr als PS Namen, Vornamen Urlaubsantritt UrlBeginn und Urlaubsende UrlEnde CREATE TABLE Urlaub ( UrlaubNr INTEGER NOT NULL, Name VARCHAR(50), Vorname VARCHAR(50), UrlBeginn DATE, UrlEnde DATE, PRIMARY KEY (urlnr) ) ; Testen DB-13 042-SQL-DDL 9 Mario Neugebauer
DDL-TABLE: Integritätsregeln - Primärschlüssel A Gesucht: Definition der Tabelle Telefonliste mit den Informationen: laufende Nummer TelefonListenNr als PS Anlage mit einem CONSTRAINT ps_telefonliste Name, Vorname Telefonnummer Bemerkung ein Buchstaben (P für privat oder G für geschäftlich) der Name und die Telefonnummer müssen immer vorhanden sein CREATE TABLE Telefonliste ( TelefonListenNr INTEGER NOT NULL, Name VARCHAR(50) NOT NULL, Vorname VARCHAR(50), Telefonnummer VARCHAR(50) NOT NULL, Bemerkung CHAR(1), CONSTRAINT ps_telefonliste PRIMARY KEY (TelefonListenNr)) ; DB-13 042-SQL-DDL 10 Mario Neugebauer Testen
DDL-TABLE: Integritätsregeln - Fremdschlüssel FOREIGN KEY FS Verbindung einer Spalte einer Tabellen mit einer gleichartigen Spalte einer anderen Tabelle CREATE TABLE tabname ( spanamea datentyp [feldbeschränkung], [... ] [PRIMARY KEY (spaliste),] [CONSTRAINT constraintname_für_fremdschlüssel] FOREIGN KEY (spanamea) REFERENCES tabnameb (spanameb) ) ; REFERENCES Tabelle mit PS, auf die man sich bezieht!! die Tabelle, auf die man sich bezieht, muss bereits existieren Student StudienGang MatNr StudName SGNr SGNr SGName 1 Rot 1 1 Gesu-Inf. 3 Blau 2 2 Sport-Inf. 4 Gelb 2 999 Dmy DB-13 042-SQL-DDL 11 Mario Neugebauer
DDL-TABLE: Integritätsregeln - Fremdschlüssel DB-13 042-SQL-DDL 12 Mario Neugebauer Definition der Tabellen Student und Studiengang mit der Verknüpfung durch den PS StudienGang.SGNr und dem FS Student.SGNr: CREATE TABLE StudienGang ( SGNr INTEGER NOT NULL, SGName VARCHAR(50), PRIMARY KEY (SGNr) ) ; CREATE TABLE Student ( MatNr INTEGER NOT NULL, SGNr INTEGER, PRIMARY KEY (MatNr), FOREIGN KEY (SGNr) REFERENCES StudienGang (SGNr) );
DDL-TABLE: Integritätsregeln - Fremdschlüssel A Gesucht: Definition der Tabelle Ferien mit den Informationen: Beginn und Ende des Urlaubs (UrlBeginn, UrlEnde) MitarbeiterNr als FS aus Mitarbeiter CREATE TABLE Ferien ( MitarbeiterNr INTEGER NOT NULL, UrlBeginn DATE NOT NULL, UrlEnde DATE, PRIMARY KEY (MitarbeiterNr, Beginn), FOREIGN KEY (MitarbeiterNr) REFERENCES Mitarbeiter (MitarbeiterNr) ); DB-13 042-SQL-DDL 13 Mario Neugebauer Testen
DDL-TABLE: Integritätsregeln - Fremdschlüssel A Gesucht: Befehl zur Erstellung der Tabelle Posten CREATE TABLE posten ( In SQLTeacher Erstellung von: BestellNr INTEGER NOT NULL, * Posten2 ArtikelNr INTEGER NOT NULL, BestellMenge INTEGER, LieferMenge INTEGER, PRIMARY KEY (BestellNr, ArtikelNr), FOREIGN KEY (BestellNr) REFERENCES Bestellung (BestellNr), FOREIGN KEY (ArtikelNr) REFERENCES Artikel (ArtikelNr) ) ; DB-13 042-SQL-DDL 14 Mario Neugebauer Testen
DDL-TABLE: Integritätsregeln - Fremdschlüssel A Gesucht: Befehle zur Erstellung folgender Tabellen und Beziehungen. CREATE TABLE MWSteuer( MWSteuerNr INTEGER NOT NULL PRIMARY KEY, Prozent DECIMAL(4,2)); CEATE TABLE Hersteller( HerstellerNr INTEGER PRIMARY KEY, HerstellerName VARCHAR(50)); In SQLTeacher Erstellung von: * Artikel2 * MWSteuer2 * Hersteller2 CREATE TABLE Artikel( ArtikelNr INTEGER NOT NULL PRIMARY DECIMAL(10,2) KEY, Bezeichnung VARCHAR(50), HerstellerNr INTEGER, Nettopreis DECIMAL(10,2), MwSteuerNr INTEGER, FOREIGN KEY (HerstellerNr) REFERENCES Hersteller (HerstellerNr) FOREIGN KEY (MwSteurNr) REFERENCES MwSteuer (MwSteuerNr)); 2 Stellen nach dem Komma da insgesamt 10 Stellen vor und nach dem Komma definiert sind, bleiben acht Stellen vor dem Komma übrig Testen DB-13 042-SQL-DDL 15 Mario Neugebauer
DDL-TABLE: Integritätsregeln Fremdschlüssel Spezifikation der Reaktion auf das Löschen oder Verändern eines Datensatzes in der Vatertabelle ( Tabelle auf die der FS verweist) Übung dazu in DML CREATE TABLE tabname ( spanamea datentyp, FOREIGN KEY (spanamea) REFERENCES tabname (spaname) [ON DELETE (NO ACTION / CASCADE / SET DEFAULT / SET NULL)] [ON UPDATE (NO ACTION / CASCADE / SET DEFAULT / SET NULL)] ); Vatertabelle Mastertabelle Student StudienGang MatNr StudName SGNr SGNr SGName 1 Rot 1 1 Gesu-Inf. 3 Blau 2 2 Sport-Inf. 4 Gelb 2 999 Dmy DB-13 042-SQL-DDL 16 Mario Neugebauer
DDL-TABLE: Integritätsregeln FS Reaktion /1 SET NULL in der abhängigen Tabelle werden die Schlüsselwerte auf NULL gesetzt Bsp.: ON DELETE SET NULL DELETE FROM StudienGang WHERE SGNr = 2; SET DEFAULT in der abhängigen Tabelle werden die Schlüsselwerte auf den DEFAULT- Wert gesetzt der Default-Wert muss in der Mastertabelle existieren Bsp.: ON DELETE SET DEFAULT Löschung der Sport-Inf. Student MatNr StudName SGNr 1 Rot 1 3 Blau 2 4 Gelb 2 Student Default Wert muss in der Mastertabelle vorhanden sein StudienGang SGNr SGName 1 Gesu-Inf. 2 Sport-Inf. 999 Dmy StudienGang MatNr StudName SGNr SGNr SGName DELETE FROM StudienGang 1 Rot 1 1 Gesu-Inf. WHERE SGNr = 2; 3 Blau 2 2 Sport-Inf. 4 Gelb 2 999 Dmy DB-13 042-SQL-DDL 17 Mario Neugebauer
DDL-TABLE: Integritätsregeln FS Reaktion /2 NO ACTION Standard in der abhängigen Tabelle dürfen die FS der Datensätze nicht geändert werden Fehlermeldung und Rollback der Lösch- oder Änderungsaktion Student MatNr StudName SGNr 1 Rot 1 3 Blau 2 4 Gelb 2 CASCADE in der abhängigen Tabelle werden bei: Update: die Schlüsselwerte aktualisiert Delete: die Datensätze mit dem FS gelöscht Bsp.: ON DELETE CASCADE Student StudienGang SGNr SGName 1 Gesu-Inf. 2 Sport-Inf. 999 Dmy StudienGang MatNr StudName SGNr SGNr SGName DELETE FROM StudienGang 1 Rot 1 1 Gesu-Inf. WHERE SGNr = 2; 3 Blau 2 2 Sport-Inf. 4 Gelb 2 999 Dmy DB-13 042-SQL-DDL 18 Mario Neugebauer
DDL-TABLE: Integritätsregeln FS Reaktion /3 REFERENCES ON DELETE CASCADE StudienGang SGNr SGName 1 Gesu-Inf. 2 Sport-Inf. 999 Dmy Delete REFERENCES ON DELETE CASCADE Student MatNr StudName SGNr 1 Rot 1 3 Blau 2 4 Gelb 2 Prpüfung MatNr Fach Note 1 Mathe1 1 3 Mathe2 2 3 DB2 2 4 DB1 3 4 DWH 2 DB-13 042-SQL-DDL 19 Mario Neugebauer
DDL-TABLE: Integritätsregeln UNIQUE UNIQUE Verhinderung der Eingabe von doppelten Werten Varianten: am Ende der Tabellendefinition: CREATE TABLE tabname ( spaname1 datentyp, [... ] [PRIMARY KEY (spaliste),] [CONSTRAINT constraintname_für_unique] UNIQUE (spaname1, spaname2 [... ])) ; nach der Spaltendefinition: CREATE TABLE tabname ( spaname datentyp UNIQUE [... ] ) ; z.b. zum nachträglichen Löschen der UNIQUE- Eigenschaft der Spalten Bsp.: Erstellung der Tabelle Kunde mit einem eindeutigen MatchCode CREATE TABLE Kunde ( Name VARCHAR(50), MatchCode VARCHAR(60) UNIQUE); DB-13 042-SQL-DDL 20 Mario Neugebauer
DDL-TABLE: Integritätsregeln CHECK /1 CHECK Prüfung von Eingaben auf definierte Bedingungen Varianten: am Ende der Tabellendefinition: CREATE TABLE tabname ( spaname datentyp, [CONSTRAINT constraintname_für_check] CHECK (Bedingung)) ; nach der Spaltendefinition: CREATE TABLE tabname ( spaname datentyp CHECK (Bedingung) [... ] ) ; Bedingung: kann jede beliebige Query mit dem Resultattyp boolean sein die CHECK-Klausel ist jeweils an eine Tabellen-Deklaration gebunden ab SQL2 gibt es freistehende CHECK-Klauseln, die nicht Teil einer Tabellen-Definition sind ASSERTIONS DB-13 042-SQL-DDL 21 Mario Neugebauer
DDL-TABLE: Integritätsregeln CHECK /2 DB-13 042-SQL-DDL 22 Mario Neugebauer Bedingung: Vergleich mit Werteliste: CHECK (spaname IN (werteliste)) Prüfung: MwSt 7% oder 19% CHECK (MwSt IN (7, 19)) Vergleich mit Konstanten: CHECK (spaname VergleichsOP Wert) Prüfung: Alter >17 und < 80 Jahre CHECK (Alter > 17 AND Alter < 80) CREATE TABLE Liefert (TeileNr DECIMAL(6) NOT NULL, CHECK (EXISTS (SELECT * FROM Teil WHERE Teil.TeileNr = Liefert.TeileNr) AND
DDL-TABLE: Integritätsregeln CHECK /2 A Gesucht: Definition der Tabelle Rabatt zur Speicherung der Kundennummer mit einer Rabattstufe. Es gibt die Rabattstufen: B»Bronze«S»Silber«G»Gold«Die eingegebene Rabattstufe soll immer gültig sein. CREATE TABLE Rabatt ( KundeNr INTEGER NOT NULL PRIMARY KEY, Rabattstufe CHAR(1) CHECK (Rabattstufe IN ('B', 'G', 'S )) ) ; Testen DB-13 042-SQL-DDL 23 Mario Neugebauer
DDL-TABLE: Integritätsregeln DEFAULT DB-13 042-SQL-DDL 24 Mario Neugebauer DEFAULT Vorgabe eines Standardwertes, der immer dann eingesetzt wird, wenn nichts anderes angegeben ist. Standardwerte können sein: Null-Marke Systemvariable z.b. CURRENT_DATE( ) gültige Zeichen CREATE TABLE tabname ( spaname datentyp DEFAULT vorgabewert [... ] CHECK(..)) ; CREATE TABLE Artikel ( ArtikelNr INTEGER NOT NULL PRIMARY KEY, Bezeichnung VARCHAR(50), Nettopreis DECIMAL (10,2), MwSt INTEGER DEFAULT 19 CHECK (MwSt IN (7, 19))) ;
DDL-TABLE: Integritätsregeln A Gesucht: Definition der Tabelle Patient zur Speicherung: PatNr Primärschlüssel PatName 50 Zeichen Geschl Zahl / Standardwert 999 / 1-w, 2-m, 999-noValue Groesse Zahl / Standardwert 999 / min:150,max:220, 999-noValue CREATE TABLE Patient ( ); PatNr INTEGER NOT NULL, PatName char(50), Geschl INTEGER DEFAULT 999 CHECK (Geschl IN (1,2,999)), Groesse INTEGER DEFAULT 999 CHECK (((Groesse => 150) AND (Groesse <= 220)) OR (Groesse = 999)), PRIMARY KEY (PatNr) Testung mit: insert into Patient (PatNr,PatName,Geschl,Groesse) values(1, Aa',3,177); insert into Patient (PatNr,PatName) values(2, Bb ); Testen DB-13 042-SQL-DDL 25 Mario Neugebauer
DDL-DOMAIN: Erzeugen Definition einer Menge zulässiger Werte Vereinfachung der Tabellendefinition ( übersichtlicher) Bedingung kann nach der Definition mehrfach angewendet werden CREATE DOMAIN domainenname AS datentyp DEFAULT Vorgabewert CHECK ( VALUE Bedingung ) ; CREATE TABLE tabname ( spaname domainenname, [... ] ) ; Vgl. Sql-Server: CREATE RULE [ schname. ] rule_name AS condition_expression [ ; ] DB-13 042-SQL-DDL 26 Mario Neugebauer
DDL-DOMAIN: Bsp. Zahlungsart Bsp.: Rechnung R, Bankeinzug B, Nachnahme N, Vorkasse V, Kreditkarte K ohne DOMAIN CREATE TABLE Kunde ( [... ] Zahlungsart CHAR(1) DEFAULT R CHECK (Zahlungsart IN ('R, 'B 'N 'V, 'K'))); mit DOMAIN CREATE DOMAIN d_zahlungsart AS CHAR(1) DEFAULT R CHECK ( VALUE IN ( R, B, N, V, K )); CREATE TABLE Kunde ( [... ] Zahlungsart d_zahlungsart ); Möglichkeit zum Zugriff auf den Wert DB-13 042-SQL-DDL 27 Mario Neugebauer
DDL-DOMAIN: Übung A Gesucht: Domain d_nichtnegativ, die für den Datentyp INTEGER die Eingabe von negativen Werten verhindert. CREATE DOMAIN d_nichtnegativ AS INTEGER CHECK (VALUE >= 0); Gesucht: Mehrwertsteuer als Domain d_mwst. Der Datentyp soll eine Nachkommastelle haben und der Vorgabewert soll 19 (Prozent) sein. CREATE DOMAIN d_mwst AS DECIMAL(3,1) DEFAULT 19; Testen DB-13 042-SQL-DDL 28 Mario Neugebauer
DDL-DOMAIN DB-13 042-SQL-DDL 29 Mario Neugebauer DBs Firebird Interbase PostgreSQL MySQL -:- Oracle -:- SQL-Srv -:- CREATE DOMAIN domänenename [AS] datentyp [DEFAULT wert] [NOT NULL] [CHECK (bedingung)] [COLLATE sortierungsreihenfolge; CREATE DOMAIN domänenename [AS] datentyp [DEFAULT wert] [NOT NULL] [CHECK (bedingung)];
DDL-DOMAIN: Löschen DB-13 042-SQL-DDL 30 Mario Neugebauer Löschung der Domänendefinition DROP DOMAIN domainenname; Achtung: Tabellen die die Domain verwenden, müssen erst geändert oder gelöscht werden (sonst Fehlermeldung).
DDL-TABLE: Ändern Änderung der Definitionen einer Tabelle ALTER TABLE tabname ADD I ALTER I DROP spaname I CONSTRAINT constraintname {Änderung I Anlage}, [... ] ; Arten von Änderungen: ADD Ergänzen von Spalten ALTER bzw. MODIFY Ändern von bestehenden Spalten DROP Löschen von Spalten DB-13 042-SQL-DDL 31 Mario Neugebauer
DDL-TABLE: Ändern A CREATE TABLE mein_kunde( KundenNr INTEGER NOT NULL, Name VARCHAR(50) NOT NULL, Anschrift VARCHAR(50) NOT NULL, Ort VARCHAR(50) NOT NULL, email VARCHAR(50)); Vergrößerung des Speicherplatzes für Name auf 100: ALTER TABLE mein_kunde ALTER Name TYPE VARCHAR(100); Zugriff auf Spaltendefinition über Type Löschen der Spalte email ALTER TABLE mein_kunde DROP email; Testen DB-13 042-SQL-DDL 32 Mario Neugebauer
DDL-TABLE: Ändern A CREATE TABLE mein_kunde( KundenNr INTEGER NOT NULL, Name VARCHAR(100) NOT NULL, Anschrift VARCHAR(50) NOT NULL, Ort VARCHAR(50) NOT NULL); Einfügen einer Spalte Zahlungsart ('R', 'K', 'B') mit Standardwert R ALTER TABLE mein_kunde ADD Zahlungsart CHAR(1) DEFAULT 'R' CHECK (Zahlungsart IN ('R', 'K', 'B')); Anlegen eines Primärschlüssels ps_mein_kunde für diese Tabelle: ALTER TABLE mein_kunde ADD CONSTRAINT ps_mein_kunde PRIMARY KEY (kundennr); Testen DB-13 042-SQL-DDL 33 Mario Neugebauer
DDL-TABLE: Ändern A CREATE TABLE mein_kunde( KundenNr INTEGER NOT NULL, Name VARCHAR(100) NOT NULL, Vorname VARCHAR(50) NOT NULL, Anschrift VARCHAR(50) NOT NULL, Plz CHAR(5) NOT NULL, Ort VARCHAR(50) NOT NULL, CONSTRAINT ps PRIMARY KEY (KundenNr)) ; Aufgabe: Löschen der Primärschlüsseleigenschaft von KundenNr Einfügen des Feldes Anrede mit den zulässigen Angaben: Herr / Frau Einfügen der Zahlungsart auf die zulässigen Werte : R / E / K ALTER TABLE mein_kunde DROP CONSTRAINT ps_mein_kunde, ADD Anrede CHAR(4) CHECK (Anrede IN ('Herr', 'Frau )), ADD Zahlungsart CHAR(1) CHECK (Zahlungsart IN ('R', 'E', 'K')); DB-13 042-SQL-DDL 34 Mario Neugebauer Testen
DDL-TABLE: Ändern A CREATE TABLE mein_kunde( KundenNr INTEGER NOT NULL, Name VARCHAR(50) NOT NULL, Vorname VARCHAR(50) NOT NULL, Anschrift VARCHAR(50) NOT NULL, Plz CHAR(5) NOT NULL, Ort VARCHAR(50) NOT NULL, CONSTRAINT ps PRIMARY KEY (KundenNr)) ; Aufgabe: Änderung der KundenNr auf mögliche Werte zwischen 0 und 1000 ALTER TABLE mein_kunde ADD CONSTRAINT knr CHECK (KundenNr > -1 AND KundenNr < 1001); Testen DB-13 042-SQL-DDL 35 Mario Neugebauer
DDL-TABLE: Löschen DB-13 042-SQL-DDL 36 Mario Neugebauer Löschen einer Tabelle DROP TABLE tabname;