Eine kleine Einführung in SQL
Willemers Informatik-Ecke

SQL (Structured Query Language) heißt die Sprache, die sich zum Standard im Umgang mit Datenbanken entwickelt hat. Zum Glück ist die Anzahl der Befehle übersichtlich. Die große Kunst liegt in ihrer geschickten Kombination.

Die Befehle von SQL werden in Data Definition Language (DDL) und Data Manipulation Language (DML) untergliedert. Die erste Kategorie dient dazu, die Struktur für die Daten anzulegen. Die DML verändert die Daten innerhalb dieser Strukturen. Diese Begriffe müssen Sie sich nicht merken, aber sie sind ganz praktisch, um die Flut der Befehle ein wenig zu untergliedern, und sie geben zudem imposante Überschriften her.

Tabellen anlegen und entfernen

Zunächst müssen ein paar Strukturen geschaffen werden, in denen die Daten später Platz finden. Wir legen also Datenbanken an und erzeugen Tabellen. Leider sind insbesondere die Befehle der DDL nicht immer bei allen Datenbanken gleich. Die Beispiele funktionieren mit MySQL. Leichte Abweichungen gibt es bei PostgreSQL, die dort aber erklärt werden.

Verwalten einer Datenbank

Bevor Sie Tabellen anlegen, benötigen Sie zunächst eine Datenbank. Sie ist das Sammelbecken, in dem sich die zusammengehörigen Tabellen befinden. Der Befehl CREATE dient in SQL zum Erzeugen aller möglichen Dinge. Folgt dem Befehl das Schlüsselwort DATABASE wird eben eine Datenbank angelegt. Zur besseren Unterscheidung ist es gut, wenn Sie ihr einen Namen geben:
CREATE DATABASE kunden;
Um eine bereits existierende Datenbank zu öffnen, wird der Befehl USE verwendet. Manche Datenbanksysteme legen Wert darauf, dass hinter dem USE das Schlüsselwort DATABASE angegeben wird. In jedem Fall muss natürlich der Name der Datenbank genannt werden.

Sie können eine komplette Datenbank mitsamt ihren Tabellen und allem, was dazugehört löschen, indem Sie den Befehl DROP verwenden:

DROP DATABASE kunden;

Anlegen einer Tabelle

Nachdem Sie die Datenbank erzeugt haben und sie benutzen, können Sie die Tabellen anlegen, in denen dann die Daten Platz nehmen können. Wieder verwenden Sie den Befehl CREATE. Dieses Mal verwenden Sie das Schlüsselwort TABLE für eine Tabelle. Auch sie benötigt einen Namen. Darauf folgt nun eine große Klammer, in der die Spalten deklariert werden. Auch die Spalten haben Namen, aber auch Typen, die beschreiben, welche Art von Inhalt in die Spalte passt. Das folgende Beispiel legt eine Tabelle für einen Mitarbeiter und eine Tabelle für einen Kundenstamm an, der von Mitarbeitern betreut wird. Die Befehle können sowohl direkt eingetippt oder in einem Skript abgelegt werden.
CREATE TABLE mitarbeiter (
    mitarbeiternr INTEGER NOT NULL PRIMARY KEY,
    name VARCHAR(80)
);

CREATE TABLE kundenstamm (
    kundennr INTEGER UNIQUE NOT NULL,
    vorname  CHAR(80),
    name     CHAR(80),
    email    VARCHAR(80),
    PRIMARY KEY (kundennr)
    FOREIGN KEY betreuer (betreuer) REFERENCES mitarbeiter (mitarbeiternr)
);
Groß- und Kleinschreibung ist bei SQL nicht signifikant. Aus Gründen der Übersicht sind die Namen kleingeschrieben und die SQL-Kommandos groß. Betrachten wir die hier verwendeten Schlüsselworte.

Löschen einer Tabelle

Der Befehl DROP sorgt dafür, dass gelöscht wird. Hängen Sie noch das Schlüsselwort TABLE und den Namen Ihrer Tabelle an, und sie ist auf Nimmerwiedersehen verschwunden:
DROP TABLE kundenstamm;

Andern der Tabelle

