learn khan how course books beginner academy sql oracle syntax

sql - khan - sequel database



Oracle: ''= ANY()'' vs. ''IN()'' (9)

Este es un estándar. Los estados estándar de SQL 1992

8.4 <en predicado>

[...]

<in predicate> ::= <row value constructor> [ NOT ] IN <in predicate value>

[...]

2) Deje que RVC sea el <constructor de valores de fila> y permita que IPV sea el <en valor de predicado>.

[...]

4) La expresión

RVC IN IPV

es equivalente a

RVC = ANY IPV

De hecho, la definición del comportamiento <in predicate> se basa en el 8.7 <quantified comparison predicate> . En otras palabras, Oracle implementa correctamente el estándar SQL aquí

Acabo de tropezar con algo en ORACLE SQL (no estoy seguro de si está en otros), que me da curiosidad. Pregunto aquí como una wiki, ya que es difícil tratar de buscar símbolos en google ...

Acabo de descubrir que al verificar un valor con un conjunto de valores puede hacer

WHERE x = ANY (a, b, c)

A diferencia de lo usual

WHERE x IN (a, b, c)

Entonces, tengo curiosidad, ¿cuál es el razonamiento para estas dos sintaxis? ¿Hay una sintaxis de Oracle estándar y otra extraña? ¿O son ambos estándar? ¿Y hay una preferencia de uno sobre el otro por motivos de rendimiento, o?

Solo curiosidad por lo que alguien pueda decirme sobre esa sintaxis ''= ANY''. CheerZ!


La sintaxis ANY te permite escribir cosas como

WHERE x > ANY(a, b, c)

o evento

WHERE x > ANY(SELECT ... FROM ...)

No estoy seguro de si realmente hay alguien en el planeta que use CUALQUIER (y su hermano TODOS).


MySql borra CUALQUIER en su documentación bastante bien:

La palabra clave ANY, que debe seguir a un operador de comparación, significa "devolver TRUE si la comparación es TRUE para CUALQUIERA de los valores en la columna que devuelve la subconsulta". Por ejemplo:

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

Supongamos que hay una fila en la tabla t1 que contiene (10). La expresión es TRUE si la tabla t2 contiene (21,14,7) porque hay un valor 7 en t2 que es menor que 10. La expresión es FALSE si la tabla t2 contiene (20,10), o si la tabla t2 está vacía. La expresión es desconocida (es decir, NULL) si la tabla t2 contiene (NULL, NULL, NULL).

https://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html

También Learning SQL por Alan Beaulieu afirma lo siguiente:

Aunque la mayoría de las personas prefiere usar IN, usar = ANY es equivalente a usar el operador IN.


Para decirlo de forma simple y citando de "Mastering Oracle SQL" de O''Reilly:

"Usar IN con una subconsulta es funcionalmente equivalente a usar ANY, y devuelve TRUE si se encuentra una coincidencia en el conjunto devuelto por la subconsulta."

"Creemos que estarás de acuerdo en que IN es más intuitivo que CUALQUIER, por lo que IN casi siempre se utiliza en tales situaciones".

Espero que aclare su pregunta acerca de ANY vs IN.


Tal vez uno de los artículos vinculados lo señala, pero ¿no es verdad que al buscar un partido (=) los dos devuelven lo mismo? Sin embargo, si busca un rango de respuestas (>, <, etc.) no puede usar "IN" y debería usar "ANY" ...

Soy un neófito, perdóname si me he perdido algo obvio ...


Un google rápido encontró esto http://theopensourcery.com/sqlanysomeall.htm

Cualquiera le permite usar un operador distinto de =, en la mayoría de los demás casos especiales para nulos, actúa como IN. Puedes pensar en IN como CUALQUIERA con el operador =.


ANY (o su sinónimo SOME ) es un azucar de sintaxis para EXISTS con una correlación simple:

SELECT * FROM mytable WHERE x <= ANY ( SELECT y FROM othertable )

es lo mismo que:

SELECT * FROM mytable m WHERE EXISTS ( SELECT NULL FROM othertable o WHERE m.x <= o.y )

Con la condición de igualdad en un campo que no admite nulos, se vuelve similar a IN .

Todas las principales bases de datos, incluidos SQL Server , MySQL y PostgreSQL , son compatibles con esta palabra clave.


Creo que lo que estás buscando es esto:

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298 (Enlace encontrado en el blog de Eddie Awad ) Para resumir aquí:

last_name IN (''SMITH'', ''KING'', ''JONES'')

se transforma en

last_name = ''SMITH'' OR last_name = ''KING'' OR last_name = ''JONES''

mientras

salary > ANY (:first_sal, :second_sal)

se transforma en

salary > :first_sal OR salary > :second_sal

El optimizador transforma una condición que utiliza el operador ANY o SOME seguido de una subconsulta en una condición que contiene el operador EXISTS y una subconsulta correlacionada


IN- Equal to any member in the list ANY- Compare value to **each** value returned by the subquery ALL- Compare value to **EVERY** value returned by the subquery <ANY() - less than maximum >ANY() - more than minimum =ANY() - equivalent to IN >ALL() - more than the maximum <ALL() - less than the minimum

p.ej:

Encuentre los empleados que ganan el mismo salario que el salario mínimo para cada departamento:

SELECT last_name, salary,department_id FROM employees WHERE salary IN (SELECT MIN(salary) FROM employees GROUP BY department_id);

Empleados que no son programadores de TI y cuyo salario es inferior al de cualquier programador de TI:

SELECT employee_id, last_name, salary, job_id FROM employees WHERE salary <ANY (SELECT salary FROM employees WHERE job_id = ''IT_PROG'') AND job_id <> ''IT_PROG'';

Los empleados cuyo salario es inferior al salario de todos los empleados con un ID de trabajo de IT_PROG y cuyo trabajo no es IT_PROG:

SELECT employee_id,last_name, salary,job_id FROM employees WHERE salary <ALL (SELECT salary FROM employees WHERE job_id = ''IT_PROG'') AND job_id <> ''IT_PROG'';

....................

Espero eso ayude. -Noorin Fatima