SQL - Unterabfragen
Hallo, angehende SQL-Enthusiasten! Ich freue mich sehr, Sie auf dieser aufregenden Reise in die Welt der SQL-Unterabfragen zu begleiten. Als jemand, der seit vielen Jahren Informatik unterrichtet, kann ich Ihnen sagen, dass Unterabfragen wie das heimliche Gewürz sind, das Ihre SQL-Fähigkeiten vom Guten zum Großen macht. Also tauchen wir ein und lüften gemeinsam die Geheimnisse der Unterabfragen!
SQL-Unterabfragen
Was sind Unterabfragen?
Stellen Sie sich vor, Sie machen sich ein Sandwich. Das Brot ist Ihre Hauptabfrage, aber was es wirklich lecker macht, sind die Füllungen innen - das ist Ihre Unterabfrage! In SQL-Begriffen ist eine Unterabfrage eine Abfrage, die innerhalb einer anderen Abfrage eingebettet ist. Es ist, als бы Sie eine Frage innerhalb einer Frage stellen, was es Ihnen ermöglicht, komplexe Operationen durchzuführen, die mit einer einzigen Abfrage möglicherweise nicht möglich wären.
Schauen wir uns ein einfaches Beispiel an:
SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');
In dieser Abfrage ist der Teil innerhalb der Klammern unsere Unterabfrage. Sie findet die department_id
für die Abteilung Marketing und wird dann von der äußeren Abfrage verwendet, um alle Mitarbeiter in dieser Abteilung zu finden.
Einzuhaltende Regeln
Bevor wir tiefer einsteigen, schauen wir uns einige wichtige Regeln für die Verwendung von Unterabfragen an:
- Unterabfragen müssen in Klammern eingeschlossen sein.
- Eine Unterabfrage kann nur eine Spalte in der SELECT-Klausel haben,除非主查询中有多个列进行比较。
- Ein ORDER BY-Befehl kann nicht in einer Unterabfrage verwendet werden, obwohl die Hauptabfrage ein ORDER BY verwenden kann.
- Unterabfragen, die mehr als eine Zeile zurückgeben, können nur mit mehrwertigen Operatoren wie dem IN-Operator verwendet werden.
Hier ist eine praktische Tabelle, die diese Regeln zusammenfasst:
Regel | Beschreibung |
---|---|
Klammern | Unterabfragen müssen in Klammern eingeschlossen sein |
Eine Spalte | Unterabfrage SELECT gibt normalerweise nur eine Spalte zurück |
Kein ORDER BY | ORDER BY kann in einer Unterabfrage nicht verwendet werden |
Mehrere Zeilen | Verwenden Sie mehrwertige Operatoren für Unterabfragen, die mehrere Zeilen zurückgeben |
Unterabfragen mit der SELECT-Anweisung
Unterabfragen werden am häufigsten mit der SELECT-Anweisung verwendet. Sie können äußerst leistungsfähig sein, um Daten basierend auf dynamischen Bedingungen abzurufen. Schauen wir uns ein komplexeres Beispiel an:
SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
Diese Abfrage wählt alle Produkte mit einem Preis über dem Durchschnittspreis aller Produkte aus. Die Unterabfrage berechnet den Durchschnittspreis, und die Hauptabfrage verwendet dieses Ergebnis, um die Produkte zu filtern.
Hier ist ein weiteres Beispiel, das eine Unterabfrage in der SELECT-Klausel verwendet:
SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;
Diese Abfrage ruft nicht nur den Namen und das Gehalt jedes Mitarbeiters ab, sondern fügt auch das Durchschnittsgehalt aller Mitarbeiter in jeder Zeile hinzu. Es ist, als hätten Sie eine Mini-Bericht für jeden Mitarbeiter!
Unterabfragen mit der INSERT-Anweisung
Unterabfragen können auch mit INSERT-Anweisungen verwendet werden, um eine Tabelle mit Daten aus einer anderen Tabelle zu füllen. Hier ist ein Beispiel:
INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);
Diese Abfrage fügt in die Tabelle high_salary_employees
alle Mitarbeiter ein, deren Gehalt mehr als 1,5 Mal so hoch ist wie der Durchschnittsgehalt. Es ist, als würden Sie eine VIP-Liste Ihrer Top-Verdiener erstellen!
Unterabfragen mit der UPDATE-Anweisung
Unterabfragen können Ihre UPDATE-Anweisungen viel leistungsfähiger machen. Schauen wir uns ein Beispiel an:
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');
Diese Abfrage erhöht den Preis aller Produkte in der Kategorie 'Electronics' um 10%. Die Unterabfrage findet die category_id
für 'Electronics', die dann von der Hauptabfrage verwendet wird, um die richtigen Produkte zu aktualisieren.
Unterabfragen mit der DELETE-Anweisung
Schließlich sehen wir, wie Unterabfragen mit DELETE-Anweisungen verwendet werden können:
DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);
Diese Abfrage löscht alle Bestellungen von Kunden, die in den letzten einem Jahr keine Bestellung aufgegeben haben. Die Unterabfrage findet alle solchen Kunden, und die Hauptabfrage löscht ihre Bestellungen.
Und das war's, Leute! Wir haben die Welt der SQL-Unterabfragen bereist, von den grundlegenden Konzepten bis zu den fortgeschritteneren Anwendungen. Denken Sie daran, Übung macht den Meister, also fürchten Sie sich nicht, diese Abfragen in Ihren eigenen Datenbanken auszuprobieren.
Wie ich meinen Schülern immer sage, SQL ist wie ein Schweizer Taschenmesser - und Unterabfragen sind die verdeckte Klinge, die Sie aus kniffligen Situationen retten kann. Also weiter erkunden, weiter abfragen und vor allem: weiter lernen!
Credits: Image by storyset