Recherche…
Remarques
Les sous-requêtes peuvent apparaître dans différentes clauses d'une requête externe ou dans l'opération définie.
Ils doivent être entre parenthèses ()
. Si le résultat de la sous-requête est comparé à autre chose, le nombre de colonnes doit correspondre. Les alias de table sont requis pour les sous-requêtes dans la clause FROM pour nommer la table temporaire.
Sous-requête dans la clause WHERE
Utilisez une sous-requête pour filtrer le jeu de résultats. Par exemple, tous les employés recevront un salaire égal au salaire le plus élevé.
SELECT *
FROM Employees
WHERE Salary = (SELECT MAX(Salary) FROM Employees)
Sous-requête dans la clause FROM
Une sous-requête dans une clause FROM
agit de manière similaire à une table temporaire générée lors de l'exécution d'une requête et perdue par la suite.
SELECT Managers.Id, Employees.Salary
FROM (
SELECT Id
FROM Employees
WHERE ManagerId IS NULL
) AS Managers
JOIN Employees ON Managers.Id = Employees.Id
Sous-requête dans la clause SELECT
SELECT
Id,
FName,
LName,
(SELECT COUNT(*) FROM Cars WHERE Cars.CustomerId = Customers.Id) AS NumberOfCars
FROM Customers
Sous-requêtes dans la clause FROM
Vous pouvez utiliser des sous-requêtes pour définir une table temporaire et l'utiliser dans la clause FROM d'une requête "externe".
SELECT * FROM (SELECT city, temp_hi - temp_lo AS temp_var FROM weather) AS w
WHERE temp_var > 20;
Le ci-dessus trouve des villes de la table météo dont la variation de température quotidienne est supérieure à 20. Le résultat est:
ville | temp_var |
---|---|
SAINT LOUIS | 21 |
LOS ANGELES | 31 |
LOS ANGELES | 23 |
LOS ANGELES | 31 |
LOS ANGELES | 27 |
LOS ANGELES | 28 |
LOS ANGELES | 28 |
LOS ANGELES | 32 |
.
Sous-requêtes dans la clause WHERE
L'exemple suivant trouve des villes ( exemple des villes ) dont la population est inférieure à la température moyenne (obtenue via une sous-requête):
SELECT name, pop2000 FROM cities
WHERE pop2000 < (SELECT avg(pop2000) FROM cities);
Ici: la sous-requête (SELECT avg (pop2000) FROM cities) est utilisée pour spécifier des conditions dans la clause WHERE. Le résultat est:
prénom | pop2000 |
---|---|
San Francisco | 776733 |
SAINT LOUIS | 348189 |
Kansas City | 146866 |
Sous-requêtes dans la clause SELECT
Les sous-requêtes peuvent également être utilisées dans la partie SELECT
de la requête externe. La requête suivante affiche toutes les colonnes de la table météo avec les états correspondants de la table cities .
SELECT w.*, (SELECT c.state FROM cities AS c WHERE c.name = w.city ) AS state
FROM weather AS w;
Filtrer les résultats de la requête à l'aide d'une requête sur une table différente
Cette requête sélectionne tous les employés qui ne figurent pas dans la table Supervisors.
SELECT *
FROM Employees
WHERE EmployeeID not in (SELECT EmployeeID
FROM Supervisors)
Les mêmes résultats peuvent être obtenus en utilisant un LEFT JOIN.
SELECT *
FROM Employees AS e
LEFT JOIN Supervisors AS s ON s.EmployeeID=e.EmployeeID
WHERE s.EmployeeID is NULL
Sous-requêtes corrélées
Les sous-requêtes corrélées (également appelées synchronisées ou coordonnées) sont des requêtes imbriquées qui font référence à la ligne actuelle de leur requête externe:
SELECT EmployeeId
FROM Employee AS eOuter
WHERE Salary > (
SELECT AVG(Salary)
FROM Employee eInner
WHERE eInner.DepartmentId = eOuter.DepartmentId
)
La sous-requête SELECT AVG(Salary) ...
est corrélée car elle fait référence à la ligne de l' Employee
eOuter
de sa requête externe.