SQL.learn / Modul 1 · Was ist eine Datenbank?
Modul 01 · Datenbanken

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).

Abkürzung

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:

Persistent

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.

Flüchtig

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.

Merkhilfe

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.

■ mitarbeiter
idINTPK
nameVARCHAR
abteilung_idINTFK
■ abteilung
idINTPK
bezeichnungVARCHAR
standortVARCHAR

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 / FK erklärt

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.

A · Atomicity

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.

C · Consistency

Konsistenz

Die Datenbank bleibt immer in einem gültigen Zustand. Regeln (z.B. ein Preis darf nicht negativ sein) werden nicht verletzt.

I · Isolation

Isolation

Gleichzeitige Transaktionen stören sich nicht gegenseitig. Wenn zwei Mitarbeiter gleichzeitig denselben Datensatz bearbeiten, wartet einer bis der andere fertig ist.

D · Durability

Dauerhaftigkeit

Abgeschlossene Transaktionen bleiben gespeichert, auch bei Systemabsturz. Das ist persistence auf Transaktionsebene.

Merkhilfe ACID

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).

Modul 01 · Datenbanken

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.

Stärken
  • 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)
Schwächen
  • 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.

Was ist JSON?

JSON (JavaScript Object Notation) ist ein Textformat zur Datendarstellung. Sieht aus wie: {"name": "Ben", "alter": 20, "skills": ["SQL", "Netzwerk"]}

Stärken
  • Sehr flexibel, kein festes Schema nötig
  • Gut skalierbar für riesige Datenmengen
  • Schnell bei einfachen Lesezugriffen
Schwächen
  • 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.

Beispiel -- Schlüssel: Wert "session_12345": "user_ben_loggedin" "cache_produktliste": "[...json...]" "zaehler_aufrufe": "4821"
Stärken
  • Extrem schnell (oft im RAM)
  • Einfach aufgebaut
  • Ideal für temporäre Daten (Sessions, Cache)
Schwächen
  • 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?

SituationEmpfehlungWarum
Klassisches Unternehmen, ERP, ShopRelational (MySQL/PostgreSQL)Strukturiert, ACID, SQL bekannt
App mit variablen DatenformatenDokumentenbasiert (MongoDB)Kein festes Schema nötig
Login-Sessions, schneller CacheKey-Value (Redis)Schnell, einfach, temporär
Kleines Projekt, lokale AppSQLiteKeine Installation, eine Datei
Für die IHK

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.

Modul 01 · Datenbanken

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

1. Server / Instanz

Der DBMS-Server

Das laufende Programm (z.B. MySQL-Server). Auf einem Server können viele Datenbanken laufen.

2. Datenbank

Die Datenbank

Ein benannter Container mit zusammengehörigen Tabellen. Z.B. eine Datenbank "firma_gmbh".

3. Schema

Das Schema

Die Struktur der Datenbank: welche Tabellen gibt es, welche Spalten, welche Datentypen. In vielen Systemen = Datenbank.

4. Tabelle

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 / DatensatzRow / Record / TupleEin einzelner Eintrag in der Tabelle
Spalte / FeldColumn / Field / AttributeEine Eigenschaft aller Datensätze (z.B. "Name")
ZelleCellDer Schnittpunkt aus Zeile und Spalte
TabelleTable / Relation / EntityDie gesamte Tabelle mit allen Zeilen und Spalten

NULL

NULL ist kein Wert. NULL bedeutet: kein Wert vorhanden. Das ist ein wichtiger Unterschied:

NULL

Kein Wert

Das Feld wurde nie ausgefüllt. Unbekannt. NULL = 0 ist falsch. NULL ist nicht mal gleich NULL.

Leerer String

Bekannter Wert: leer

Das Feld wurde ausgefüllt, aber mit einem leeren Text. "" ist ein echter Wert, NULL nicht.

Häufiger Fehler

WHERE name = NULL funktioniert nicht. Stattdessen: WHERE name IS NULL
Das ist einer der häufigsten Anfänger-Fehler in SQL.

Kommentare in SQL

SQL -- Das ist ein einzeiliger Kommentar /* Das ist ein mehrzeiliger Kommentar */ SELECT * FROM mitarbeiter; -- auch am Zeilenende möglich
Warum Kommentare?

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.

Modul 01 · Quiz

Quiz 1: Datenbanken

7 Fragen. Lies jede genau. Auswerten erst nach Auswahl der Antwort.

