Aller au contenu
Sous-requêtes & CTE

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

Modèle
-- scalaire (une valeur)WHERE col > (SELECT AVG(col) FROM table)-- table dérivéeSELECT * FROM (SELECT ...) AS t

Exemple

Exemple concret
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

  1. Trois formes : scalaire (une seule valeur, comparable avec = ou >), liste (utilisée avec IN), table (dans FROM, avec un alias).
  2. 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.
  3. 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).
  4. 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