ALL – Comparer à un ensemble complet
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes
Dans le langage SQL, la commande ALL permet de comparer une valeur à l’ensemble des valeurs d’une sous-requête. En d’autres mots, cette commande permet de s’assurer qu’une condition est « égale », « différente », « supérieure », « inférieure », « supérieure ou égale » ou « inférieure ou égale » pour tous les résultats retournés par une sous-requête.
Bon à savoir :
ALLest souvent utilisé avec les opérateurs de comparaison (>,<,=,>=,<=,<>) pour vérifier qu’une condition est vraie pour l’ensemble des valeurs d’une sous-requête.
Syntaxe
Section titled “Syntaxe”Cette commande s’utilise dans une clause conditionnelle entre l’opérateur de condition et la sous-requête. L’exemple ci-dessous montre une utilisation basique :
SELECT *FROM table1WHERE condition > ALL ( SELECT * FROM table2 WHERE condition2);Les opérateurs conditionnels pouvant être utilisés avec ALL sont les suivants : =, <, >, <>, !=, <=, >=, !> ou !<.
Remarque : Si la sous-requête ne retourne aucune ligne, la condition
ALLest évaluée commeTRUE(car il n’y a aucune valeur à comparer). Ce comportement peut parfois être surprenant.
Exemple concret
Section titled “Exemple concret”Imaginons une table des ventes par région que l’on souhaite analyser.
Table « ventes » :
| id | region | montant |
|---|---|---|
| 1 | Nord | 150 |
| 2 | Nord | 200 |
| 3 | Sud | 120 |
| 4 | Sud | 180 |
| 5 | Est | 90 |
| 6 | Est | 70 |
| 7 | Ouest | 210 |
| 8 | Ouest | 190 |
Exemple 1 : Trouver les régions où tous les montants sont supérieurs à 100
Section titled “Exemple 1 : Trouver les régions où tous les montants sont supérieurs à 100”SELECT regionFROM ventesGROUP BY regionHAVING MIN(montant) > 100;Avec ALL (approche alternative) :
SELECT DISTINCT regionFROM ventes v1WHERE 100 < ALL ( SELECT montant FROM ventes v2 WHERE v2.region = v1.region);Résultat :
| region |
|---|
| Nord |
| Sud |
| Ouest |
Explication :
- Nord (150, 200) → tous les montants > 100 → inclus
- Sud (120, 180) → tous les montants > 100 → inclus
- Est (90, 70) → 90 < 100, donc pas tous > 100 → exclu
- Ouest (210, 190) → tous les montants > 100 → inclus
Exemple 2 : Trouver les régions où tous les montants sont inférieurs à 150
Section titled “Exemple 2 : Trouver les régions où tous les montants sont inférieurs à 150”SELECT DISTINCT regionFROM ventes v1WHERE 150 > ALL ( SELECT montant FROM ventes v2 WHERE v2.region = v1.region);Résultat :
| region |
|---|
| Est |
Explication : Seule la région Est a tous ses montants (90 et 70) inférieurs à 150.
Utilisation avec d’autres opérateurs
Section titled “Utilisation avec d’autres opérateurs”ALL avec = (égal à toutes les valeurs)
Section titled “ALL avec = (égal à toutes les valeurs)”SELECT *FROM tableWHERE colonne = ALL ( SELECT autre_colonne FROM autre_table);Cette condition est vraie si la colonne est égale à toutes les valeurs retournées par la sous-requête. Cela n’est généralement vrai que si la sous-requête ne retourne qu’une seule valeur (ou si toutes les valeurs sont identiques).
ALL avec <> (différent de toutes les valeurs)
Section titled “ALL avec <> (différent de toutes les valeurs)”SELECT *FROM produitWHERE prix <> ALL ( SELECT prix FROM produit WHERE categorie = 'solde');Cette condition est vraie si le prix est différent de tous les prix des produits en solde.
ALL vs ANY/SOME
Section titled “ALL vs ANY/SOME”| Commande | Signification |
|---|---|
> ALL |
Supérieur à toutes les valeurs |
> ANY |
Supérieur à au moins une valeur |
Exemple comparatif :
-- Retourne les produits dont le prix est supérieur à tous les prix de la catégorie 'solde'SELECT * FROM produit WHERE prix > ALL (SELECT prix FROM produit WHERE categorie = 'solde');
-- Retourne les produits dont le prix est supérieur à au moins un prix de la catégorie 'solde'SELECT * FROM produit WHERE prix > ANY (SELECT prix FROM produit WHERE categorie = 'solde');ALL vs IN
Section titled “ALL vs IN”| Commande | Signification | Équivalence avec ALL |
|---|---|---|
IN |
Égal à au moins une valeur | = ANY |
NOT IN |
Différent de toutes les valeurs | <> ALL |
-- IN (égal à au moins une valeur)SELECT * FROM produit WHERE categorie IN ('informatique', 'fourniture');
-- Équivalent avec ANYSELECT * FROM produit WHERE categorie = ANY ('informatique', 'fourniture');
-- NOT IN (différent de toutes les valeurs)SELECT * FROM produit WHERE categorie NOT IN ('informatique', 'fourniture');
-- Équivalent avec ALLSELECT * FROM produit WHERE categorie <> ALL ('informatique', 'fourniture');ALL avec un ensemble vide
Section titled “ALL avec un ensemble vide”Si la sous-requête ne retourne aucune ligne, la condition ALL est toujours TRUE :
SELECT *FROM tableWHERE id > ALL ( SELECT id FROM table WHERE 1 = 0 -- Ne retourne aucune ligne);Résultat : toutes les lignes de la table seront retournées, car la condition est toujours vraie.
Remarque : Ce comportement peut être source d’erreurs. Si vous utilisez
ALL, assurez-vous que la sous-requête retourne bien des résultats.
ALL avec des valeurs NULL
Section titled “ALL avec des valeurs NULL”Si la sous-requête contient des valeurs NULL, le comportement peut être surprenant :
- Avec
> ALL, si une valeur estNULL, le résultat estUNKNOWN(carNULLest inconnu). - Avec
= ALLou<> ALL, une valeurNULLrend le résultatUNKNOWN.
-- Si la sous-requête retourne {10, 20, NULL}SELECT * FROM table WHERE colonne > ALL (SELECT valeur FROM autre_table);Résultat : Aucune ligne ne sera retournée (car la présence de NULL empêche la condition d’être vraie).
Recommandation : Utilisez
COALESCEou filtrez lesNULLdans la sous-requête pour éviter ces comportements.
Performance
Section titled “Performance”ALLest généralement moins efficace queANYcar il doit vérifier toutes les valeurs de la sous-requête.- Utilisez
ALLuniquement lorsque vous avez besoin de la sémantique « pour toutes les valeurs ». - Dans de nombreux cas, une fonction d’agrégation (
MAX,MIN) est plus performante :
-- Avec ALLSELECT * FROM produit WHERE prix > ALL (SELECT prix FROM produit WHERE categorie = 'solde');
-- Avec MAX (souvent plus performant)SELECT * FROM produit WHERE prix > (SELECT MAX(prix) FROM produit WHERE categorie = 'solde');Compatibilité entre SGBD
Section titled “Compatibilité entre SGBD”| SGBD | Support de ALL |
|---|---|
| PostgreSQL | Oui |
| MySQL | Oui |
| SQL Server | Oui |
| Oracle | Oui |
| SQLite | Oui |
Erreurs courantes
Section titled “Erreurs courantes”| Erreur | Cause | Solution |
|---|---|---|
| Résultat inattendu | Sous-requête vide | Vérifier que la sous-requête retourne des résultats |
| Résultat vide | Présence de NULL dans la sous-requête | Filtrer les NULL avec IS NOT NULL |
| Mauvaise performance | Sous-requête volumineuse | Utiliser MAX ou MIN à la place |
| Comparaison de types incompatibles | Types de données différents | S’assurer de la compatibilité des types |
Bonnes pratiques
Section titled “Bonnes pratiques”-
Utilisez
ALLuniquement lorsque vous avez vraiment besoin de comparer avec toutes les valeurs. -
Préférez les fonctions d’agrégation (
MAX,MIN) pour des cas simples :
-- Au lieu deSELECT * FROM produit WHERE prix > ALL (SELECT prix FROM produit WHERE categorie = 'solde');-- UtilisezSELECT * FROM produit WHERE prix > (SELECT MAX(prix) FROM produit WHERE categorie = 'solde');- Filtrez les
NULLdans la sous-requête si nécessaire :
SELECT * FROM tableWHERE colonne > ALL ( SELECT valeur FROM autre_table WHERE valeur IS NOT NULL);-
Testez la sous-requête séparément pour vérifier qu’elle retourne les valeurs attendues.
-
Utilisez
ANYouINsi vous voulez comparer avec au moins une valeur, et non avec toutes.
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment comparer une valeur avec toutes les valeurs d’un ensemble avec ALL. Mais comment comparer avec au moins une valeur ?
👉 Chapitre 42 : ANY / SOME – Comparer à au moins un élément
Bonne continuation !
Junior TSAFACK – 08/08/2026