Checkmark on Circle.png

SQL

Aus KGS-Wiki

SQL (Structured Query Language) ist eine Datenbanksprache, mit der Datenbanken aufgebaut und bearbeitet werden können.

Eine SQL-Datenbank besteht aus zwei Komponenten:

  1. dem SQL-Server, auf dem die Daten in Relationen gespeichert sind, und
  2. dem SQL-Client, der an den Server Anfragen schickt, um die Daten abzufragen oder zu bearbeiten.

Die Anfragen, die der Client schickt, sind in der Sprache SQL geschrieben, die im Folgenden beschrieben wird. Der Klarheit halber werden in diesem Artikel die SQL-Schlüsselwörter groß geschrieben und Platzhalter für Attribut- und Relationennamen o.ä. klein. Tatsächlich ist SQL case insensitive, ignoriert also Groß- und Kleinschreibung. Um die Lesbarkeit zu erhöhen, sind in die Beispiele Zeilenumbrüche und Leerzeichen eingefügt, auch diese werden von SQL ignoriert. Die Zeichenfolge -- kennzeichnet einen Kommentar; der Rest der Zeile wird von SQL ignoriert.

Die Anfragen, die der Client schicken kann, lassen sich in drei Kategorien unterteilen:

  1. Abfragen an den Datenbestand.
  2. Bearbeitungen am Datenbestand, d.h. Operationen zum Einfügen, Ändern und Löschen von Daten.
  3. Bearbeitungen an der Datenbankstruktur, d.h. Operationen zum Erstellen, Ändern und Löschen der Tabellen.

Abfragen

Projektion

SQL-Abfragen beginnen mit dem Schlüsselwort SELECT:

Diese Anfrage liefert alle ausgewählten Spalten aus der angegebenen Relation zurück. Es können mehrere, mit Kommata getrennte Spalten, selegiert werden. Um alle Spalten einer Relation zu erhalten, schreibt man ein *. Mit dem Schlüsselwort DISTINCT kann man doppelte Einträge herausfiltern.

SELECT nachname
FROM lehrkraft;
-- ergibt die Nachnamen aller Lehrkräfte

SELECT vorname, nachname, kuerzel
FROM lehrkraft;
-- ergibt Vorname, Nachname und Kürzel alle Lehrkräfte

SELECT *
FROM lehrkraft;
-- ergibt alle Attribute aller Lehrkräfte

SELECT DISTINCT nachname
FROM lehrkraft;
-- ergibt die Nachnamen aller Lehrkräfte, aber so, dass jeder Name nur einmal auftaucht.

Selektion

Mit dem Schlüsselwort WHERE können Bedingungen gestellt werden, nach denen die Ergebnisse gefiltert werden. Mit AND und OR können mehrere Bedingungen verknüpft werden. Negiert werden Bedingungen mit NOT, Bedingungen können auch geklammert werden.

Selektionsoperatoren
Operator Beschreibung Erläuterungen
=<> Gleichheit

Ungleichheit

<><=>=<> Kleiner

Größer Kleiner oder gleich Größer oder gleich Ungleich

Zahlen werden numerisch sortiert, Daten chronologisch (d.h. '1990-10-06' < '2021-11-27') und Strings lexikalisch (d.h. 'Meier' > 'Mayer')
LIKE Ähnlichkeit Vergleicht Strings mit Mustern, die Platzhalter enthalten können.

Der Platzhalter _ steht für ein beliebiges Zeichen, % steht für beliebig viele beliebige Zeichen, [xyz] steht für eins der Zeichen x, y oder z, [^xyz] steht für ein beliebiges Zeichen, außer x, y und z.

IN Teil einer Liste? Prüft, ob der betrachtete Wert in einer gegebenen Liste von Vergleichswerten enthalten ist
BETWEEN x AND y Zwischen zwei Grenzen Prüft, ob der betrachtete Wert zwischen x und y liegt.
IS (NOT) NULL Vorhandensein von Daten Prüft, ob das betrachtete Attribut vorhanden ist oder nicht.
SELECT nachname
FROM lehrkraft
WHERE vorname = 'Sven';
-- ergibt alle Lehrkräfte namens Sven

