SQL für Einsteiger – Abfragen sicher lernen

🛠️ 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"
💡 Merke: Relationale Datenbanksysteme wie MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server und SQLite verwenden SQL. Details der Syntax unterscheiden sich jedoch je nach SQL-Dialekt.
✅ SQL ist für viele digitale Aufgaben relevant. Dazu gehören Web-Entwicklung, Datenanalyse, Berichte und Backend-Systeme.

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

Fünf Beispieldatensätze der 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
💡 Tipp: Ein Primärschlüssel identifiziert jeden Datensatz eindeutig. Er kann aus einer ID-Spalte oder aus mehreren Spalten bestehen. In echten Kundendaten wird meist ein Geburtsdatum statt eines veränderlichen Alters gespeichert; 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.

📄 sqlite.sql
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

📄 sql.sql
SELECT * FROM Kunden;

Bedeutung: "Hole mir alle Spalten und alle Zeilen aus der Tabelle Kunden."

📤 Ergebnis:
Alle 5 Kunden mit allen Spalten (KundenID, Vorname, Nachname, Stadt, Alter_Jahre).

📝 Nur bestimmte Spalten abfragen

📄 sql.sql
SELECT Vorname, Nachname, Stadt FROM Kunden;

Bedeutung: "Hole mir nur die Spalten Vorname, Nachname und Stadt von allen Kunden."

📤 Ergebnis:
Anna | Schmidt | Berlin
Ben | Müller | München
Clara | Wagner | Berlin
David | Fischer | Hamburg
Elena | Weber | Berlin
💡 Für Anwendungen: 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.
💡 Reihenfolge: Ohne 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

📄 sql.sql
SELECT * FROM Kunden
WHERE Stadt = 'Berlin';

Bedeutung: "Zeige mir alle Kunden, die in Berlin wohnen."

📤 Ergebnis:
1 | Anna | Schmidt | Berlin | 28
3 | Clara | Wagner | Berlin | 22
5 | Elena | Weber | Berlin | 19

📝 Kunden mit Alter über 30

📄 sql.sql
SELECT * FROM Kunden
WHERE Alter_Jahre > 30;
📤 Ergebnis:
2 | Ben | Müller | München | 34
4 | David | Fischer | Hamburg | 41

📝 Kombinierte Bedingungen mit AND / OR

📄 sql.sql
-- 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';
💡 Wichtige Vergleichsoperatoren:
= 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.

📄 sql.sql
SELECT Vorname, Nachname
FROM Kunden
WHERE Stadt IS NULL;
💡 Hintergrund: Vergleiche mit 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

📄 sql.sql
SELECT * FROM Kunden
ORDER BY Nachname ASC;

Bedeutung: "Sortiere die Kunden aufsteigend (A-Z) nach Nachname."

📤 Ergebnis:
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

📄 sql.sql
SELECT * FROM Kunden
ORDER BY Alter_Jahre DESC;

Bedeutung: "Sortiere die Kunden nach Alter absteigend – vom größten zum kleinsten Wert."

📤 Ergebnis:
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
💡 Tipp: ASC = aufsteigend (A-Z, 1-10) – das ist die Voreinstellung.
DESC = absteigend (Z-A, 10-1)
💡 Hinweis: Bei Text hängt die genaue Reihenfolge von der eingestellten Sortierregel (Collation) der Datenbank ab, etwa bei Umlauten sowie Groß- und Kleinschreibung.

6. INSERT – Daten einfügen

Mit INSERT fügen Sie neue Datensätze in eine Tabelle ein.

📝 Einen neuen Kunden hinzufügen

📄 sql.sql
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."

📤 Nach dem Einfügen hat die Tabelle jetzt 6 Kunden:
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
⚠️ SQL-Dialekt beachten: Die ID wird nur automatisch vergeben, wenn die Spalte entsprechend definiert wurde. MySQL verwendet beispielsweise 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.

📄 Prinzip mit benannten Platzhaltern
INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter_Jahre)
VALUES (:vorname, :nachname, :stadt, :alter_jahre);
💡 Wichtig: :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

📄 sql.sql
UPDATE Kunden
SET Stadt = 'Frankfurt'
WHERE KundenID = 6;

Bedeutung: "Ändere die Stadt von Kunde 6 auf Frankfurt."

⚠️ Achtung! Ohne WHERE werden alle Datensätze geändert!

UPDATE Kunden SET Stadt = 'Berlin'; – würde alle Kunden nach Berlin ziehen!

