Files

5.1 KiB

3.4 SQL-Abfragen

JOINs - Tabellen verknüpfen

JOINs verbinden Daten aus mehreren Tabellen.

Arten von JOINs

JOIN-Typen
├── INNER JOIN
├── LEFT OUTER JOIN
├── RIGHT OUTER JOIN
├── FULL OUTER JOIN
└── CROSS JOIN

INNER JOIN

Gibt nur übereinstimmende Zeilen zurück.

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

-- Beispiel: Kunden mit Bestellungen
SELECT Kunde.Name, Bestellung.Datum
FROM Kunde
INNER JOIN Bestellung ON Kunde.Kunden_ID = Bestellung.Kunden_ID;

-- Kurzschreibweise (impliziter Join)
SELECT Kunde.Name, Bestellung.Datum
FROM Kunde, Bestellung
WHERE Kunde.Kunden_ID = Bestellung.Kunden_ID;

LEFT OUTER JOIN

Gibt alle Zeilen der linken Tabelle zurück.

-- Alle Kunden, auch ohne Bestellung
SELECT Kunde.Name, Bestellung.Datum
FROM Kunde
LEFT OUTER JOIN Bestellung ON Kunde.Kunden_ID = Bestellung.Kunden_ID;

RIGHT OUTER JOIN

Gibt alle Zeilen der rechten Tabelle zurück.

-- Alle Bestellungen, auch ohne Kunden
SELECT Kunde.Name, Bestellung.Datum
FROM Kunde
RIGHT OUTER JOIN Bestellung ON Kunde.Kunden_ID = Bestellung.Kunden_ID;

Mehrere JOINs

SELECT
    Kunde.Name,
    Bestellung.Datum,
    Produkt.Name AS Produkt
FROM Kunde
INNER JOIN Bestellung ON Kunde.Kunden_ID = Bestellung.Kunden_ID
INNER JOIN BestellPosition ON Bestellung.Bestell_ID = BestellPosition.Bestell_ID
INNER JOIN Produkt ON BestellPosition.Produkt_ID = Produkt.Produkt_ID;

Aggregatfunktionen

Aggregatfunktionen fassen mehrere Zeilen zu einem Ergebnis zusammen.

Funktion Beschreibung Beispiel
COUNT() Anzahl der Zeilen COUNT(*)
SUM() Summe SUM(Preis)
AVG() Durchschnitt AVG(Preis)
MIN() Minimum MIN(Preis)
MAX() Maximum MAX(Preis)

Beispiele

-- Anzahl der Kunden
SELECT COUNT(*) AS AnzahlKunden FROM Kunde;

-- Summe aller Bestellungen
SELECT SUM(Gesamtbetrag) AS Gesamtumsatz FROM Bestellung;

-- Durchschnittspreis
SELECT AVG(Preis) AS Durchschnittspreis FROM Produkt;

-- Minimale/Maximale Bestellung
SELECT MIN(Gesamtbetrag) AS KleinsteBestellung,
       MAX(Gesamtbetrag) AS GrößteBestellung
FROM Bestellung;

GROUP BY - Gruppierung

Gruppiert Ergebnisse nach bestimmten Kriterien.

-- Umsatz pro Kunde
SELECT Kunden_ID, SUM(Gesamtbetrag) AS Umsatz
FROM Bestellung
GROUP BY Kunden_ID;

-- Anzahl Bestellungen pro Kunde
SELECT Kunden_ID, COUNT(*) AS AnzahlBestellungen
FROM Bestellung
GROUP BY Kunden_ID;

-- Umsatz pro Kategorie
SELECT Kategorie, SUM(Preis) AS Gesamtumsatz
FROM Produkt
GROUP BY Kategorie;

HAVING - Filter nach Aggregation

-- Kunden mit mehr als 3 Bestellungen
SELECT Kunden_ID, COUNT(*) AS Anzahl
FROM Bestellung
GROUP BY Kunden_ID
HAVING COUNT(*) > 3;

Unterabfragen (Subqueries)

Unterabfragen sind verschachtelte SELECT-Anweisungen.

Skalar-Unterabfrage

Gibt einen einzelnen Wert zurück.

-- Alle Produkte, die teurer als der Durchschnitt sind
SELECT Name, Preis
FROM Produkt
WHERE Preis > (SELECT AVG(Preis) FROM Produkt);

Unterabfrage mit IN

-- Kunden, die mindestens eine Bestellung haben
SELECT Name
FROM Kunde
WHERE Kunden_ID IN (SELECT Kunden_ID FROM Bestellung);

Korrelierte Unterabfrage

Referenziert Spalten der äußeren Abfrage.

-- Produkte mit dem höchsten Preis pro Kategorie
SELECT Name, Preis, Kategorie
FROM Produkt p1
WHERE Preis = (
    SELECT MAX(Preis)
    FROM Produkt p2
    WHERE p1.Kategorie = p2.Kategorie
);

ORDER BY - Sortierung

-- Aufsteigend (Standard)
SELECT * FROM Produkt ORDER BY Preis;

-- Absteigend
SELECT * FROM Produkt ORDER BY Preis DESC;

-- Mehrere Sortierspalten
SELECT * FROM Bestellung
ORDER BY Datum DESC, Gesamtbetrag DESC;

LIMIT / TOP - Ergebnismenge begrenzen

-- MySQL/MariaDB
SELECT * FROM Produkt ORDER BY Preis DESC LIMIT 10;

-- SQL Server
SELECT TOP 10 * FROM Produkt ORDER BY Preis DESC;

-- PostgreSQL
SELECT * FROM Produkt ORDER BY Preis DESC LIMIT 10;

Übung: Komplexe Abfragen

Ausgangsdaten

-- Kunden (ID, Name, Stadt)
-- Bestellungen (ID, Kunden_ID, Datum, Gesamtbetrag)
-- BestellPositionen (Bestell_ID, Produkt_ID, Menge, Preis)

Aufgaben

  1. Finde die 5 umsatzstärksten Kunden
  2. Liste alle Bestellungen mit Kundenname
  3. Zeige den durchschnittlichen Bestellwert pro Stadt

Lösungen

-- 1. Top 5 Kunden
SELECT K.Name, SUM(B.Gesamtbetrag) AS Umsatz
FROM Kunde K
JOIN Bestellung B ON K.Kunden_ID = B.Kunden_ID
GROUP BY K.Kunden_ID, K.Name
ORDER BY Umsatz DESC
LIMIT 5;

-- 2. Bestellungen mit Kundenname
SELECT B.Bestell_ID, K.Name, B.Datum, B.Gesamtbetrag
FROM Bestellung B
JOIN Kunde K ON B.Kunden_ID = K.Kunden_ID
ORDER BY B.Datum DESC;

-- 3. Durchschnittsbestellwert pro Stadt
SELECT K.Stadt, AVG(B.Gesamtbetrag) AS Durchschnitt
FROM Kunde K
JOIN Bestellung B ON K.Kunden_ID = B.Kunden_ID
GROUP BY K.Stadt;

Querverweise


Stand: 2024