5. Daten abfragen

Daten abfragen

In diesem Kapitel lernst du, wie du Daten aus mehreren Tabellen gezielt kombinierst, um noch präzisere und aussagekräftigere Abfragen zu erstellen. Häufig liegen relevante Informationen in relationalen Datenbanken auf verschiedene Tabellen verteilt – sei es, um Redundanzen zu vermeiden oder komplexe Datenstrukturen abzubilden. Um diese Daten effizient auszuwerten, ist es entscheidend, die richtigen Techniken zu beherrschen, um Tabellen sinnvoll zu verknüpfen, Ergebnisse zusammenzuführen oder Teilabfragen zu nutzen.

Wir werden uns daher ausführlich mit den verschiedenen Arten von JOINs beschäftigen, lernen, wie UNION unterschiedliche Datenmengen zusammenführen, und verstehen, wie Unterabfragen (Subqueries) dabei helfen können, komplexe Fragestellungen elegant zu lösen. Dabei legen wir besonderen Wert auf praxisnahe Beispiele und typische Anwendungsfälle, damit du die Konzepte nicht nur theoretisch verstehst, sondern sie sicher und gezielt im eigenen SQL-Alltag anwenden kannst. Am Ende dieses Kapitels wirst du in der Lage sein, selbst anspruchsvolle Analysen zu erstellen und Daten effizienter auszuwerten.

5.1 JOINs

JOINs sind eines der mächtigsten Werkzeuge in SQL, um Daten aus mehreren Tabellen zu kombinieren. Sie basieren auf einer Beziehung zwischen den Tabellen – meist über Primär- und Fremdschlüssel. Wenn Daten logisch miteinander verbunden sind, ermöglichen JOINs, diese Beziehungen in einer einzigen Abfrage darzustellen.

INNER JOIN

Der INNER JOIN gibt nur die Datensätze zurück, bei denen die Verknüpfungsbedingung in beiden Tabellen erfüllt ist. Wenn ein Datensatz in einer Tabelle keine passende Entsprechung in der anderen Tabelle hat, wird er nicht angezeigt.

SELECT spalten
FROM tabelle1
INNER JOIN tabelle2
ON tabelle1.spalte = tabelle2.spalte;

Beispiel:

SELECT benutzer.name, bestellungen.datum
FROM benutzer
INNER JOIN bestellungen
ON benutzer.id = bestellungen.benutzer_id;

Erklärung: Nur Benutzer, die tatsächlich Bestellungen haben, erscheinen im Ergebnis. Datensätze ohne passende Bestellung werden ausgeschlossen.

Praxis-Tipp: Verwende INNER JOIN, wenn du nur zusammenhängende Daten sehen möchtest. Gut geeignet für Berichte, in denen unvollständige Daten nicht relevant sind.

LEFT JOIN

Der LEFT JOIN (oder LEFT OUTER JOIN) gibt alle Datensätze aus der linken Tabelle zurück, auch wenn keine passende Entsprechung in der rechten Tabelle existiert. Fehlt eine Übereinstimmung, erscheinen anstelle der fehlenden Werte NULL.

SELECT benutzer.name, bestellungen.datum
FROM benutzer
LEFT JOIN bestellungen
ON benutzer.id = bestellungen.benutzer_id;

Erklärung: Jeder Benutzer wird angezeigt, selbst wenn er keine Bestellung hat. Bei fehlenden Bestellungen zeigt die Spalte datum NULL.

Praxis-Tipp: Ideal, wenn du vollständige Listen benötigst, z. B. alle Kunden, auch wenn sie noch nichts gekauft haben. Oft in Dashboards oder Reports genutzt, um Lücken in den Daten sichtbar zu machen.

RIGHT JOIN

Der RIGHT JOIN funktioniert wie der LEFT JOIN, aber spiegelt die Perspektive: Alle Datensätze aus der rechten Tabelle werden angezeigt.

