4. Datenbanksprache SQL Standard-Sprache für das Arbeiten mit relationalen Datenbanken: Structured Query Language Datendefinition: Anlegen, Ändern und Löschen von Datenbankstrukturen Datenmanipulation: Einfügen, Ändern und Löschen von Datensätzen Datenabfrage: Abfragen von Datensätzen 4.1. Datendefinition Bevor man Daten in einer DB ablegen kann, muss diese zunächst angelegt, ein Schema sowie und Tabellenstrukturen definiert werden. 4.1.1. Schema und Tabellen alle Definitionen für relationale Datenbank werden im relationalen Schema gesammelt zunächst leeres Schema definieren: Datenbankschema löschen: CREATE SCHEMA <Schema-Name> DROP SCHEMA <Schema-Name> CASCADE RESTRICT 1
Sobald ein Schema definiert ist, können die normalisierten Tabellen angelegt werden: Tabelle (Relation) definieren: <Tabellen-Name> ( <Attribut-Definitionen>, [<Tabellen-Integritätsbedingungen>] ) Attribut definieren (<Attribut-Definition>): <Attribut-Name> <Datentyp> [<Attribut-Integritätsbedingungen>] 4.1.2. Datentypen und weitere Integritätsbedingungen Basis-Datentypen für Attribute (<Datentyp>): INT INTEGER: ganze Zahl zwischen -2 31 und 2 31-1 SMALLINT: ganze Zahl zwischen -2 15 und 2 15-1 DEC DECIMAL DECIMAL(p, [q]): Dezimalzahl (mit insgesamt p Stellen, davon q Dezimalstellen) NUM NUMERIC NUMERIC(p, [q]): (wie DECIMAL) FLOAT FLOAT(p): Zahl in (4 Byte-) Fließkomma-Darstellung mit Vorzeichen REAL DOUBLE PRECISION: reelle Zahl (double precision ist genauer) 2
CHAR(n): alphanumerische Zeichenkette mit fester Länge n VARCHAR(n): alphanumerische Zeichenkette mit variabler Länge (maximal n) CLOB(m [K M G]): Text mit max. m Zeichen (angebbar in Kilo-, Mega- oder Giga-Byte) BOOLEAN: Wahrheitswerte true, false, unknown DATE: Datum - als Zeichenkette in der Form JJJJ-MM-TT TIME: (Uhr-)Zeit - als Zeichenkette in der Form HH:MM:SS TIMESTAMP: Zeitstempel - als Zeichenkette in der Form JJJJ-MM-TT HH:MM:SS Integritätsbedingungen für Attribute (<Attribut-Integritätsbedingungen>): UNIQUE NOT NULL DEFAULT <Default-Wert> CHECK (<<Attribut-Name> VALUE> <Prüfbedingung 1> [AND OR AND OR <<Attribut-Name> VALUE> <Prüfbedingung n>]) PRIMARY KEY FOREIGN KEY REFERENCES <Tabellen-Name> (<Attribut-Name>) [ON DELETE CASCADE SET NULL SET DEFAULT RESTRICT NO ACTION] [ON UPDATE CASCADE SET NULL SET DEFAULT RESTRICT NO ACTION] 3
Prüfbedingungen für CHECK-Klausel: <Vergleichsoperator> <Wert-Ausdruck> mit: <Vergleichsoperator>: = < <= > >= <> <Wert-Ausdruck>: <konkreter Wert> <arithm. Ausdruck> <skalare -Anweisung> [NOT] IN (<Werte-Aufzählung> <-Anweisung>) [NOT] BETWEEN <Untergrenze> AND <Obergrenze> [NOT] LIKE <Textmuster> [ESCAPE <Sonderzeichen>] Integritätsbedingungen für Tabelle (= Attribut-übergreifend): <Attribut-Name> WITH OPTIONS <Attribut-Integritätsbedingungen> UNIQUE (<Liste Attribut-Namen>) CHECK (<Selektionsbedingung 1> [AND OR AND OR <Selektionsbedingung n>]) PRIMARY KEY (<Liste Attribut-Namen>) FOREIGN KEY (<Liste Attribut-Namen>) REFERENCES <Tabellen-Name> (<Liste Attribut-Namen>) [ON DELETE CASCADE SET NULL SET DEFAULT RESTRICT NO ACTION] [ON UPDATE CASCADE SET NULL SET DEFAULT RESTRICT NO ACTION] 4
Beispiel 4-1: Eine Kaufhaus-Kette möchte seine in den Filialen verkauften Waren in einer relationalen Datenbank verwalten, die aus den folgenden Relationen bestehen soll: Kunde mit den Attributen - KNr (Kundennummer, alphanumerisch) als Primärschlüssel, - Name (alphanumerisch), der immer mit einem Wert belegt sein soll, - Wohnort (alphanumerisch) und - Bonität, die zwischen 0 (für schlechter Kunde) und 100 (für guter Kunde) liegt und beim Einfügen eines Kunden mit dem Wert 50 belegt werden soll, Artikel mit den Attributen - ANr (Artikelnummer, alphanumerisch) als Primärschlüssel, - Bezeichner, der ebenfalls immer mit einem Wert belegt sein soll, - Preis, der immer mit einem Wert belegt und größer 0 sein soll, Filiale mit den Attributen - FNr (Filialnummer, alphanumerisch) als Primärschlüssel und - Ort, der immer mit einem Wert belegt und eindeutig sein soll (d.h. es gibt pro Ort max. eine Filiale), Kauf mit den Attributen - KNr (Kundennummer) als Teil des Primärschlüssels und Fremdschlüssel zum Attribut KNr der Relation Kunde, - ANr (Artikelnummer) als Teil des Primärschlüssels und Fremdschlüssel zum Attribut ANr der Relation Artikel, - FNr (Filialnummer) als Teil des Primärschlüssels und Fremdschlüssel zum Attribut FNr der Relation Filiale, - Menge, die immer mit einem Wert belegt und größer 0 sein soll, und - Datum. 5
Beispiel CREATE SCHEMA Verkauf; Kunde ( KNr VARCHAR (7) PRIMARY KEY, Name VARCHAR (30) NOT NULL, Wohnort VARCHAR (60), Bonität SMALLINT DEFAULT 50 CHECK (VALUE BETWEEN 0 AND 100) ); Artikel ( ANr VARCHAR (5) PRIMARY KEY, Bezeichner VARCHAR (20) NOT NULL, Preis DECIMAL (7,2) NOT NULL CHECK (VALUE > 0) ); Filiale ( FNr VARCHAR (3) PRIMARY KEY, Ort VARCHAR (60) NOT NULL UNIQUE ); Kauf muss zuletzt definiert werden, da sonst die FS nicht Kauf definiert werden ( KNr VARCHAR (7) FOREIGN KEY REFERENCES Kunde (KNr), können ANr VARCHAR (5) FOREIGN KEY REFERENCES Artikel (ANr), FNr VARCHAR (3) FOREIGN KEY REFERENCES Filiale (FNr), Menge SMALLINT NOT NULL, Datum DATE, PRIMARY KEY (KNr, ANr, FNr), Menge WITH OPTIONS CHECK (VALUE > 0) ); 6
4.1.3. Änderung einer Tabelle ALTER TABLE <Tabellen-Name> ADD [COLUMN] <Attribut-Name> <Datentyp> [<Attribut-Integritätsbedingungen>] DROP [COLUMN] <Attribut-Name> CASCADE RESTRICT Die ALTER TABLE Anweisung ist zwingend erforderlich, wenn zwei Relationen definiert werden sollen, die sich über FS-Attribute gegenseitig referenzieren. Beispiel 4-2: In einem Unternehmen sollen die Angestellten in einer eigenen Relation und die Abteilungen in einer eigenen Relation verwaltet werden. Für die Angestellten soll die eindeutige Personalnummer (PersNr, 10-stellige Zeichenkette) als Primärschlüssel, der Name (max. 30-stellige Zeichenkette, muss immer Wert aufweisen) und die Abteilungsnummer (AbtNr, Zahl) als Fremdschlüssel mit Referenz auf das gleichnamige Attribut in der Relation Abteilung geführt werden. Für die Abteilungen soll die eindeutige Abteilungsnummer (AbtNr, Zahl) als Primärschlüssel, der Name (max. 25-stellige Zeichenkette, muss immer Wert aufweisen) und die Personalnummer des Abteilungsleiters (Leiter) als Fremdschlüssel mit Referenz auf das Attribut PersNr in der Relation Angestellter geführt werden. 7
CREATE SCHEMA Ang_Abt_Datenbank; Angestellter ( PersNr CHAR (10) PRIMARY KEY, Name VARCHAR (30) NOT NULL ); Abteilung ( AbtNr SMALLINT PRIMARY KEY, Name VARCHAR (25) NOT NULL, Leiter CHAR (10) FOREIGN KEY REFERENCES Angestellter (PersNr) ); ALTER TABLE Angestellter ADD AbtNr SMALLINT FOREIGN KEY REFERENCES Abteilung (AbtNr); Tabelle löschen: DROP TABLE <Tabellen-Name> CASCADE RESTRICT Löscht nicht nur den Inhalt einer Tabelle, sondern auch deren Definition. 8
Bisher: SQL-Anweisungen für die Definition eines relationalen Datenbankschemas auf der logischen Ebene. Zusätzlich: SQL-Anweisungen auf der externen Ebene (View) und internen Ebene (Index). 4.1.4. Views und Indexe View = Sicht eines Benutzers auf die Datenbank Daten aus Basisrelationen und anderen Views extrahieren Inhalt einer View nicht permanent in Datenbank gespeichert (= virtuelle Relation) View definieren: CREATE VIEW <View-Name> [( <Liste Attribut-Namen> )] AS <-Anweisung> Extraktion der gewünschten Daten mittels 9
Views Beispiel 4-3: Die Personalabteilung benötigt eine bestimmte Sicht auf die beiden Tabellen Angestellter und Abteilung aus Beispiel 4-2. Es wird eine Aufstellung benötigt, welche Abteilung von welchem Mitarbeiter geleitet wird. Dies soll in einer View Abteilungsleiter mit den Attributen Abteilung (Name der Abteilung) und Leiter (Name des Abteilungsleiters) ausgegeben werden. a. Basistabellen Angestellter Abteilung PersNr Name AbtNr AbtNr Name Leiter 007 Bond A-1 A-1 Außendienst 007 0815 Smith A-1 P-0 Personal 4711 4711 Walker P-0 4712 Miller P-0 b. View Abteilungsleiter Abteilung Leiter Außendienst Bond Personal Walker Abb. 4-1: Relationale Datenbank mit Basistabellen und View View löschen: DROP VIEW <View-Name> CASCADE RESTRICT 10
Index = Attributwertverzeichnis (Inhalts- oder Stichwortverzeichnis) dient zum schnellen Zugriff auf einen bestimmten Datensatz liefert zu einem bestimmten Attributwert die Speicheradresse des zugehörigen Datensatzes Index kann über einzelnes Attribut oder über eine Attributkombination definiert werden (Hinweis: Index nur auf der logischen Ebene definierbar, also nicht für Views!) Index im SQL-Standard nicht vorgesehen, aber in Datenbanksystemen unentbehrlich Index definieren: CREATE [UNIQUE] INDEX <Index-Name> ON <Tabellen-Name> (<Attribut-Name 1> [ASC DESC],, <Attribut-Name n> [ASC DESC] ) Bsp.: CREATE INDEX PersNrIndex ON Angestellter (PersNr); Index löschen: DROP INDEX <Index-Name> 11