ANY / SOME – Comparer à au moins un élément
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes
Dans le langage SQL, la commande ANY (ou SOME) permet de comparer une valeur avec le résultat d’une sous-requête. Il est ainsi possible de vérifier si une valeur est « égale », « différente », « supérieure », « supérieure ou égale », « inférieure » ou « inférieure ou égale » pour au moins une des valeurs de la sous-requête.
Bon à savoir : Le mot-clé
SOMEest un alias deANY. L’un et l’autre des termes peut être utilisé indifféremment. Certains développeurs préfèrentANYpour sa clarté, d’autres utilisentSOMEpour une meilleure lisibilité en anglais.
Syntaxe
Section titled “Syntaxe”Cette commande s’utilise dans une clause conditionnelle juste après un opérateur conditionnel et juste avant une sous-requête. L’exemple ci-dessous démontre une utilisation basique de ANY dans une requête SQL :
SELECT *FROM table1WHERE condition > ANY ( SELECT colonne FROM table2 WHERE condition2);Cette requête peut se traduire de la façon suivante : sélectionner toutes les colonnes de table1, où la condition est supérieure à n’importe quel résultat de la sous-requête.
Les opérateurs conditionnels pouvant être utilisés avec ANY sont les suivants : =, <, >, <>, !=, <=, >=, !> ou !<.
Exemple concret
Section titled “Exemple concret”Imaginons une base de données d’une entreprise avec une table des employés et une table des objectifs de vente.
Table « employe » :
| id | nom | prenom | salaire | departement |
|---|---|---|---|---|
| 1 | Martin | Sophie | 2800 | Ventes |
| 2 | Bernard | Thomas | 3200 | Ventes |
| 3 | Dubois | Marie | 3500 | Marketing |
| 4 | Moreau | Jean | 2700 | Ventes |
| 5 | Leroy | Claire | 3900 | Marketing |
| 6 | Lefevre | Nicolas | 3000 | Ventes |
Table « objectif » :
| id | departement | objectif_salaire |
|---|---|---|
| 1 | Ventes | 2500 |
| 2 | Ventes | 3000 |
| 3 | Marketing | 3200 |
| 4 | Marketing | 3500 |
| 5 | Ventes | 2800 |
Exemple 1 : Trouver les employés dont le salaire est supérieur à au moins un objectif du département
Section titled “Exemple 1 : Trouver les employés dont le salaire est supérieur à au moins un objectif du département”SELECT e.nom, e.prenom, e.salaire, e.departementFROM employe eWHERE e.salaire > ANY ( SELECT o.objectif_salaire FROM objectif o WHERE o.departement = e.departement);Résultat :
| nom | prenom | salaire | departement |
|---|---|---|---|
| Bernard | Thomas | 3200 | Ventes |
| Dubois | Marie | 3500 | Marketing |
| Moreau | Jean | 2700 | Ventes |
| Leroy | Claire | 3900 | Marketing |
| Lefevre | Nicolas | 3000 | Ventes |
Explication :
- Sophie (salaire 2800) : dans le département Ventes, les objectifs sont 2500, 3000, 2800. Le salaire de Sophie est supérieur à 2500 et 2800, mais pas à 3000. Comme il est supérieur à au moins un objectif, elle est incluse.
- Thomas (3200) : supérieur à tous les objectifs Ventes → inclus.
- Marie (3500) : dans Marketing, objectifs 3200 et 3500. Supérieure à 3200 → inclus.
- Jean (2700) : supérieur à 2500 (objectif Ventes) → inclus.
- Claire (3900) : supérieure à tous → incluse.
- Nicolas (3000) : supérieur à 2500 et 2800, égal à 3000 → inclus.
Exemple 2 : Trouver les employés dont le salaire est inférieur à au moins un objectif du département
Section titled “Exemple 2 : Trouver les employés dont le salaire est inférieur à au moins un objectif du département”SELECT e.nom, e.prenom, e.salaire, e.departementFROM employe eWHERE e.salaire < ANY ( SELECT o.objectif_salaire FROM objectif o WHERE o.departement = e.departement);Résultat :
| nom | prenom | salaire | departement |
|---|---|---|---|
| Martin | Sophie | 2800 | Ventes |
| Bernard | Thomas | 3200 | Ventes |
| Dubois | Marie | 3500 | Marketing |
| Moreau | Jean | 2700 | Ventes |
| Lefevre | Nicolas | 3000 | Ventes |
Explication : Claire (3900) n’est pas incluse car elle n’est inférieure à aucun objectif Marketing (les objectifs sont 3200 et 3500, tous inférieurs à 3900).
ANY et IN : une équivalence importante
Section titled “ANY et IN : une équivalence importante”La commande IN est équivalente à l’opérateur = suivi de ANY.
-- Avec INSELECT * FROM employe WHERE departement IN ('Ventes', 'Marketing');
-- Avec ANY (équivalent)SELECT * FROM employe WHERE departement = ANY ('Ventes', 'Marketing');
-- Avec IN et sous-requêteSELECT * FROM employe WHERE departement IN (SELECT departement FROM objectif);
-- Avec ANY (équivalent)SELECT * FROM employe WHERE departement = ANY (SELECT departement FROM objectif);ANY vs ALL
Section titled “ANY vs ALL”| Commande | Signification |
|---|---|
> ANY |
Supérieur à au moins une valeur |
> ALL |
Supérieur à toutes les valeurs |
= ANY |
Égal à au moins une valeur (équivalent à IN) |
<> ALL |
Différent de toutes les valeurs (équivalent à NOT IN) |
Exemple comparatif :
-- Employés dont le salaire est supérieur à au moins un objectif VentesSELECT * FROM employeWHERE salaire > ANY (SELECT objectif_salaire FROM objectif WHERE departement = 'Ventes');-- Retourne les employés dont le salaire est > 2500, > 3000 ou > 2800
-- Employés dont le salaire est supérieur à tous les objectifs VentesSELECT * FROM employeWHERE salaire > ALL (SELECT objectif_salaire FROM objectif WHERE departement = 'Ventes');-- Retourne les employés dont le salaire est > 3000 (le plus grand objectif)ANY avec un ensemble vide
Section titled “ANY avec un ensemble vide”Si la sous-requête ne retourne aucune ligne, la condition ANY est évaluée comme FALSE :
SELECT *FROM employeWHERE salaire > ANY ( SELECT objectif_salaire FROM objectif WHERE departement = 'Informatique' -- Aucun objectif pour ce département);Résultat : Aucune ligne retournée (car il n’y a aucune valeur à comparer).
Remarque : Ce comportement est différent de
ALLqui retourneraitTRUEdans le même cas.
ANY avec des valeurs NULL
Section titled “ANY avec des valeurs NULL”Si la sous-requête contient des valeurs NULL, le comportement peut être surprenant :
-- Si la sous-requête retourne {2500, NULL, 3000}SELECT * FROM employe WHERE salaire > ANY (SELECT objectif_salaire FROM objectif);Résultat : La comparaison avec NULL est UNKNOWN. Seules les comparaisons avec les valeurs non nulles sont évaluées. Si toutes les valeurs sont NULL, le résultat est FALSE.
Recommandation : Filtrez les
NULLdans la sous-requête pour éviter des résultats inattendus :
SELECT * FROM employeWHERE salaire > ANY ( SELECT objectif_salaire FROM objectif WHERE objectif_salaire IS NOT NULL);Performance
Section titled “Performance”-
ANYest généralement plus efficace queALLcar il peut s’arrêter dès qu’une correspondance est trouvée. -
Pour les grandes sous-requêtes,
EXISTSest souvent plus performant que= ANY:
-- Avec ANYSELECT * FROM employe WHERE departement = ANY (SELECT departement FROM objectif);
-- Avec EXISTS (souvent plus performant)SELECT * FROM employe e WHERE EXISTS (SELECT 1 FROM objectif o WHERE o.departement = e.departement);- Utilisez
INpour une meilleure lisibilité lorsque vous utilisez= ANY.
Compatibilité entre SGBD
Section titled “Compatibilité entre SGBD”| SGBD | Support de ANY / SOME |
|---|---|
| PostgreSQL | Oui (les deux) |
| MySQL | Oui (ANY uniquement, SOME comme synonyme) |
| SQL Server | Oui (les deux) |
| Oracle | Oui (les deux) |
| SQLite | Oui (les deux) |
Cas d’usage
Section titled “Cas d’usage”| Situation | Utilisation recommandée |
|---|---|
| Vérifier si une valeur est présente dans une liste dynamique | IN (plus lisible) |
| Vérifier si une valeur est présente dans une sous-requête | = ANY |
| Vérifier si une valeur est supérieure à au moins une valeur d’un ensemble | > ANY |
| Vérifier si une valeur est inférieure à au moins une valeur d’un ensemble | < ANY |
Comparaison avec une liste de valeurs avec des opérateurs autres que = |
ANY (ex: > ANY, < ANY) |
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 |
Utilisation de ANY avec un opérateur inapproprié |
Mauvais opérateur | Vérifier la sémantique de l’opérateur |
Confusion entre ANY et ALL |
Mauvaise compréhension de la logique | Relire la définition (au moins un vs tous) |
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment comparer une valeur avec au moins une valeur d’un ensemble avec ANY / SOME. Il est maintenant temps d’aborder l’optimisation des requêtes avec les index.
👉 Chapitre 43 : Introduction aux index SQL
Bonne continuation !
Junior TSAFACK – 08/08/2026