264 lines
5.1 KiB
Markdown
264 lines
5.1 KiB
Markdown
# 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.
|
|
|
|
```sql
|
|
-- 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.
|
|
|
|
```sql
|
|
-- 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.
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
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
|
|
|
|
```sql
|
|
-- 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.
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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.
|
|
|
|
```sql
|
|
-- Alle Produkte, die teurer als der Durchschnitt sind
|
|
SELECT Name, Preis
|
|
FROM Produkt
|
|
WHERE Preis > (SELECT AVG(Preis) FROM Produkt);
|
|
```
|
|
|
|
### Unterabfrage mit IN
|
|
|
|
```sql
|
|
-- 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.
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
- [[LF3-03-SQL-Grundlagen|Zurück: SQL-Grundlagen]]
|
|
- [[LF3-05-Datenbankmanagement|Nächstes Thema: Datenbankmanagement]]
|
|
- [[LF5-03-Programmierung|Programmierung]]
|
|
|
|
---
|
|
|
|
*Stand: 2024*
|