Frage 1 von 7
Was bedeutet "persistent" im Kontext von Datenspeicherung?
Frage 2 von 7
Was ist ein DBMS?
Frage 3 von 7
Wofür steht das "A" in ACID?
Frage 4 von 7
Was ist der Unterschied zwischen PK (Primärschlüssel) und FK (Fremdschlüssel)?
Frage 5 von 7
Du baust eine App mit stark variierenden Datenstrukturen (z.B. unterschiedliche Produktattribute je Kategorie). Welcher Datenbanktyp eignet sich am besten?
Frage 6 von 7
Was ist der Unterschied zwischen NULL und einem leeren String ("")?
Frage 7 von 7
Wie prüft man in SQL korrekt, ob ein Feld keinen Wert hat?
Punkte erreicht
Modul 02 · SQL Grundlagen

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).

Aussprache

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:

DDL · Data Definition Language

Struktur definieren

Tabellen erstellen, ändern, löschen. Du baust das Gerüst der Datenbank. CREATE, ALTER, DROP

DML · Data Manipulation Language

Daten bearbeiten

Daten einfügen, lesen, ändern, löschen. Das ist der Alltag. SELECT, INSERT, UPDATE, DELETE

DCL · Data Control Language

Rechte steuern

Wer darf was in der Datenbank tun. GRANT, REVOKE

Merkhilfe

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:

SQL -- "Zeig mir alle Mitarbeiter aus der Abteilung 3" SELECT name, gehalt FROM mitarbeiter WHERE abteilung_id = 3; -- "Erstelle eine neue Tabelle namens 'produkte'" CREATE TABLE produkte ( id INT PRIMARY KEY, name VARCHAR(100) );

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 ;.

Groß- und Kleinschreibung

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.

Modul 02 · SQL Grundlagen

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.

Was ist ein 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

SystemEinsatzgebietBesonderheitLizenz
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:

MySQL / MariaDB CREATE TABLE mitarbeiter ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) );
SQLite CREATE TABLE mitarbeiter ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- kein Bindestrich! name TEXT );
PostgreSQL CREATE TABLE mitarbeiter ( id SERIAL PRIMARY KEY, -- SERIAL = automatisch hochzählend name VARCHAR(100) );
Dialekt-Hinweis

AUTO_INCREMENT ist MySQL-spezifisch. AUTOINCREMENT (ohne Bindestrich) ist SQLite. SERIAL ist PostgreSQL. Das Konzept ist dasselbe, die Syntax unterscheidet sich.

Texte begrenzen

Standard SQL (alle Systeme) -- String-Werte immer in einfache Anführungszeichen WHERE name = 'Ben' -- Doppelte Anführungszeichen sind für Spaltennamen (nicht alle Systeme) SELECT "name" FROM mitarbeiter; -- PostgreSQL: ok / MySQL: eher nicht

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 im Browser – wie funktioniert das?

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.

Schema-Beispiel (vereinfacht) -- Das Schema legt fest WIE Daten gespeichert werden mitarbeiter (id INT PK, name VARCHAR(100), abt_id INT FK) abteilung (id INT PK, bezeichnung VARCHAR(50)) -- Die Daten selbst sind der Inhalt mitarbeiter: (1, 'Ben', 2), (2, 'Anna', 1) abteilung: (1, 'IT'), (2, 'Vertrieb')
Modul 02 · Quiz

Quiz 2: SQL Grundlagen

6 Fragen. Lies jede genau.

Frage 1 von 6
Wofür steht SQL?
Frage 2 von 6
Welcher SQL-Bereich ist für das Lesen und Verändern von Daten zuständig?
Frage 3 von 6
Du möchtest eine Tabelle erstellen. Welchem SQL-Bereich gehört der CREATE TABLE-Befehl an?
Frage 4 von 6
Wie lautet das korrekte Schlüsselwort für automatisch hochzählende IDs in MySQL?
Frage 5 von 6
Was beschreibt ein "Schema" in einer Datenbank?
Frage 6 von 6
Was ist ein "SQL-Dialekt"?
Punkte erreicht
Modul 03 · Datentypen

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

TypBeschreibungWertebereich (ca.)Einsatz
TINYINTSehr kleine Ganzzahl-128 bis 127Status-Flags, Boolean-Ersatz
INTGanzzahl (Integer)ca. -2,1 Mrd. bis +2,1 Mrd.IDs, Mengen, Zähler
BIGINTGroße Ganzzahlca. ±9,2 QuintillionenSehr große IDs, Timestamps
FLOATGleitkommazahl (ungenau)ca. ±3,4 × 10³⁸Wissenschaftliche Werte
DOUBLEDoppelt genaue Gleitkommazahlca. ±1,8 × 10³⁰⁸Koordinaten, Messungen
DECIMAL(p,s)Exakte Dezimalzahlp Stellen, s davon NachkommaGeldbeträge, Steuern
Wichtig: Geldbeträge

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

