# Die Sprache SQL

Ich habe die Länge und Breite dieses Landes bereist und mit den besten Leuten geredet, und ich kann Ihnen versichern, dass Datenverarbeitung ein Tick ist, der dieses Jahr nicht überleben wird.
– The editor in charge of business books for Prentice Hall, 1957

In diesem Kapitel werde ich Ihnen den grundlegenden Aufbau der Abfragesprache SQL erklären. Damit Sie die einzelnen Konstrukte auch testen können, werde ich Ihnen außerdem den Umgang mit der Konsole von MySQL erklären.

# Einstieg

Die Konsole von MySQL ist ein sehr mächtiges Werkzeug. Sie kann sowohl zur Administration als auch zum Testen von Abfragen verwendet werden. Wechseln Sie in das Installationsverzeichnis von MySQL, und öffnen Sie das Verzeichnis bin. Öffnen Sie das Programm mysql.exe. Sie sollten nun eine Konsole sehen, die derjenigen in Abbildung 2.1 ähnelt.

Konsole von MySQL Abbildung 2.1: Konsole von MySQL

Geben Sie nun help ein, und bestätigen Sie mit Enter. Die Konsole gibt nun eine Übersicht über die einzelnen Befehle mit Erklärungen aus. Die wichtigsten dieser Befehle finden Sie in Tabelle 2.1.

Befehl Erklärung
help Gibt eine Übersicht aller Befehle aus.
use Wählt die Datenbank aus, die als Parameter an den Befehl übergeben wurde.
exit Schließt die Konsole.
status Gibt den Status der MySQL-Datenbank aus.
source Führt ein SQL-Script aus, das als Parameter an den Befehl übergeben wurde.
clear Löscht den Befehlspuffer.

Tabelle 2.1: Die wichtigsten MySQL-Konsolen-Befehle

Mit dem Kommando use können Sie eine Datenbank auswählen. Schon von Beginn an verfügt MySQL über zwei Datenbanken: mysql und test. Geben Sie nun use mysql; (inklusive des Semikolons) ein. Die Konsole wird bei korrekter Eingabe mit

Database changed

antworten.

Tippen Sie nun SELECT * FROM db; in die MySQL-Konsole ein. Die nun in der Konsole folgende Ausgabe ist der Beweis für Ihre erste erfolgreiche Datenbankabfrage, auch wenn die Ausgabe in der Konsole zu wünschen übrig lässt. Um ein leserliches Ergebnis zu erhalten, können Sie auch einmal SELECT user FROM db; ausprobieren. Die Ausgabe ist:

+------+  
| host |  
+------+  
| %    |  
+------+  
1 row in set (0.00 sec)

Anhand dieser Ausgabe können Sie erkennen, dass die Tabelle einen Datensatz enthält (1 row in set) und dass es 0.00 Sekunden gedauert hat, bis die Abfrage vollständig durchgeführt wurde.

# Namenskonventionen

Bei der Benennung von Datenbanken, Tabellen oder Spalten müssen Sie eine gewisse Namenskonvention einhalten, die Ihnen vorschreibt, welche Zeichen in welcher Zusammensetzung für den Namen verwendet werden dürfen bzw. sollten. Dies bezieht sich auch auf die Schreibweise von SQL-Anweisungen.

Zum Bezeichnen von Datenbanken, Tabellen und Spalten dürfen Sie alle alphanumerischen Zeichen, also Buchstaben und Zahlen von 0 bis 9, verwenden. Zusätzlich sind der Unterstrich »_« und das Dollarzeichen »$« erlaubt. Dabei darf der Name mit einem beliebigen Zeichen anfangen, jedoch darf ein Name nicht nur aus Zahlen bestehen. Außerdem ist die Länge eines Namens auf 64 Zeichen beschränkt.

Einige Beispiele für erlaubte Namen:

datenbank  
tabelle123  
db_12_tabelle$  
$tab123

Beispiele für ungültige Namen:

09876  
<tabelle>  
tabelle buecher  
tabelle=buecher