Mit dem Befehl ALTER steht zwar die Möglichkeit zur Verfügung, eine Tabelle zu ändern. Im Normalfall wird dieser Befehl aber eher selten verwendet, da Sie bei wichtigen Datenbanken die Tabellen durch Skripte erzeugen und vor dem Start die bisherigen Tabellen per DROP löschen. Der Befehl ALTER TABLE kann dazu führen, dass Sie die Daten in der Tabelle verlieren. Bei DROP wissen Sie wenigstens, was Ihnen blüht.

Index

Wenn Sie in einer Tabelle nach Einträgen suchen, wird es etwas langwierig, wenn die Datenbank Zeile für Zeile nach dem Begriff sucht. Abhilfe schafft ein Index. Er sorgt dafür, dass über eine Spalte schnell nach dem Ergebnis gesucht werden kann. Sie können mehrere solcher Suchhilfen für jede Tabelle anlegen. Das Datenbanksystem wird selbst erkennen, dass es einen Index gibt, und ihn benutzen, wenn dadurch Geschwindigkeitsvorteile zu erzielen sind.

Auch der Index wird mit dem Befehl CREATE erzeugt. Das nachfolgende Schlüsselwort heißt INDEX gefolgt von dem Namen, den Sie dem Index geben wollen. Der Index steht nicht allein, sondern gehört immer zu einer Tabelle. Also geben Sie nach dem Schlüsselwort ON noch den Tabellennamen an.

Nun fehlt noch die Spalte, über die der Index laufen soll. Es können auch mehrere Spalten für einen Index relevant sein, etwa Name und Vorname. Sie werden in einer Klammer angegeben:

CREATE INDEX kundenname ON kundenstamm (name, vorname);

Ansichten (Views)

Eine View ist eine Sichtweise einer oder mehrerer Tabellen. Sie können damit erreichen, dass bestimmte Benutzer nur die Teile einer Tabelle sehen können, die für sie relevant sind. So könnten Sie in der Mitarbeitertabelle beispielsweise das Gehalt ausblenden. Ein weiteres Einsatzgebiet ist, dass es nicht möglich ist, in einer View Änderungen durchzuführen. Damit können Sie bei größeren Datenbanken verhindern, dass versehentlich Änderungen durchgeführt werden.

Eine View wird mit dem Befehl CREATE VIEW erzeugt und kann mit Lesebefehlen wie eine Tabelle behandelt werden.

CREATE VIEW ViewName [ (FeldNamensListe) ] AS SelectBefehl ;

Wird die Feldnamensliste angegeben, werden die Spaltennamen des SELECT-Befehls auf diese Namen umgesetzt.

Benutzer und ihre Rechte

Neben dem Anlegen von Datenbankstrukturen ist die Zuordnung der Rechte ein wichtiges Element. Dazu bedarf es einer Benutzerverwaltung.

Ein Benutzer wird mit dem Befehl CREATE USER eingerichtet. Mit dem Befehl DROP USER kann er wieder entfernt werden. Als Argument wird jeweils der Benutzername benötigt. Alle Datenbanksysteme vergeben Passwörter an die Benutzer, aber die Syntax ist leider nicht einheitlich. Die Benutzer allein wären nutzlos, wenn man ihnen nicht gestaffelte Rechte zuordnen könnte. Der Befehl dazu lautet GRANT.

GRANT SELECT,UPDATE ON kunden.kundenstamm TO meier;
Dieser Befehl erlaubt es dem Benutzer meier, in der Tabelle kundenstamm der Datenbank kunden Abfragen (SELECT) zu erstellen und Werte in den bestehenden Sätzen zu korrigieren (UPDATE). Er darf keine neuen Sätze anlegen oder Sätze löschen.

Es kann das Recht auf Korrekturen auch wieder entzogen werden. Der Befehl zum Entzug von Rechten heißt REVOKE.

