Skip to content

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 : ALL est 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.


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 table1
WHERE 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 ALL est évaluée comme TRUE (car il n’y a aucune valeur à comparer). Ce comportement peut parfois être surprenant.


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 region
FROM ventes
GROUP BY region
HAVING MIN(montant) > 100;

Avec ALL (approche alternative) :

SELECT DISTINCT region
FROM ventes v1
WHERE 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 region
FROM ventes v1
WHERE 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.


SELECT *
FROM table
WHERE 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 produit
WHERE 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.


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');

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 ANY
SELECT * 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 ALL
SELECT * FROM produit WHERE categorie <> ALL ('informatique', 'fourniture');

Si la sous-requête ne retourne aucune ligne, la condition ALL est toujours TRUE :

SELECT *
FROM table
WHERE 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.


Si la sous-requête contient des valeurs NULL, le comportement peut être surprenant :

  • Avec > ALL, si une valeur est NULL, le résultat est UNKNOWN (car NULL est inconnu).
  • Avec = ALL ou <> ALL, une valeur NULL rend le résultat UNKNOWN.
-- 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 COALESCE ou filtrez les NULL dans la sous-requête pour éviter ces comportements.


  1. ALL est généralement moins efficace que ANY car il doit vérifier toutes les valeurs de la sous-requête.
  2. Utilisez ALL uniquement lorsque vous avez besoin de la sémantique « pour toutes les valeurs ».
  3. Dans de nombreux cas, une fonction d’agrégation (MAX, MIN) est plus performante :
-- Avec ALL
SELECT * 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');

SGBD Support de ALL
PostgreSQL Oui
MySQL Oui
SQL Server Oui
Oracle Oui
SQLite Oui

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

  1. Utilisez ALL uniquement lorsque vous avez vraiment besoin de comparer avec toutes les valeurs.

  2. Préférez les fonctions d’agrégation (MAX, MIN) pour des cas simples :

-- Au lieu de
SELECT * FROM produit WHERE prix > ALL (SELECT prix FROM produit WHERE categorie = 'solde');
-- Utilisez
SELECT * FROM produit WHERE prix > (SELECT MAX(prix) FROM produit WHERE categorie = 'solde');
  1. Filtrez les NULL dans la sous-requête si nécessaire :
SELECT * FROM table
WHERE colonne > ALL (
SELECT valeur
FROM autre_table
WHERE valeur IS NOT NULL
);
  1. Testez la sous-requête séparément pour vérifier qu’elle retourne les valeurs attendues.

  2. Utilisez ANY ou IN si vous voulez comparer avec au moins une valeur, et non avec toutes.


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