Leçon 1 / 9 — Chapitre 3: Sous-requêtes
Sous-requêtes simples (dans WHERE ou SELECT)
Une sous-requête est une requête SELECT placée à l'intérieur d'une autre — entre parenthèses —, dans une clause WHERE ou SELECT.
Sous-requête avec IN, pour tester l'appartenance à un ensemble de valeurs :
SELECT nom FROM produits
WHERE id IN (SELECT produit_id FROM commandes);
La sous-requête (SELECT produit_id FROM commandes) renvoie l'ensemble des produit_id présents dans commandes : 1, 1, 3, 4, 6. WHERE id IN (...) garde les produits dont l'id figure dans cet ensemble — Cahier, Savon, Jus, Dentifrice. Contrairement à une jointure, chaque produit n'apparaît qu'une seule fois, même si son id figure plusieurs fois dans la sous-requête (Cahier, malgré ses deux commandes) : IN teste une appartenance, il ne multiplie pas les lignes.
Sous-requête scalaire, qui renvoie une seule valeur, utilisable dans une comparaison :
SELECT nom FROM produits
WHERE prix > (SELECT AVG(prix) FROM produits);
(SELECT AVG(prix) FROM produits) renvoie une seule valeur (400) ; la requête garde alors les produits dont le prix dépasse cette moyenne.
À retenir :
- Une sous-requête est un
SELECTplacé entre parenthèses à l'intérieur d'une autre requête. WHERE colonne IN (sous-requête)garde les lignes dont la colonne figure dans l'ensemble de valeurs renvoyé — sans dupliquer les lignes, contrairement à une jointure.- Une sous-requête qui renvoie une seule valeur (comme un
AVG,COUNT,MAX...) peut être comparée directement avec=,>,<...
À vous de jouer : comparez le nombre de lignes renvoyées par la jointure INNER JOIN du chapitre précédent et par cette sous-requête IN — même lien logique, résultat différent.
À vous de jouer
À faireVoici deux tables produits et commandes :
produits
id | nom | categorie | prix | stock
1 | Cahier | papeterie | 500 | 40
2 | Stylo | papeterie | 100 | 120
3 | Savon | hygiene | 300 | 25
4 | Jus | boisson | 600 | 15
5 | Biscuits | alimentaire | 400 | 60
6 | Dentifrice | hygiene | 500 | 10
commandes
id | produit_id | quantite
1 | 1 | 3
2 | 1 | 2
3 | 3 | 5
4 | 4 | 1
5 | 6 | 4
Combien de lignes retourne :
SELECT nom FROM produits
WHERE id IN (SELECT produit_id FROM commandes);
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nombre.
À vous de jouer
À faireVoici deux tables produits et commandes :
produits
id | nom | categorie | prix | stock
1 | Cahier | papeterie | 500 | 40
2 | Stylo | papeterie | 100 | 120
3 | Savon | hygiene | 300 | 25
4 | Jus | boisson | 600 | 15
5 | Biscuits | alimentaire | 400 | 60
6 | Dentifrice | hygiene | 500 | 10
commandes
id | produit_id | quantite
1 | 1 | 3
2 | 1 | 2
3 | 3 | 5
4 | 4 | 1
5 | 6 | 4
Le nom 'Stylo' apparaît-il dans le résultat de SELECT nom FROM produits WHERE id IN (SELECT produit_id FROM commandes); ? Répondez par oui ou non.
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Oui ou non.
À vous de jouer
À faireVoici une table produits :
produits
id | nom | categorie | prix | stock
1 | Cahier | papeterie | 500 | 40
2 | Stylo | papeterie | 100 | 120
3 | Savon | hygiene | 300 | 25
4 | Jus | boisson | 600 | 15
5 | Biscuits | alimentaire | 400 | 60
6 | Dentifrice | hygiene | 500 | 10
Combien de lignes retourne :
SELECT nom FROM produits
WHERE prix > (SELECT AVG(prix) FROM produits);
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nombre.