Ricerca…
Osservazioni
Le sottoquery possono apparire in diverse clausole di una query esterna o nell'operazione set.
Devono essere racchiusi tra parentesi ()
. Se il risultato della sottoquery viene confrontato con qualcos'altro, il numero di colonne deve corrispondere. Gli alias di tabella sono necessari per le sottoquery nella clausola FROM per denominare la tabella temporanea.
Sottoquery nella clausola WHERE
Utilizzare una sottoquery per filtrare il set di risultati. Ad esempio, questo restituirà tutti i dipendenti con uno stipendio pari all'impiegato più pagato.
SELECT *
FROM Employees
WHERE Salary = (SELECT MAX(Salary) FROM Employees)
Sottoquery nella clausola FROM
Una sottoquery in una clausola FROM
agisce in modo simile a una tabella temporanea generata durante l'esecuzione di una query e successivamente persa.
SELECT Managers.Id, Employees.Salary
FROM (
SELECT Id
FROM Employees
WHERE ManagerId IS NULL
) AS Managers
JOIN Employees ON Managers.Id = Employees.Id
Sottoquery nella clausola SELECT
SELECT
Id,
FName,
LName,
(SELECT COUNT(*) FROM Cars WHERE Cars.CustomerId = Customers.Id) AS NumberOfCars
FROM Customers
Sottoquery nella clausola FROM
È possibile utilizzare le sottoquery per definire una tabella temporanea e utilizzarla nella clausola FROM di una query "esterna".
SELECT * FROM (SELECT city, temp_hi - temp_lo AS temp_var FROM weather) AS w
WHERE temp_var > 20;
Quanto sopra trova le città dalla tabella del tempo la cui variazione di temperatura giornaliera è maggiore di 20. Il risultato è:
città | 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 |
.
Sottoquery nella clausola WHERE
L'esempio seguente trova le città (dall'esempio delle città ) la cui popolazione è inferiore alla temperatura media (ottenuta tramite una subquery):
SELECT name, pop2000 FROM cities
WHERE pop2000 < (SELECT avg(pop2000) FROM cities);
Qui: la sottoquery (SELECT avg (pop2000) FROM cities) viene utilizzata per specificare le condizioni nella clausola WHERE. Il risultato è:
nome | pop2000 |
---|---|
San Francisco | 776.733 |
ST. LOUIS | 348.189 |
Kansas City | 146.866 |
Sottoquery nella clausola SELECT
Le sottoquery possono anche essere utilizzate nella parte SELECT
della query esterna. La seguente query mostra tutte le colonne della tabella meteo con gli stati corrispondenti dalla tabella delle città .
SELECT w.*, (SELECT c.state FROM cities AS c WHERE c.name = w.city ) AS state
FROM weather AS w;
Filtra i risultati della query utilizzando la query su una tabella diversa
Questa query seleziona tutti i dipendenti non presenti nella tabella Supervisori.
SELECT *
FROM Employees
WHERE EmployeeID not in (SELECT EmployeeID
FROM Supervisors)
Gli stessi risultati possono essere ottenuti usando un SINISTRA SINISTRA.
SELECT *
FROM Employees AS e
LEFT JOIN Supervisors AS s ON s.EmployeeID=e.EmployeeID
WHERE s.EmployeeID is NULL
Subquery correlate
Le sottoquery correlate (note anche come sincronizzate o coordinate) sono query nidificate che fanno riferimento alla riga corrente della query esterna:
SELECT EmployeeId
FROM Employee AS eOuter
WHERE Salary > (
SELECT AVG(Salary)
FROM Employee eInner
WHERE eInner.DepartmentId = eOuter.DepartmentId
)
Subquery SELECT AVG(Salary) ...
è correlato perché fa riferimento alla riga Employee
eOuter
dalla sua query esterna.