REVOKE UPDATE ON kunden.kundenstamm FROM meier;
Wenn alle Rechte über eine Datenbank oder eine Tabelle vergeben werden sollen, können diese mit ALL PRIVILEGES zusammengefasst werden. Die folgende Anweisung erlaubt schulze alle Arbeiten an der Datenbank mydb:
GRANT ALL PRIVILEGES ON mydb.* TO schulze;
Sie können sich die Rechte mit dem Befehl SHOW GRANTS anzeigen lassen.
mysql> SHOW GRANTS FOR meier;
+-------------------------------------------------------+
| Grants for meier@%                                    |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO 'meier'@'%'                     |
| GRANT SELECT ON `kunden`.`kundenstamm` TO 'meier'@'%' |
+-------------------------------------------------------+
2 rows in set (0.00 sec)

Daten abfragen und verändern

Die Strukturen sind angelegt. Nun geht es um das, wofür Datenbanken eigentlich geschaffen wurden: um die Daten. Die müssen in die Tabellen eingefügt, verändert und gelesen werden können.

Die Befehle zur Veränderung der Daten bezeichnet man als Data Manipulation Language (DML).

Einfügen von Daten: INSERT

Mit dem Befehl INSERT können neue Datensätze in eine Tabelle eingefügt werden. Dazu gibt der Befehl über das Schlüsselwort INTO an, in welche Tabelle und welche Spalten geschrieben werden soll. Hinter dem Schlüsselwort VALUES werden die Werte angegeben, die geschrieben werden sollen:
INSERT INTO kundenstamm (name, email, betreuer)
       VALUES ('Diana Rigg','schirm@charme.de',29);
In der ersten Klammer stehen die Feldnamen und in der zweiten Klammer hinter VALUES die Werte, die durch sie besetzt werden. Dabei ist natürlich die Reihenfolge relevant. Werden alle Felder eines Satzes belegt, kann die erste Klammer weggelassen werden. Es gilt dann die Reihenfolge, die bei CREATE TABLE festgelegt wurde.

Daten ändern: UPDATE

Um bestehende Sätze in der Tabelle zu verändern, wird der Befehl UPDATE verwendet. Zunächst wird die Tabelle angegeben. Hinter dem Schlüsselwort SET erfolgt die Zuweisung des Feldes und nach dem Schlüsselwort WHERE kann durch Formulierung einer Bedingung festgelegt werden, welche Sätze der Tabelle von der Änderung betroffen sein sollen.

Der folgende Befehl sorgt dafür, dass der Kunde mit der Kundennummer 4711 ab sofort vom Mitarbeiter mit der Personalnummer 42 betreut wird:

UPDATE kundenstamm SET betreuer=42 WHERE kundennr=4711;
Ein weiteres Beispiel: Sollte der Betreuer mit der Nummer 29 gekündigt haben, könnten dessen Kunden durch den Betreuer 7 übernommen werden. Datenbanktechnisch bedarf es dazu nur eines Befehls. Was aber 7 dazu sagen wird, ist etwas ganz anderes:
UPDATE kundenstamm SET betreuer=7 WHERE betreuer=29;
UPDATE TabellenName SET FeldName=Wert [,FeldName=Wert]* WHERE Bedingung

Daten löschen: DELETE

Nachdem der Mitarbeiter 29 gekündigt hat und seine Arbeit auf die anderen Mitarbeiter abgewälzt wurde, kann er nun auch aus der Datenbank verschwinden. Für das Entfernen von Sätzen aus einer Tabelle wird der DELETE-Befehl verwendet. Nach dem Schlüsselwort FROM wird die Tabelle genannt und eine WHERE-Klausel legt fest, welche Sätze gelöscht werden sollen:
DELETE FROM mitarbeiter WHERE mitarbeiternr=29;
Die allgemeine Form des Befehls folgt diesem Schema:

DELETE FROM TabellenName WHERE Bedingung

Abfragen: SELECT

Das Hauptziel einer Datenbank ist natürlich die Auswertung der vorher eingepflegten Daten. Eine Abfrage wird durch den Befehl SELECT realisiert. Nach dem Befehl werden die Spalten aufgezählt, die ausgewählt werden sollen. Mit einem Stern können gleich alle Spalten angesprochen werden.

Wieder führt das Schlüsselwort FROM ein, von welcher Tabelle die Informationen geholt werden sollen. Die WHERE-Klausel gibt an, welche Sätze selektiert werden sollen. Wenn Sie Namen und E-Mail-Adresse aller Kunden ermitteln wollen, die von dem Mitarbeiter mit der Personalnummer 42 betreut werden, lautet der Befehl:

