Files
ihk-ausbildung/1-Ausbildungsjahr/LF3-Datenbanken/LF3-04-SQL-Abfragen.md

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*