Suche…
Bemerkungen
Unterabfragen können in verschiedenen Klauseln einer äußeren Abfrage oder in der Setoperation erscheinen.
Sie müssen in Klammern ()
. Wenn das Ergebnis der Unterabfrage mit etwas anderem verglichen wird, muss die Anzahl der Spalten übereinstimmen. Tabellenaliasnamen sind für Unterabfragen in der FROM-Klausel erforderlich, um die temporäre Tabelle zu benennen.
Unterabfrage in WHERE-Klausel
Verwenden Sie eine Unterabfrage, um die Ergebnismenge zu filtern. Zum Beispiel werden alle Mitarbeiter mit einem Gehalt entlohnt, das dem bestbezahlten Mitarbeiter entspricht.
SELECT *
FROM Employees
WHERE Salary = (SELECT MAX(Salary) FROM Employees)
Unterabfrage in FROM-Klausel
Eine Unterabfrage in einer FROM
Klausel verhält sich ähnlich wie eine temporäre Tabelle, die während der Ausführung einer Abfrage generiert wird und danach verloren geht.
SELECT Managers.Id, Employees.Salary
FROM (
SELECT Id
FROM Employees
WHERE ManagerId IS NULL
) AS Managers
JOIN Employees ON Managers.Id = Employees.Id
Unterabfrage in SELECT-Klausel
SELECT
Id,
FName,
LName,
(SELECT COUNT(*) FROM Cars WHERE Cars.CustomerId = Customers.Id) AS NumberOfCars
FROM Customers
Unterabfragen in FROM-Klausel
Sie können Unterabfragen verwenden, um eine temporäre Tabelle zu definieren und in der FROM-Klausel einer "äußeren" Abfrage zu verwenden.
SELECT * FROM (SELECT city, temp_hi - temp_lo AS temp_var FROM weather) AS w
WHERE temp_var > 20;
Oben werden Städte aus der Wettertabelle gefunden, deren tägliche Temperaturschwankung größer als 20 ist. Das Ergebnis ist:
Stadt | temp_var |
---|---|
ST LOUIS | 21 |
LOS ANGELES | 31 |
LOS ANGELES | 23 |
LOS ANGELES | 31 |
LOS ANGELES | 27 |
LOS ANGELES | 28 |
LOS ANGELES | 28 |
LOS ANGELES | 32 |
.
Unterabfragen in der WHERE-Klausel
Im folgenden Beispiel werden Städte (aus dem Beispiel für Städte ) gefunden, deren Bevölkerung unter der Durchschnittstemperatur liegt (über eine Unterabfrage ermittelt):
SELECT name, pop2000 FROM cities
WHERE pop2000 < (SELECT avg(pop2000) FROM cities);
Hier: Mit der Unterabfrage (SELECT avg (pop2000) FROM cities) werden Bedingungen in der WHERE-Klausel angegeben. Das Ergebnis ist:
Name | pop2000 |
---|---|
San Francisco | 776733 |
ST LOUIS | 348189 |
Kansas City | 146866 |
Unterabfragen in SELECT-Klausel
Unterabfragen können auch im SELECT
Teil der äußeren Abfrage verwendet werden. Die folgende Abfrage zeigt alle Wettertabellenspalten mit den entsprechenden Bundesländern aus der Städtetabelle .
SELECT w.*, (SELECT c.state FROM cities AS c WHERE c.name = w.city ) AS state
FROM weather AS w;
Filtern Sie die Abfrageergebnisse mithilfe der Abfrage in einer anderen Tabelle
Diese Abfrage wählt alle Mitarbeiter aus, die sich nicht in der Supervisors-Tabelle befinden.
SELECT *
FROM Employees
WHERE EmployeeID not in (SELECT EmployeeID
FROM Supervisors)
Die gleichen Ergebnisse können mit einem LEFT JOIN erzielt werden.
SELECT *
FROM Employees AS e
LEFT JOIN Supervisors AS s ON s.EmployeeID=e.EmployeeID
WHERE s.EmployeeID is NULL
Korrelierte Unterabfragen
Korrelierte (auch als synchronisierte oder koordinierte) Unterabfragen bezeichnet verschachtelte Abfragen, die auf die aktuelle Zeile ihrer äußeren Abfrage verweisen:
SELECT EmployeeId
FROM Employee AS eOuter
WHERE Salary > (
SELECT AVG(Salary)
FROM Employee eInner
WHERE eInner.DepartmentId = eOuter.DepartmentId
)
Die Unterabfrage SELECT AVG(Salary) ...
ist korreliert, da sie von ihrer äußeren Abfrage auf die Employee
eOuter
verweist.