PaliSkill
SQL Intermédiaire

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 SELECT placé 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

À faire

Voici 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

À faire

Voici 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

À faire

Voici 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.

Quitter le module