avril
2012
Une sous-requête est une instruction select imbriquée dans une instruction select, insert, update ou delete, ou à l’intérieur d’une autre sous requête. Vous pouvez réécrire les sous requêtes sous forme de jointures et les utiliser à la place d’une expression.
Une expression est une combinaison d’identificateurs, de valeurs et d’opérateurs que sql évalue pour obtenir un résultat.
Les sous-requêtes vous permettent de décomposer une requête complexe en une série d’étapes logiques et, par conséquent, de résoudre un problème à l’aide d’une seule d’instruction. Les sous-requêtes sont utiles lorsque votre requête repose sur les résultats d’une autre requête.
Une requête qui contient des sous requêtes peut souvent être écrite comme une jointure, si c’est le cas préférez la jointure pour des raisons d’optimisation.
Lorsque vous décidez d’utiliser des sous requêtes tenez compte des points ci-dessous :
- Vous devez mettre les sous-requêtes entre parenthèses.
- Vous pouvez mettre une sous-requête à la place d’une expression lorsqu’une valeur unique ou une liste de valeur est renvoyée. Vous pouvez utiliser une sous requete renvoyant un ensemble d’enregistrements avec plusieurs colonnes au lieu d’une table ou exécuter la même fonction en tant que jointure.
- Vous ne pouvez pas utiliser des sous requêtes pour extraire des colonnes qui contiennent des données de type text ou image.
- Vous pouvez avoir des imbrications de requêtes (jusqu’à 32 niveau) mais ce sera au dépend des performances.
Utilisation de sous requêtes en tant que table dérivée
La sous requête constitue un ensemble d’enregistrements d’une requête qui fonctionne comme une table, donc elle remplace une table dans la clause from. Elle sera optimisée en même temps que le reste de la requête.
Utilisation de sous requête en tant qu’expression
La sous requête doit faire référence à une valeur scalaire ou à une liste de valeurs contenue dans une colonne.
Attention cette expression ne sera calculées qu’une seul fois au cours de l’instruction.
Exemple : ici on a le nom du produit, son prix, la moyenne des prix des produits et la différence entre le prix du produit et le prix moyen.
Utilisation de sous-requêtes pour corréler les données
Vous pouvez utiliser une sous requête corrélée en tant qu’expression dynamique qui est modifiée pour chaque ligne d’une requête externe. Le processeur de requête exécute la sous requête pour chaque ligne de la requête externe, ligne par ligne. Celle-ci est à son tour évaluée en tant qu’expression pour chaque ligne, et son résultat est envoyé dans la requête externe.
Ici on a demandé à avoir l’id de commande et l’id des clients qui ont commandé le produit 770 et dont la quantité de commande est inférieure à 20.
Un autre exemple : la liste des produits et la quantité maximum commandée par produit.
Simulation d’une clause join
Les sous requêtes permettent de générer les mêmes résultats qu’avec une clause join néanmoins c’est beaucoup moins performant.
On veut la liste des produits et leurs quantités commandées pour tous les produits qui sont couleur argent.
Simulation d’une clause Having
Utilisation d’une sous requête pour générer les mêmes résultats qu’une requête utilisant la clause Having (en moins performant !!!).
Exemple on recherche tous les produits dont le prix dépasse le prix moyen de ce même produit.
Utilisations des clauses EXISTS et NOT EXISTS
On peut utiliser les opérateurs Exists et not exists pour savoir si des données existent dans une liste de valeurs.
Exemple : on veut tous les produits (id et nom) qui ont été commandé après le « 01/07/2004 ».
Conseils pratiques
Utilisez les sous requêtes pour décomposer une requête complexe (peut-être qu’il y aura possibilité de faire une ou plusieurs vues
Utilisez des alias de nom de table pour les sous requêtes corrélées.
Utilisez l’instruction Insert… select pour ajouter des lignes d’autres sources dans une table existante (insert into Matable select …).
Utilisez l’opérateur exists plutôt que l’opérateur in.
Articles récents
- [SharePoint 2010]Faire un workflow approbation sous SharePoint foundation 2010
- [SQL Server]Saga transact-SQL Episode 6 : Les sous requêtes
- [SQL Server]Saga transact-SQL Episode 5 : Les jointures de tables
- [SQL Server]Saga transact-SQL Episode 4 : Grouper et organiser les données
- [SQL Server]Saga transact-SQL Episode 3 : Retrouver les données avec un SELECT