SQL (Structured Query Language) ist die Standardsprache für die Arbeit mit relationalen Datenbanken. Sie wurde in den 1970er Jahren entwickelt und seitdem kontinuierlich erweitert. SQL ist in verschiedene Sprachbereiche unterteilt:
In diesem Kapitel konzentrieren wir uns auf die DDL-Befehle zum Anlegen von Datenbanken und Tabellen.
Eine neue Datenbank wird mit dem Befehl CREATE DATABASE
erstellt:
CREATE DATABASE firmenverwaltung;Um die neue Datenbank anschließend zu verwenden, muss sie mit dem
Befehl USE ausgewählt werden:
USE firmenverwaltung;Beim Erstellen der Datenbank gibt es einige wichtige Optionen:
-- Mit Angabe von Zeichensatz und Sortierung
CREATE DATABASE firmenverwaltung
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- Nur erstellen, wenn die Datenbank noch nicht existiert
CREATE DATABASE IF NOT EXISTS firmenverwaltung;Eine Datenbank kann mit dem Befehl DROP DATABASE
gelöscht werden:
DROP DATABASE firmenverwaltung;
-- Sicherere Variante, die prüft, ob die Datenbank existiert
DROP DATABASE IF EXISTS firmenverwaltung;ACHTUNG: Dieser Befehl löscht die Datenbank und alle darin enthaltenen Daten unwiderruflich!
Der Zeichensatz bestimmt, welche Zeichen in der Datenbank gespeichert werden können. Er kann bei der Erstellung der Datenbank festgelegt werden:
-- Bei der Erstellung
CREATE DATABASE firmenverwaltung
CHARACTER SET utf8mb4;
-- Nachträglich ändern
ALTER DATABASE firmenverwaltung
CHARACTER SET utf8mb4;Empfohlene Zeichensätze sind:
utf8mb4 - Unicode-Zeichensatz, der alle gängigen
Zeichen abdeckt (empfohlen)latin1 - Westeuropäische Zeichen (veraltet)Die Sortierung (Collation) bestimmt, wie Zeichenketten verglichen und sortiert werden. Auch sie kann bei der Erstellung der Datenbank festgelegt werden:
-- Bei der Erstellung
CREATE DATABASE firmenverwaltung
COLLATE utf8mb4_unicode_ci;
-- Nachträglich ändern
ALTER DATABASE firmenverwaltung
COLLATE utf8mb4_unicode_ci;Häufig verwendete Sortierungen sind:
utf8mb4_unicode_ci - Unterscheidet nicht zwischen Groß-
und Kleinschreibungutf8mb4_bin - Binärer Vergleich, unterscheidet zwischen
Groß- und KleinschreibungMySQL bietet verschiedene Datentypen für unterschiedliche Arten von Daten:
Zahlen:
INT - Ganze Zahlen im Bereich von -2^31 bis 2^31-1TINYINT - Kleine ganze Zahlen im Bereich von -128 bis
127DECIMAL(m,n) - Festkommazahlen mit insgesamt m Stellen,
davon n NachkommastellenFLOAT, DOUBLE - FließkommazahlenText:
CHAR(n) - Zeichenkette mit fester Länge nVARCHAR(n) - Zeichenkette mit variabler Länge bis
maximal n ZeichenTEXT - Langer Text mit variabler LängeDatum und Zeit:
DATE - Datum im Format YYYY-MM-DDTIME - Zeit im Format HH:MM:SSDATETIME - Kombination aus Datum und ZeitTIMESTAMP - Zeitstempel, wird automatisch beim Einfügen
oder Ändern gesetztSonstige:
ENUM - Aufzählung aus einer vorgegebenen Liste von
WertenBOOLEAN - Wahrheitswert (TRUE/FALSE oder 1/0)BLOB - Binary Large Object, für die Speicherung von
Binärdaten wie Bildern oder DokumentenEine neue Tabelle wird mit dem Befehl CREATE TABLE
erstellt:
CREATE TABLE mitarbeiter (
id INT AUTO_INCREMENT PRIMARY KEY,
vorname VARCHAR(50) NOT NULL,
nachname VARCHAR(50) NOT NULL,
geburtsdatum DATE,
abteilung VARCHAR(100),
gehalt DECIMAL(10,2)
);Wichtige Optionen bei der Definition der Spalten sind:
NOT NULL - Der Wert darf nicht leer seinDEFAULT - Ein Standardwert, der verwendet wird, wenn
kein Wert angegeben wirdAUTO_INCREMENT - Ein automatisch hochzählender Wert
(meist für Primärschlüssel verwendet)PRIMARY KEY - Kennzeichnet die Spalte(n) als
PrimärschlüsselFOREIGN KEY - Kennzeichnet die Spalte als
Fremdschlüssel, der auf den Primärschlüssel einer anderen Tabelle
verweistEine Aufzählung (ENUM) bietet sich an,
wenn:
CREATE TABLE mitarbeiter (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
status ENUM('aktiv', 'beurlaubt', 'ausgeschieden')
);Eine eigene Tabelle ist dagegen sinnvoll, wenn:
CREATE TABLE status (
id INT AUTO_INCREMENT PRIMARY KEY,
bezeichnung VARCHAR(50),
beschreibung TEXT
);
CREATE TABLE mitarbeiter (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
status_id INT,
FOREIGN KEY (status_id) REFERENCES status(id)
);Die Option NOT NULL sollte verwendet werden, wenn:
CREATE TABLE bestellung (
id INT AUTO_INCREMENT PRIMARY KEY,
kunde_id INT NOT NULL,
bestelldatum DATE NOT NULL,
lieferdatum DATE, -- kann NULL sein
FOREIGN KEY (kunde_id) REFERENCES kunden(id)
);Fremdschlüssel werden mit der Option FOREIGN KEY
definiert:
CREATE TABLE bestellungen (
id INT AUTO_INCREMENT PRIMARY KEY,
kunde_id INT NOT NULL,
datum DATE NOT NULL,
FOREIGN KEY (kunde_id) REFERENCES kunden(id)
ON DELETE RESTRICT
ON UPDATE CASCADE
);Optionen für Fremdschlüssel:
ON DELETE - Legt das Verhalten fest, wenn der
referenzierte Datensatz gelöscht wirdON UPDATE - Legt das Verhalten fest, wenn der
referenzierte Schlüssel geändert wirdMögliche Aktionen sind:
RESTRICT - Verbietet das Löschen oder Ändern, wenn
abhängige Datensätze existierenCASCADE - Führt die Aktion (Löschen oder Ändern) auch
für die abhängigen Datensätze durchSET NULL - Setzt den Fremdschlüssel auf NULL, wenn der
referenzierte Datensatz gelöscht oder geändert wirdMit der Klausel CREATE TABLE ... LIKE können Sie eine
neue Tabelle mit der gleichen Struktur wie eine bestehende Tabelle
erstellen:
-- Leere Kopie der Tabelle "mitarbeiter" erstellen
CREATE TABLE mitarbeiter_archiv LIKE mitarbeiter;
-- Kopie mit Daten erstellen
CREATE TABLE mitarbeiter_backup
AS SELECT * FROM mitarbeiter;Für temporäre Tabellen, die nur während der aktuellen Session
existieren, können Sie den Befehl CREATE TEMPORARY TABLE
verwenden:
CREATE TEMPORARY TABLE temp_results (
id INT,
name VARCHAR(100),
wert DECIMAL(10,2)
);Temporäre Tabellen werden automatisch am Ende der Session gelöscht. Sie sind nützlich, um Zwischenergebnisse zu speichern oder komplexe Abfragen zu vereinfachen.