Einführung in SQL: DDL - Struktur der Datenbank
Aus Wikibooks
Mit den Befehlen der Data Definition Language (DDL) wird die Struktur der Datenbank gesteuert.
Dabei handelt es sich um Aufgaben, die über eine Einführung in SQL hinausgehen, aber nicht am Anfang stehen. Ich beschränke mich deshalb hier auf einige grundlegende Informationen und Beispiele, für welche Objekte einer Datenbank diese Befehle verwendet werden.
Einige Erweiterungen werden unter Erweiterungen behandelt:
Bitte beachten Sie, dass ein Benutzer vor allem bei DDL-Befehlen über die entsprechenden Rechte verfügen muss, siehe DCL – Zugriffsrechte.
Inhaltsverzeichnis |
[Bearbeiten] Allgemeine Syntax
Die DDL-Befehle sind grundsätzlich so aufgebaut:
BEFEHL OBJEKTTYP <Objektname> [<weitere Angaben>]
[Bearbeiten] CREATE
CREATE erzeugt ein Datenobjekt, zum Beispiel eine Datentabelle oder gar eine Datenbank.
[Bearbeiten] ALTER
Mit ALTER kann das Objekt, z.B. die Tabelle, auch wieder geändert werden:
In neueren Versionen gibt es auch den gemeinsamen Aufruf (unterschiedlich je nach DBMS):
- CREATE OR ALTER
- CREATE OR REPLACE
- RECREATE
Das DBMS entscheidet dann selbst: Wenn das Objekt schon existiert, wird es geändert, andernfalls erzeugt.
[Bearbeiten] DROP
Mit DROP kann das Objekt, z.B. eine Tabelle wieder gelöscht werden:
[Bearbeiten] Hauptteile der Datenbank
[Bearbeiten] DATABASE – die Datenbank selbst
Der Befehl zum Erstellen einer Datenbank lautet:
CREATE DATABASE <Dateiname> [ <Optionen> ] ;
Der <Dateiname> ist meistens ein vollständiger Name einschließlich Pfad; in einer solchen Datei werden alle Teile der Datenbank zusammengefasst. Zu den <Optionen> gehören z.B. der Benutzername des Eigentümers der Datenbank mit seinem Passwort, der Zeichensatz mit Angaben zur Standardsortierung, die Aufteilung in eine oder mehrere Dateien usw.
Jedes DBMS bietet sehr verschiedene Optionen; ich kann hier keine Gemeinsamkeiten vorstellen und muss deshalb ganz auf Beispiele verzichten.
Wegen der vielen Möglichkeiten ist zu empfehlen, dass eine Datenbank nicht per SQL-Befehl, sondern innerhalb einer Benutzeroberfläche erstellt wird.
Mit ALTER DATABASE werden die Optionen geändert, mit DROP DATABASE wird die Datenbank gelöscht. Diese Befehle kennt nicht jedes DBMS.
[Bearbeiten] TABLE – eine einzelne Tabelle
[Bearbeiten] CREATE TABLE
Um eine Tabelle zu erzeugen, sind wesentlich konkretere umfangreiche Angaben nötig.
CREATE TABLE <Tabellenname>
( <Spaltenliste>
[ , <Zusatzangaben> ]
);
Zum Erzeugen einer Tabelle werden folgende Angaben benutzt:
- der Name der Tabelle, mit dem die Daten über die DML-Befehle gespeichert und abgerufen werden
- die Liste der Spalten (Felder), und zwar vor allem mit dem jeweiligen Datentyp
- Angaben wie der Primärschlüssel (PRIMARY KEY, PK) oder weitere Indizes
Jede Spalte und Zusatzangabe wird mit einem Komma abgeschlossen; dieses entfällt vor der schließenden Klammer. Die Zusatzangaben werden häufig nicht sofort festgelegt, sondern durch anschließende ALTER TABLE-Befehle; ich bespreche sie deshalb weiter unten.
In der Beispieldatenbank wird eine Tabelle so erzeugt:
CREATE TABLE Dienstwagen ( ID integer NOT NULL AUTO_INCREMENT PRIMARY KEY, Kennzeichen varchar(30) NOT NULL, Farbe varchar(30), Fahrzeugtyp_ID integer NOT NULL, Mitarbeiter_ID integer );
Die einzelnen Spalten berücksichtigen mit ihren Festlegungen unterschiedliche Anforderungen:
- ID ist eine ganze Zahl, darf nicht NULL sein, wird automatisch hochgezählt und dient dadurch gleichzeitig als Primärschlüssel.
- Das Kennzeichen ist eine Zeichenkette von variabler Länge (maximal 30 Zeichen), die unbedingt erforderlich ist.
- Die Farbe ist ebenfalls eine Zeichenkette, deren Angabe entfallen kann.
- Für den Fahrzeugtyp wird dessen ID benötigt, wie er in der Tabelle Fahrzeugtyp gespeichert ist; diese Angabe muss sein – ein "unbekannter" Fahrzeugtyp macht bei einem Dienstwagen keinen Sinn.
- Für den Mitarbeiter, dem ein Dienstwagen zugeordnet ist, wird dessen ID aus der Tabelle Mitarbeiter benötigt. Dieser Wert kann entfallen, wenn es sich nicht um einen "persönlichen" Dienstwagen handelt.
[Bearbeiten] ALTER TABLE
Die Struktur einer Tabelle wird wie folgt geändert:
ALTER TABLE <Aufgabe> <Zusatzangaben>
Mit der Aufgabe ADD CONSTRAINT wird eine interne Einschränkung – Constraint genannt – hinzugefügt:
Ein Primärschlüssel kann auch nachträglich festgelegt werden, z.B. so:
Firebird-Version
SQL-Quelltext:
ALTER TABLE Dienstwagen ADD CONSTRAINT Dienstwagen_PK PRIMARY KEY (ID);
Die Einschränkung bekommt den Namen Dienstwagen_PK und legt fest, dass es sich dabei um den PRIMARY KEY unter Verwendung der Spalte ID handelt.
In der Tabelle Mitarbeiter muss auch die Personalnummer eindeutig sein (zusätzlich zur ID, die als PK sowieso eindeutig ist):
In der Tabelle Zuordnung_SF_FZ – Verknüpfung zwischen den Schadensfällen und den Fahrzeugen – wird ein Feld für sehr lange Texte eingefügt:
Mit ALTER ... DROP Beschreibung kann dieses Feld auch wieder gelöscht werden.
[Bearbeiten] DROP TABLE
Damit wird eine Tabelle mit allen Daten gelöscht (diese gab es in einer früheren Version der Beispieldatenbank und wird jetzt nicht mehr benutzt):
Warnung: Dies löscht die Tabelle einschließlich aller Daten unwiderruflich!
[Bearbeiten] USER – Benutzer
Auf diese Weise wird ein neuer Benutzer für die Arbeit mit der aktuellen Datenbank registriert.
Dieser Befehl richtet einen neuen Benutzer mit dem Namen Hans_Dampf ein, der sich mit dem Passwort 'cH4y37X1P' anmelden muss. – Jedes DBMS kennt für die Zuordnung des Passworts, weitere Optionen und die Verwendung von Anführungszeichen eigene Regeln.
[Bearbeiten] Ergänzungen zu Tabellen
Weitere Objekte in der Datenbank erleichtern die Arbeit mit Tabellen.
[Bearbeiten] VIEW – besondere Ansichten
Eine VIEW ist eine spezielle Sicht auf eine oder mehrere Tabellen. Für den Anwender sieht es wie eine eigene Tabelle aus; es handelt sich aber "nur" um eine fest gespeicherte Abfrage, die immer wieder in der gleichen Form benutzt und ausgeführt wird. Bitte beachten Sie: Nur die Abfrage wird fest gespeichert, nicht das Ergebnis; dieses muss bei jedem neuen Aufruf nach den aktuellen Daten neu erstellt werden.
Einzelheiten werden unter Erstellen von Views behandelt.
[Bearbeiten] INDEX – Datenzugriff beschleunigen
Ein Index beschleunigt die Suche nach bestimmten Datensätzen. Um beispielsweise in der Tabelle Versicherungsnehmer nach dem Namen "Schulze" zu suchen, würde es zu lange dauern, wenn das DBMS alle Zeilen durchgehen müsste, bis es auf diesen Namen träfe. Stattdessen wird ein Index angelegt (ähnlich wie in einem Telefon- oder Wörterbuch), sodass schnell alle passenden Datensätze gefunden werden.
So wird ein Index mit der Bezeichnung Versicherungsnehmer_Name für die Kombination "Name, Vorname" angelegt:
Es ist dringend zu empfehlen, dass Indizes für alle Spalten bzw. Kombinationen von Spalten angelegt werden, die immer wieder zum Suchen benutzt werden.
Weitere Einzelheiten werden unter DDL – Einzelheiten behandelt.
[Bearbeiten] SEQUENCE – Ersatz für automatischen Zähler
Wenn das DBMS für Spalten nicht die Festlegung AUTO_INCREMENT kennt (Firebird, Oracle), steht dies als Ersatz zur Verfügung.
Firebird-Version
SQL-Quelltext:
/* zuerst die Folge definieren */ CREATE SEQUENCE Versicherungsnehmer_ID; /* dann den Startwert festlegen */ ALTER SEQUENCE Versicherungsnehmer_ID RESTART WITH 1; /* und im Trigger (s.u.) ähnlich wie eine Funktion benutzen */ NEXT VALUE FOR Versicherungsnehmer_ID
Oracle arbeitet (natürlich) mit anderer Syntax (mit mehr Möglichkeiten) und benutzt dann NEXTVAL.
[Bearbeiten] Programmieren mit SQL
Die Funktionalität einer SQL-Datenbank kann erweitert werden, und zwar auch mit Bestandteilen einer "vollwertigen" Programmiersprachen, z.B. Schleifen und IF-Abfragen.
Dies wird unter Programmierung behandelt; dabei gibt es relativ wenig Gemeinsamkeiten zwischen den DBMS.
[Bearbeiten] FUNCTION – Benutzerdefinierte Funktionen
Eigene Funktionen ergänzen die (internen) Skalarfunktionen des DBMS, die unter Funktionen und Funktionen (2) behandelt werden.
[Bearbeiten] PROCEDURE – Gespeicherte Prozeduren
Eine Prozedur – gespeicherte Prozedur, engl. StoredProcedure (SP) – ist vorgesehen für Arbeitsabläufe, die "immer wiederkehrende" Arbeiten ausführen sollen. Es gibt sie mit und ohne Argumente und Rückgabewerte.
[Bearbeiten] TRIGGER – Ereignisse beim Speichern
Ein Trigger ist ein Arbeitsablauf, der automatisch beim Speichern in einer Tabelle ausgeführt wird. Dies dient für Eingabeprüfungen oder zusätzliche Maßnahmen; beispielsweise holt sich Firebird durch einen Trigger den NEXT VALUE einer SEQUENCE (siehe oben).
TRIGGER werden unterschieden nach INSERT-, UPDATE- oder DELETE-Befehlen und können vor oder nach dem Speichern sowie in einer bestimmten Reihenfolge ausgeführt werden.
[Bearbeiten] Zusammenfassung
In diesem Kapitel lernten wir die Grundbegriffe einer Datenbankstruktur kennen:
- Die DATABASE selbst sowie TABLE sind die wichtigsten Objekte, ein USER arbeitet damit.
- Eine VIEW ist eine fest gespeicherte Abfrage, die wie eine Tabelle abgerufen wird.
- Ein INDEX beschleunigt den Datenzugriff.
Darüber hinaus wurde auf weitere Möglichkeiten wie SEQUENCE, Funktionen, Prozeduren und Trigger hingewiesen.