TypBeschreibungMax. LängeEinsatz
CHAR(n)Feste Zeichenlänge, immer n Zeichen255 ZeichenLändercodes (DE, US), feste Kürzel
VARCHAR(n)Variable Zeichenlänge, max. n Zeichen65.535 ZeichenNamen, E-Mails, Beschreibungen
TEXTLanger Fließtext65.535 ZeichenKommentare, Artikeltexte
MEDIUMTEXTSehr langer Textca. 16 MBHTML-Inhalte, große Texte
LONGTEXTExtrem langer Textca. 4 GBLogs, sehr große Dokumente
CHAR vs. VARCHAR

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

TypFormatEinsatz
DATEYYYY-MM-DDGeburtstage, Vertragsdaten
TIMEHH:MM:SSUhrzeiten, Arbeitszeiten
DATETIMEYYYY-MM-DD HH:MM:SSErstellungszeitpunkte, Logs
TIMESTAMPSekunden seit 01.01.1970Automatische Zeitstempel
YEARYYYYJahrgang, Modelljahr
Dialekt-Hinweis: SQLite

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.

TypMax. GrößeEinsatz
TINYBLOB255 ByteSehr kleine Binärdaten
BLOB65 KBKleine Bilder, Icons
MEDIUMBLOB16 MBBilder, PDFs
LONGBLOB4 GBVideos, große Dateien
BLOB in der Praxis

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

TypBeschreibungEinsatz
BOOLEANWahrheitswert: TRUE oder FALSEAktiv/Inaktiv, Ja/Nein-Felder
ENUM('a','b')Einer aus einer festen ListeStatus: 'aktiv','inaktiv','gesperrt'
JSONJSON-Dokument (ab MySQL 5.7)Flexible Zusatzdaten
Dialekt-Hinweis: BOOLEAN

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.

PRIMARY KEY

Primärschlüssel

Eindeutig + NOT NULL. Jede Tabelle sollte einen haben. Identifiziert jeden Datensatz eindeutig.

NOT NULL

Pflichtfeld

Das Feld muss einen Wert haben. NULL ist nicht erlaubt. Für alle Pflichtangaben verwenden.

UNIQUE

Eindeutig

Kein zweiter Datensatz darf denselben Wert in dieser Spalte haben. Z.B. für E-Mail-Adressen.

DEFAULT

Standardwert

Wenn beim Einfügen kein Wert angegeben wird, nimmt das Feld automatisch diesen Wert an.

CHECK

Bedingung

Der Wert muss eine Bedingung erfüllen. Z.B. Alter muss größer als 0 sein.

FOREIGN KEY

Fremdschlüssel

Verweist auf den PK einer anderen Tabelle. Stellt sicher, dass keine verwaisten Verweise entstehen.

Constraints in der Praxis

SQL (Standard) CREATE TABLE mitarbeiter ( id INT PRIMARY KEY AUTO_INCREMENT, -- MySQL name VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL UNIQUE, gehalt DECIMAL(10,2) DEFAULT 0.00, alter_j INT CHECK (alter_j > 0 AND alter_j < 120), abt_id INT, FOREIGN KEY (abt_id) REFERENCES abteilung(id) );
Dialekt-Hinweis: CHECK in MySQL

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.

Modul 03 · Quiz

Quiz 3: Datentypen & Constraints

7 Fragen. Lies jede genau.

Frage 1 von 7
Du speicherst Produktpreise in einer Datenbank. Welcher Datentyp ist korrekt?
Frage 2 von 7
Was bedeutet BLOB?
Frage 3 von 7
Welcher Constraint stellt sicher, dass kein Datensatz denselben E-Mail-Wert wie ein anderer haben kann?
Frage 4 von 7
Was ist der Unterschied zwischen CHAR(10) und VARCHAR(10)?
Frage 5 von 7
Du willst sicherstellen, dass das Feld "alter" immer zwischen 0 und 120 liegt. Welcher Constraint ist dafür geeignet?
Frage 6 von 7
Welches Datumsformat verwendet SQL für den Typ DATE?
Frage 7 von 7
Was macht der DEFAULT-Constraint?
Punkte erreicht
Modul 04 · DDL

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.

Merkhilfe

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.

SQLiteCREATE TABLE abteilung ( id INTEGER PRIMARY KEY AUTOINCREMENT, bezeichnung VARCHAR(100) NOT NULL, standort VARCHAR(100) );
Reihenfolge wichtig

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.

SQLALTER TABLE mitarbeiter ADD COLUMN einstellungsdatum DATE; ALTER TABLE mitarbeiter RENAME COLUMN email TO email_adresse; ALTER TABLE mitarbeiter RENAME TO personal;

DROP TABLE

