57 votes

Différence entre les opérateurs IN et ANY en SQL

Quelle est la différence entre IN y ANY opérateurs en SQL ?

57voto

Pranay Rana Points 69934
SQL>
SQL> -- Use the ANY operator in a WHERE clause to compare a value with any of the values in a list.
SQL>

SQL> -- Vous devez placer un opérateur =, <>, <, >, <=, ou >= avant ANY.

SQL> SELECT *
  2  FROM employee
  3  WHERE salary > ANY (2000, 3000, 4000);

Pour l'opérateur In

SQL> -- Use the IN operator in a WHERE clause to compare a value with any of the values in a list.
SQL> SELECT *
  2  FROM employee
  3  WHERE salary IN (2000, 3000, 4000);

Mais avec l'opérateur IN, vous ne pouvez pas utiliser =, <>, <, >, <=, ou >=.

3 votes

Y a-t-il une raison d'utiliser l'un plutôt que l'autre lors de l'élaboration d'un plan d'action ? = ANY ? (bien entendu, utilisez ANY pour les autres opérateurs) = parce que IN ne concerne que les = )

1 votes

Comme @tscizzle, j'aimerais également savoir si ANY/ALL offre des cas particuliers où il pour =ANY ou <>ALL est différent de IN/NOT IN ? Et pour > et < l'utilisation de MAX/MIN dans une sous-requête scalaire ? S'agit-il d'une simple question de goût ou existe-t-il des cas particuliers où ils agissent différemment ? J'ai essayé avec des valeurs nulles et des ensembles vides, mais je n'ai pas trouvé de différence.

0 votes

Il existe un cas très particulier où ils sont clairement meilleurs, les étranges "=ALL" et "<>ANY", qui testent tous deux si tous les éléments de l'ensemble sont égaux ET, le cas échéant, s'ils sont égaux/différents à la valeur de l'expression. Mais si jamais vous avez besoin de cette construction étrange, alors "...WHERE value=ALL (SELECT a FROM Tbl)" est beaucoup plus lisible que, par exemple, "...WHERE value=(SELECT MIN(a) FROM Tbl HAVING MIN(a)=MAX(a))". - Je ne pense pas avoir jamais eu besoin de cette construction...

25voto

codaddict Points 189

DANS - est égal à n'importe quel élément de la liste

N'IMPORTE QUEL - Compare la valeur à chaque valeur renvoyée par la sous-requête.

TOUTES - Compare la valeur à chaque valeur renvoyée par la sous-requête.

Par exemple :

IN :

Afficher les détails de tous les employés dont les salaires correspondent aux moindres investissements des départements ?

 Select Ename, Sal, Deptno 
 from Emp 
 Where Sal IN (Select Min(Sal) 
               From Emp 
               Group By Deptno);

ANY :

< ANY signifie inférieur à la valeur maximale de la liste.

Obtenir les détails de tous les employés qui gagnent moins que l'employé qui gagne le plus d'argent Contrôler les autres employés ?

 Select Empno, Ename, Job, Sal 
 From Emp
 Where Sal < Any (Select Distinct MGR 
                  From Emp);

> ANY signifie plus que la valeur minimale de la liste.

Obtenez les détails de tous les employés qui gagnent plus que le moins payé du département 10 ?

 Select Empno, Ename, Job, Sal 
 From Emp
 Where Sal > Any (Select Min(Sal) 
                  From Emp 
                  Where Deptno 10);

\=ANY est équivalent à In Operator.

Note : QUELQUES-UNES est également utilisé à la place de ANY.

19voto

Wernfried Points 2508

Pour une meilleure compréhension, ces deux conditions sont peut-être équivalentes. C'est une question de goût quant à celle que vous utilisez (à condition que le SGBDR supporte les deux).

... WHERE x IN (SELECT Y FROM THE_TABLE)  
... WHERE x =ANY (SELECT Y FROM THE_TABLE) 

et ceux-ci aussi

... WHERE x NOT IN (SELECT Y FROM THE_TABLE) 
... WHERE x <>ALL (SELECT Y FROM THE_TABLE) 

En fait, mon habitude personnelle est d'utiliser IN pour une expression de liste (comme WHERE x IN (2,4,6,8) y =ANY , resp. <>ALL pour les sous-requêtes.

0 votes

C'est la réponse la plus simple (et la meilleure) IMO

8voto

Mansi Raval Points 182

Tout en utilisant tous les

SELECT empno, sal FROM emp WHERE sal > ALL (2000, 3000, 4000) ;

 EMPNO        SAL

  7839       5000

Il retournera un résultat équivalent à la requête :

SELECT empno, sal FROM emp WHERE sal > 2000 AND sal > 3000 AND sal > 4000 ;

En utilisant n'importe quel

SELECT empno, sal FROM emp WHERE sal > ANY (2000, 3000, 4000) ;

 EMPNO        SAL

  7566       2975
  7698       2850
  7782       2450
  7788       3000
  7839       5000
  7902       3000

Renvoie un résultat identique à

SELECT empno, sal FROM emp WHERE sal > 2000 OR sal > 3000 OR sal > 4000 ;

0 votes

Mais attention, ils agissent de manière assez étrange sur les ensembles vides... Les six variantes "ALL" renvoient toujours vrai, et les six variantes "ANY" renvoient toujours faux. Essayez par exemple " SELECT 5 WHERE 4=ALL (SELECT 1 WHERE 2=3) "

3voto

Thomas Mueller Points 18666

Avec ANY, vous avez besoin d'un opérateur :

WHERE X > ANY (SELECT Y FROM Z)

Avec IN, vous ne pouvez pas. Il teste toujours l'égalité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X