SELECT vorname, nachname
FROM lehrkraft
WHERE titel = 'Dr.'
  AND geburtsdatum < '1980-01-01';
-- ergibt Lehrkräfte mit Doktortitel, die vor 1980 geboren sind

SELECT *
FROM lehrkraft
WHERE NOT nachname LIKE 'M_ller';
-- ergibt Lehrkräfte, die nicht Möller, Müller, Miller o.ä. heißen


SELECT *
FROM lehrkraft
WHERE NOT nachname LIKE 'M%ller';
-- ergibt Lehrkräfte, die nicht Möller, Miller, Moosmüller, Meynerts-Stiller o.ä. heißen

SELECT *
FROM lehrkraft
WHERE geburtsdatum BETWEEN '1970-01-01' AND '1979-31-12';
-- ergibt Lehrkräfte, die in den 70ern geboren sind

SELECT *
FROM lehrkraft
WHERE vorname IN ['Jan', 'Hein', 'Klaas', 'Pit'];
-- ergibt Lehrkräfte, die Jan, Hein, Klaas oder Pit heißen

Kreuzprodukt

Es können mehrere Relationen mit Kommata getrennt angegeben werden. In diesem Fall wird ein Kreuzprodukt gebildet und alle Tupel aus allen Relationen miteinander verknüpft. Darum sollte in diesem Fall unbedingt mit WHERE sichergestellt werden, dass die Tupel sinnvoll verknüpft werden und die Ergebnismenge nicht unhandlich wird.

Bei gleichnamigen Spalten muss zusätzlich die Relation angegeben werden, deren Spalte betrachtet werden soll. Die Schreibweise ist relation.spalte. In allen anderen Fällen kann die Relation ebenfalls angegeben werden, muss aber nicht.

SELECT spalten
FROM relation1, relation2
WHERE relation1.spalteX = relation2.spalteY
AND weitereBedingungen;

Join

Relationen können auch mit dem Schlüsselwort JOIN verknüpft werden, wobei eine Bedingung angegeben werden muss, unter der gejoint wird. Dieser Bedingung wird nicht WHERE, sondern ON vorangestellt.

SELECT spalten
FROM relation1
JOIN relation2
ON relation1.spalteX = relation2.spalteY
JOIN relation3
ON relation1.spalteQ = relation3.spalteR
WHERE bedingungen;

Umbenennung

Manchmal ist es hilfreich, Spalten oder ganze Relationen umzubenennen, etwa wenn man eine Relation mit sich selbst joint. Zur Umbenennung von Spalten nutzt man das Schlüsselwort AS, Relationen kann man einfach ohne Schlüsselwort umbenennen.

SELECT attribut1 AS andererName,
       attribut2 AS ganzAndererName
FROM relation r,
     andereRelation ar
WHERE bedingung;

Aggregierende Funktionen

Zu einem Datensatz lassen sich einfache Statistiken berechnen, z.B. die Anzahl aller Einträge in einer bestimmten Spalte, deren Summe, Minimum, Maximum oder Durchschnitt. Die Schlüsselwörter dafür sind COUNT, SUM, MIN, MAX und AVG. Diese werden auch als aggregierende Funktionen bezeichnet.

SELECT COUNT(nachname)
FROM lehrkraft;
-- gibt die Anzahl aller Lehrkräfte zurück

SELECT MIN(geburtsdatum)
FROM lehrkraft;
-- gibt das Geburtsdatum der jüngsten Lehrkraft zurück

SELECT AVG(alter)
FROM lehrkraft;
-- gibt das Durchschnittsalter der Lehrkräfte zurück.

Ergebnisse gruppieren

Die Ergebnisse von aggregierenden Funktionen können nach anderen Spalten gruppiert werden. Das Schlüsselwort hierfür heißt GROUP BY.

SELECT nachname, COUNT(vorname)
FROM lehrkraft
GROUP BY nachname;
-- liefert die Nachnamen aller Lehrer und dazu, wie oft welcher Nachname vertreten ist, d.h. wie viele Vornamen es dazu gibt.

Möchte man an diese aggregierende Funktion Bedingungen stellen, muss man nach dem GROUP BY das Schlüsselwort HAVING verwenden, das genau wie WHERE funktioniert.