Löscht eine Tabelle vollständig – inklusive aller Daten. Nicht rückgängig zu machen.

SQLDROP TABLE mitarbeiter; DROP TABLE IF EXISTS mitarbeiter;
Achtung

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.

MySQL / PostgreSQLTRUNCATE TABLE mitarbeiter;
Dialekt-Hinweis: SQLite

SQLite kennt kein TRUNCATE. Stattdessen: DELETE FROM mitarbeiter;

Übersicht DDL-Befehle

BefehlWirkungDaten weg?Struktur weg?
CREATE TABLENeue Tabelle anlegen
ALTER TABLETabelle ändernNeinNein
DROP TABLETabelle löschenJaJa
TRUNCATE TABLEAlle Daten leerenJaNein

Normalisierung (Grundprinzip)

1NF

Atomare Werte

Jede Zelle enthält nur einen einzelnen Wert. Keine Listen in einer Zelle.

2NF

Keine Teilabhängigkeit

Jede Nicht-Schlüsselspalte hängt vom gesamten Primärschlüssel ab.

3NF

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.

SQLCREATE INDEX idx_email ON mitarbeiter(email); DROP INDEX idx_email;
Vorteile
  • SELECT-Abfragen auf indizierte Spalten viel schneller
  • PK und UNIQUE sind automatisch indiziert
Nachteile
  • Zusätzlicher Speicherplatz
  • INSERT/UPDATE/DELETE langsamer
Modul 04 · Praxis

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.

So funktioniert das Terminal

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.

Aufgabe 1 von 4
Der Chef ruft dich rein: „Wir brauchen eine Tabelle für unsere Abteilungen. Jede Abteilung hat eine ID, einen Namen und einen Standort. Die ID soll automatisch hochzählen.“
Ziel: Erstelle Tabelle abteilung mit: id (INTEGER PK AUTOINCREMENT), bezeichnung (VARCHAR(100) NOT NULL), standort (VARCHAR(100)).
Aufgabe 2 von 4
„Gut. Jetzt brauchen wir Mitarbeiter: Name, E-Mail (eindeutig), Gehalt (Standard 0), und zu welcher Abteilung sie gehören.“
Ziel: Erstelle 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).
Aufgabe 3 von 4
„Wir haben vergessen: jeder Mitarbeiter soll auch ein Einstellungsdatum haben. Füg die Spalte nachträglich hinzu.“
Ziel: Füge der Tabelle mitarbeiter die Spalte einstellungsdatum (DATE) hinzu via ALTER TABLE.
Aufgabe 4 von 4
„Kannst du die alte Testtabelle ‘temp_daten’ löschen? Aber nur wenn sie existiert – ich bin nicht sicher ob sie schon angelegt wurde.“
Ziel: Lösche temp_daten falls vorhanden. Nutze DROP TABLE IF EXISTS.
SQLite · TowerTech GmbH
SQLite 3 · TowerTech GmbH Datenbank bereit.
Tippe SQL-Befehle und bestätige mit Enter oder klick Ausführen.
Tipp: .tables zeigt alle Tabellen · PRAGMA table_info(name); zeigt Spalten
Mehrzeilige Befehle: Shift+Enter für neue Zeile, Enter oder Ausführen zum Starten.
sql>
Modul 04 · Quiz

Quiz 4: DDL

7 Fragen zu DDL-Befehlen, Normalisierung und Indizes.

Frage 1 von 7
Was bedeutet DDL?
Frage 2 von 7
Du willst sichergehen dass kein Fehler entsteht wenn du eine Tabelle löschst die möglicherweise nicht existiert. Welcher Befehl ist korrekt?
Frage 3 von 7
Was ist der Unterschied zwischen DROP TABLE und TRUNCATE TABLE?
Frage 4 von 7
Du willst einer bestehenden Tabelle nachträglich eine neue Spalte hinzufügen. Welcher Befehl ist korrekt?
Frage 5 von 7
Was beschreibt die erste Normalform (1NF)?
Frage 6 von 7
Warum muss bei einem Fremdschlüssel die referenzierte Tabelle zuerst erstellt werden?
Frage 7 von 7
Was ist ein Nachteil von zu vielen Indizes auf einer Tabelle?
Punkte erreicht
Modul 05 · DML

DML – Data Manipulation Language

DML (Data Manipulation Language = Datenmanipulationssprache) umfasst alle Befehle, die mit den eigentlichen Daten arbeiten: lesen, einfügen, ändern, löschen.

Merkhilfe

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.

