Microsoft Office Online
Se connecter à Mon site Office Online (Qu'est-ce que c'est ?) | Se connecter

 
 
Microsoft Office Access
Rechercher
Rechercher
 
Acheter Office
Acheter Office
Télécharger Office 2010 beta
Tester Office 2010 beta
 
 
 
Avertissement : vous affichez cette page avec un navigateur Web non pris en charge. Ce site Web fonctionne de manière optimale avec Microsoft Internet Explorer 6.0 ou version ultérieure, Firefox 1.5 ou Netscape Navigator 8.0 ou version ultérieure. En savoir plus sur les navigateurs pris en charge.

Sous-requêtes SQL
 

Un sous-requête est une instruction SELECT imbriquée dans une instruction SELECT, SELECT...INTO, INSERT...INTO, DELETE ou UPDATE ou à l'intérieur d'une autre sous-requête.

Syntaxe

Vous pouvez utiliser trois variantes de syntaxe pour créer une sous-requête :

comparison [ANY | ALL | SOME] (sqlstatement)

expression [NOT] IN (sqlstatement)

[NOT] EXISTS (sqlstatement)

Une sous-requête se compose des éléments suivants :

Composant Description
comparison Expression et opérateur de comparaison qui compare l'expression avec les résultats de la sous-requête.
expression Expression que l'on recherche dans le jeu de résultats de la sous-requête.
sqlstatement Instruction SELECT respectant le format et les règles conventionnelles des autres instructions SELECT. Elle doit être encadrée par des parenthèses.

Remarques

Vous pouvez utiliser une sous-requête au lieu d'une expression, dans la liste de champs d'une instruction SELECT ou dans une clause WHERE ou HAVING. Dans une sous-requête, vous utilisez une instruction SELECT pour fournir un jeu d'une ou plusieurs valeurs spécifiques à évaluer dans l'expression de la clause WHERE ou HAVING.

Utilisez les prédicats ANY ou SOME, qui sont synonymes, pour rechercher par comparaison les enregistrements de la requête principale en correspondance avec n'importe quel enregistrement de la sous-requête. Dans l'exemple suivant, la requête renvoie tous les produits dont le prix unitaire est supérieur au prix de n'importe quel produit vendu avec une remise de 25 pour cent ou davantage :

SELECT * FROM Products

WHERE UnitPrice > ANY

(SELECT UnitPrice FROM OrderDetails

WHERE Discount >= .25);

Utilisez le prédicat ALL pour rechercher par comparaison les enregistrements de la requête principale en correspondance avec tous les enregistrements de la sous-requête. Si dans l'exemple précédent, vous avez remplacé ANY par ALL, la requête ne renvoie que les produits dont le prix unitaire est supérieur aux prix de tous les produits vendus avec une remise de 25 pour cent ou davantage. La recherche est beaucoup plus restrictive.

Utilisez le prédicat IN pour rechercher les enregistrements de la requête principale pour lesquels on trouve des enregistrements avec une valeur identique dans la sous-requête. Dans l'exemple suivant, la requête renvoie tous les produits vendus avec une remise de 25 pour cent ou davantage :

SELECT * FROM Products

WHERE ProductID IN

(SELECT ProductID FROM OrderDetails

WHERE Discount >= .25);

Inversement, vous pouvez utiliser le prédicat NOT IN pour rechercher les enregistrements de la requête principale pour lesquels on ne trouve aucun enregistrement avec une valeur identique dans la sous-requête.

Utilisez le prédicat EXISTS (avec le mot réservé facultatif NOT) dans des comparaisons vrai/faux pour déterminer si la sous-requête renvoie des enregistrements.

Vous pouvez également utiliser des alias de nom de table dans une sous-requête pour faire référence à des tables répertoriées dans une clause FROM en dehors de la requête. Dans l'exemple suivant, la requête renvoie les noms des employés dont les salaires sont supérieurs ou égaux au salaire moyen de l'ensemble des employés occupant le même poste. L'alias affecté à la table Employés est « T1 » :

SELECT LastName,

FirstName, Title, Salary

FROM Employees AS T1

WHERE Salary >=

(SELECT Avg(Salary)

FROM Employees

WHERE T1.Title = Employees.Title) Order by Title;

Dans l'exemple précédent, le mot réservé AS est facultatif.

Certaines sous-requêtes sont autorisées dans les requêtes Analyse croisée mais uniquement comme prédicats (ceux de la clause WHERE). Les sous-requêtes ne sont pas autorisées dans les requêtes Analyse croisée pour ce qui concerne les sorties (dans la liste de SELECT).

Voir aussi
Prédicats ALL, DISTINCT, DISTINCTROW, TOP Instruction SELECT
Instruction DELETE Instruction SELECT INTO
Clause HAVING Opération UNION
Opération INNER JOIN Instruction UPDATE
Instruction INSERT INTO Clause WHERE
Opérations LEFT JOIN, RIGHT JOIN
publicité