Skip to content

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é SOME est un alias de ANY. L’un et l’autre des termes peut être utilisé indifféremment. Certains développeurs préfèrent ANY pour sa clarté, d’autres utilisent SOME pour une meilleure lisibilité en anglais.


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 table1
WHERE 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 !<.


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.departement
FROM employe e
WHERE 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.departement
FROM employe e
WHERE 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).


La commande IN est équivalente à l’opérateur = suivi de ANY.

-- Avec IN
SELECT * FROM employe WHERE departement IN ('Ventes', 'Marketing');
-- Avec ANY (équivalent)
SELECT * FROM employe WHERE departement = ANY ('Ventes', 'Marketing');
-- Avec IN et sous-requête
SELECT * FROM employe WHERE departement IN (SELECT departement FROM objectif);
-- Avec ANY (équivalent)
SELECT * FROM employe WHERE departement = ANY (SELECT departement FROM objectif);

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 Ventes
SELECT * FROM employe
WHERE 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 Ventes
SELECT * FROM employe
WHERE salaire > ALL (SELECT objectif_salaire FROM objectif WHERE departement = 'Ventes');
-- Retourne les employés dont le salaire est > 3000 (le plus grand objectif)

Si la sous-requête ne retourne aucune ligne, la condition ANY est évaluée comme FALSE :

SELECT *
FROM employe
WHERE 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 ALL qui retournerait TRUE dans le même cas.


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 NULL dans la sous-requête pour éviter des résultats inattendus :

SELECT * FROM employe
WHERE salaire > ANY (
SELECT objectif_salaire
FROM objectif
WHERE objectif_salaire IS NOT NULL
);

  1. ANY est généralement plus efficace que ALL car il peut s’arrêter dès qu’une correspondance est trouvée.

  2. Pour les grandes sous-requêtes, EXISTS est souvent plus performant que = ANY :

-- Avec ANY
SELECT * 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);
  1. Utilisez IN pour une meilleure lisibilité lorsque vous utilisez = ANY.

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)

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)

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)

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