SELECT benutzer.name, bestellungen.datum
FROM benutzer
RIGHT JOIN bestellungen
ON benutzer.id = bestellungen.benutzer_id;

Erklärung: Jede Bestellung wird angezeigt, auch wenn der Benutzer nicht in der benutzer-Tabelle existiert. Fehlende Benutzerdaten erscheinen als NULL.

Praxis-Tipp: Wird seltener genutzt als LEFT JOIN. Hilfreich, wenn die „rechte“ Tabelle die Hauptquelle ist, z. B. alle Bestellungen unabhängig von der Benutzerregistrierung.

FULL JOIN

Der FULL JOIN (oder FULL OUTER JOIN) kombiniert LEFT JOIN und RIGHT JOIN: Alle Datensätze aus beiden Tabellen werden angezeigt. Wenn es keine Übereinstimmung gibt, erscheinen NULL-Werte.

SELECT benutzer.name, bestellungen.datum
FROM benutzer
FULL JOIN bestellungen
ON benutzer.id = bestellungen.benutzer_id;

Erklärung: Benutzer ohne Bestellungen und Bestellungen ohne zugehörigen Benutzer werden angezeigt. Praktisch für Datenanalysen, um Lücken oder Inkonsistenzen zwischen Tabellen zu identifizieren.

Praxis-Tipp: FULL JOIN wird eher in Analyse- oder Prüf-Abfragen eingesetzt. Kann große Ergebnisse erzeugen, daher bei sehr großen Tabellen vorsichtig verwenden.

Visualisierung in Worten

  • INNER JOIN: Nur das „Schnittfeld“ der beiden Tabellen.
  • LEFT JOIN: Alles links + passende Daten rechts, sonst NULL.
  • RIGHT JOIN: Alles rechts + passende Daten links, sonst NULL.
  • FULL JOIN: Alles aus beiden Tabellen, überall NULL, wo keine Übereinstimmung existiert.

5.2 UNION

Die UNION-Klausel wird verwendet, um die Ergebnisse von zwei oder mehr SELECT-Anweisungen zu kombinieren. Dabei müssen die Anzahl und die Reihenfolge der Spalten in allen SELECT-Anweisungen gleich sein. UNION entfernt standardmäßig doppelte Zeilen.

Syntax

SELECT spalte1, spalte2
FROM tabelle1
UNION
SELECT spalte1, spalte2
FROM tabelle2;

Beispiel

Angenommen, wir möchten die Namen aller Benutzer und Mitarbeiter in einer einzigen Liste kombinieren:

SELECT name
FROM benutzer
UNION
SELECT name
FROM mitarbeiter;

Erklärung: – Die Abfrage kombiniert die Ergebnisse beider Tabellen. – Doppelte Namen werden automatisch entfernt.

UNION ALL

Wenn du die doppelten Zeilen behalten möchtest, verwendest du UNION ALL:

SELECT name
FROM benutzer
UNION ALL
SELECT name
FROM mitarbeiter;

Praxis-Tipp:UNION ALL ist schneller als UNION, da keine Duplikate entfernt werden müssen. – Nützlich, wenn du die vollständige Datenmenge behalten willst, z. B. für Analyse oder Statistik.

Typische Anwendungsfälle

  • Daten aus mehreren Filialen, Regionen oder Datenquellen zusammenführen.
  • Berichte erstellen, in denen unterschiedliche Tabellen zusammen dargestellt werden müssen.
  • Alte und neue Datensätze kombinieren, z. B. historische Daten mit aktuellen Daten.

Wichtige Hinweise

  • Die Spaltenanzahl und der Datentyp müssen übereinstimmen.
  • UNION entfernt standardmäßig doppelte Zeilen.
  • UNION ALL behält alle Zeilen, kann aber größere Ergebnisse erzeugen.

5.3 Unterabfragen (Subqueries)

