Was ist eine Datenbank?
Eine Datenbank ist ein System zur strukturierten, dauerhaften Speicherung von Daten, auf die mehrere Programme oder Benutzer gleichzeitig zugreifen können.
Stell dir vor, du hast 10.000 Kundendaten in einer Excel-Tabelle. Das funktioniert für kleine Mengen. Aber was passiert, wenn zwei Mitarbeiter gleichzeitig einen Eintrag ändern? Was wenn du gezielt alle Kunden aus NRW brauchst, die in den letzten 30 Tagen bestellt haben? Excel gerät schnell an seine Grenzen.
Genau dafür gibt es Datenbanken und das Programm das sie verwaltet: das Datenbankmanagementsystem (DBMS).
DBMS = Datenbankmanagementsystem (engl. Database Management System). Das ist die Software, die zwischen dir und den eigentlichen Daten sitzt. Beispiele: MySQL, PostgreSQL, SQLite, Microsoft SQL Server.
Persistent vs. flüchtig
Zwei Begriffe, die du sicher kennen musst:
Dauerhaft gespeichert
Daten bleiben erhalten, auch wenn der Strom weg ist oder das Programm beendet wird. Datenbanken speichern auf der Festplatte (HDD/SSD) und sind deshalb persistent.
Nur im Arbeitsspeicher
Der RAM (Random Access Memory = Arbeitsspeicher) verliert alle Daten sobald die Stromversorgung unterbrochen wird. Programme nutzen ihn für temporäre Berechnungen.
RAM = Strom weg, Daten weg. Festplatte = Strom weg, Daten bleiben. Datenbanken = persistent, also auf der Festplatte.
Was ist relational?
Das Wort "relational" beschreibt eine bestimmte Art, Daten zu organisieren. Statt alles in einer riesigen Tabelle zu speichern, verteilst du Daten auf mehrere Tabellen und verknüpfst sie miteinander.
Beispiel: Du hast eine Firma mit Mitarbeitern und Abteilungen. Statt bei jedem Mitarbeiter den vollen Abteilungsnamen zu wiederholen, gibst du jeder Abteilung eine Nummer und speicherst nur die Nummer beim Mitarbeiter.
Die Relation ist die Verknüpfung zwischen den Tabellen über den Fremdschlüssel (FK = Foreign Key). So vermeidest du doppelte Daten und hältst alles konsistent. Das nennt sich Normalisierung (dazu mehr in Modul 4).
PK (Primary Key = Primärschlüssel): Eindeutige ID jedes Datensatzes. Keine zwei Zeilen dürfen denselben PK haben.
FK (Foreign Key = Fremdschlüssel): Verweist auf den PK einer anderen Tabelle. So entsteht die Verbindung zwischen Tabellen.
Das ACID-Prinzip
Ein gutes DBMS garantiert vier Eigenschaften, zusammengefasst als ACID. Das ist der Grund warum Datenbanken zuverlässiger sind als einfache Dateien.
Atomarität
Eine Transaktion ist entweder vollständig oder gar nicht. Wenn du Geld überweist und die Verbindung bricht ab, wird die Überweisung komplett rückgängig gemacht. Kein halbes Geld weg.
Konsistenz
Die Datenbank bleibt immer in einem gültigen Zustand. Regeln (z.B. ein Preis darf nicht negativ sein) werden nicht verletzt.
Isolation
Gleichzeitige Transaktionen stören sich nicht gegenseitig. Wenn zwei Mitarbeiter gleichzeitig denselben Datensatz bearbeiten, wartet einer bis der andere fertig ist.
Dauerhaftigkeit
Abgeschlossene Transaktionen bleiben gespeichert, auch bei Systemabsturz. Das ist persistence auf Transaktionsebene.
Stell dir eine Banküberweisung vor: Entweder läuft sie komplett durch (Atomarität), das Konto bleibt nicht im Minus wenn es nicht sein soll (Konsistenz), andere Überweisungen warten ihren Zug ab (Isolation), und die Buchung bleibt nach dem Absturz der Bank-App erhalten (Dauerhaftigkeit).
Arten von Datenbanken
Nicht jedes Problem braucht eine relationale Datenbank. Es gibt verschiedene Datenbanktypen, die für unterschiedliche Anwendungsfälle optimiert sind.
Relationale Datenbank (RDBMS)
Daten werden in Tabellen mit festen Spalten gespeichert. Tabellen sind über Schlüssel verknüpft. Abfragen laufen über SQL.
- Klare Struktur, einfach zu verstehen
- ACID-Garantien, sehr zuverlässig
- SQL ist weit verbreitet und standardisiert
- Gut für komplexe Abfragen über mehrere Tabellen
- Transaktionen (z.B. Banküberweisung)
- Festes Schema: Struktur muss vorher definiert werden
- Schlecht skalierbar bei Milliarden Datensätzen
- Unflexibel wenn sich Datenstruktur häufig ändert
Typische Beispiele: MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle DB
Einsatz: Shopsysteme, ERP-Software, Buchhaltung, fast alles in klassischen Unternehmen
Dokumentenbasierte Datenbank (NoSQL)
Kein festes Schema. Daten werden als JSON-ähnliche Dokumente gespeichert. Jedes Dokument kann eine andere Struktur haben.
JSON (JavaScript Object Notation) ist ein Textformat zur Datendarstellung. Sieht aus wie: {"name": "Ben", "alter": 20, "skills": ["SQL", "Netzwerk"]}
- Sehr flexibel, kein festes Schema nötig
- Gut skalierbar für riesige Datenmengen
- Schnell bei einfachen Lesezugriffen
- Keine ACID-Garantien (je nach System)
- Komplexe Abfragen über Beziehungen schwieriger
- Kein einheitlicher Standard wie SQL
Typische Beispiele: MongoDB, CouchDB, Firebase
Einsatz: Social Media, Content-Management, Apps mit stark variierenden Datenstrukturen
Key-Value Store
Die einfachste Form: Ein Schlüssel zeigt auf einen Wert. Ähnlich wie ein Wörterbuch oder ein Schrank mit nummerierten Fächern.
- Extrem schnell (oft im RAM)
- Einfach aufgebaut
- Ideal für temporäre Daten (Sessions, Cache)
- Keine Abfragen über Inhalte möglich
- Keine Beziehungen zwischen Daten
- Ungeeignet für komplexe Datenstrukturen
Typische Beispiele: Redis, Memcached
Einsatz: Login-Sessions, Caching von häufig abgerufenen Daten
Wann nimmt man was?
| Situation | Empfehlung | Warum |
|---|---|---|
| Klassisches Unternehmen, ERP, Shop | Relational (MySQL/PostgreSQL) | Strukturiert, ACID, SQL bekannt |
| App mit variablen Datenformaten | Dokumentenbasiert (MongoDB) | Kein festes Schema nötig |
| Login-Sessions, schneller Cache | Key-Value (Redis) | Schnell, einfach, temporär |
| Kleines Projekt, lokale App | SQLite | Keine Installation, eine Datei |
In der Prüfung dreht sich fast alles um relationale Datenbanken und SQL. NoSQL und Key-Value werden höchstens im Überblick abgefragt. Der Fokus dieser Lernplattform liegt deshalb auf relationalem SQL.
Aufbau & Grundbegriffe
Bevor du SQL schreibst, musst du verstehen wie eine relationale Datenbank von innen aufgebaut ist und was die wichtigsten Begriffe bedeuten.
Die Hierarchie
Der DBMS-Server
Das laufende Programm (z.B. MySQL-Server). Auf einem Server können viele Datenbanken laufen.
Die Datenbank
Ein benannter Container mit zusammengehörigen Tabellen. Z.B. eine Datenbank "firma_gmbh".
Das Schema
Die Struktur der Datenbank: welche Tabellen gibt es, welche Spalten, welche Datentypen. In vielen Systemen = Datenbank.
Die Tabelle
Enthält Daten in Zeilen (Datensätze) und Spalten (Felder). Wie ein Excel-Tabellenblatt, aber strenger strukturiert.
Zeilen, Spalten, Felder
In der Datenbanktheorie gibt es spezifische Begriffe für die Bestandteile einer Tabelle:
| Begriff (DE) | Begriff (EN) | Bedeutung |
|---|---|---|
| Zeile / Datensatz | Row / Record / Tuple | Ein einzelner Eintrag in der Tabelle |
| Spalte / Feld | Column / Field / Attribute | Eine Eigenschaft aller Datensätze (z.B. "Name") |
| Zelle | Cell | Der Schnittpunkt aus Zeile und Spalte |
| Tabelle | Table / Relation / Entity | Die gesamte Tabelle mit allen Zeilen und Spalten |
NULL
NULL ist kein Wert. NULL bedeutet: kein Wert vorhanden. Das ist ein wichtiger Unterschied:
Kein Wert
Das Feld wurde nie ausgefüllt. Unbekannt. NULL = 0 ist falsch. NULL ist nicht mal gleich NULL.
Bekannter Wert: leer
Das Feld wurde ausgefüllt, aber mit einem leeren Text. "" ist ein echter Wert, NULL nicht.
WHERE name = NULL funktioniert nicht. Stattdessen: WHERE name IS NULL
Das ist einer der häufigsten Anfänger-Fehler in SQL.
Kommentare in SQL
In der Praxis kommentierst du komplexe Abfragen damit andere (oder du selbst in 3 Monaten) verstehen, was der Code macht. In der IHK-Prüfung können Kommentare deinen Lösungsweg erklären.
Quiz 1: Datenbanken
7 Fragen. Lies jede genau. Auswerten erst nach Auswahl der Antwort.
Was ist SQL?
SQL (Structured Query Language = Strukturierte Abfragesprache) ist die Sprache, mit der du mit relationalen Datenbanken kommunizierst. Du gibst Befehle, die Datenbank führt sie aus.
SQL wurde in den 1970er-Jahren bei IBM entwickelt und ist bis heute der Standard für relationale Datenbanken. Egal ob du mit MySQL, PostgreSQL oder SQLite arbeitest – die Grundbefehle sind immer dieselben. Nur in Details unterscheiden sich die Systeme (dazu mehr auf der nächsten Seite).
SQL spricht man entweder als einzelne Buchstaben "Es-Que-El" oder als Wort "Sequel" aus. Beides ist korrekt und verbreitet.
Was kann SQL?
SQL ist in drei Hauptbereiche unterteilt:
Struktur definieren
Tabellen erstellen, ändern, löschen. Du baust das Gerüst der Datenbank. CREATE, ALTER, DROP
Daten bearbeiten
Daten einfügen, lesen, ändern, löschen. Das ist der Alltag. SELECT, INSERT, UPDATE, DELETE
Rechte steuern
Wer darf was in der Datenbank tun. GRANT, REVOKE
Stell dir eine Bibliothek vor:
DDL = die Regale bauen und beschriften
DML = Bücher rein-, rausstellen und suchen
DCL = festlegen, wer Zugang bekommt
Wie sieht SQL aus?
SQL-Befehle lesen sich fast wie englische Sätze. Das macht die Sprache vergleichsweise einfach zu lernen:
Was ist eine Query?
Eine Query (Abfrage) ist ein einzelner SQL-Befehl, den du an die Datenbank schickst. Die Datenbank verarbeitet die Query und liefert ein Ergebnis zurück. Jede Query endet mit einem Semikolon ;.
SQL-Schlüsselwörter (SELECT, FROM, WHERE) sind nicht case-sensitive – du kannst also auch select klein schreiben. Konvention ist aber Großschreibung für Keywords, damit der Code lesbarer wird. Tabellen- und Spaltennamen hingegen können je nach System case-sensitive sein.
SQL-Systeme im Vergleich
SQL ist standardisiert (ISO/ANSI-Standard), aber jedes Datenbanksystem hat eigene Erweiterungen und kleine Unterschiede in der Syntax. Das nennt sich SQL-Dialekt.
So wie Deutsch in Bayern anders klingt als in Hamburg – aber trotzdem Deutsch ist – hat jedes Datenbanksystem seinen eigenen SQL-Dialekt. Die Grundbefehle (SELECT, INSERT, CREATE...) funktionieren überall gleich. Bei Details wie automatisch hochzählenden IDs oder Datumsformaten gibt es aber Unterschiede.
Die wichtigsten Systeme
| System | Einsatzgebiet | Besonderheit | Lizenz |
|---|---|---|---|
| MySQL | Webserver, CMS (z.B. WordPress) | Sehr weit verbreitet, einfacher Einstieg | Open Source / kommerziell |
| PostgreSQL | Komplexe Anwendungen, Data Engineering | Sehr standards-konform, mächtige Features | Open Source |
| SQLite | Mobile Apps, kleine Projekte, Prototypen | Keine Installation nötig, eine einzelne Datei | Public Domain (kostenlos) |
| MS SQL Server | Microsoft-Umgebungen, Unternehmen | T-SQL Dialekt, gut in Windows-Infrastruktur | Kommerziell |
| Oracle DB | Großunternehmen, Banken | PL/SQL Dialekt, sehr leistungsstark | Kommerziell |
Wichtige Dialekt-Unterschiede
Diese Unterschiede begegnen dir in der Praxis regelmäßig. Immer wenn hier eine Einschränkung auf ein bestimmtes System gilt, ist das gekennzeichnet.
Auto-Inkrement (automatisch hochzählende ID)
Fast jede Tabelle hat eine ID-Spalte die sich automatisch erhöht. Die Syntax dafür ist je nach System unterschiedlich:
AUTO_INCREMENT ist MySQL-spezifisch. AUTOINCREMENT (ohne Bindestrich) ist SQLite. SERIAL ist PostgreSQL. Das Konzept ist dasselbe, die Syntax unterscheidet sich.
Texte begrenzen
Auf dieser Plattform
Die Terminal-Übungen hier laufen auf SQLite (direkt im Browser, keine Installation). SQLite ist ein vollwertiges SQL-System, aber schlanker als MySQL oder PostgreSQL. Wo die Syntax abweicht, ist das immer gekennzeichnet.
SQLite wurde als WebAssembly (WASM = Web Assembly, eine Technologie die native Programme im Browser ausführt) portiert. Das bedeutet: eine echte SQLite-Datenbank-Engine läuft direkt in deinem Browser, ohne Server. Deine Daten verlassen dein Gerät nicht.
Was ist ein Schema?
Ein Schema beschreibt die Struktur einer Datenbank: welche Tabellen gibt es, welche Spalten haben sie, welche Datentypen, welche Beziehungen. Das Schema ist sozusagen der Bauplan.
Quiz 2: SQL Grundlagen
6 Fragen. Lies jede genau.
Datentypen & Constraints
Jede Spalte in einer Tabelle hat einen Datentyp. Der Datentyp legt fest, welche Art von Wert dort gespeichert werden darf. Constraints (Einschränkungen) legen zusätzliche Regeln fest.
Warum ist das wichtig? Wenn du einer Spalte den falschen Typ gibst, passieren Fehler die schwer zu finden sind. Zum Beispiel: Eine Postleitzahl als Zahl gespeichert verliert führende Nullen (01234 wird zu 1234). Oder ein Preis als Text kann nicht korrekt summiert werden.
Numerische Datentypen
| Typ | Beschreibung | Wertebereich (ca.) | Einsatz |
|---|---|---|---|
TINYINT | Sehr kleine Ganzzahl | -128 bis 127 | Status-Flags, Boolean-Ersatz |
INT | Ganzzahl (Integer) | ca. -2,1 Mrd. bis +2,1 Mrd. | IDs, Mengen, Zähler |
BIGINT | Große Ganzzahl | ca. ±9,2 Quintillionen | Sehr große IDs, Timestamps |
FLOAT | Gleitkommazahl (ungenau) | ca. ±3,4 × 10³⁸ | Wissenschaftliche Werte |
DOUBLE | Doppelt genaue Gleitkommazahl | ca. ±1,8 × 10³⁰⁸ | Koordinaten, Messungen |
DECIMAL(p,s) | Exakte Dezimalzahl | p Stellen, s davon Nachkomma | Geldbeträge, Steuern |
Für Geldbeträge niemals FLOAT oder DOUBLE verwenden. Diese Typen haben Rundungsfehler. 0.1 + 0.2 ergibt in Gleitkomma nicht exakt 0.3. Für Preise immer DECIMAL(10,2) verwenden – das bedeutet 10 Stellen gesamt, 2 davon Nachkommastellen.
Text-Datentypen
| Typ | Beschreibung | Max. Länge | Einsatz |
|---|---|---|---|
CHAR(n) | Feste Zeichenlänge, immer n Zeichen | 255 Zeichen | Ländercodes (DE, US), feste Kürzel |
VARCHAR(n) | Variable Zeichenlänge, max. n Zeichen | 65.535 Zeichen | Namen, E-Mails, Beschreibungen |
TEXT | Langer Fließtext | 65.535 Zeichen | Kommentare, Artikeltexte |
MEDIUMTEXT | Sehr langer Text | ca. 16 MB | HTML-Inhalte, große Texte |
LONGTEXT | Extrem langer Text | ca. 4 GB | Logs, sehr große Dokumente |
CHAR(10) reserviert immer 10 Zeichen, auch wenn der Wert kürzer ist (wird mit Leerzeichen aufgefüllt). VARCHAR(10) reserviert nur so viel Platz wie nötig, maximal 10. Für feste Längen wie ISO-Ländercodes ist CHAR effizienter. Für variable Texte ist VARCHAR die bessere Wahl.
Datum & Zeit
| Typ | Format | Einsatz |
|---|---|---|
DATE | YYYY-MM-DD | Geburtstage, Vertragsdaten |
TIME | HH:MM:SS | Uhrzeiten, Arbeitszeiten |
DATETIME | YYYY-MM-DD HH:MM:SS | Erstellungszeitpunkte, Logs |
TIMESTAMP | Sekunden seit 01.01.1970 | Automatische Zeitstempel |
YEAR | YYYY | Jahrgang, Modelljahr |
SQLite hat keine eigenen Datums-Typen. Datumsangaben werden als TEXT (im Format YYYY-MM-DD), INTEGER (Unix-Timestamp) oder REAL gespeichert. SQLite bietet aber Datumsfunktionen wie date(), datetime() um damit zu rechnen.
Binäre Datentypen (BLOB)
BLOB steht für Binary Large Object (Binäres großes Objekt). Hier werden rohe Binärdaten gespeichert, also Dinge die kein Text sind: Bilder, Dateien, Audio.
| Typ | Max. Größe | Einsatz |
|---|---|---|
TINYBLOB | 255 Byte | Sehr kleine Binärdaten |
BLOB | 65 KB | Kleine Bilder, Icons |
MEDIUMBLOB | 16 MB | Bilder, PDFs |
LONGBLOB | 4 GB | Videos, große Dateien |
In der Praxis speichert man große Dateien oft nicht direkt in der Datenbank, sondern auf einem Dateisystem (z.B. einem Server oder Cloud-Speicher). In der Datenbank steht dann nur der Pfad oder die URL zur Datei. Das ist effizienter, weil Datenbanken nicht für große Binärdaten optimiert sind.
Sonstige Typen
| Typ | Beschreibung | Einsatz |
|---|---|---|
BOOLEAN | Wahrheitswert: TRUE oder FALSE | Aktiv/Inaktiv, Ja/Nein-Felder |
ENUM('a','b') | Einer aus einer festen Liste | Status: 'aktiv','inaktiv','gesperrt' |
JSON | JSON-Dokument (ab MySQL 5.7) | Flexible Zusatzdaten |
MySQL speichert BOOLEAN intern als TINYINT(1). TRUE = 1, FALSE = 0. SQLite kennt keinen echten BOOLEAN-Typ, verwendet auch INTEGER (0/1). PostgreSQL hat einen echten BOOLEAN-Typ.
Constraints (Einschränkungen)
Constraints sind Regeln die du auf Spalten oder Tabellen anwendest. Sie schützen die Datenintegrität, also dass keine unsinnigen oder widersprüchlichen Daten in die Datenbank gelangen.
Primärschlüssel
Eindeutig + NOT NULL. Jede Tabelle sollte einen haben. Identifiziert jeden Datensatz eindeutig.
Pflichtfeld
Das Feld muss einen Wert haben. NULL ist nicht erlaubt. Für alle Pflichtangaben verwenden.
Eindeutig
Kein zweiter Datensatz darf denselben Wert in dieser Spalte haben. Z.B. für E-Mail-Adressen.
Standardwert
Wenn beim Einfügen kein Wert angegeben wird, nimmt das Feld automatisch diesen Wert an.
Bedingung
Der Wert muss eine Bedingung erfüllen. Z.B. Alter muss größer als 0 sein.
Fremdschlüssel
Verweist auf den PK einer anderen Tabelle. Stellt sicher, dass keine verwaisten Verweise entstehen.
Constraints in der Praxis
CHECK-Constraints wurden in MySQL erst ab Version 8.0.16 wirklich durchgesetzt. In älteren MySQL-Versionen wurden sie zwar akzeptiert, aber ignoriert. In PostgreSQL und SQLite funktionieren sie zuverlässig.
Quiz 3: Datentypen & Constraints
7 Fragen. Lies jede genau.
DDL – Data Definition Language
DDL (Data Definition Language = Datendefinitionssprache) umfasst alle Befehle, die die Struktur einer Datenbank verändern. Nicht die Daten selbst, sondern das Gerüst drumherum.
DDL = Regale bauen. Du legst fest wie die Datenbank aussieht. Erst wenn das Regal steht, kannst du Bücher (Daten) reinstellen – das ist dann DML.
CREATE TABLE
Erstellt eine neue Tabelle mit definierten Spalten und Datentypen. Das ist der erste Schritt bevor irgendwelche Daten gespeichert werden können.
Wenn Tabelle A einen Fremdschlüssel auf Tabelle B hat, muss Tabelle B zuerst erstellt werden. abteilung vor mitarbeiter, weil mitarbeiter einen FK auf abteilung hat.
ALTER TABLE
Ändert eine bestehende Tabelle nachträglich. Du kannst Spalten hinzufügen, ändern oder löschen.
DROP TABLE
Löscht eine Tabelle vollständig – inklusive aller Daten. Nicht rückgängig zu machen.
DROP TABLE löscht die Tabelle und alle Daten darin permanent. Kein Undo. Immer vorher Backup machen.
TRUNCATE TABLE
Leert eine Tabelle vollständig – löscht alle Zeilen, behält aber die Tabellenstruktur.
SQLite kennt kein TRUNCATE. Stattdessen: DELETE FROM mitarbeiter;
Übersicht DDL-Befehle
| Befehl | Wirkung | Daten weg? | Struktur weg? |
|---|---|---|---|
CREATE TABLE | Neue Tabelle anlegen | – | – |
ALTER TABLE | Tabelle ändern | Nein | Nein |
DROP TABLE | Tabelle löschen | Ja | Ja |
TRUNCATE TABLE | Alle Daten leeren | Ja | Nein |
Normalisierung (Grundprinzip)
Atomare Werte
Jede Zelle enthält nur einen einzelnen Wert. Keine Listen in einer Zelle.
Keine Teilabhängigkeit
Jede Nicht-Schlüsselspalte hängt vom gesamten Primärschlüssel ab.
Keine transitiven Abhängigkeiten
Kein Nicht-Schlüsselfeld darf von einem anderen Nicht-Schlüsselfeld abhängen.
Index
Ein Index beschleunigt Abfragen auf bestimmte Spalten. Ohne Index: Full Table Scan (vollständiger Tabellenscan). Mit Index: direkte Suche.
- SELECT-Abfragen auf indizierte Spalten viel schneller
- PK und UNIQUE sind automatisch indiziert
- Zusätzlicher Speicherplatz
- INSERT/UPDATE/DELETE langsamer
Praxis: Die TowerTech GmbH
Du wurdest als IT-Azubi bei der TowerTech GmbH eingestellt. Deine erste Aufgabe: die Datenbank aufbauen. Das Terminal unten ist eine echte SQLite-Engine direkt in deinem Browser.
Gib SQL-Befehle ein und drück Enter oder klick Ausführen. Echte SQL-Syntax, echte Fehler. Jede Aufgabe baut auf der vorherigen auf. Mit .tables siehst du alle Tabellen, mit PRAGMA table_info(name); die Spalten einer Tabelle.
abteilung mit: id (INTEGER PK AUTOINCREMENT), bezeichnung (VARCHAR(100) NOT NULL), standort (VARCHAR(100)).mitarbeiter mit: id (INTEGER PK AUTOINCREMENT), name (VARCHAR(100) NOT NULL), email (VARCHAR(150) UNIQUE), gehalt (DECIMAL(10,2) DEFAULT 0.00), abt_id (INTEGER, FK auf abteilung.id).mitarbeiter die Spalte einstellungsdatum (DATE) hinzu via ALTER TABLE.temp_daten falls vorhanden. Nutze DROP TABLE IF EXISTS.Quiz 4: DDL
7 Fragen zu DDL-Befehlen, Normalisierung und Indizes.
DML – Data Manipulation Language
DML (Data Manipulation Language = Datenmanipulationssprache) umfasst alle Befehle, die mit den eigentlichen Daten arbeiten: lesen, einfügen, ändern, löschen.
DML = Bücher ins Regal stellen, rausnehmen, suchen und ändern. Das Regal (Struktur) wurde schon von DDL gebaut.
SELECT – Daten lesen
SELECT ist der mit Abstand häufigste SQL-Befehl. Er liest Daten aus einer oder mehreren Tabellen.
WHERE – Bedingungen
WHERE filtert Datensätze. Ohne WHERE werden alle Zeilen zurückgegeben oder verändert.
INSERT – Daten einfügen
Spalten mit DEFAULT oder AUTOINCREMENT können weggelassen werden. NOT NULL Spalten ohne DEFAULT müssen angegeben werden, sonst gibt es einen Fehler.
UPDATE – Daten ändern
UPDATE ohne WHERE-Klausel ändert alle Zeilen in der Tabelle. Das ist fast immer ein Fehler. Immer zuerst mit SELECT prüfen welche Zeilen betroffen wären.
DELETE – Daten löschen
DELETE ohne WHERE löscht alle Zeilen. Die Tabellenstruktur bleibt erhalten (Unterschied zu DROP TABLE), aber alle Daten sind weg. Kein Undo.
Aggregat-Funktionen
Aggregat-Funktionen berechnen einen Wert aus mehreren Zeilen.
GROUP BY & HAVING
GROUP BY fasst Zeilen mit demselben Wert zusammen. HAVING filtert Gruppen (wie WHERE, aber nach dem Gruppieren).
WHERE filtert vor dem Gruppieren (einzelne Zeilen). HAVING filtert nach dem Gruppieren (Gruppen). WHERE kann keine Aggregat-Funktionen verwenden, HAVING schon.
JOIN – Tabellen verknüpfen
Mit JOIN kombinierst du Daten aus mehreren Tabellen anhand einer gemeinsamen Spalte.
SQLite unterstützt kein RIGHT JOIN. Als Workaround: Tabellen tauschen und LEFT JOIN verwenden. MySQL und PostgreSQL unterstützen RIGHT JOIN.
Schnittmenge
Nur Datensätze die in beiden Tabellen eine Übereinstimmung haben. Mitarbeiter ohne Abteilung werden nicht angezeigt.
Alle links, Rest wenn vorhanden
Alle Mitarbeiter, auch die ohne Abteilung. Fehlende Abteilungsdaten erscheinen als NULL.
Alle rechts, Rest wenn vorhanden
Alle Abteilungen, auch leere. Nicht in SQLite verfügbar.
JOIN – Tabellen verknüpfen
JOIN kombiniert Zeilen aus zwei oder mehr Tabellen anhand einer gemeinsamen Spalte. Ohne JOIN müsstest du für jeden Mitarbeiter manuell die Abteilung nachschlagen.
Warum JOIN?
In einer normalisierten Datenbank stehen zusammengehörige Daten in verschiedenen Tabellen. Die Mitarbeitertabelle speichert nur die abt_id, nicht den vollen Abteilungsnamen. Mit JOIN holst du beide Informationen in einer einzigen Abfrage.
INNER JOIN
Gibt nur Zeilen zurück die in beiden Tabellen eine Übereinstimmung haben. Mitarbeiter ohne Abteilung und Abteilungen ohne Mitarbeiter werden nicht angezeigt.
LEFT JOIN
Gibt alle Zeilen aus der linken Tabelle zurück, auch wenn es keine Übereinstimmung in der rechten Tabelle gibt. Fehlende Werte erscheinen als NULL.
RIGHT JOIN
Gibt alle Zeilen aus der rechten Tabelle zurück, auch ohne Übereinstimmung links.
SQLite unterstützt kein RIGHT JOIN. Workaround: Tabellen tauschen und LEFT JOIN verwenden.FROM abteilung a LEFT JOIN mitarbeiter m ON m.abt_id = a.id – entspricht einem RIGHT JOIN auf mitarbeiter.
Vergleich der JOIN-Typen
| JOIN-Typ | Ergebnis | NULL-Zeilen möglich? | SQLite? |
|---|---|---|---|
| INNER JOIN | Nur Übereinstimmungen aus beiden Tabellen | Nein | Ja |
| LEFT JOIN | Alle links + Übereinstimmungen rechts | Ja (rechts) | Ja |
| RIGHT JOIN | Alle rechts + Übereinstimmungen links | Ja (links) | Nein |
| FULL OUTER JOIN | Alle Zeilen beider Tabellen | Ja (beide) | Nein |
JOIN mit mehreren Tabellen
INNER JOIN und LEFT JOIN sind Pflicht. Den Unterschied erklären können: INNER JOIN = Schnittmenge, LEFT JOIN = alle aus links. Die ON-Bedingung beschreibt die Verknüpfung über Fremdschlüssel.
Praxis: Das Azubi-Chaos
Die Datenbank steht. Jetzt geht der Alltag los – und mit ihm das Chaos. Die TowerTech GmbH hat ein bewegtes erstes Jahr. Du bist mittendrin.
Die Datenbank startet mit vorbefüllten Tabellen. Du kannst jederzeit mit SELECT die aktuellen Daten anschauen. Das Terminal läuft unabhängig vom DDL-Terminal in Modul 4.
abteilung ein. Bezeichnungen: IT, Vertrieb, Buchhaltung.mitarbeiter ein.fahrzeug den spritpreis auf 1.89 WHERE spritpreis < 0.01.mitarbeiter.Deine Aufgabe: Stell die Tabelle wieder her (CREATE TABLE mitarbeiter neu anlegen). Das ist der Grund warum man Backups macht.
DROP TABLE mitarbeiter; aus (spiel die Rolle). Dann lege die Tabelle neu an mit denselben Spalten wie in Modul 4.Quiz 5: DML
8 Fragen zu SELECT, INSERT, UPDATE, DELETE, JOINs und Aggregat-Funktionen.
DCL – Data Control Language
DCL (Data Control Language = Datenkontrollsprache) steuert wer was in einer Datenbank darf. Mit zwei Befehlen: GRANT (Rechte vergeben) und REVOKE (Rechte entziehen).
SQLite hat kein Benutzer- und Rechtesystem. GRANT und REVOKE existieren in SQLite nicht. Wer die SQLite-Datei öffnen kann, hat vollen Zugriff. DCL ist relevant für Produktionssysteme wie MySQL, PostgreSQL und MS SQL Server, die echte Benutzerverwaltung haben.
Warum Rechteverwaltung?
In einem Unternehmen haben verschiedene Personen unterschiedliche Berechtigungen. Ein Azubi soll Daten lesen können, aber nichts löschen. Ein Buchhalter soll Gehälter sehen, aber keine Tabellen erstellen. Ein Admin hat alles.
Ohne Rechteverwaltung könnte jeder Datenbanknutzer alles – löschen, ändern, exportieren. Das ist ein massives Sicherheitsrisiko.
Rechte vergeben
Gibt einem Benutzer bestimmte Rechte auf eine Tabelle oder Datenbank. Nur ein Admin oder der Eigentümer kann GRANT ausführen.
Rechte entziehen
Entzieht einem Benutzer Rechte die vorher per GRANT vergeben wurden.
GRANT
REVOKE
In der Realität arbeitet man meist mit Rollen (ROLE): Du definierst eine Rolle "azubi" mit bestimmten Rechten und weist Benutzern diese Rolle zu. Das ist flexibler als Rechte direkt an einzelne Benutzer zu vergeben. In PostgreSQL und MS SQL Server sind Rollen Standard, in MySQL ab Version 8.0 verfügbar.
Übersicht: Rechte in SQL
| Recht | Erlaubt | Typisch für |
|---|---|---|
SELECT | Daten lesen | Alle Benutzer |
INSERT | Daten einfügen | Mitarbeiter mit Schreibzugriff |
UPDATE | Daten ändern | Mitarbeiter mit Schreibzugriff |
DELETE | Daten löschen | Nur Berechtigte |
CREATE | Tabellen erstellen | Datenbankadmins |
DROP | Tabellen löschen | Nur Admins |
ALL PRIVILEGES | Alles | Root/Admin |
Praxis: DCL Simulation
GRANT und REVOKE existieren in SQLite nicht. Dieses Terminal simuliert ein Rechtesystem damit du die Syntax üben kannst. Alle Befehle werden gegen eine interne Benutzertabelle geprüft.
Dieses Terminal ist eine JavaScript-Simulation. Die Befehle GRANT und REVOKE funktionieren hier genau wie in MySQL oder PostgreSQL würden. In einer echten SQLite-Datei würden diese Befehle einen Fehler erzeugen.
GRANT SELECT ON mitarbeiter TO 'lena_azubi';GRANT INSERT ON mitarbeiter TO 'lena_azubi';REVOKE ALL PRIVILEGES ON mitarbeiter FROM 'lena_azubi';GRANT ALL PRIVILEGES ON *.* TO 'max_admin';Quiz 6: DCL
6 Fragen zu Zugriffsrechten in SQL.
SQL Injection & Best Practices
SQL Injection (SQLi) ist eine der häufigsten und gefährlichsten Sicherheitslücken in Webanwendungen. Seit Jahren auf Platz 1 der OWASP Top 10 (Open Web Application Security Project = offenes Webapplikations-Sicherheitsprojekt).
Was ist SQL Injection?
SQL Injection passiert wenn Benutzereingaben ungefiltert in einen SQL-Befehl eingebaut werden. Ein Angreifer kann so eigene SQL-Befehle einschleusen und ausführen.
Mit SQL Injection kann ein Angreifer:
Datenleck
Alle Daten aus der Datenbank auslesen, inklusive Passwörter, Kreditkartendaten, persönliche Daten.
Manipulation
Einträge ändern oder löschen. Guthaben verändern, Noten fälschen, Datensätze zerstören.
Zerstörung
DROP TABLE ausführen. Komplette Datenbanklöschung. Ohne Backup ist alles weg.
Schutz: Prepared Statements
Die wichtigste Gegenmaßnahme sind Prepared Statements (vorbereitete Anweisungen). Die SQL-Struktur wird getrennt von den Daten übergeben. Benutzereingaben können so niemals SQL-Befehle einschleusen.
Prepared Statements trennen den Bauplan (SQL) von den Zutaten (Daten). Der Bauplan steht fest, die Zutaten können keine Befehle enthalten.
Best Practices
1. Niemals DELETE oder UPDATE ohne WHERE
2. Minimale Rechte (Principle of Least Privilege)
Jeder Benutzer bekommt nur die Rechte die er wirklich braucht. Ein Webshop-Benutzer braucht SELECT, INSERT, UPDATE – aber kein DROP TABLE. Ein Lesebenutzer braucht nur SELECT.
3. Backups
Regelmäßige Backups sind kein optionales Feature. Sie sind Pflicht. DROP TABLE, versehentliches DELETE, Ransomware – ohne Backup ist alles weg. Das 3-2-1-Prinzip: 3 Kopien, auf 2 verschiedenen Medien, 1 davon extern.
4. Keine Fehlermeldungen nach außen
Datenbankfehlermeldungen im Browser geben Angreifern wertvolle Informationen über die Datenbankstruktur. Fehlermeldungen intern loggen, dem Benutzer nur eine generische Meldung zeigen.
5. Eingaben validieren
Auch mit Prepared Statements: Eingaben prüfen. Eine E-Mail-Adresse sollte wie eine E-Mail-Adresse aussehen. Eine ID sollte eine Zahl sein. Je früher ungültige Eingaben abgefangen werden, desto besser.
SQL Injection solltest du erklären können: Was ist es, wie funktioniert es, wie schützt man sich. Prepared Statements als Schutzmaßnahme kennen. Das Prinzip der minimalen Rechte (Least Privilege) benennen können.
Quiz 7: Sicherheit
6 Fragen zu SQL Injection und Sicherheits-Best-Practices.
Gesamtquiz
20 Fragen aus allen Modulen. Zeigt wo du sicher bist und wo noch Nachholbedarf besteht.