PostgreSQL Unterabfragen
Unterabfragen in PostgreSQL sind verschachtelte Abfragen, die innerhalb einer Hauptabfrage verwendet werden, um komplexe Filterungen oder Berechnungen durchzuführen. Sie ermöglichen es dir, Teile von SQL-Abfragen zu isolieren und Zwischenergebnisse zu verwenden, um die endgültige Abfrageausgabe zu formulieren.
Verwendung
Unterabfragen werden in der Regel in SELECT, INSERT, UPDATE oder DELETE Anweisungen verwendet, um komplexe SQL-Operationen in einfachere, leichter zu handhabende Komponenten zu zerlegen. Sie sind in Klammern eingeschlossen und können einen einzelnen Wert oder eine Gruppe von Werten zurückgeben, die von der Hauptabfrage verwendet werden.
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (SELECT column FROM table WHERE condition);
In dieser Syntax wird die Subquery innerhalb einer WHERE Klausel verwendet, um die Ergebnisse auf der Grundlage der Ausgabe der verschachtelten Abfrage zu filtern.
Beispiele
1. Einfache Unterabfrage in der WHERE-Klausel
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > '2023-01-01');
In diesem Beispiel werden Kunden, die nach dem 1. Januar 2023 bestellt haben, mit einer Unterabfrage innerhalb der WHERE Klausel abgerufen.
2. Subquery in SELECT-Anweisung
SELECT product_id,
(SELECT AVG(price) FROM products) AS average_price
FROM products;
Hier berechnet eine Unterabfrage den Durchschnittspreis aller Produkte und stellt ihn neben der ID jedes Produkts dar.
3. Unterabfrage mit EXISTS verwenden
SELECT supplier_id, supplier_name
FROM suppliers
WHERE EXISTS (SELECT * FROM products WHERE suppliers.supplier_id = products.supplier_id AND products.stock > 0);
In diesem Beispiel wird nach Lieferanten gesucht, die Produkte auf Lager haben, indem eine EXISTS Bedingung zum Filtern der Ergebnisse verwendet wird.
4. Unterabfrage in INSERT-Anweisung
INSERT INTO sales_summary (product_id, total_sales)
SELECT product_id, SUM(sales_amount)
FROM sales
WHERE sale_date > '2023-01-01'
GROUP BY product_id;
In diesem Beispiel wird eine Unterabfrage verwendet, um die Verkaufsdaten zu aggregieren und die Ergebnisse in eine zusammenfassende Tabelle einzufügen.
5. Unterabfrage in der UPDATE-Anweisung
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');
Hier findet die Unterabfrage die Kategorie-ID für "Elektronik", und die Hauptabfrage aktualisiert die Preise für diese Produkte.
6. Subquery in DELETE-Anweisung
DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_items WHERE quantity = 0);
In diesem Beispiel werden Bestellungen gelöscht, die laut einer Unterabfrage keine Artikel enthalten.
7. Beispiel für eine korrelierte Unterabfrage
SELECT employee_id, employee_name
FROM employees e
WHERE EXISTS (SELECT 1 FROM sales s WHERE s.employee_id = e.employee_id AND s.amount > 1000);
Eine korrelierte Unterabfrage verweist auf Spalten aus der äußeren Abfrage, hier auf Mitarbeiter mit einem Umsatz von über 1000 USD.
Tipps und bewährte Praktiken
- Optimiere die Leistung. Setze Unterabfragen klug ein; ziehe in Betracht, relevante Spalten zu indizieren oder Abfragen umzustrukturieren, um die Ausführungszeit zu minimieren.
- Verwende Unterabfragen für Modularität. Zerlege komplexe Abfragen in Unterabfragen, um sie leichter verwalten und lesen zu können.
- Nutze korrelierte Unterabfragen sorgfältig. Korrelierte Unterabfragen sind leistungsstark, können aber die Leistung beeinträchtigen, da sie einmal pro Zeile in der äußeren Abfrage ausgeführt werden.
- Erwäge,
EXISTSfür die Existenzprüfung zu verwenden. Das ist oft effizienter als der Vergleich von Subquery-Ergebnissen mit Operatoren wieIN.