SELECT name, email FROM kundenstamm WHERE betreuer=42;
Schematisch sieht eine solche Abfrage so aus:

SELECT { FeldNamensListe | * } FROM TabellenName [ WHERE Bedingung ] ;

Sie können aber nicht nur eine Tabelle abfragen. Wenn Sie beispielsweise eine Liste aller Verkäufe haben wollen, deren Wert über 1.000 Euro lag, dann wird niemand beglückt sein, wenn als Kunde und Mitarbeiter je eine Zahl erscheint. Da sollten zumindest die Namen aufgeführt werden. Dazu werden aber auch die Tabellen kundenstamm und mitarbeiter benötigt. Zunächst einmal die Abfrage als Gesamtkunstwerk:

SELECT kundenstamm.name,
       kundenstamm.email,
       mitarbeiter.name,
       betrag 
FROM 
       verkauf,kundenstamm,mitarbeiter 
WHERE 
       kdnr=kundennr 
   AND persnr=verkauf.betreuer 
   AND betrag>1000.0
Sie sehen, dass hinter dem FROM nun drei Tabellen aufgeführt sind. Hinter dem SELECT stehen die Feldnamen der Spalten, die angezeigt werden sollen. Sofern die Namen in den drei Tabellen nicht eindeutig sind, müssen Sie dem Feldnamen den Tabellennamen durch einen Punkt getrennt voranstellen. Im Fall der Spalte betrag können Sie den Tabellennamen weglassen, da betrag nur in der Tabelle verkauf vorkommt. Gleiches gilt für die Felder kdnr, persnu und kundennu.

Die WHERE-Klausel verknüpft drei Bedingungen. Die letzte besagt, dass der Betrag über 1.000 Euro liegen muss. Das ist die tatsächliche Filterbedingung. Die anderen beiden Bedingungen sorgen dafür, dass der passende Name aus kundenstamm und mitarbeiter verwendet wird, wobei die Kundennummer aus dem Verkauf mit der aus dem Kundenstamm gleich sein muss. Das Gleiche gilt für die Personalnummer aus der Mitarbeitertabelle und der Verkaufstabelle.

Bedingung

Für Bedingungen wird in SQL-Anweisungen wie schon erwähnt die Klausel WHERE benutzt. Ein paar Beispiele haben Sie ja schon gesehen.

Um die Bedingungen zu formulieren, sind die auch in anderen Sprachen gängigen Vergleichsoperatoren üblich: <, >, <>, <= und >=. Die Gleichheit wird durch ein Gleichheitszeichen symbolisiert, im Gegensatz zu C, Java und Konsorten, die dafür zwei benötigen.

Darüber hinaus gibt es die Verknüpfungen AND, OR und NOT. Eine AND-Verknüpfung ist wahr, wenn alle Teilbedingungen wahr sind. Eine OR-Verknüpfung ist wahr, wenn mindestens eine Teilbedingung wahr ist. Der NOT-Operator kehrt den Wahrheitswert um.

Eine Besonderheit von SQL ist die Möglichkeit mit IS NULL zu prüfen, ob ein Wert überhaupt besetzt ist.

Zeichenkettenvergleiche

Die Sprache SQL besitzt noch einige speziellere Operatoren für Textvergleiche. So werden Textsuchmuster mit dem Schlüsselwort LIKE verglichen. Als Wildcard dienen dabei der Unterstrich für ein Zeichen und das Prozentzeichen für eine beliebige Zeichenkette. So findet der folgende Befehl unter anderem alle Kunden mit Vornamen „Diana“ oder „Drafi“.
select * from kundenstamm where vorname like 'D_a%';
Zeichenkettenkonstanten werden in Hochkommata eingeschlossen.

Mit dem Schlüsselwort BETWEEN kann geprüft werden, ob sich ein CHAR-Feld alphabetisch zwischen zwei Werten befindet. Tatsächlich beherrscht es neben Zeichenketten auch Zahlen und sogar Datumsfelder.