Montag, 2026-01-26_Datenbanken_KNO
Subqueries (Unterabfragen)
- Eine Subquery ist eine SQL-Abfrage, die innerhalb einer anderen Abfrage verwendet wird.
- Sie dient dazu, komplexe Fragestellungen in mehrere logisch aufeinanderfolgende Schritte zu zerlegen.
- Subqueries können – abhängig vom Kontext – unterschiedliche Ergebnistypen liefern:
- Skalar (ein einzelner Wert)
- Liste (eine Spalte mit mehreren Werten)
- Tabelle (mehrere Spalten und Zeilen)
Verwendung von Subqueries in SQL-Klauseln
SELECT erwartet:
- Skalar (z. B. Aggregat oder Berechnung)
- Liste
- Tabelle
WHERE erwartet:
- Skalar
- Liste (z. B. mit
IN)
- Tabelle (z. B. mit
EXISTS)
FROM erwartet:
- Tabelle
HAVING erwartet:
- Skalar
- Liste
JOIN erwartet:
- Tabelle
INSERT erwartet:
- Tabelle
UPDATE erwartet:
- Skalar
DELETE erwartet:
- Skalar
CREATE TABLE erwartet:
- Tabelle
WITH ... AS (SELECT ...) (Common Table Expression, CTE) erwartet:
- Tabelle
Beispiel: Common Table Expression (CTE)
WITH dept_count AS (
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
)
SELECT *
FROM dept_count
WHERE emp_count > 10;
Beispiele für Subqueries
Skalare Subquery (Einzelwert)
SELECT name
FROM employees
WHERE department_id = (
SELECT id
FROM departments
WHERE name = 'Sales'
);
Subquery mit Liste (IN)
SELECT name
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
WHERE location = 'New York'
);
Subquery mit Aggregatfunktion
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Korrelierte Subquery (Bezug auf äußere Abfrage)
SELECT name,
(SELECT COUNT(*)
FROM orders
WHERE orders.employee_id = employees.id) AS order_count
FROM employees;
Weitere Eigenschaften von Subqueries
- Subqueries können selbst weitere Subqueries enthalten (Verschachtelung).
- Sie können als Ausdruck, Filter oder Datenquelle eingesetzt werden.
- Korrelierte Subqueries werden für jede Zeile der äußeren Abfrage erneut ausgewertet.
- Subqueries können die Performance negativ beeinflussen, wenn sie ungünstig eingesetzt werden.
- Wichtige Optimierungsmaßnahmen:
- Vermeidung unnötiger Subqueries
- Verwendung von
JOINs, wenn sie funktional gleichwertig und effizienter sind
- Einsatz von Indizes auf beteiligten Spalten
- Nutzung von CTEs (
WITH) zur besseren Lesbarkeit und Wartbarkeit
- Analyse der Ausführungspläne (Query Execution Plans)
- Vergleich von Abfragen mit und ohne Subqueries
- Gezielter Einsatz von
EXISTS oder IN, abhängig vom Anwendungsfall