📊 SQL für Einsteiger
Die Sprache der Datenbanken – einfach erklärt mit vielen Beispielen.
Von der ersten Abfrage bis zu komplexen Verknüpfungen.
🛠️ Empfohlene Tools für Entwickler
Diese Tools nutze ich selbst – sie helfen Ihnen, Ihre Projekte professionell umzusetzen und zu vermarkten.
🔒 XLS Padlock
Excel-Arbeitsmappen als EXE kompilieren und schützen – perfekt für den professionellen Vertrieb.
Jetzt ansehen →🐍 VBA Padlock
VBA-Code kompilieren und Office-Lösungen verkaufen – ohne Source-Code-Weitergabe.
Jetzt ansehen →📦 Paquet Builder
Professionelle Windows-Installationsprogramme für Ihre Anwendungen erstellen.
Jetzt ansehen →⚡ ExeOutput for PHP
PHP-Anwendungen in eigenständige Windows-EXE-Dateien kompilieren.
Jetzt ansehen →📄 HTML Executable
HTML-Dateien und Websites als eigenständige Windows-EXE-Dateien kompilieren.
Jetzt ansehen →* Affiliate-Links: Bei einem Kauf über diese Links erhalten wir eine kleine Provision – für Sie entstehen keine zusätzlichen Kosten.
1. Was ist SQL?
SQL (Structured Query Language) ist eine standardisierte Sprache für relationale Datenbanken. Mit SQL können Sie:
- ✅ Daten abfragen – "Zeige mir alle Kunden aus Berlin"
- ✅ Daten einfügen – "Füge einen neuen Kunden hinzu"
- ✅ Daten ändern – "Ändere die Adresse von Kunde 5"
- ✅ Daten löschen – "Lösche Kunde 7"
- ✅ Tabellen erstellen – "Erstelle eine Tabelle für Produkte"
2. Datenbank & Tabellen verstehen
Eine relationale Datenbank organisiert zusammengehörige Informationen in Tabellen. Eine Tabelle besteht aus Spalten (Feldern) und Zeilen (Datensätzen). Die Tabellen können über Schlüssel miteinander verknüpft werden.
📋 Beispiel-Tabelle: Kunden
| KundenID | Vorname | Nachname | Stadt | Alter_Jahre |
|---|---|---|---|---|
| 1 | Anna | Schmidt | Berlin | 28 |
| 2 | Ben | Müller | München | 34 |
| 3 | Clara | Wagner | Berlin | 22 |
| 4 | David | Fischer | Hamburg | 41 |
| 5 | Elena | Weber | Berlin | 19 |
- Spalten: KundenID, Vorname, Nachname, Stadt, Alter_Jahre
- Zeilen: Jede Zeile ist ein einzelner Kunde
- Primärschlüssel: KundenID – eindeutige Nummer für jeden Kunden
Alter_Jahre dient hier nur der Übung.
🛠️ Beispieltabelle in SQLite anlegen
Mit diesem Schema können Sie die folgenden Beispiele in SQLite nachvollziehen. Andere Datenbanksysteme verwenden für Datentypen und automatisch erzeugte IDs teilweise andere Syntax.
CREATE TABLE Kunden (
KundenID INTEGER PRIMARY KEY,
Vorname TEXT NOT NULL,
Nachname TEXT NOT NULL,
Stadt TEXT,
Alter_Jahre INTEGER CHECK (Alter_Jahre >= 0)
);
INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter_Jahre)
VALUES
('Anna', 'Schmidt', 'Berlin', 28),
('Ben', 'Müller', 'München', 34),
('Clara', 'Wagner', 'Berlin', 22),
('David', 'Fischer', 'Hamburg', 41),
('Elena', 'Weber', 'Berlin', 19);
3. SELECT – Daten abfragen
SELECT ist der wichtigste Befehl in SQL. Er fragt Daten aus einer Tabelle ab.
📝 Alle Daten einer Tabelle abfragen
SELECT * FROM Kunden;
Bedeutung: "Hole mir alle Spalten und alle Zeilen aus der Tabelle Kunden."
Alle 5 Kunden mit allen Spalten (KundenID, Vorname, Nachname, Stadt, Alter_Jahre).
📝 Nur bestimmte Spalten abfragen
SELECT Vorname, Nachname, Stadt FROM Kunden;
Bedeutung: "Hole mir nur die Spalten Vorname, Nachname und Stadt von allen Kunden."
Anna | Schmidt | Berlin
Ben | Müller | München
Clara | Wagner | Berlin
David | Fischer | Hamburg
Elena | Weber | Berlin
SELECT * ist praktisch zum Lernen.
Im produktiven Code sollten Sie meist nur die benötigten Spalten auswählen. Das macht
Abfragen verständlicher und vermeidet unnötig übertragene Daten.
ORDER BY ist die Reihenfolge der
Ergebniszeilen nicht garantiert. Die hier gezeigten Ausgaben sind deshalb Beispiele.
4. WHERE – Daten filtern
Mit WHERE können Sie Bedingungen festlegen, welche Datensätze angezeigt werden sollen.
📝 Kunden aus einer bestimmten Stadt
SELECT * FROM Kunden WHERE Stadt = 'Berlin';
Bedeutung: "Zeige mir alle Kunden, die in Berlin wohnen."
1 | Anna | Schmidt | Berlin | 28
3 | Clara | Wagner | Berlin | 22
5 | Elena | Weber | Berlin | 19
📝 Kunden mit Alter über 30
SELECT * FROM Kunden WHERE Alter_Jahre > 30;
2 | Ben | Müller | München | 34
4 | David | Fischer | Hamburg | 41
📝 Kombinierte Bedingungen mit AND / OR
-- Kunden aus Berlin, die älter als 25 sind SELECT * FROM Kunden WHERE Stadt = 'Berlin' AND Alter_Jahre > 25; -- Kunden aus Berlin ODER München SELECT * FROM Kunden WHERE Stadt = 'Berlin' OR Stadt = 'München';
= Gleich> Größer als< Kleiner als>= Größer oder gleich<= Kleiner oder gleich<> Ungleich; viele Systeme akzeptieren zusätzlich !=
📝 Fehlende Werte mit NULL prüfen
NULL steht für einen unbekannten oder fehlenden Wert. Verwenden Sie dafür
IS NULL beziehungsweise IS NOT NULL – nicht = NULL.
SELECT Vorname, Nachname FROM Kunden WHERE Stadt IS NULL;
NULL ergeben keinen normalen
Wahrheitswert. Deshalb hat SQL dafür die Operatoren IS NULL und IS NOT NULL.
5. ORDER BY – Sortieren
Mit ORDER BY können Sie die Ergebnisse sortieren.
📝 Kunden alphabetisch nach Nachname sortieren
SELECT * FROM Kunden ORDER BY Nachname ASC;
Bedeutung: "Sortiere die Kunden aufsteigend (A-Z) nach Nachname."
4 | David | Fischer | Hamburg | 41
2 | Ben | Müller | München | 34
1 | Anna | Schmidt | Berlin | 28
3 | Clara | Wagner | Berlin | 22
5 | Elena | Weber | Berlin | 19
📝 Zahlen absteigend sortieren
SELECT * FROM Kunden ORDER BY Alter_Jahre DESC;
Bedeutung: "Sortiere die Kunden nach Alter absteigend – vom größten zum kleinsten Wert."
4 | David | Fischer | Hamburg | 41
2 | Ben | Müller | München | 34
1 | Anna | Schmidt | Berlin | 28
3 | Clara | Wagner | Berlin | 22
5 | Elena | Weber | Berlin | 19
ASC = aufsteigend (A-Z, 1-10) – das ist die Voreinstellung.DESC = absteigend (Z-A, 10-1)
6. INSERT – Daten einfügen
Mit INSERT fügen Sie neue Datensätze in eine Tabelle ein.
📝 Einen neuen Kunden hinzufügen
INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter_Jahre)
VALUES ('Felix', 'Klein', 'Köln', 27);
Bedeutung: "Füge einen neuen Kunden mit den angegebenen Werten ein."
1 | Anna | Schmidt | Berlin | 28
2 | Ben | Müller | München | 34
3 | Clara | Wagner | Berlin | 22
4 | David | Fischer | Hamburg | 41
5 | Elena | Weber | Berlin | 19
6 | Felix | Klein | Köln | 27
AUTO_INCREMENT;
andere Systeme nutzen Identitätsspalten, Sequenzen oder eigene Regeln.
🛡️ Werte aus Formularen sicher übergeben
Werte von Benutzern dürfen nicht per Zeichenketten-Verkettung in SQL eingebaut werden. Nutzen Sie in Ihrer Programmiersprache eine parametrisierte Abfrage (Prepared Statement). Die Platzhalter-Syntax hängt von Treiber und Programmiersprache ab.
INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter_Jahre) VALUES (:vorname, :nachname, :stadt, :alter_jahre);
:vorname und die anderen Platzhalter werden über die
Datenbank-API gebunden. Sie sind nicht als ungeprüfter Text zu ersetzen und funktionieren
je nach SQL-Konsole nicht direkt.
7. UPDATE – Daten ändern
Mit UPDATE können Sie vorhandene Daten ändern.
📝 Die Adresse eines Kunden ändern
UPDATE Kunden SET Stadt = 'Frankfurt' WHERE KundenID = 6;
Bedeutung: "Ändere die Stadt von Kunde 6 auf Frankfurt."
WHERE werden alle Datensätze geändert!
UPDATE Kunden SET Stadt = 'Berlin'; – würde alle Kunden nach Berlin ziehen!
🛡️ Sicheren Ablauf verwenden
BEGIN; SELECT * FROM Kunden WHERE KundenID = 6; UPDATE Kunden SET Stadt = 'Frankfurt' WHERE KundenID = 6; -- In der Lernumgebung rückgängig machen: ROLLBACK; -- Nach sorgfältiger Prüfung wäre stattdessen COMMIT möglich.
Transaktionsbefehle und ihr Verhalten unterscheiden sich im Detail je nach Datenbanksystem. Prüfen Sie die Dokumentation Ihres Systems und testen Sie Änderungen zuerst an einer Kopie.
📝 Mehrere Spalten gleichzeitig ändern
UPDATE Kunden SET Stadt = 'Düsseldorf', Alter_Jahre = 30 WHERE KundenID = 6;
8. DELETE – Daten löschen
Mit DELETE können Sie Datensätze entfernen.
📝 Einen Kunden löschen
DELETE FROM Kunden WHERE KundenID = 6;
Bedeutung: "Lösche den Kunden mit der ID 6."
WHERE werden ALLE Datensätze gelöscht!
DELETE FROM Kunden; – würde die ganze Tabelle leeren!
TRUNCATE: Manche Datenbanksysteme bieten
TRUNCATE TABLE Kunden; zum vollständigen Leeren einer Tabelle an. Berechtigungen,
Rückrollbarkeit, Fremdschlüssel und das Zurücksetzen von Identitätswerten unterscheiden sich.
Verwenden Sie den Befehl nur bewusst, nach Dokumentationsprüfung und mit aktuellem Backup.
9. Verknüpfungen (JOIN)
Mit JOIN können Sie Daten aus mehreren Tabellen kombinieren.
📋 Beispiel: Zwei Tabellen
Kunden
| KundenID | Vorname |
|---|---|
| 1 | Anna |
| 2 | Ben |
| 3 | Clara |
Bestellungen
| BestellID | KundenID | Produkt |
|---|---|---|
| 1 | 1 | Laptop |
| 2 | 2 | Maus |
| 3 | 1 | Tastatur |
📝 Kunden mit ihren Bestellungen anzeigen
SELECT Kunden.Vorname, Bestellungen.Produkt
FROM Kunden
INNER JOIN Bestellungen
ON Kunden.KundenID = Bestellungen.KundenID
ORDER BY Bestellungen.BestellID;
Anna | Laptop
Ben | Maus
Anna | Tastatur
JOIN verbindet Tabellen über eine gemeinsame Spalte –
hier die KundenID.
📝 Kunden ohne Bestellung mit anzeigen
Ein INNER JOIN liefert nur passende Paare. Ein LEFT JOIN behält
zusätzlich alle Zeilen der linken Tabelle; ohne passende Bestellung steht rechts NULL.
SELECT Kunden.Vorname, Bestellungen.Produkt
FROM Kunden
LEFT JOIN Bestellungen
ON Kunden.KundenID = Bestellungen.KundenID;
10. Aggregatfunktionen
Aggregatfunktionen führen Berechnungen auf mehreren Zeilen durch.
| Funktion | Beschreibung | Beispiel |
|---|---|---|
COUNT(*) |
Zählt die Zeilen | SELECT COUNT(*) FROM Kunden; → 5 |
SUM(Spalte) |
Summiert die Werte | SELECT SUM(Alter_Jahre) FROM Kunden; → 144 |
AVG(Spalte) |
Durchschnitt | SELECT AVG(Alter_Jahre) FROM Kunden; → 28.8 |
MIN(Spalte) |
Kleinster Wert | SELECT MIN(Alter_Jahre) FROM Kunden; → 19 |
MAX(Spalte) |
Größter Wert | SELECT MAX(Alter_Jahre) FROM Kunden; → 41 |
COUNT(*) zählt Zeilen. Dagegen zählt
COUNT(Spalte) nur Zeilen, in denen diese Spalte nicht NULL ist.
Auch SUM, AVG, MIN und MAX ignorieren in der Regel
NULL-Werte.
📝 Beispiele mit GROUP BY
-- Anzahl der Kunden pro Stadt SELECT Stadt, COUNT(*) AS Anzahl FROM Kunden GROUP BY Stadt ORDER BY Stadt; -- Durchschnittsalter pro Stadt SELECT Stadt, AVG(Alter_Jahre) AS Durchschnittsalter FROM Kunden GROUP BY Stadt ORDER BY Stadt;
Berlin | 3
Hamburg | 1
München | 1
11. Praxis-Beispiele
📝 Beispiel 1: Kundensuche
-- Suche Kunden mit "er" im Nachnamen SELECT * FROM Kunden WHERE Nachname LIKE '%er%'; -- Kunden, deren Name mit "S" beginnt SELECT * FROM Kunden WHERE Nachname LIKE 'S%'; -- Kunden mit 3 Buchstaben im Vornamen SELECT * FROM Kunden WHERE Vorname LIKE '___';
📝 Beispiel 2: Top-5 der ältesten Kunden
SELECT * FROM Kunden ORDER BY Alter_Jahre DESC LIMIT 5;
LIMIT funktioniert unter anderem in PostgreSQL,
MySQL und SQLite. Andere Systeme verwenden beispielsweise FETCH FIRST oder
TOP. Prüfen Sie die Dokumentation Ihrer Datenbank.
📝 Beispiel 3: Kundenstatistik
-- Ältester und jüngster Kunde pro Stadt
SELECT
Stadt,
MIN(Alter_Jahre) AS Juengster,
MAX(Alter_Jahre) AS Aeltester,
AVG(Alter_Jahre) AS Durchschnitt
FROM Kunden
GROUP BY Stadt;
12. Übungen zum Mitmachen
📝 Übung 1: Alle Daten abfragen
Schreiben Sie eine Abfrage, die alle Daten aus der Tabelle "Kunden" anzeigt.
Lösung anzeigen
SELECT * FROM Kunden;
📝 Übung 2: Daten filtern
Zeigen Sie alle Kunden aus Berlin an, die älter als 25 sind.
Lösung anzeigen
SELECT * FROM Kunden WHERE Stadt = 'Berlin' AND Alter_Jahre > 25;
📝 Übung 3: Sortieren
Zeigen Sie alle Kunden an, sortiert nach Alter absteigend (älteste zuerst).
Lösung anzeigen
SELECT * FROM Kunden ORDER BY Alter_Jahre DESC;
📝 Übung 4: Aggregatfunktion
Wie viele Kunden wohnen in Berlin?
Lösung anzeigen
SELECT COUNT(*) FROM Kunden WHERE Stadt = 'Berlin';
📝 Übung 5: Daten einfügen
Fügen Sie einen neuen Kunden ein: "Greta", "Bauer", "Berlin", 26.
Lösung anzeigen
INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter_Jahre) VALUES ('Greta', 'Bauer', 'Berlin', 26);
📝 Übung 6: Daten ändern
Ändern Sie die Stadt von Kunde mit ID 3 auf "Leipzig".
Lösung anzeigen
UPDATE Kunden SET Stadt = 'Leipzig' WHERE KundenID = 3;
13. Tipps & Best Practices
WHERE betreffen UPDATE und DELETE absichtlich alle Zeilen.
Prüfen Sie die Zielmenge vorher mit SELECT und verwenden Sie bei kritischen Änderungen
eine Transaktion, Berechtigungsschutz und ein aktuelles Backup.
AS können Sie Spalten umbenennen:
SELECT COUNT(*) AS Anzahl FROM Kunden;
SELECT, bevor Sie
UPDATE oder DELETE ausführen – so sehen Sie,
welche Datensätze betroffen wären.
NOT NULL-, UNIQUE-,
CHECK- und Fremdschlüssel-Regeln. Anwendungskonten sollten nur die wirklich
benötigten Datenbankrechte erhalten.
14. Weiterführende Ressourcen
Lernen Sie zuerst mit einem Datenbanksystem und vergleichen Sie später gezielt die Dialekte. Für Syntaxdetails sind die offiziellen Handbücher die verlässlichste Anlaufstelle.
PostgreSQL-Tutorial
Offizielle Einführung in Tabellen, Abfragen, JOINs und Aggregatfunktionen.
PostgreSQL-Dokumentation öffnenSQLite-SQL-Syntax
Offizielle Sprachübersicht für die kompakte, dateibasierte Datenbank SQLite.
SQLite-Dokumentation öffnenMySQL-Tutorial
Offizielles Tutorial mit Beispielen für den MySQL-Dialekt.
MySQL-Dokumentation öffnenSQL-Injection vermeiden
OWASP erklärt parametrisierte Abfragen und weitere Schutzmaßnahmen.
OWASP-Leitfaden öffnen15. Lernstand prüfen
Markieren Sie, was Sie bereits ohne Vorlage erklären oder anwenden können.
0 von 6 Lernzielen markiert.
16. Häufige Fragen
Ist SQL dasselbe wie MySQL?
Nein. SQL ist die Sprache; MySQL ist ein Datenbanksystem mit einem eigenen SQL-Dialekt.
Warum funktioniert eine Abfrage in einer anderen Datenbank nicht sofort?
Datentypen, automatische IDs, Begrenzung von Ergebnissen, Funktionen und Anführungszeichen können sich je nach SQL-Dialekt unterscheiden.
Reicht das Filtern von Eingaben gegen SQL-Injection?
Nein. Verwenden Sie parametrisierte Abfragen oder Prepared Statements. Eingabeprüfung ergänzt den Schutz nur für fachliche Regeln.
Wie übe ich UPDATE und DELETE möglichst sicher?
Arbeiten Sie mit Beispieldaten oder einer Kopie, prüfen Sie dieselbe Bedingung zuerst mit SELECT und nutzen Sie eine Transaktion, sofern Ihr System dies unterstützt.