Die Groß- und Kleinschreibung bei Namen hängt stark vom eingesetzten Betriebssystem ab. So wird in UNIX-/Linux-Umgebungen z. B. bei Datenbanknamen zwischen Groß- und Kleinschreibung unterschieden, während dies unter Windows keinen Unterschied macht. Dies gilt ebenso für Tabellen. Bei Spalten hingegen wird sowohl unter UNIX/Linux als auch unter Windows die Groß- und Kleinschreibung ignoriert.

Bei Schlüsselwörtern wird nie zwischen Groß- und Kleinschreibung unterschieden, egal ob unter UNIX/Linux oder Windows.

Dies führt auch dazu, dass sich für die Groß- und Kleinschreibung gewisse Regeln eingebürgert haben. So werden SQL-Schlüsselwörter immer großgeschrieben und Namen von Datenbanken, Tabellen oder Spalten immer klein. Dies trägt stark zur Übersicht in komplexen SQL-Anweisungen bei.

# Datenbank erstellen, löschen oder auswählen

Bevor ich eingehender auf Auswahlabfragen eingehe, will ich mich zunächst dem Erstellen und Löschen von Datenbanken widmen. MySQL stellt Ihnen als Benutzer schließlich die Möglichkeit zur Verfügung, nicht nur eine Datenbank zu verwenden, sondern mehrere. So können Sie logische Gruppierungen verschiedener Tabellen in verschiedene Datenbanken vornehmen. Das Erstellen einer Datenbank erfolgt mit dem Befehl CREATE DATABASE.

CREATE DATABASE datenbankname

Dem Befehl müssen Sie zusätzlich noch einen Namen für die anzulegende Datenbank übergeben. Ein Beispiel:

CREATE DATABASE buecher;

Dieses Beispiel würde die Datenbank buecher anlegen.

Natürlich können Sie erstellte Datenbanken auch wieder löschen. Der entsprechende Befehl dafür lautet DROP DATABASE.

DROP DATABASE datenbankname

Ein Beispiel:

DROP DATABASE buecher;

Dieser Befehl würde die Datenbank buecher löschen.

An dieser Stelle ein wichtiger Hinweis: Wenn Sie mit DROP DATABASE eine Datenbank gelöscht haben, ist diese unwiederbringlich entfernt, inklusive aller Tabellen und Datensätze, die sie enthielt. Es ist nicht möglich, diese Datenbank wiederherzustellen.

Mit dem USE-Befehl können Sie eine Datenbank auswählen.

USE datenbankname

Ein Beispiel:

USE buecher;

Dieses Beispiel würde die Datenbank buecher als aktuelle Datenbank auszeichnen, und alle nachfolgenden SQL-Befehle würden sich nun auf diese Datenbank beziehen. Abgesehen natürlich vom Befehl USE.

# Tabellen erstellen und löschen

Ohne Tabellen können Sie in einer Datenbank natürlich keine Datensätze speichern. Um eine neue Tabelle zu erstellen, steht der Befehl CREATE TABLE zur Verfügung.

CREATE TABLE tabellenname (spaltenname datentyp [optionen], [, ...] [, PRIMARY KEY spaltenname])

Sowohl die Angabe eines Namens für die Tabelle als auch die Definition mindestens einer Spalte inklusive Datentyp ist zwingend. Ein Beispiel:

CREATE TABLE buecher (id INTEGER AUTO_INCREMENT,  
                      autor VARCHAR(60),  
                      titel VARCHAR(60),  
                      seitenzahl INTEGER,  
                      isbn VARCHAR(15),  
                      verlag INTEGER,  
                      PRIMARY KEY (id));

Dieses Beispiel legt nun eine Tabelle mit 6 Spalten an. Als Erstes wird eine Spalte namens id mit dem Datentyp INTEGER angelegt. Als Option für diese Spalte wurde AUTO_INCREMENT festgelegt, was bedeutet, dass der Wert dieser Spalte automatisch um 1 hochgezählt wird. Der Datentyp INTEGER bedeutet, dass in dieser Spalte ausschließlich Zahlen gespeichert werden können. Dann folgt die Spalte autor, die als Datentyp VARCHAR zugewiesen bekommt. Der Typ VARCHAR steht für eine beliebige Zeichenkette. In Klammern dahinter wird die Länge dieser Spalte festgelegt. In unserem Beispiel 60, was bedeutet, dass ein in der Spalte gespeicherter Wert maximal 60 Zeichen lang sein darf. Dann folgt die Spalte titel, die ebenfalls vom Typ VARCHAR ist und eine Maximallänge von 60 Zeichen erhält. Die Spalte seitenzahl ist vom Typ INTEGER, während die Spalte isbn wieder vom Datentyp VARCHAR ist. Diesmal wurde aber lediglich eine Länge von 15 Zeichen festgelegt. Als letzte Spalte folgt verlag, Sie bekommt den Datentyp INTEGER zugewiesen. In dieser Spalte wird später nur die Kennnummer eines Verlages gespeichert und kein Text. Zum Schluss wird mit PRIMARY KEY (id) festgelegt, dass die Spalte id der Primärschlüssel der Tabelle werden soll.