SQLSELECT * FROM mitarbeiter; -- Nur bestimmte Spalten SELECT name, gehalt FROM mitarbeiter; -- Mit Bedingung SELECT name, gehalt FROM mitarbeiter WHERE gehalt > 3000; -- Sortiert SELECT name, gehalt FROM mitarbeiter ORDER BY gehalt DESC; -- Begrenzt auf 5 Ergebnisse SELECT * FROM mitarbeiter LIMIT 5;

WHERE – Bedingungen

WHERE filtert Datensätze. Ohne WHERE werden alle Zeilen zurückgegeben oder verändert.

SQL-- Vergleichsoperatoren WHERE gehalt = 3000 -- genau gleich WHERE gehalt <> 3000 -- ungleich (auch != möglich) WHERE gehalt > 3000 -- größer als WHERE gehalt BETWEEN 2000 AND 4000 -- zwischen WHERE name LIKE 'B%' -- beginnt mit B (% = beliebig viele Zeichen) WHERE abt_id IN (1, 2, 3) -- einer aus der Liste WHERE email IS NULL -- kein Wert vorhanden -- Kombinieren WHERE gehalt > 3000 AND abt_id = 2 WHERE abt_id = 1 OR abt_id = 2

INSERT – Daten einfügen

SQL-- Alle Spalten angeben INSERT INTO mitarbeiter (name, email, gehalt, abt_id) VALUES ('Ben Azubi', 'ben@towertech.de', 1800.00, 1); -- Mehrere Zeilen auf einmal INSERT INTO mitarbeiter (name, email, gehalt, abt_id) VALUES ('Anna Chef', 'anna@towertech.de', 5500.00, 1), ('Tom IT', 'tom@towertech.de', 3200.00, 2), ('Lisa Sales', 'lisa@towertech.de', 2900.00, 3);
Wichtig

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

SQL-- Gehalt eines bestimmten Mitarbeiters ändern UPDATE mitarbeiter SET gehalt = 2000.00 WHERE id = 1; -- Mehrere Spalten gleichzeitig ändern UPDATE mitarbeiter SET gehalt = 2100.00, abt_id = 2 WHERE name = 'Ben Azubi';
Achtung: UPDATE ohne WHERE

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

SQL-- Einen bestimmten Datensatz löschen DELETE FROM mitarbeiter WHERE id = 1; -- Alle Azubis löschen DELETE FROM mitarbeiter WHERE gehalt < 2000;
Achtung: DELETE ohne WHERE

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.

SQLSELECT COUNT(*) FROM mitarbeiter; -- Anzahl Zeilen SELECT SUM(gehalt) FROM mitarbeiter; -- Summe aller Gehälter SELECT AVG(gehalt) FROM mitarbeiter; -- Durchschnittsgehalt SELECT MIN(gehalt) FROM mitarbeiter; -- Kleinstes Gehalt SELECT MAX(gehalt) FROM mitarbeiter; -- Größtes Gehalt

GROUP BY & HAVING

GROUP BY fasst Zeilen mit demselben Wert zusammen. HAVING filtert Gruppen (wie WHERE, aber nach dem Gruppieren).

SQL-- Durchschnittsgehalt pro Abteilung SELECT abt_id, AVG(gehalt) AS avg_gehalt FROM mitarbeiter GROUP BY abt_id; -- Nur Abteilungen mit Durchschnittsgehalt über 3000 SELECT abt_id, AVG(gehalt) AS avg_gehalt FROM mitarbeiter GROUP BY abt_id HAVING AVG(gehalt) > 3000;
WHERE vs. HAVING

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.

SQL-- INNER JOIN: nur Zeilen die in BEIDEN Tabellen eine Übereinstimmung haben SELECT m.name, m.gehalt, a.bezeichnung FROM mitarbeiter m INNER JOIN abteilung a ON m.abt_id = a.id; -- LEFT JOIN: alle Zeilen aus der linken Tabelle, auch ohne Übereinstimmung SELECT m.name, a.bezeichnung FROM mitarbeiter m LEFT JOIN abteilung a ON m.abt_id = a.id; -- RIGHT JOIN: alle Zeilen aus der rechten Tabelle (in SQLite nicht verfügbar)
Dialekt-Hinweis: RIGHT JOIN

SQLite unterstützt kein RIGHT JOIN. Als Workaround: Tabellen tauschen und LEFT JOIN verwenden. MySQL und PostgreSQL unterstützen RIGHT JOIN.

INNER JOIN

Schnittmenge

Nur Datensätze die in beiden Tabellen eine Übereinstimmung haben. Mitarbeiter ohne Abteilung werden nicht angezeigt.

LEFT JOIN

Alle links, Rest wenn vorhanden

Alle Mitarbeiter, auch die ohne Abteilung. Fehlende Abteilungsdaten erscheinen als NULL.

RIGHT JOIN

Alle rechts, Rest wenn vorhanden

