Sous-requêtes
Une sous-requête est un SELECT placé à l'intérieur d'une autre requête, dans WHERE, FROM ou SELECT. Elle calcule une valeur intermédiaire, comme une moyenne, à laquelle on compare chaque ligne.
- subquery
- imbriquée
- scalaire
- corrélée
- table dérivée
Syntaxe
-- scalaire (une valeur)WHERE col > (SELECT AVG(col) FROM table)-- table dérivéeSELECT * FROM (SELECT ...) AS tExemple
SELECT name, price, ROUND(price - (SELECT AVG(price) FROM products), 2) AS ecart_moyenneFROM productsWHERE price > (SELECT AVG(price) FROM products)ORDER BY price DESC;-- Jeu de données : boutique-- Produits plus chers que la moyenne du catalogue (81.99)-- Résultat attendu :-- Casque audio | 149.99 | 68-- Clavier mécanique | 89.99 | 8À retenir
- Trois formes : scalaire (une seule valeur, comparable avec = ou >), liste (utilisée avec IN), table (dans FROM, avec un alias).
- Une sous-requête corrélée fait référence à la ligne en cours de la requête principale (WHERE p2.category = p.category) et se réévalue pour chaque ligne.
- Piège : une sous-requête scalaire qui renvoie plusieurs lignes provoque une erreur dans PostgreSQL et SQL Server, mais SQLite prend silencieusement la première. Assurez-vous qu'elle ne peut renvoyer qu'une ligne (agrégat, clé primaire).
- Quand la même sous-requête revient plusieurs fois, comme ici, une CTE la nomme une seule fois et rend la requête plus lisible.
Voir aussi
- WITH (CTE)Une CTE (WITH) donne un nom à un résultat intermédiaire, utilisable ensuite comme une table dans la requête. On découpe ainsi un calcul complexe en étapes lisibles et vérifiables.
- EXISTS & IN (sous-requête)EXISTS vérifie qu'une sous-requête renvoie au moins une ligne, IN qu'une valeur figure dans sa liste. Tous deux répondent à « a-t-il au moins un… ? » sans dupliquer les lignes comme le ferait un JOIN.
- Piège NOT IN et NULLNOT IN renvoie zéro ligne dès que sa sous-requête contient un NULL, sans aucun message d'erreur. Pour chercher des éléments absents d'une autre table, NOT EXISTS donne toujours le bon résultat.