# 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.
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.
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 mitCREATE 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 beiCREATE 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 diesNULL
. Wurde jedoch die OptionNOT NULL
gesetzt, darf in der Spalte keinNULL
vorkommen. In einem solchen Fall wird der mitDEFAULT
angegebene Wert eingesetzt.NULL/NOT NULL
MitNULL
oderNOT NULL
können Sie festlegen, ob in der Spalte ein Wert enthalten sein muss. Ist die OptionNOT NULL
gesetzt, muss in der Spalte ein Wert eingefügt werden. Dieser kann dann auch durchDEFAULT
festgelegt werden.PRIMARY KEY
Definiert eine Spalte als Primärschlüssel. Diese Spalte muss einen Wert enthalten (darf also nichtNULL
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 mitINT
-Typen keine vorzeichenbehafteten Werte erlaubt, also keine negativen Zahlen.ZEROFILL
Füllt den Wert vom TypINT
mit führenden Nullen auf. Aus dem Wert 23 wird dann z. B. 000023, wenn die maximale Länge mitINT(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 mitDROP DATABASE
gelöscht werden. - Tabellen werden mit den Befehlen
CREATE TABLE
undDROP 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
- Welche Zeichen dürfen Sie bei der Vergabe von Datenbank-, Tabellen- und Spaltennamen verwenden? Welche Regeln müssen Sie dabei einhalten?
- Erstellen Sie eine SQL-Anweisung, die eine Datenbank mit dem Namen
buecher
erstellt. - Erstellen Sie eine SQL-Anweisung, die eine Tabelle mit dem Namen
verlage
und folgenden Spalten anlegt:id
,name
,webseite
,strasse
,ort
undplz
. Wählen Sie sinnvolle Datentypen für die einzelnen Spalten, und weisen Sie der Spalteid
die OptionenAUTO_INCREMENT
undPRIMARY KEY
zu. - Erstellen Sie eine SQL-Anweisung, die eine Tabelle namens
buecher
mit den folgenden Spalten anlegt:id
,autor
,titel
,seitenzahl
,erscheinungsjahr
,preis
,auflage
,verlag
,isbn
undkommentar
. Die Spalteid
soll der Primärschlüssel sein und automatisch hochgezählt werden. In die Spaltenautor
undtitel
soll jeweils eine Zeichenkette von maximal 128 Zeichen eingefügt werden dürfen, und sie sollen nichtNULL
sein. Standardmäßig soll dannunbekannt
eingefügt werden. Die Spalteerscheinungsjahr
soll eine vierstellige Jahresangabe sein. Die Spaltepreis
soll eine Dezimalzahl mit fünf Vor- und zwei Nachkommastellen enthalten, darf ebenfalls nichtNULL
sein und soll als Standardwert dann0.00
erhalten. Die Spalteauflage
soll vom TypINT
sein. In der Spalteverlag
soll eine Ganzzahl gespeichert werden können. Die Spalteisbn
wiederum soll eine maximal 15 Zeichen lange Zeichenkette und die Spaltekommentar
soll einen längeren Kommentartext mit bis zu 65.535 Zeichen enthalten können.