PostgreSQL - Unterabfragen

Hallo da draußen, angehende Datenbankenthusiasten! Heute tauchen wir ein in die faszinierende Welt der PostgreSQL-Unterabfragen. Stellt euch Unterabfragen als kleine Helfer vor, die eurer Hauptabfrage dabei assistieren, Daten abzurufen oder zu manipulieren. Sie sind wie die treuen Sidekicks in euren Lieblings-Superheldenfilmen – nicht immer im Rampenlicht, aber unerlässlich, um die Arbeit zu erledigen!

PostgreSQL - Sub Queries

Unterabfragen mit der SELECT-Anweisung

fangen wir mit der häufigsten Verwendung von Unterabfragen an – innerhalb einer SELECT-Anweisung. Stellt euch vor, ihr führt ein Buchgeschäft und wollt herausfinden, welche Bücher über dem Durchschnittspreis liegen. Hier ist, wie ihr das macht:

SELECT title, price
FROM books
WHERE price > (SELECT AVG(price) FROM books);

In dieser Abfrage ist der Teil (SELECT AVG(price) FROM books) unsere Unterabfrage. Sie berechnet den Durchschnittspreis aller Bücher, und dann verwendet unsere Hauptabfrage diesen Wert, um die Ergebnisse zu filtern.

Lassen wir es auseinanderfallen:

  1. Die Unterabfrage berechnet den Durchschnittspreis.
  2. Die Hauptabfrage vergleicht dann den Preis jedes Buches mit diesem Durchschnitt.
  3. Nur Bücher mit einem Preis über dem Durchschnitt werden zurückgegeben.

Hier ist noch ein weiteres Beispiel. Angenommen, ihr wollt alle Kunden finden, die Bestellungen aufgegeben haben:

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);

In diesem Fall gibt unsere Unterabfrage (SELECT DISTINCT customer_id FROM orders) eine Liste von Kunden-IDs zurück, die Bestellungen aufgegeben haben. Die Hauptabfrage verwendet dann diese Liste, um die Tabelle der Kunden zu filtern.

Unterabfragen mit der INSERT-Anweisung

Nun schauen wir uns an, wie Unterabfragen mit INSERT-Anweisungen verwendet werden können. Stellt euch vor, ihr erstellt eine 'featured books'-Tabelle und wollt sie mit allen Büchern füllen, die mehr als 1000 Exemplare verkauft haben:

INSERT INTO featured_books (book_id, title, author)
SELECT book_id, title, author
FROM books
WHERE book_id IN (SELECT book_id FROM sales WHERE copies_sold > 1000);

Hierfindet unsere Unterabfrage (SELECT book_id FROM sales WHERE copies_sold > 1000) alle Bücher, die mehr als 1000 Exemplare verkauft haben. Die Hauptabfrage fügt dann die Details dieser Bücher in die 'featured_books'-Tabelle ein.

Unterabfragen mit der UPDATE-Anweisung

Unterabfragen können auch unglaublich nützlich in UPDATE-Anweisungen sein. Angenommen, ihr wollt allen Büchern von Autoren, die mehr als 5 Bücher geschrieben haben, einen Rabatt von 10 % gewähren:

UPDATE books
SET price = price * 0.9
WHERE author_id IN (
SELECT author_id
FROM books
GROUP BY author_id
HAVING COUNT(*) > 5
);

In diesem Beispiel identifiziert unsere Unterabfrage Autoren, die mehr als 5 Bücher geschrieben haben. Die Hauptabfrage aktualisiert dann die Preise aller Bücher dieser Autoren.

Unterabfragen mit der DELETE-Anweisung

Schließlich schauen wir uns an, wie Unterabfragen mit DELETE-Anweisungen verwendet werden können. Stellt euch vor, ihr wollt alle Bestellungen von Kunden entfernen, die in den letzten 12 Monaten kein Kauf getätigt haben:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_purchase_date < CURRENT_DATE - INTERVAL '1 year'
);

Hierfindet unsere Unterabfrage alle Kunden, die in den letzten 12 Monaten keinen Kauf getätigt haben. Die Hauptabfrage löscht dann alle Bestellungen dieser Kunden.

Gemeinsame Unterabfrage-Methoden

Hier ist eine Tabelle der gemeinsamen Unterabfrage-Methoden in PostgreSQL:

Methode Beschreibung Beispiel
IN Überprüft, ob ein Wert im Ergebnisselement der Unterabfrage enthalten ist WHERE id IN (SELECT id FROM table)
EXISTS Überprüft, ob die Unterabfrage Zeilen zurückgibt WHERE EXISTS (SELECT 1 FROM table WHERE condition)
ANY Gibt wahr zurück, wenn irgendeiner der Unterabfrage-Werte die Bedingung erfüllt WHERE column > ANY (SELECT column FROM table)
ALL Gibt wahr zurück, wenn alle Unterabfrage-Werte die Bedingung erfüllen WHERE column > ALL (SELECT column FROM table)

Denkt daran, Übung macht den Meister! Versucht, eigene Abfragen zu schreiben, experimentiert mit verschiedenen Szenarien und habt keine Angst vor Fehlern. So lernen und wachsen wir in der wunderbaren Welt der Datenbanken!

Bevor wir schließen, hier eine kleine Geschichte aus meiner Lehrerfahrung. Ich hatte einmal einen Schüler, der mit Unterabfragen kämpfte. Er vermischte ständig die Hauptabfrage mit der Unterabfrage. Also sagte ich ihm, er solle sich die Unterabfrage wie eine russische Puppenhaus vorstellen – die kleinste Puppe (Unterabfrage) passt in die größere (Hauptabfrage). Diese Vorstellung half ihm, den Begriff zu verstehen, und bald schrieb er komplexe Abfragen wie ein Profi!

Ich hoffe, diese Anleitung hat euch geholfen, PostgreSQL-Unterabfragen zu entmystifizieren. Weiter abfragen, weiter lernen und vor allem: Spass an Datenbanken haben!

Credits: Image by storyset