Alle Abteilungen, auch leere. Nicht in SQLite verfügbar.

Modul 05 · JOIN

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.

■ mitarbeiter
id1
nameBen Azubi
abt_id2
■ abteilung
id2
bezeichnungIT
standortKöln

INNER JOIN

Gibt nur Zeilen zurück die in beiden Tabellen eine Übereinstimmung haben. Mitarbeiter ohne Abteilung und Abteilungen ohne Mitarbeiter werden nicht angezeigt.

SQLSELECT m.name, m.gehalt, a.bezeichnung, a.standort FROM mitarbeiter m INNER JOIN abteilung a ON m.abt_id = a.id; -- m und a sind Aliase (Kurzbezeichnungen) für die Tabellen -- ON legt fest welche Spalten verglichen werden

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.

SQLSELECT m.name, a.bezeichnung FROM mitarbeiter m LEFT JOIN abteilung a ON m.abt_id = a.id; -- Mitarbeiter ohne Abteilung erscheinen mit NULL bei bezeichnung

RIGHT JOIN

Gibt alle Zeilen aus der rechten Tabelle zurück, auch ohne Übereinstimmung links.

Dialekt-Hinweis: SQLite

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-TypErgebnisNULL-Zeilen möglich?SQLite?
INNER JOINNur Übereinstimmungen aus beiden TabellenNeinJa
LEFT JOINAlle links + Übereinstimmungen rechtsJa (rechts)Ja
RIGHT JOINAlle rechts + Übereinstimmungen linksJa (links)Nein
FULL OUTER JOINAlle Zeilen beider TabellenJa (beide)Nein

JOIN mit mehreren Tabellen

SQL-- Drei Tabellen verknüpfen SELECT m.name, a.bezeichnung, p.projektname FROM mitarbeiter m INNER JOIN abteilung a ON m.abt_id = a.id INNER JOIN projekt p ON m.projekt_id = p.id;
Für die IHK

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.

Modul 05 · Praxis

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.

Hinweis

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.

Aufgabe 1 von 6
Erster Tag. Der Chef: „Trag erstmal alle Abteilungen ein: IT (Köln), Vertrieb (Düsseldorf) und Buchhaltung (Köln).“
Ziel: Füge 3 Abteilungen in die Tabelle abteilung ein. Bezeichnungen: IT, Vertrieb, Buchhaltung.
Aufgabe 2 von 6
„Jetzt trag Ben Azubi ein. Gehört zur IT, Gehalt 1800, E-Mail ben@towertech.de.“
Ziel: Füge einen Mitarbeiter namens 'Ben Azubi' in die Tabelle mitarbeiter ein.
Aufgabe 3 von 6
3 Monate später. „Ben hat sich gut gemacht. Heb sein Gehalt auf 2100 an.“
Ziel: Ändere das Gehalt von 'Ben Azubi' auf 2100.00 via UPDATE.
Aufgabe 4 von 6
Skandal im Vertrieb. „Der neue Praktikant hat den Spritpreis in der Fahrzeug-Tabelle auf 0.0001€ gesetzt! Änder den Preis auf 1.89 zurück.“
Ziel: Ändere in der Tabelle fahrzeug den spritpreis auf 1.89 WHERE spritpreis < 0.01.
Aufgabe 5 von 6
Ende des Jahres. „Herr Müller verlässt das Unternehmen. Lösch seinen Eintrag aus der Mitarbeiterliste.“
Ziel: Lösche den Mitarbeiter mit dem Namen 'Klaus Müller' aus der Tabelle mitarbeiter.
Aufgabe 6 von 6 – FINALE
Ben wird nicht übernommen. Als Rache… „Ben loggt sich ein letztes Mal ein. Er kennt den Befehl. Er tippt ihn. Die Tabelle mitarbeiter ist weg.“

Deine Aufgabe: Stell die Tabelle wieder her (CREATE TABLE mitarbeiter neu anlegen). Das ist der Grund warum man Backups macht.
Ziel: Führe zuerst DROP TABLE mitarbeiter; aus (spiel die Rolle). Dann lege die Tabelle neu an mit denselben Spalten wie in Modul 4.
SQLite · TowerTech GmbH · DML
Datenbank wird vorbereitet...
sql>
Modul 05 · Quiz

Quiz 5: DML

8 Fragen zu SELECT, INSERT, UPDATE, DELETE, JOINs und Aggregat-Funktionen.