Ergebnisse sortieren

Mit dem Schlüsselwort ORDER BY können die Ergebnisse einer Anfrage in Abhängigkeit von einem Attribut aufsteigend (ASC) oder absteigend (DESC) sortiert werden.

SELECT *
FROM lehrkräfte
ORDER BY vorname DESC;
-- liefert alle Daten von allen Lehrkräften, absteigend nach Vornamen sortiert.

Ergebnisse einschränken

Mit dem Schlüsselwort LIMIT kann die Größe des Ergebnisdatensatzes beschränkt werden, etwa wenn man nur die Top Ten der aktuellen Charts sehen möchte

SELECT *
FROM lehrkräfte
ORDER BY nachname ASC
LIMIT 5;
-- liefert die Daten der alphabetisch ersten fünf Lehrkräfte

Datenbestand bearbeiten

Daten einfügen

Mit dem Schlüsselwort INSERT INTO relation (spalten) VALUES (tupel1), (tupel2), ... kann man Daten in eine Tabelle einfügen. Dabei müssen alle Spalten angegeben werden, in die man Daten einfügen möchte (dies kann entfallen, wenn man in alle Spalten in der Reihenfolge, in der sie vorhanden sind, Daten einfügt), und dann die Tupel, die man darin einfügen möchte. Spalten, für die man keine Daten angibt, werden je nach Aufbau der Datenbank mit Nullwerten, Standardwerten oder automatisch generierten Werten befüllt.

INSERT INTO lehrkraft
       (kuerzel, vorname, nachname)
VALUES ('Ml',    'Müller','Markus'),
       ('Me',    'Meier', 'Maria'),
       ('Sz',    'Schulz','Stefanie');

Daten ändern

Mit dem Schlüsselwort UPDATE relation SET spalte1 = wert1, spalte2 = wert2 WHERE bedingung können die Daten in einer Tabelle geändert werden. Geändert werden hierbei alle Tupel, die die Bedingung erfüllen, weswegen man diese vorsichtig setzen und am besten vorher in einer Abfrage überprüfen sollte.

UPDATE lehrkraft
SET nachname = 'Fettköther'
WHERE nachname = 'Schmidt'
AND vorname = 'Simone';
-- Ändert den Nachnamen von Simone Schmidt in Fettköther
-- Herzlichen Glückwunsch zur Hochzeit, Frau Fettköther!

Daten löschen

Mit dem Schlüsselwort DELETE FROM relation WHERE bedingung werden alle Tupel aus der angegebenen Relation gelöscht, die der Bedingung entsprechen. Auch hier sollte man die Bedingung vorher per Abfrage überprüfen.

DELETE FROM lehrkraft
WHERE nachname = 'Schröder';
-- Alle Schröders werden aus der Datenbank gelöscht.
-- Gut für Frau Schröder, der wir alles Gute für die Pensionierung wünschen
-- Doof für Herrn Schröder, der ab morgen alle möglichen und unmöglichen Probleme erleben wird.

Datenbank aufbauen

Tabellen erzeugen

Eine neue Tabelle erzeugt man mit dem Schlüsselwort CREATE TABLE. Die Syntax ist folgende:

CREATE TABLE nameDerTabelle
  (attribut1 datentypVonAttribut1 bedingungenFürAttribut1,
   attribut2 datentypVonAttribut2 bedingungenFürAttribut2,
   ...
   attributX datentypVonAttributX bedingungenFürAttributX)

-- Hinweis: Bedingungen sind immer optional aber oft vernünftig.

Für jeden Spaltennamen muss ein Datentyp angegeben werden. Die wichtigsten Datentypen in SQL sind folgende:

SQL-Datentypen
Typ Beschreibung
Numerische Datentypen INT Ganzzahlen zwischen und
BIGINT Ganzzahlen zwischen und
REAL Reelle Zahlen zwischen und
Strings CHAR(länge) Strings mit der vorgegebenen Länge (max. 8000 Zeichen)
VARCHAR(länge) Strings mit variabler, aber höchstens mit der vorgegebenen Länge (max. 8000 Zeichen)
TEXT Strings mit beliebiger Länge, höchstens 2 GB Text.
Datum und Zeit DATE Daten zwischen 0001-01-01 und 9999-12-31
TIME Zeitangaben mit einer Genauigkeit von 100 Nanosekunden
DATETIME Datum und Zeitangaben kombiniert