🛡️ Sicheren Ablauf verwenden

📄 sql.sql
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

📄 sql.sql
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

📄 sql.sql
DELETE FROM Kunden
WHERE KundenID = 6;

Bedeutung: "Lösche den Kunden mit der ID 6."

⚠️ Achtung! Ohne WHERE werden ALLE Datensätze gelöscht!

DELETE FROM Kunden; – würde die ganze Tabelle leeren!
💡 Zu 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

Kunden für das JOIN-Beispiel
KundenIDVorname
1Anna
2Ben
3Clara

Bestellungen

Bestellungen für das JOIN-Beispiel
BestellIDKundenIDProdukt
11Laptop
22Maus
31Tastatur

📝 Kunden mit ihren Bestellungen anzeigen

📄 sql.sql
SELECT Kunden.Vorname, Bestellungen.Produkt
FROM Kunden
INNER JOIN Bestellungen
    ON Kunden.KundenID = Bestellungen.KundenID
ORDER BY Bestellungen.BestellID;
📤 Ergebnis:
Anna | Laptop
Ben | Maus
Anna | Tastatur
💡 Merke: 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.

📄 sql.sql
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.

SQL-Aggregatfunktionen und Beispiele
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
💡 NULL beachten: 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

📄 sql.sql
-- 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;
📤 Ergebnis (Anzahl pro Stadt):
Berlin | 3
Hamburg | 1
München | 1

11. Praxis-Beispiele

📝 Beispiel 1: Kundensuche

📄 sql.sql
-- 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

📄 sql.sql
SELECT * FROM Kunden
ORDER BY Alter_Jahre DESC
LIMIT 5;
💡 SQL-Dialekt: 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

📄 sql.sql
-- Ä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

✅ Groß-/Kleinschreibung: SQL-Schlüsselwörter werden häufig in Großbuchstaben geschrieben. In den verbreiteten Systemen ist das für Schlüsselwörter nicht erforderlich; bei Bezeichnern und Anführungszeichen gelten jedoch je nach Datenbank unterschiedliche Regeln.
✅ Semikolon am Ende: Das Semikolon trennt SQL-Anweisungen. In Skripten und Konsolen sollten Sie es verwenden; manche Programmierschnittstellen senden einzelne Anweisungen auch ohne abschließendes Semikolon.
⚠️ Änderungsbereich prüfen: Ohne 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.
✅ Aliase verwenden: Mit AS können Sie Spalten umbenennen:

SELECT COUNT(*) AS Anzahl FROM Kunden;
💡 Tipp für die Praxis: Testen Sie Ihre SQL-Abfragen zuerst mit SELECT, bevor Sie UPDATE oder DELETE ausführen – so sehen Sie, welche Datensätze betroffen wären.
🛡️ SQL-Injection verhindern: Übergeben Sie externe Werte mit Prepared Statements und gebundenen Parametern. Eingabeprüfung kann fachliche Regeln sichern, ersetzt aber keine Parametrisierung.
✅ Datenqualität und Rechte: Nutzen Sie passende Datentypen sowie 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.

SQL-Injection vermeiden

OWASP erklärt parametrisierte Abfragen und weitere Schutzmaßnahmen.

OWASP-Leitfaden öffnen
💡 Übungsumgebung: SQLite eignet sich gut für lokale Übungen. Eine grafische Oberfläche wie DB Browser for SQLite muss je nach Betriebssystem installiert oder als portable Version gestartet werden. Nutzen Sie ausschließlich Beispieldaten, keine echten Personen- oder Zugangsdaten.

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

← Zurück zu den Grundlagen
© 2026 Digitale Start-Hilfe – SQL-Leitfaden für Einsteiger & Fortgeschrittene
Datenschutz-Übersicht
digitale-start-hilfe.de

Auf dieser Website werden Cookies verwendet, um deine Nutzererfahrung zu verbessern. Du kannst in den {setting}Einstellungen{/setting} mehr erfahren oder Cookies jederzeit ablehnen.

Eine vollständige Liste aller Cookies findest du in unserer Cookie-Erklärung.

Weitere Informationen findest du in unserer Datenschutzerklärung.

Notwendige Cookies & Chatbot

Diese Cookies sind für den Betrieb der Website unbedingt erforderlich und können nicht deaktiviert werden. Dazu gehören auch grundlegende Funktionen wie der WebChatAgent (Chatbot) von WebChatAgent.com, der die direkte Kommunikation mit uns ermöglicht.