Wurde der Befehl erfolgreich durchgeführt, bestätigt die MySQL-Konsole dies mit Query OK. Falls Sie nun noch einmal die Tabelle auf ihre Struktur überprüfen möchten, können Sie den Befehl EXPLAIN verwenden.

EXPLAIN tabellenname

Beispiel:

EXPLAIN buecher;

Die MySQL-Konsole gibt nun eine Beschreibung der Tabelle aus. Die Ausgabe der Konsole sollte der in Abbildung 2.2 gezeigten entsprechen.

Konsolen-Ausgabe nach Ausführung des Befehls EXPLAIN buecher; Abbildung 2.2: Konsolen-Ausgabe nach Ausführung des Befehls EXPLAIN buecher;

Natürlich ist es auch möglich, eine Tabelle zu löschen. Der zu verwendende Befehl lautet DROP TABLE.

DROP TABLE tabellenname

Ein Beispiel:

DROP TABLE buecher;

Dieser Befehl würde die Tabelle buecher inklusive aller Datensätze unwiederbringlich löschen.

# Tabellen verändern

Eine bereits existierende Tabelle können Sie auch nachträglich verändern bzw. anpassen. Sie können Spalten löschen, hinzufügen, den Datentyp einer Spalte umwandeln oder auch den Primärschlüssel ändern. Der Befehl dafür lautet ALTER TABLE.

ALTER TABLE tabellenname vorgang [, vorgang, ...]

Mit dem Befehl ALTER TABLE weisen Sie MySQL zuerst an, dass Sie eine Änderung an der Struktur einer Tabelle vornehmen möchten. Die zu verändernde Tabelle muss dabei angegeben werden. Welche Änderung Sie dann genau durchführen möchten, geben Sie als Vorgang an. Folgende Vorgänge sind möglich:

  • ADD
    Fügt der Tabelle eine Spalte hinzu. Die Definition der Spalte erfolgt dabei äquivalent zur Definition in Zusammenhang mit CREATE TABLE, z. B. ALTER TABLE buecher ADD jahr INTEGER;.
  • DROP
    Löscht eine Spalte einer Tabelle. Es genügt dabei die Angabe des Spaltennamens, z. B. ALTER TABLE buecher DROP jahr;. Achten Sie darauf, dass bereits vorhandene Datensätze von einer solchen Änderung beeinflusst werden, da die Daten der Spalte ebenfalls gelöscht werden.
  • ADD PRIMARY KEY
    Fügt der Tabelle einen Primärschlüssel hinzu, z. B. ALTER TABLE buecher ADD PRIMARY KEY (verlag);.
  • DROP PRIMARY KEY
    Löscht den Primärschlüssel einer Tabelle, z. B. ALTER TABLE buecher DROP PRIMARY KEY;.
  • CHANGE
    Ändert die Definition einer Spalte inklusive des Namens. Es wird der alte und der neue Spaltenname sowie die Definition der Spalte erwartet. Die Definition erfolgt äquivalent zur Definition bei CREATE TABLE. Beispiel: ALTER TABLE buecher CHANGE seitenzahl seiten integer;.
  • MODIFY
    Modifiziert die Definition einer Spalte, ohne den Namen zu ändern, z. B. ALTER TABLE buecher MODIFY autor VARCHAR(128);.

# MySQL-Datentypen

Zwei Datentypen haben Sie bereits kennen gelernt: INTEGER und VARCHAR. MySQL kennt jedoch noch einige Datentypen mehr. Dabei wird zwischen drei Gruppen unterschieden: numerische Typen, Zeichen- oder Zeichenketten-Typen und vermischte Typen.

