SQL Basic Kurs
Von Elyndra Valen, Senior Entwicklerin bei Java Fleet Systems Consulting

🗺️ Deine Position im Kurs
| Tag | Thema | Status |
|---|---|---|
| 1 | Warum Datenbanken? | ✅ Abgeschlossen |
| 2 | Das relationale Modell | ✅ Abgeschlossen |
| 3 | Schlüssel & Beziehungen | ✅ Abgeschlossen |
| 4 | Tabellen erstellen & Daten pflegen | ✅ Abgeschlossen |
| 5 | SELECT – Deine erste Abfrage | ✅ Abgeschlossen |
| 6 | Filtern und Sortieren | ✅ Abgeschlossen |
| 7 | Gruppieren und Auswerten | ✅ Abgeschlossen |
| 8 | JOINs – Tabellen verbinden | ✅ Abgeschlossen |
| → 9 | Subqueries und Views | 👉 DU BIST HIER! |
| 10 | Zusammenfassung & Projekt | 🔜 Morgen! |
Modul: SQL Basic
Gesamt-Dauer: 10 Kurstage
Selbstlernzeit heute: ca. 6 Unterrichtseinheiten
Dein Ziel: Komplexe Abfragen mit Subqueries schreiben und Views erstellen
📋 Voraussetzungen für diesen Tag
Du brauchst:
- ✅ Tag 1-8 abgeschlossen
- ✅ Du kannst JOINs, GROUP BY und WHERE
- ✅ XAMPP läuft, phpMyAdmin ist offen
- ✅ Die Datenbanken sind importiert
Fragen?
Schreib uns: elyndra.valen@java-developer.online
🔄 Kurzwiederholung: Lösung der Challenge von Tag 8
1. Personen mit Adressen (INNER JOIN):
SELECT
p.FIRSTNAME,
p.LASTNAME,
a.stadt,
a.STREET
FROM person p
INNER JOIN adressen a ON p.PERSID = a.PERSID;
2. ALLE Personen, auch ohne Adresse (LEFT JOIN):
SELECT
p.FIRSTNAME,
p.LASTNAME,
a.stadt,
a.STREET
FROM person p
LEFT JOIN adressen a ON p.PERSID = a.PERSID;
3. Anzahl Adressen pro Person:
SELECT
p.FIRSTNAME,
p.LASTNAME,
COUNT(a.ADRESID) AS anzahl_adressen
FROM person p
LEFT JOIN adressen a ON p.PERSID = a.PERSID
GROUP BY p.PERSID, p.FIRSTNAME, p.LASTNAME
ORDER BY anzahl_adressen DESC;
4. Vorname beginnt wie Stadt:
SELECT
p.FIRSTNAME,
p.LASTNAME,
a.stadt
FROM person p
INNER JOIN adressen a ON p.PERSID = a.PERSID
WHERE LEFT(p.FIRSTNAME, 1) = LEFT(a.stadt, 1);
5. (Bonus) Kunden mit Bestellungen und Gesamtwert:
SELECT
k.name,
COUNT(DISTINCT b.bestellungen_id) AS anzahl_bestellungen,
SUM(pos.menge * pos.preis) AS gesamtwert
FROM kunden k
LEFT JOIN bestellungen b ON k.kunden_id = b.kunden_id
LEFT JOIN positionen pos ON b.bestellungen_id = pos.bestellungen_id
GROUP BY k.kunden_id, k.name
ORDER BY gesamtwert DESC;
⚡ Das Wichtigste in 30 Sekunden
Heute lernst du:
- ✅ Subqueries – Abfragen in Abfragen
- ✅ Subqueries in WHERE, SELECT und FROM
- ✅ EXISTS und NOT EXISTS
- ✅ Views – gespeicherte Abfragen als „virtuelle Tabellen“
Am Ende des Tages kannst du: Komplexe Probleme elegant lösen und wiederverwendbare Abfragen erstellen.
Schwierigkeitsgrad: 🟡 Mittel bis 🔴 Fortgeschritten
Hi! 👋
Du hast jetzt alle Grundbausteine: SELECT, WHERE, JOIN, GROUP BY. Heute lernst du, sie zu kombinieren und zu verschachteln.
Subqueries sind Abfragen innerhalb von Abfragen. Klingt kompliziert, ist aber unglaublich nützlich.
Views sind gespeicherte Abfragen, die du wie Tabellen benutzen kannst. Sie machen komplexe Abfragen wiederverwendbar.
Das ist das vorletzte Level! Morgen kommt die Zusammenfassung.
Los geht’s! 🚀
🟢 GRUNDLAGEN: Subqueries
Was ist eine Subquery?
Eine Subquery ist eine SELECT-Abfrage, die innerhalb einer anderen Abfrage steht.
Beispiel: „Zeige alle Personen, die älter als der Durchschnitt sind.“
Ohne Subquery müsstest du:
- Erst den Durchschnitt berechnen:
SELECT AVG(AGE) FROM person;→ z.B. 52.3 - Dann filtern:
SELECT * FROM person WHERE AGE > 52.3;
Mit Subquery – alles in einem:
SELECT * FROM person WHERE AGE > (SELECT AVG(AGE) FROM person);
Die innere Abfrage (SELECT AVG(AGE) FROM person) wird zuerst ausgeführt, dann die äußere.
Subqueries in WHERE
Häufigster Anwendungsfall!
Personen älter als der Durchschnitt:
SELECT FIRSTNAME, LASTNAME, AGE FROM person WHERE AGE > (SELECT AVG(AGE) FROM person);
Personen mit dem häufigsten Vornamen:
SELECT * FROM person
WHERE FIRSTNAME = (
SELECT FIRSTNAME
FROM person
GROUP BY FIRSTNAME
ORDER BY COUNT(*) DESC
LIMIT 1
);
Personen, die in „Bad“-Städten wohnen:
SELECT * FROM person
WHERE PERSID IN (
SELECT PERSID
FROM adressen
WHERE stadt LIKE 'Bad%'
);
Skalare Subqueries vs. Listen-Subqueries
Skalar = ein einzelner Wert:
WHERE AGE > (SELECT AVG(AGE) FROM person)
Die Subquery liefert EINEN Wert (z.B. 52.3).
Liste = mehrere Werte:
WHERE PERSID IN (SELECT PERSID FROM adressen)
Die Subquery liefert VIELE Werte (eine Liste von IDs).
Wichtig:
- Bei
=,>,<muss die Subquery genau EINEN Wert liefern - Bei
IN,NOT INkann sie mehrere Werte liefern
🟡 PROFESSIONALS: Mehr Subquery-Orte
Subquery in SELECT
Du kannst eine Subquery auch als Spalte einbauen:
SELECT
FIRSTNAME,
LASTNAME,
AGE,
(SELECT AVG(AGE) FROM person) AS durchschnitt,
AGE - (SELECT AVG(AGE) FROM person) AS abweichung
FROM person;
Jede Zeile zeigt: Name, Alter, Durchschnittsalter, Differenz zum Durchschnitt.
Subquery in FROM (Derived Table)
Du kannst eine Subquery wie eine Tabelle behandeln:
SELECT buchstabe, anzahl
FROM (
SELECT
LEFT(FIRSTNAME, 1) AS buchstabe,
COUNT(*) AS anzahl
FROM person
GROUP BY LEFT(FIRSTNAME, 1)
) AS buchstaben_stats
WHERE anzahl > 20
ORDER BY anzahl DESC;
Die innere Abfrage erstellt eine „temporäre Tabelle“ namens buchstaben_stats, die äußere filtert daraus.
Wichtig: Bei Subqueries in FROM MUSS ein Alias angegeben werden (AS buchstaben_stats).
EXISTS und NOT EXISTS
Prüft, ob eine Subquery Ergebnisse liefert.
Alle Personen, die mindestens eine Adresse haben:
SELECT * FROM person p
WHERE EXISTS (
SELECT 1 FROM adressen a
WHERE a.PERSID = p.PERSID
);
Alle Personen OHNE Adresse:
SELECT * FROM person p
WHERE NOT EXISTS (
SELECT 1 FROM adressen a
WHERE a.PERSID = p.PERSID
);
EXISTS vs. IN:
- EXISTS ist oft schneller bei großen Tabellen
- EXISTS stoppt, sobald ein Match gefunden wird
- IN muss die komplette Liste aufbauen
🟡 Views – Gespeicherte Abfragen
Was ist ein View?
Ein View ist eine gespeicherte Abfrage, die wie eine Tabelle benutzt werden kann.
Stell dir vor: Du hast eine komplizierte Abfrage, die du ständig brauchst. Statt sie jedes Mal zu schreiben, speicherst du sie als View.
View erstellen
CREATE VIEW personen_mit_adressen AS
SELECT
p.PERSID,
p.FIRSTNAME,
p.LASTNAME,
p.AGE,
a.stadt,
a.STREET
FROM person p
INNER JOIN adressen a ON p.PERSID = a.PERSID;
View benutzen
Jetzt kannst du den View wie eine Tabelle abfragen:
SELECT * FROM personen_mit_adressen;
SELECT * FROM personen_mit_adressen WHERE stadt LIKE 'Bad%';
SELECT stadt, COUNT(*) as anzahl FROM personen_mit_adressen GROUP BY stadt;
Vorteile von Views
- Wiederverwendbarkeit – Komplexe Abfragen nur einmal schreiben
- Vereinfachung – Benutzer sehen nur die relevanten Spalten
- Sicherheit – Zugriff auf Teilmengen der Daten gewähren
- Konsistenz – Alle nutzen dieselbe Logik
View ändern oder löschen
-- View ändern CREATE OR REPLACE VIEW personen_mit_adressen AS SELECT ...; -- neue Definition -- View löschen DROP VIEW personen_mit_adressen; -- View anzeigen (was steckt drin?) SHOW CREATE VIEW personen_mit_adressen;
Praktisches Beispiel: Statistik-View
CREATE VIEW alters_statistik AS
SELECT
FLOOR(AGE / 10) * 10 AS altersgruppe,
COUNT(*) AS anzahl,
ROUND(AVG(AGE), 1) AS durchschnitt
FROM person
GROUP BY FLOOR(AGE / 10) * 10;
Jetzt kannst du jederzeit abfragen:
SELECT * FROM alters_statistik ORDER BY altersgruppe;
🔴 BONUS: Fortgeschrittene Techniken
Korrelierte Subqueries
Eine korrelierte Subquery bezieht sich auf die äußere Abfrage:
SELECT
p.FIRSTNAME,
p.LASTNAME,
(SELECT COUNT(*) FROM adressen a WHERE a.PERSID = p.PERSID) AS anzahl_adressen
FROM person p;
Die Subquery wird für JEDE Zeile der äußeren Abfrage neu ausgeführt (kann langsam sein!).
ALL und ANY
-- Älter als ALLE anderen mit gleichem Vornamen
SELECT * FROM person p1
WHERE AGE >= ALL (
SELECT AGE FROM person p2
WHERE p2.FIRSTNAME = p1.FIRSTNAME
);
-- Älter als MINDESTENS EINER mit Vorname 'Bruno'
SELECT * FROM person
WHERE AGE > ANY (
SELECT AGE FROM person WHERE FIRSTNAME = 'Bruno'
);
View mit Aggregation und JOIN
CREATE VIEW kunden_uebersicht AS
SELECT
k.kunden_id,
k.name,
k.vorname,
k.stadt,
COUNT(DISTINCT b.bestellungen_id) AS anzahl_bestellungen,
COALESCE(SUM(pos.menge * pos.preis), 0) AS gesamtumsatz
FROM kunden k
LEFT JOIN bestellungen b ON k.kunden_id = b.kunden_id
LEFT JOIN positionen pos ON b.bestellungen_id = pos.bestellungen_id
GROUP BY k.kunden_id, k.name, k.vorname, k.stadt;
Jetzt: SELECT * FROM kunden_uebersicht WHERE gesamtumsatz > 1000;
💬 Real Talk: Die Kursplanung für Tag 9
Java Fleet Büro, später Nachmittag. Das Team sitzt müde aber zufrieden zusammen.
Franz-Martin: „Vorletzter Tag. Subqueries und Views. Das rundet den Kurs ab.“
Nova: „Subqueries haben mich am Anfang überfordert. Eine Abfrage IN einer Abfrage?“
Tom: „Für mich war das Aha-Moment: ‚Wo würde ich sonst einen Wert hinschreiben, kann ich auch eine Abfrage hinschreiben.'“
Elyndra: „Das ist eine gute Erklärung. WHERE AGE > 50 – statt 50 kann da auch eine Abfrage stehen.“
Kat: „Views finde ich super praktisch. Einmal schreiben, immer benutzen.“
Franz-Martin: „In der Praxis nutzen wir Views für Berichte. Die Controller fragen dann einfach SELECT * FROM monatsumsatz statt die 30-Zeilen-Abfrage.“
Nova: „Das ist Abstraktion, oder? Die müssen nicht wissen, wie es funktioniert.“
Elyndra: „Exakt. Views verstecken Komplexität.“
Tom: „Sollen wir korrelierte Subqueries erklären? Die sind heftig.“
Elyndra: „Als Bonus. Die meisten kommen erstmal mit einfachen Subqueries weit.“
Franz-Martin: „Morgen ist Zusammenfassung. Da können sie alles nochmal sehen.“
✅ Checkpoint: Hast du es verstanden?
Bevor du weitermachst, teste dein Wissen:
Quiz:
Frage 1: Was ist eine Subquery?
Frage 2: Wann benutzt du IN statt = bei einer Subquery?
Frage 3: Was ist ein View und wozu ist er gut?
Frage 4: Wie erstellst du einen View namens „aktive_kunden“?
Frage 5: Was bedeutet EXISTS in einer WHERE-Klausel?
Mini-Challenge:
Aufgabe:
Arbeite mit den Datenbanken:
- Finde alle Personen, die älter sind als das Durchschnittsalter. (Subquery)
- Finde alle Personen, die in einer Stadt wohnen, die mit „Nord“ anfängt. Nutze eine Subquery mit IN.
- Erstelle einen View namens
personen_stats, der für jeden Anfangsbuchstaben des Vornamens zeigt: Buchstabe, Anzahl Personen, Durchschnittsalter. - Nutze den View: Zeige nur Buchstaben mit mehr als 30 Personen.
- Finde mit NOT EXISTS alle Personen ohne Adresse.
Lösung:
Wir besprechen die Lösung am Anfang von Tag 10!
❓ Häufig gestellte Fragen
Frage 1: Sind Subqueries langsam?
Kommt drauf an. Einfache Subqueries sind meist kein Problem. Korrelierte Subqueries (die für jede Zeile neu laufen) können langsam sein. Oft lässt sich eine Subquery durch einen JOIN ersetzen – das ist manchmal schneller.
Frage 2: Kann ich Subqueries verschachteln?
Ja, beliebig tief. Aber: Ab 2-3 Ebenen wird es unlesbar. Besser Views nutzen oder die Abfrage anders strukturieren.
Frage 3: Kann ich durch einen View Daten ändern?
Manchmal ja (einfache Views), manchmal nein (Views mit JOINs, GROUP BY, Aggregatfunktionen). Für Anfänger: Views zum Lesen benutzen.
Frage 4: Werden Views bei jeder Abfrage neu berechnet?
Ja, ein View ist keine gespeicherte Ergebnistabelle. Bei jeder Abfrage wird die View-Definition ausgeführt. Für Performance-kritische Fälle gibt es „Materialized Views“ – aber nicht in MariaDB/MySQL.
Frage 5: Wie sehe ich alle Views in meiner Datenbank?
SHOW FULL TABLES WHERE Table_type = 'VIEW';
Frage 6: Kann ich in einer Subquery ORDER BY benutzen?
Nur wenn du auch LIMIT benutzt. Ansonsten wird ORDER BY in Subqueries ignoriert.
Frage 7: Tom sagte, sein Aha-Moment war „wo ein Wert steht, kann auch eine Abfrage stehen“. Ist das immer so?
Real talk: Ziemlich oft, ja! WHERE AGE > 50 → WHERE AGE > (SELECT AVG(AGE) FROM person). SELECT 'fix' AS spalte → SELECT (SELECT MAX(AGE) FROM person) AS max_alter. Das mentale Modell hilft: Überall, wo ein Wert erwartet wird, kann eine Subquery stehen, die einen Wert liefert. Nur bei Listen (IN, EXISTS) gelten leicht andere Regeln.
📚 Quiz-Lösungen
Hier sind die Antworten zum Quiz von oben:
Frage 1: Was ist eine Subquery?
Antwort:
Eine Subquery ist eine SELECT-Abfrage, die innerhalb einer anderen Abfrage steht. Sie wird zuerst ausgeführt, und ihr Ergebnis wird in der äußeren Abfrage verwendet.
Frage 2: Wann IN statt =?
Antwort:
=wenn die Subquery genau EINEN Wert liefertINwenn die Subquery MEHRERE Werte (eine Liste) liefert
WHERE x = (Subquery die 1 Wert liefert) WHERE x IN (Subquery die mehrere Werte liefert)
Frage 3: Was ist ein View?
Antwort:
Ein View ist eine gespeicherte Abfrage, die wie eine virtuelle Tabelle benutzt werden kann.
Vorteile:
- Wiederverwendbarkeit
- Vereinfachung komplexer Abfragen
- Abstraktion und Sicherheit
Frage 4: View „aktive_kunden“ erstellen?
Antwort:
CREATE VIEW aktive_kunden AS SELECT * FROM kunden WHERE ...; -- deine Bedingung
Beispiel:
CREATE VIEW aktive_kunden AS
SELECT k.* FROM kunden k
WHERE EXISTS (
SELECT 1 FROM bestellungen b
WHERE b.kunden_id = k.kunden_id
);
Frage 5: Was bedeutet EXISTS?
Antwort:
EXISTS prüft, ob eine Subquery mindestens eine Zeile zurückliefert.
WHERE EXISTS (Subquery)– wahr, wenn Subquery Ergebnisse hatWHERE NOT EXISTS (Subquery)– wahr, wenn Subquery leer ist
🎉 Tag 9 geschafft!
Fantastisch! Du bist jetzt auf Fortgeschrittenen-Level! 🚀
Das hast du heute gelernt:
- ✅ Subqueries in WHERE, SELECT und FROM
- ✅ IN, NOT IN, EXISTS, NOT EXISTS
- ✅ Views erstellen und benutzen
- ✅ Komplexe Probleme elegant lösen
Du kannst jetzt: Abfragen schreiben, die „von sich selbst abhängen“ – und wiederverwendbare Views für häufige Aufgaben erstellen.
Morgen kommt Tag 10 – die große Zusammenfassung und dein Mini-Projekt! 💪
Wie geht’s weiter?
Morgen (Tag 10): Zusammenfassung & Mini-Projekt
Was dich erwartet:
- Alles nochmal im Überblick
- Ein kleines Projekt zum Selbermachen
- Tipps für deine weitere SQL-Reise
- Abschluss-Zertifikat! 🎓
🛠️ Troubleshooting
Problem: „Subquery returns more than 1 row“
Lösung: Du benutzt = aber die Subquery liefert mehrere Zeilen. Nutze IN statt =, oder füge LIMIT 1 zur Subquery hinzu.
Problem: „Every derived table must have its own alias“
Lösung: Bei Subqueries in FROM musst du einen Alias angeben: FROM (SELECT ...) AS mein_alias
Problem: View erstellen schlägt fehl
Lösung: Prüfe, ob die SELECT-Abfrage alleine funktioniert. Wenn ja, prüfe ob der View-Name schon existiert (DROP VIEW IF EXISTS name;).
📖 Im Buch nachlesen
Mehr Details zu den heutigen Themen findest du in:
Kapitel 8: Subselects
- 8.1 Unterabfragen in WHERE
- 8.2 Unterabfragen in SELECT
- 8.3 Unterabfragen in FROM
- 8.4 Korrelierte Unterabfragen
Kapitel 10: Sichten (Views)
- 10.1 Views erstellen
- 10.2 Views benutzen
- 10.3 Views ändern und löschen
SQL Ressourcen & Weiterführende Links
Elyndra’s Schatzkiste – Alles, was du für deinen SQL-Lernweg brauchst
Du hast die 10 Tage SQL Basic Kurs geschafft (oder bist mittendrin) und willst mehr? Hier findest du handverlesene Ressourcen, die dich weiterbringen – von interaktiven Übungsplattformen bis zur offiziellen Dokumentation.
🎮 Interaktive Übungsplattformen
Übung macht den Meister. Diese Plattformen lassen dich SQL direkt im Browser ausprobieren – ohne Installation, ohne Risiko.
SQLBolt – Der Klassiker für Einsteiger
- Interaktive Lektionen mit sofortigem Feedback
- Perfekt strukturiert: SELECT → JOINs → Subqueries
- Keine Registrierung nötig
- Empfohlen für: Tag 5-8 unseres Kurses
SQLZoo – Echte Daten, echte Herausforderungen
- Seit über 20 Jahren der Goldstandard
- Übungen mit echten Datensätzen (Nobel-Preise, Fußball-WM, etc.)
- Progressiv schwieriger werdende Aufgaben
- Empfohlen für: Tag 9-10 und danach
W3Schools SQL Tutorial
- „Try it Yourself“ Editor bei jedem Beispiel
- Komplette Referenz aller SQL-Befehle
- Gut zum Nachschlagen
- Empfohlen für: Schnelles Nachschlagen während des Kurses
SQL Easy – Minimalistisch & Effektiv
- Reduziert auf das Wesentliche
- Sofort loslegen ohne Ablenkung
- Über 200.000 Lernende seit 2017
- Empfohlen für: Schnelle Wiederholung
Learn SQL Online
- Komplett kostenlos
- Interaktive Code-Beispiele
- Community-getrieben
- Empfohlen für: Zusätzliche Übungen
📚 Offizielle Dokumentation
Wenn du es genau wissen willst, führt kein Weg an der offiziellen Doku vorbei.
MariaDB Knowledge Base (Deutsch)
- Offizielle Dokumentation auf Deutsch
- Alle Befehle, Datentypen, Konfigurationen
- Das Nachschlagewerk für unseren Kurs
MariaDB.org Documentation
- Hauptdokumentation der MariaDB Foundation
- PDF-Download verfügbar
- Release Notes für alle Versionen
- Kostenlose Video-Kurse zu fortgeschrittenen Themen
MySQL Referenz
- Gilt zu 95% auch für MariaDB
- Sehr detailliert und umfangreich
- Englisch, aber sehr präzise
🛠️ Setup & Installation
Alles, was du brauchst, um SQL auf deinem Rechner zum Laufen zu bringen.
XAMPP – Das Rundum-Sorglos-Paket
- Apache + MariaDB + PHP in einem Paket
- Windows, Mac, Linux
- Unsere Empfehlung für den Kurs!
- Ein Klick → Datenbank läuft
MariaDB Standalone
🔗 mariadb.com/get-started-with-mariadb
- Offizielle Installationsanleitung
- Für alle Betriebssysteme
- Docker-Variante verfügbar
HeidiSQL – Der komfortable Client
- Kostenloser SQL-Client für Windows
- Grafische Oberfläche statt Kommandozeile
- Perfekt für Einsteiger
- Export/Import von Daten
DBeaver – Der Alleskönner
- Universeller Datenbank-Client
- Windows, Mac, Linux
- Unterstützt MySQL, MariaDB, PostgreSQL, Oracle, …
- Community Edition kostenlos
🇩🇪 Tutorials auf Deutsch
Nicht jeder mag englische Tutorials. Hier die besten deutschen Ressourcen.
IONOS Digital Guide
🔗 ionos.de – MySQL/MariaDB installieren
- Schritt-für-Schritt Installationsanleitung
- Screenshots für jeden Schritt
- Linux, Windows, Mac abgedeckt
Guru99 MariaDB Tutorial
🔗 guru99.com/de/mariadb-tutorial-install.html
- Übersetztes Tutorial
- Viele Screenshots
- Grundlagen gut erklärt
GeeksforGeeks SQL Tutorial
🔗 geeksforgeeks.org/sql-tutorial
- Sehr umfangreich
- Von Basics bis Advanced
- Viele Code-Beispiele
🎬 Video-Kurse (kostenlos)
Manchmal ist Zuschauen einfacher als Lesen.
freeCodeCamp – SQL Full Course
- Kompletter SQL-Kurs in einem Video
- 4+ Stunden Inhalt
- Sehr beliebt (Millionen Views)
- Englisch mit guter Aussprache
Bro Code – SQL Playlist
- Viral gegangen 2024
- Kurze, knackige Videos
- Schritt für Schritt
- Gut für Pausen zwischendurch
📅 Welche Ressource zu welchem Tag?
| Kurstag | Thema | Empfohlene Ressource |
|---|---|---|
| Tag 1 | Was ist eine Datenbank? | XAMPP installieren, MariaDB Doku |
| Tag 2 | Tabellen & Beziehungen | W3Schools Referenz |
| Tag 3 | Schlüssel | MariaDB Knowledge Base |
| Tag 4 | CREATE TABLE | SQLBolt Lesson 16-17 |
| Tag 5 | SELECT Basics | SQLBolt Lesson 1-4 |
| Tag 6 | WHERE & Filter | SQLBolt Lesson 2-4 |
| Tag 7 | GROUP BY | SQLBolt Lesson 10-11 |
| Tag 8 | HAVING | SQLZoo SUM and COUNT |
| Tag 9 | JOINs | SQLBolt Lesson 6-7, SQLZoo JOIN |
| Tag 10 | Subqueries | SQLZoo SELECT within SELECT |
💡 Elyndra’s Pro-Tipps
„Die beste Ressource ist die, die du auch benutzt.“
- Nicht alles auf einmal – Wähle EINE Übungsplattform und bleib dabei
- Täglich 15 Minuten schlägt einmal pro Woche 2 Stunden
- Fehler sind Lernchancen – Jede Fehlermeldung bringt dich weiter
- Eigene Datenbank – Sobald du kannst, arbeite mit eigenen Daten
- Community nutzen – Stack Overflow, Reddit r/SQL, Discord-Server
🚀 Nach dem Kurs: Wie geht’s weiter?
Du hast die Basics drauf? Hier sind die nächsten Schritte:
Fortgeschrittene Themen
- Window Functions – OVER(), PARTITION BY, ROW_NUMBER()
- CTEs – Common Table Expressions (WITH-Klausel)
- Stored Procedures – Wiederverwendbare SQL-Skripte
- Indexe & Performance – Queries optimieren
Weiterführende Kurse
- SQLCourse.com Advanced – Fortgeschrittene Themen
- Mode Analytics SQL Tutorial – Für Data Analytics
- LeetCode SQL – Übungen für Bewerbungen
Zertifizierungen
- Oracle Database SQL Certified Associate
- Microsoft Azure Data Fundamentals (DP-900)
- Google Data Analytics Certificate
📥 Downloads aus unserem Kurs
- versandhandel.sql – Unsere Übungsdatenbank (5 Tabellen)
- adressen.sql – 601 Personen, 1523 Adressen
Fragen? Feedback?
Schreib uns in die Kommentare oder kontaktiere das Java Fleet Team!
Letzte Aktualisierung: Dezember 2024
Zusammengestellt von Elyndra Valen – Senior Database Architect
💬 Feedback?
War heute zu viel? Oder genau richtig für den vorletzten Tag?
Schreib uns: elyndra.valen@java-developer.online
Bis morgen zum großen Finale! 👋
Elyndra
SQL Basic – Tag 9 von 10
© Java Fleet Systems Consulting
www.java-developer.online