Attribute an Bedingungen knüpfen

Attribute können, müssen aber nicht mit Bedingungen verknüpft werden. Zum Beispiel kann man für Studierende verlangen, dass ihre Matrikelnummern eindeutig sind und diese dann gleich als Schlüssel deklarieren. Leer sollte die Matrikelnummer ebenfalls nicht sein, am besten wird diese beim Anlegen eines Eintrages gleich automatisch erzeugt. Die wichtigsten Bedingungen sind folgende:

SQL-Bedingungen
Schlüsselwort Erläuterung
NOT NULL In dieser Spalte darf kein Nullwert stehen, d.h. beim Einfügen von Daten darf diese nicht ausgelassen werden.
UNIQUE Diese Spalte muss für alle Tupel in der Relation eindeutig sein
PRIMARY KEY Diese Spalte wird als Primärschlüssel genutzt, um die Tupel eindeutg zu identifizieren. Ein PRIMARY KEY ist automatisch auch UNIQUE.
FOREIGN KEY REFERENCES relation(attribut) Diese Spalte ist ein Fremdschlüssel und muss Werte aus dem angegebenen Attribut der angegebenen Relation enthalten. Dieses andere Attribut muss der PRIMARY KEY der anderen Relation sein.
CHECK (bedingungen) Die Daten in dieser Spalte müssen bestimmten Bedingungen entsprechen. Die Syntax für die Bedingungen ist dabei dieselbe wie im WHERE-Teil von Anfragen
DEFAULT standardwert Wenn beim INSERT für dieses Attribut kein Wert angegeben wird, wird der angegebene Standardwert gesetzt.
AUTO_INCREMENT Für die automatische Generierung von IDs: in dieser Spalte werden, falls beim INSERT nicht explizit Werte angegeben werden, automatisch Werte generiert, beginnend bei 1.

Hinweis: In SQLite-Datenbanken wie der W3Schools-Test-Datenbank ergibt die Kombination INTEGER PRIMARY KEY automatisch einen AUTO_INCREMENT.

CREATE TABLE angestellter
   (id int AUTO_INCREMENT PRIMARY KEY,
    vorname text NOT NULL,
    nachname text NOT NULL,
    titel text CHECK (titel = 'Dr.' OR titel = 'Prof.' OR titel = 'Prof. Dr.'),
    geburtsdatum date)
-- erzeugt eine Relation namens angestellter
-- mit folgenden Spalten:
-- - id, Ganzzahl, wird automatisch hochgezählt und als Schlüssel verwendet,
-- - vorname, String, darf nicht leer sein
-- - nachname, String, darf nicht leer sein
-- - titel, String, darf nur "Dr.", "Prof." oder "Prof. Dr." sein
-- - geburtsdatum, Datum

Tabellen verändern

Mit dem Schlüsselwort ALTER TABLE kann man Tabellen auf vielfältige Weise bearbeiten. Nach dem ALTER TABLE folgt zuerst der Name der Relation und dann eine Liste der Modifikationen.

Einige SQL-Modifikationen
Schlüsselwort Erläuterung
ADD spaltenname datentyp bedingungen Fügt eine neue Spalte mit dem angegebenen Datentyp hinzu.
DROP COLUMN spaltenname Löscht die angegebene Spalte.
RENAME COLUMN alterSpaltenname TO neuerSpaltenname Benennt die angegebene Spalte um.
ALTER COLUMN spaltenname neuerDatentyp bedingungenMODIFY COLUMN spaltenname neuerDatentyp bedingungen Ändert den Datentyp einer Spalte.
ADD FOREIGN KEY spalte REFERENCES andereRelation(spalte) Fügt eine neue Fremdschlüsselbedingung hinzu.
ADD PRIMARY KEY spalte Legt die angegebene Spalte als Primärschlüssel fest.
DROP PRIMARY KEY Löscht die Primärschlüsselbedingung.

Tabellen löschen

Mit dem Schlüsselwor DROP TABLE relation kann man eine Tabelle löschen.

Weblinks