In den folgenden Tabellen finden Sie den Namen des Datentyps, den Wertebereich bzw. die maximale Größe und den in der Datenbank belegten Speicherplatz.

# Numerische Typen

Datentyp Wertebereich Speicherplatz
TINYINT –128 bis 127 8 Bit
SMALLINT –32.768 bis 32.767 16 Bit
MEDIUMINT –8.388.608 bis 8.388.607 24 Bit
INTEGER –2.147.483.648 bis 2.147.483.647 32 Bit
BIGINT –9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 64 Bit
FLOAT Abhängig von den Werten bzw. Nachkommastellen 32 Bit
DOUBLE Abhängig von den Werten bzw. Nachkommastellen 64 Bit
DECIMAL Abhängig von den Werten bzw. Nachkommastellen x+16 Bit

Tabelle 2.2: Übersicht aller numerischen Datentypen

# Zeichen- und Zeichenketten-Typen

Datentyp Maximale Größe Speicherplatz
CHAR(x) 255 Byte x Byte
VARCHAR(x) 255 Byte x+1 Byte
TINYTEXT 255 Byte x+1 Byte
TINYBLOB 255 Byte x+1 Byte
TEXT / BLOB 65.535 Byte x+2 Byte
MEDIUMTEXT 16.777.215 Byte = ca. 16 Mbyte x+3 Byte
MEDIUMBLOB 16.777.215 Byte = ca. 16 Mbyte x+3 Byte
LONGTEXT 4.294.967.295 Byte = ca. 4 Gbyte x+4 Byte
LONGBLOB 4.294.967.295 Byte = ca. 4 Gbyte x+4 Byte

Tabelle 2.3: Übersicht aller Zeichen- und Zeichenketten-Datentypen

# Vermischte Typen

Datentyp Erklärung
ENUM('A','B',...) Eine Liste mit maximal 65.535 Posten. Gespeichert wird immer nur einer der in der Liste angegebenen Posten.
SET('A','B',…) Eine Listen mit maximal 64 Posten. Speichert alle Posten der Liste.
DATE Datum im Format YYYY-MM-DD
TIME Uhrzeit im Format HH:MM:SS
DATETIME Datum und Zeit im Format
YYYY-MM-DD/HH:MM:SS

Tabelle 2.4: Übersicht aller vermischten Datentypen

# Was ist ein BLOB?

Ein BLOB ist ein »Binary Large Object«, zu Deutsch ein »großes binäres Objekt«. Der Unterschied zwischen einem TEXT-Typ und einem BLOB-Typ entspricht in etwa demjenigen bei Dateien. Während TEXT-Typen in der Datenbank als Zeichen gespeichert werden, werden BLOB-Typen in der Datenbank binär abgelegt. Dies hängt hauptsächlich mit den Steuerbytes für einen Zeilenumbruch zusammen. Bei TEXT-Typen sind dies in der Regel CR und LF (Carriage Return/Line Feed) und bei BLOB-Typen nur LF. Würde in binären Daten eine Bitfolge vorkommen, die dem CR entspricht, könnte dies zu fehlerhaften Daten führen. TEXT-Typen werden also normalerweise zum Speichern von Texten und BLOB-Typen zum Speichern von Bildern oder Geräuschen verwendet.

# Optionen