Frage 1 von 8
Du willst alle Mitarbeiter anzeigen deren Gehalt zwischen 2000 und 4000 liegt. Welche WHERE-Klausel ist korrekt?
Frage 2 von 8
Was passiert wenn du UPDATE mitarbeiter SET gehalt = 5000; ohne WHERE ausführst?
Frage 3 von 8
Was ist der Unterschied zwischen DELETE FROM mitarbeiter; und DROP TABLE mitarbeiter;?
Frage 4 von 8
Du willst den Durchschnitt der Gehälter pro Abteilung berechnen, aber nur für Abteilungen wo der Durchschnitt über 3000 liegt. Welche Kombination ist korrekt?
Frage 5 von 8
Was gibt ein INNER JOIN zurück?
Frage 6 von 8
Welche Funktion zählt die Anzahl der Zeilen in einer Tabelle?
Frage 7 von 8
Du willst alle Mitarbeiter deren Name mit 'A' beginnt. Welche WHERE-Klausel ist korrekt?
Frage 8 von 8
Was ist der Unterschied zwischen WHERE und HAVING?
Punkte erreicht
Modul 06 · DCL

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).

Dialekt-Hinweis: SQLite

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.

GRANT

Rechte vergeben

Gibt einem Benutzer bestimmte Rechte auf eine Tabelle oder Datenbank. Nur ein Admin oder der Eigentümer kann GRANT ausführen.

REVOKE

Rechte entziehen

Entzieht einem Benutzer Rechte die vorher per GRANT vergeben wurden.

GRANT

MySQL / PostgreSQL-- Leserecht auf eine Tabelle GRANT SELECT ON mitarbeiter TO 'ben_azubi'; -- Lese- und Schreibrecht GRANT SELECT, INSERT, UPDATE ON mitarbeiter TO 'ben_azubi'; -- Alle Rechte auf eine Datenbank GRANT ALL PRIVILEGES ON firma_db.* TO 'admin_user'; -- Recht weitergeben dürfen (WITH GRANT OPTION) GRANT SELECT ON mitarbeiter TO 'team_lead' WITH GRANT OPTION;

REVOKE

MySQL / PostgreSQL-- Leserecht entziehen REVOKE SELECT ON mitarbeiter FROM 'ben_azubi'; -- Alle Rechte entziehen REVOKE ALL PRIVILEGES ON firma_db.* FROM 'ben_azubi';
Praxis-Kontext

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

RechtErlaubtTypisch für
SELECTDaten lesenAlle Benutzer
INSERTDaten einfügenMitarbeiter mit Schreibzugriff
UPDATEDaten ändernMitarbeiter mit Schreibzugriff
DELETEDaten löschenNur Berechtigte
CREATETabellen erstellenDatenbankadmins
DROPTabellen löschenNur Admins
ALL PRIVILEGESAllesRoot/Admin
Modul 06 · Praxis

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.

Simulation – kein echtes SQLite

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.

Aufgabe 1 von 4
Neuer Azubi fängt an. „Leg dem Benutzer ‘lena_azubi’ nur Leserecht auf die Tabelle mitarbeiter.“
Ziel: GRANT SELECT ON mitarbeiter TO 'lena_azubi';
Aufgabe 2 von 4
„Lena darf jetzt auch neue Einträge hinzufügen. Gib ihr INSERT-Recht zusätzlich.“
Ziel: GRANT INSERT ON mitarbeiter TO 'lena_azubi';
Aufgabe 3 von 4
Lena verlässt das Unternehmen. „Entzieh ihr alle Rechte auf mitarbeiter.“
Ziel: REVOKE ALL PRIVILEGES ON mitarbeiter FROM 'lena_azubi';
Aufgabe 4 von 4
„Neuer Admin ‘max_admin’ bekommt alle Rechte auf alle Tabellen.“
Ziel: GRANT ALL PRIVILEGES ON *.* TO 'max_admin';
DCL Simulation · TowerTech GmbH · [MySQL-Syntax]
DCL-Simulation bereit. Benutzer: lena_azubi, max_admin
Verfügbare Befehle: GRANT, REVOKE, SHOW GRANTS FOR user;
Hinweis: Dies ist eine Simulation. Echte SQLite unterstützt kein GRANT/REVOKE.
sql>
Modul 06 · Quiz

Quiz 6: DCL

6 Fragen zu Zugriffsrechten in SQL.

Frage 1 von 6
Was bedeutet DCL?
Frage 2 von 6
Du willst dem Benutzer 'anna' nur Leserecht auf die Tabelle mitarbeiter geben. Welcher Befehl ist korrekt?
Frage 3 von 6
Welches Datenbanksystem hat kein eigenes Benutzer- und Rechtesystem und unterstützt deshalb kein GRANT/REVOKE?
Frage 4 von 6
Was macht WITH GRANT OPTION bei einem GRANT-Befehl?
Frage 5 von 6
Ein Azubi soll Daten lesen und neue Einträge hinzufügen dürfen, aber nichts ändern oder löschen. Welcher GRANT-Befehl ist korrekt?
Frage 6 von 6
Du willst dem Benutzer 'ben' alle Rechte auf die Tabelle mitarbeiter entziehen. Welcher Befehl ist korrekt?
Punkte erreicht
Modul 07 · Sicherheit

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.

