Eine Subquery (Unterabfrage) in einer WHERE-Klausel schreiben
In diesem Schritt lernen Sie, wie Sie eine Unterabfrage (subquery) innerhalb der WHERE-Klausel einer SQL-Abfrage verwenden. Eine Unterabfrage, auch bekannt als innere Abfrage (inner query) oder verschachtelte Abfrage (nested query), ist eine Abfrage, die in eine andere Abfrage eingebettet ist. Unterabfragen werden verwendet, um Daten zurückzugeben, die in der Hauptabfrage als Bedingung verwendet werden, um die abzurufenden Daten weiter einzuschränken.
Grundlegendes zu Unterabfragen in der WHERE-Klausel
Eine Unterabfrage in der WHERE-Klausel wird typischerweise verwendet, um den Wert einer Spalte mit dem Ergebnis der Unterabfrage zu vergleichen. Die Unterabfrage wird zuerst ausgeführt, und ihr Ergebnis wird dann von der äußeren Abfrage verwendet.
Grundlegende Syntax:
SELECT column1, column2
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
Hier gibt die Unterabfrage (SELECT column_name FROM another_table WHERE condition) eine Menge von Werten zurück. Die äußere Abfrage wählt dann Zeilen aus table_name aus, bei denen column_name in dieser Menge enthalten ist.
Szenario:
Nehmen wir an, Sie haben zwei Tabellen: employees (Mitarbeiter) und departments (Abteilungen). Die Tabelle employees enthält Informationen über Mitarbeiter, einschließlich ihrer employee_id (Mitarbeiter-ID), employee_name (Mitarbeitername) und department_id (Abteilungs-ID). Die Tabelle departments enthält Informationen über Abteilungen, einschließlich ihrer department_id und department_name (Abteilungsname).
Wir möchten alle Mitarbeiter finden, die in der Abteilung 'Sales' (Vertrieb) arbeiten.
Schritt 1: Erstellen der Tabellen und Einfügen von Daten
Stellen Sie zunächst eine Verbindung zur PostgreSQL-Datenbank mit dem Benutzer postgres her:
sudo -u postgres psql
Erstellen Sie als Nächstes die Tabelle departments:
CREATE TABLE departments (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(50)
);
Fügen Sie einige Beispieldaten in die Tabelle departments ein:
INSERT INTO departments (department_name) VALUES
('Sales'),
('Marketing'),
('Engineering');
Erstellen Sie nun die Tabelle employees:
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
employee_name VARCHAR(50),
department_id INTEGER REFERENCES departments(department_id)
);
Fügen Sie einige Beispieldaten in die Tabelle employees ein:
INSERT INTO employees (employee_name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', 2);
Schritt 2: Schreiben der Unterabfrage
Schreiben wir nun die Abfrage, um alle Mitarbeiter zu finden, die in der Abteilung 'Sales' arbeiten, indem wir eine Unterabfrage in der WHERE-Klausel verwenden.
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
Erläuterung:
- Die Unterabfrage
(SELECT department_id FROM departments WHERE department_name = 'Sales') wählt die department_id aus der Tabelle departments aus, bei der der department_name 'Sales' ist. In diesem Fall wird 1 zurückgegeben.
- Die äußere Abfrage wählt dann den
employee_name aus der Tabelle employees aus, bei der die department_id in der von der Unterabfrage zurückgegebenen Menge enthalten ist (die nur 1 ist).
Schritt 3: Ausführen der Abfrage und Anzeigen der Ergebnisse
Führen Sie die Abfrage in Ihrem psql-Terminal aus. Sie sollten die folgende Ausgabe sehen:
employee_name
---------------
Alice
Charlie
(2 rows)
Dies zeigt, dass Alice und Charlie die Mitarbeiter sind, die in der Abteilung 'Sales' arbeiten.
Schritt 4: Verwenden von EXISTS mit Unterabfragen
Eine andere Möglichkeit, Unterabfragen in der WHERE-Klausel zu verwenden, ist mit dem Operator EXISTS. Der Operator EXISTS testet auf das Vorhandensein von Zeilen in einer Unterabfrage. Er gibt true zurück, wenn die Unterabfrage Zeilen zurückgibt, andernfalls false.
Hier ist ein Beispiel für die Verwendung von EXISTS, um das gleiche Ergebnis zu erzielen:
SELECT employee_name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
AND d.department_name = 'Sales'
);
Diese Abfrage erzielt das gleiche Ergebnis wie die vorherige, verwendet jedoch den Operator EXISTS anstelle von IN.
Erläuterung:
- Die Unterabfrage
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales' prüft, ob es eine Abteilung mit dem Namen 'Sales' gibt, die die gleiche department_id wie der aktuelle Mitarbeiter hat.
- Wenn die Unterabfrage Zeilen zurückgibt (was bedeutet, dass es eine Abteilung 'Sales' mit der gleichen
department_id gibt), gibt der Operator EXISTS true zurück, und der Name des Mitarbeiters wird ausgewählt.
Führen Sie die Abfrage in Ihrem psql-Terminal aus. Sie sollten die gleiche Ausgabe wie zuvor sehen:
employee_name
---------------
Alice
Charlie
(2 rows)
Sie haben nun erfolgreich eine Unterabfrage in der WHERE-Klausel verwendet, um Daten basierend auf einer Bedingung in einer anderen Tabelle zu filtern. Sie haben auch gelernt, wie Sie den Operator EXISTS mit einer Unterabfrage verwenden.