Zusätzlich zu der Option AUTO_INCREMENT gibt es auch noch weitere Optionen, die Sie zu einer Spalte angeben können. Einige dieser Optionen haben auch Einfluss auf den Wertebereich eines Datentyps. So führt die Option UNSIGNED z. B. dazu, dass numerische Datentypen dann kein Vorzeichen besitzen können. Der Wertebereich einer TINYINT würde sich also von –128 bis 127 auf 0 bis 255 ändern.

  • AUTO_INCREMENT
    Zählt den Wert automatisch um 1 hoch; darf nur im Zusammenhang mit Ganzzahlen (...INT) verwendet werden und nur einmal pro Tabelle festgelegt werden.
  • BINARY
    Die Daten werden binär gespeichert.
  • DEFAULT
    Ermöglicht das Festlegen eines Standardwertes, falls kein Wert angegeben wurde. Normalerweise ist dies NULL. Wurde jedoch die Option NOT NULL gesetzt, darf in der Spalte kein NULL vorkommen. In einem solchen Fall wird der mit DEFAULT angegebene Wert eingesetzt.
  • NULL/NOT NULL
    Mit NULL oder NOT NULL können Sie festlegen, ob in der Spalte ein Wert enthalten sein muss. Ist die Option NOT NULL gesetzt, muss in der Spalte ein Wert eingefügt werden. Dieser kann dann auch durch DEFAULT festgelegt werden.
  • PRIMARY KEY
    Definiert eine Spalte als Primärschlüssel. Diese Spalte muss einen Wert enthalten (darf also nicht NULL sein).
  • UNIQUE
    Diese Option bewirkt, dass in einer Spalte keine doppelten Werte vorkommen dürfen, jeder Wert also einmalig sein muss.
  • UNSIGNED
    In der Spalte sind im Zusammenhang mit INT-Typen keine vorzeichenbehafteten Werte erlaubt, also keine negativen Zahlen.
  • ZEROFILL
    Füllt den Wert vom Typ INT mit führenden Nullen auf. Aus dem Wert 23 wird dann z. B. 000023, wenn die maximale Länge mit INT(6) auf sechs festgelegt wurde.

# Zusammenfassung

  • Bei Datenbanken und Tabellen wird abhängig vom Betriebssystem zwischen Groß- und Kleinschreibung unterschieden, nicht jedoch bei Schlüsselwörtern oder Spaltennamen. Aus diesem Grund werden Schlüsselwörter großgeschrieben und Datenbank-, Tabellen- und Spaltennamen kleingeschrieben.
  • Datenbanken können mit dem Befehl CREATE DATABASE erzeugt und mit DROP DATABASE gelöscht werden.
  • Tabellen werden mit den Befehlen CREATE TABLE und DROP TABLE angelegt oder gelöscht.
  • Der Befehl ALTER TABLE ermöglicht das Ändern der Struktur einer Tabelle.
  • Bei den Datentypen wird zwischen numerischen Typen, Zeichen- oder Zeichenketten- und vermischten Typen unterschieden.
  • Unterschiedliche Optionen nehmen Einfluss auf die Werte, die in einer Spalte eingefügt werden dürfen.

# Fragen und Übungen

  1. Welche Zeichen dürfen Sie bei der Vergabe von Datenbank-, Tabellen- und Spaltennamen verwenden? Welche Regeln müssen Sie dabei einhalten?
  2. Erstellen Sie eine SQL-Anweisung, die eine Datenbank mit dem Namen buecher erstellt.
  3. Erstellen Sie eine SQL-Anweisung, die eine Tabelle mit dem Namen verlage und folgenden Spalten anlegt: id, name, webseite, strasse, ort und plz. Wählen Sie sinnvolle Datentypen für die einzelnen Spalten, und weisen Sie der Spalte id die Optionen AUTO_INCREMENT und PRIMARY KEY zu.
  4. Erstellen Sie eine SQL-Anweisung, die eine Tabelle namens buecher mit den folgenden Spalten anlegt: id, autor, titel, seitenzahl, erscheinungsjahr, preis, auflage, verlag, isbn und kommentar. Die Spalte id soll der Primärschlüssel sein und automatisch hochgezählt werden. In die Spalten autor und titel soll jeweils eine Zeichenkette von maximal 128 Zeichen eingefügt werden dürfen, und sie sollen nicht NULL sein. Standardmäßig soll dann unbekannt eingefügt werden. Die Spalte erscheinungsjahr soll eine vierstellige Jahresangabe sein. Die Spalte preis soll eine Dezimalzahl mit fünf Vor- und zwei Nachkommastellen enthalten, darf ebenfalls nicht NULL sein und soll als Standardwert dann 0.00 erhalten. Die Spalte auflage soll vom Typ INT sein. In der Spalte verlag soll eine Ganzzahl gespeichert werden können. Die Spalte isbn wiederum soll eine maximal 15 Zeichen lange Zeichenkette und die Spalte kommentar soll einen längeren Kommentartext mit bis zu 65.535 Zeichen enthalten können.