Kurz: INSERT INTO produkte (name, preis) VALUES (‘Stift’, 1.5); SELECT * FROM produkte; `output id name preis lager aktiv -- ----- ----- ----- ----- 1 Stift 1.5 0 1
Teil des Kurses SQL
Tabellen anlegen
CREATE TABLE produkte (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
preis REAL NOT NULL CHECK (preis >= 0),
lager INTEGER DEFAULT 0,
aktiv INTEGER DEFAULT 1
);
INSERT INTO produkte (name, preis) VALUES ('Stift', 1.5);
SELECT * FROM produkte;Ausgabe:
id name preis lager aktiv
-- ----- ----- ----- -----
1 Stift 1.5 0 1Datentypen
Die Namen unterscheiden sich je nach System. Gängige Typen:
| Zweck | Standard / PostgreSQL | MySQL | SQLite |
|---|---|---|---|
| Ganzzahl | INTEGER, BIGINT, SMALLINT | INT, BIGINT | INTEGER |
| Dezimal exakt | NUMERIC(10,2) | DECIMAL(10,2) | NUMERIC |
| Gleitkomma | REAL, DOUBLE PRECISION | FLOAT, DOUBLE | REAL |
| Text | VARCHAR(n), TEXT | VARCHAR(n), TEXT | TEXT |
| Wahrheitswert | BOOLEAN | BOOLEAN (= TINYINT) | INTEGER (0/1) |
| Datum/Zeit | DATE, TIMESTAMP | DATE, DATETIME | TEXT (ISO-Format) |
| Binär | BYTEA | BLOB | BLOB |
Tipp
Geldbeträge gehören in
NUMERIC/DECIMALoder in ganze Cent, nicht in Gleitkommazahlen:0.1 + 0.2ist dort nicht exakt0.3.
SQLite ist besonders: Es hat dynamische Typisierung (der Wert bestimmt den Typ). Mit typeof() siehst du ihn:
SELECT typeof(42) AS a, typeof(3.14) AS b, typeof('x') AS c, typeof(NULL) AS d, typeof(x'ff') AS e;
SELECT 0.1 + 0.2 AS summe, 0.1 + 0.2 = 0.3 AS gleich;Ausgabe:
a b c d e
------- ---- ---- ---- ----
integer real text null blob
summe gleich
----- ------
0.3 0Einschränkungen (Constraints)
| Constraint | Wirkung |
|---|---|
PRIMARY KEY | eindeutiger Schlüssel der Zeile |
NOT NULL | Wert ist Pflicht |
UNIQUE | keine Duplikate |
DEFAULT x | Standardwert, wenn nichts angegeben |
CHECK (bedingung) | beliebige Regel |
FOREIGN KEY | Verweis auf andere Tabelle (später) |
CREATE TABLE konto (
iban TEXT PRIMARY KEY,
inhaber TEXT NOT NULL,
stand REAL NOT NULL DEFAULT 0 CHECK (stand >= -500),
email TEXT UNIQUE
);
INSERT INTO konto (iban, inhaber, email) VALUES ('DE01', 'Mia', 'mia@x.de');
SELECT * FROM konto;Ausgabe:
iban inhaber stand email
---- ------- ----- --------
DE01 Mia 0.0 mia@x.deVerstößt ein Befehl gegen eine Regel, bricht die Datenbank ihn ab:
CREATE TABLE konto (iban TEXT PRIMARY KEY, stand REAL NOT NULL CHECK (stand >= 0));
INSERT INTO konto VALUES ('DE01', 10);
INSERT INTO konto VALUES ('DE01', 20);Fehlermeldung:
Runtime error near line 3: UNIQUE constraint failed: konto.iban (19)Tabellen ändern und löschen
CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT);
ALTER TABLE t ADD COLUMN notiz TEXT;
ALTER TABLE t RENAME COLUMN notiz TO bemerkung;
ALTER TABLE t RENAME TO tabelle;
INSERT INTO tabelle (name) VALUES ('x');
SELECT * FROM tabelle;
DROP TABLE tabelle;
DROP TABLE IF EXISTS gibt_es_nicht;
SELECT count(*) AS tabellen FROM sqlite_master WHERE type = 'table';Ausgabe:
id name bemerkung
-- ---- ---------
1 x
tabellen
--------
0Achtung
DROP TABLElöscht Tabelle und Daten endgültig, ohne Rückfrage.
Auto-Inkrement
INTEGER PRIMARY KEY zählt in SQLite automatisch hoch. In anderen Systemen: PostgreSQL GENERATED ALWAYS AS IDENTITY (oder SERIAL), MySQL AUTO_INCREMENT.
CREATE TABLE gaeste (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO gaeste (name) VALUES ('A'), ('B'), ('C');
SELECT * FROM gaeste;
SELECT last_insert_rowid() AS letzte_id;Ausgabe:
id name
-- ----
1 A
2 B
3 C
letzte_id
---------
3Merke
CREATE TABLElegt Struktur an,ALTER TABLEändert sie,DROP TABLElöscht sie- Wichtige Typen: Ganzzahl, Dezimal, Text, Datum, Wahrheitswert (Namen variieren)
- Constraints (
NOT NULL,UNIQUE,CHECK,DEFAULT) sichern Datenqualität - Geld nie als Gleitkommazahl speichern
- Jede Tabelle braucht einen Primärschlüssel
Übungsaufgabe
Lege eine Tabelle buecher mit Primärschlüssel, Pflichttitel, Seitenzahl (nur positiv) und Erscheinungsjahr an.
Quiz zur Selbstkontrolle
Wozu dient ein CHECK-Constraint?
- Er erzwingt eine eigene Regel für Werte (richtig)
- Er sortiert Spalten
- Er legt einen Index an
- Er löscht Duplikate
Welcher Typ eignet sich für Geldbeträge?
- NUMERIC/DECIMAL oder ganze Cent (richtig)
- REAL
- FLOAT
- TEXT
Was löscht DROP TABLE?
- Die Tabelle samt allen Daten (richtig)
- Nur die Daten
- Nur die Struktur
- Eine Zeile
Weiter im Kurs
Zurück: Einführung in SQL und Datenbanken
Weiter: Daten einfügen, ändern und löschen
Alle Kapitel: SQL im Überblick