Beispiel: Verwundbarer Login
PHP (unsicher)// Benutzereingabe direkt in SQL eingebaut -- NIEMALS so machen $sql = "SELECT * FROM users WHERE name='" . $_POST['name'] . "'"; // Normale Eingabe: name = 'ben' // Ergebnis: SELECT * FROM users WHERE name='ben' -- ok // Angreifer gibt ein: name = ' OR '1'='1 // Ergebnis: SELECT * FROM users WHERE name='' OR '1'='1' // '1'='1' ist immer wahr -- gibt ALLE Benutzer zurück!

Mit SQL Injection kann ein Angreifer:

Daten lesen

Datenleck

Alle Daten aus der Datenbank auslesen, inklusive Passwörter, Kreditkartendaten, persönliche Daten.

Daten manipulieren

Manipulation

Einträge ändern oder löschen. Guthaben verändern, Noten fälschen, Datensätze zerstören.

Tabellen löschen

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.

PHP (sicher mit PDO)// Prepared Statement: SQL-Struktur und Daten getrennt $stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?"); $stmt->execute([$_POST['name']]); // Egal was der Benutzer eingibt -- es wird als reiner Datenwert behandelt // ' OR '1'='1 wird nicht als SQL interpretiert sondern als Suchbegriff
Merkhilfe

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

SQL-- FALSCH: löscht alle Zeilen DELETE FROM mitarbeiter; -- RICHTIG: erst mit SELECT prüfen, dann löschen SELECT * FROM mitarbeiter WHERE id = 5; -- prüfen DELETE FROM mitarbeiter WHERE id = 5; -- dann löschen

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.

Für die IHK

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.

Modul 07 · Quiz

Quiz 7: Sicherheit

6 Fragen zu SQL Injection und Sicherheits-Best-Practices.

Frage 1 von 6
Was ist SQL Injection?
Frage 2 von 6
Was ist die wichtigste technische Maßnahme gegen SQL Injection?
Frage 3 von 6
Was bedeutet das "Principle of Least Privilege" (Prinzip der minimalen Rechte)?
Frage 4 von 6
Warum sollten Datenbankfehlermeldungen nicht im Browser des Benutzers angezeigt werden?
Frage 5 von 6
Was bedeutet das 3-2-1-Backup-Prinzip?
Frage 6 von 6
Wie funktioniert ein Prepared Statement als Schutz gegen SQL Injection?
Punkte erreicht
Abschluss · Gesamtquiz

Gesamtquiz

20 Fragen aus allen Modulen. Zeigt wo du sicher bist und wo noch Nachholbedarf besteht.

Frage 1 von 20
Was ist der Unterschied zwischen einer relationalen und einer dokumentenbasierten Datenbank?
Frage 2 von 20
Was garantiert das "D" in ACID?
Frage 3 von 20
Welcher Datentyp ist für Geldbeträge korrekt?
Frage 4 von 20
Was macht ALTER TABLE?
Frage 5 von 20
Du willst alle Mitarbeiter anzeigen deren Name mit 'K' beginnt, sortiert nach Gehalt absteigend. Was ist korrekt?
Frage 6 von 20
Was ist der Unterschied zwischen DROP TABLE und DELETE FROM?
Frage 7 von 20
Wofür wird GRANT verwendet?
Frage 8 von 20
Was ist SQL Injection und wie schützt man sich?
Frage 9 von 20
Was gibt INNER JOIN zurück?
Frage 10 von 20
Welcher Constraint stellt sicher dass ein Feld nicht leer bleibt?
Frage 11 von 20
Was bedeutet persistent in Bezug auf Datenspeicherung?
Frage 12 von 20
Welcher Befehl gehört zur DDL?
Frage 13 von 20
Was ist der Unterschied zwischen WHERE und HAVING?
Frage 14 von 20
Was ist ein SQL-Dialekt?
Frage 15 von 20
Was beschreibt die dritte Normalform (3NF)?
Frage 16 von 20
Wie prüft man korrekt ob ein Feld NULL ist?
Frage 17 von 20
Was ist ein Index in einer Datenbank?
Frage 18 von 20
Welcher JOIN-Typ ist in SQLite nicht verfügbar?
Frage 19 von 20
Was ist BLOB?
Frage 20 von 20
Was ist der Fremdschlüssel (FK = Foreign Key)?
Punkte erreicht