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