Eine Unterabfrage (Subquery) ist eine Abfrage, die innerhalb einer anderen Abfrage verschachtelt ist. Unterabfragen können in SELECT, INSERT, UPDATE, DELETE oder sogar in einer anderen Unterabfrage verwendet werden. Sie ermöglichen komplexe Fragestellungen, die mit einer einzigen Abfrage schwer zu lösen wären.

Einfaches Beispiel

Um alle Benutzer abzurufen, die mindestens eine Bestellung aufgegeben haben:

SELECT name
FROM benutzer
WHERE id IN (SELECT benutzer_id FROM bestellungen);

Erklärung: – Die innere Abfrage (SELECT benutzer_id FROM bestellungen) liefert alle Benutzer-IDs, die Bestellungen haben. – Die äußere Abfrage filtert die Benutzer, deren ID in dieser Liste enthalten ist.

Korrelierte Unterabfragen

Eine korrelierte Unterabfrage bezieht sich auf Werte der äußeren Abfrage. Sie wird für jede Zeile der äußeren Abfrage neu ausgewertet.

SELECT name
FROM benutzer b
WHERE EXISTS (
  SELECT 1
  FROM bestellungen bo
  WHERE bo.benutzer_id = b.id
);

Erklärung: – Die Unterabfrage prüft für jeden Benutzer, ob eine Bestellung existiert. – EXISTS liefert TRUE, wenn mindestens eine Zeile gefunden wird.

Skalare Unterabfragen

Eine skalare Unterabfrage liefert genau einen Wert zurück. Sie kann direkt in der SELECT-Liste verwendet werden:

SELECT name,
       (SELECT COUNT(*) FROM bestellungen WHERE benutzer_id = b.id) AS bestellanzahl
FROM benutzer b;

Erklärung: – Für jeden Benutzer wird die Anzahl seiner Bestellungen berechnet. – Das Ergebnis wird als neue Spalte bestellanzahl angezeigt.

Praxis-Tipps

  • Unterabfragen sind hilfreich, wenn man Daten filtern oder aggregieren möchte, die von anderen Tabellen abhängen.
  • Korrelierte Unterabfragen können langsam sein, besonders bei großen Tabellen – manchmal lohnt sich ein JOIN.
  • Skalare Unterabfragen eignen sich gut, um einzelne Werte pro Zeile zu berechnen.

5.4 Zusammenfassung

In diesem Kapitel hast du gelernt, wie du Daten aus mehreren Tabellen mit JOINs kombinierst, um gezielt Informationen aus relationalen Datenbanken abzurufen. Du weißt nun, wie du Ergebnisse von Abfragen mit UNION zusammenführen kannst, um Daten aus verschiedenen Tabellen in einer Liste zu vereinen. Außerdem hast du erfahren, wie Unterabfragen eingesetzt werden, um komplexe Fragestellungen elegant zu lösen und Daten gezielt zu filtern oder aggregieren. Mit diesen Techniken bist du in der Lage, anspruchsvolle Analysen zu erstellen, Daten effizient auszuwerten und sie für Berichte oder weitere Analysen optimal aufzubereiten.

Quiz zu Daten abfragen

Teste dein Wissen mit diesen Fragen:

  1. Welcher JOIN-Typ gibt nur die Datensätze zurück, bei denen die JOIN-Bedingung in beiden Tabellen erfüllt ist?

    • a) LEFT JOIN

    • b) INNER JOIN

    • c) FULL JOIN

  2. Wie kombinierst du die Ergebnisse von zwei SELECT-Anweisungen, ohne doppelte Zeilen zu entfernen?

    • a) UNION

    • b) UNION ALL

    • c) JOIN

  3. Was ist eine Unterabfrage?

    • a) Eine Abfrage, die in einer anderen Abfrage verschachtelt ist.

    • b) Eine Abfrage, die nur eine Spalte zurückgibt.

    • c) Eine Abfrage, die nur eine Zeile zurückgibt.