Initial commit: IHK Ausbildung materials
This commit is contained in:
263
1-Ausbildungsjahr/LF3-Datenbanken/LF3-04-SQL-Abfragen.md
Normal file
263
1-Ausbildungsjahr/LF3-Datenbanken/LF3-04-SQL-Abfragen.md
Normal file
@@ -0,0 +1,263 @@
|
||||
# 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*
|
||||
Reference in New Issue
Block a user