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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow