Erstellt eine Tabelle

CREATE TABLE personen (pid INT, name VARCHAR(500), geboren DATE);

Datentypen

DatentypAliasBeschreibungBeispiel
INTEGERINTGanze Zahl-217
DECIMAL(p,s)NUMERICZahl mit p Stellen, davon s nach dem DezimalpunktDECIMAL(5, 2) -149.99
DOUBLEREALFLießkommazahl (nicht exakt)-15.127E-2
CHARACTER(l)CHARZeichenkette mit fixer Länge l (Zu kurze Werte werden mit Leerzeichen aufgefüllt)CHAR(3) ‘AB ‘
CHARACTER VARYING(l)VARCHARZeichenkette mit maximaler Länge lVARCHAR(3) ‘AB’
DATEDatum (Jahr, Monat, Tag)‘2020-11-18’
TIMESTAMPZeitstempel (Datum und Uhrzeit)‘2020-11-18 14:37:52.681’

Beispiel

CREATE TABLE kunden (
	kundennummer INT PRIMARY KEY, name VARCHAR(100) NOT NULL,
	email VARCHAR(500) CHECK (email LIKE '%@%') UNIQUE,
	passwort CHAR(32), land VARCHAR(100) DEFAULT 'Deutschland',
	geworben_von INT REFERENCES kunden(kundennummer)
);

Constraints

NULL - Standard

NULL-Werte sind in der Spalte erlaubt

CREATE TABLE kunden (/* ... */, name VARCHAR(100) NULL)

NOT NULL

NULL-Werte sind in der Spalte verboten

CREATE TABLE kunden (/* ... */, name VARCHAR(100) NOT NULL)

UNIQUE

CREATE TABLE kunden (/* ... */, email VARCHAR(500) UNIQUE)
-- oder 
CREATE TABLE kunden (/* .... */ email VARCHAR(500), UNIQUE(email))

PRIMARY KEY - Primärschlüssel

Primärschlüssel sind UNIQUE und NOT NULL.

CREATE TABLE kunden (kundennummer INT PRIMARY KEY, ...)
-- oder
CREATE TABLE kunden (kundennummer INT, ..., PRIMARY KEY(kundennummer))

FOREIGN KEY - Fremdschlüssel

CREATE TABLE kunden (/* ... */, geworben_von INT 
	REFERENCES kunden(kundennummer));
-- oder
CREATE TABLE kunden (/* ... */, geworben_von INT, 
	FOREIGN KEY(geworben_von) REFERENCES kunden(kundennummer));

DEFAULT

Wird beim Einfügen in die Tabelle der Wert für eine Spalte nicht gesetzt, wird der DEFAULT-Wert dort eingetragen (standardmäßig NULL).

CREATE TABLE kunden (/* ... */, land VARCHAR(100) DEFAULT 'Deutschland');

Sequenzen / Autoincrement

Primärschlüsselwerte (z. B. IDs) automatisch erzeugen lassen.

-- MySQL
CREATE TABLE kunden(kundennr INT PRIMARY KEY AUTO_INCREMENT, ...);
-- PostgreSQL
CREATE TABLE kunden(kundennr SERIAL PRIMARY KEY , ...);

CHECK

Check und dann ein boolsches Prädikat, welches true sein muss damit kein Fehler entsteht.

CREATE TABLE kunden (/* ... */, email VARCHAR(500) CHECK (email LIKE '%@%'));
CREATE TABLE bewertungen (/* ... */, sterne INT CHECK (sterne BETWEEN 1 AND 5));
CREATE TABLE personen (/* ... */, 
	geburtsdatum DATE, 
	hochzeitsdatum DATE CHECK (hochzeitsdatum > geburtsdatum)
);

Referentielle Aktionen

ON DELETE oder ON UPDATE:

  • CASCADE: Alle Produkte auch löschen/updaten
  • SET NULL / SET DEFAULT: NULL / Default-Wert setzen
  • RESTRICT: Löschen verbieten
  • NO ACTION (Standardverhalten): erst mal abwarten

Beispiel

CREATE TABLE produkte (
	produktnummer INT PRIMARY KEY,
	bezeichnung VARCHAR(100) NOT NULL, preis DECIMAL(9,2),
	hersteller VARCHAR(50) REFERENCES hersteller(firma)
		ON DELETE SET NULL ON UPDATE CASCADE
);

Würde ein Hersteller gelöscht werden, würden alle Produkte die diesen Hersteller als Fremdschlüssel referenzieren, diesen auf NULL gesetzt bekommen.
Das ON UPDATE CASCADE sorgt dafür, dass bei einer Umbenennung im Primärschlüsselattribut des Herstellers (Firma) diese Umbenennung auch bei den Produkten dieses Herstellers erfolgt.

Ähnliche Tabellen erstellen

LIKE

Tabelle mit gleichen Kopfzeilen wird kopiert, aber keine Daten

CREATE TABLE kunden2 (LIKE kunden);
-- zusätzliche spalten:
CREATE TABLE kunden2 (LIKE kunden, INT zusatzwert);
CREATE TABLE kunden2 (LIKE kunden, LIKE mehr_kunden);

AS

Ergebnis des SELECT-Befehls wird in die neue Tabelle gespeichert

CREATE TABLE schrottkarren AS
	SELECT * FROM pkw WHERE leistung < 60