Oracle: '= ANY()' против 'IN()'
Я просто наткнулся на что-то в ORACLE SQL (не уверен, что это в других), что мне интересно. Я прошу здесь, как вики, так как трудно найти символы в google...
Я только что обнаружил, что при проверке значения по набору значений вы можете сделать
WHERE x = ANY (a, b, c)
В отличие от обычного
WHERE x IN (a, b, c)
Итак, мне любопытно, в чем причина этих двух синтаксисов? Является ли один стандартным и одним синтаксисом Oracle? Или они оба стандартные? И есть ли предпочтение одного за другим по соображениям производительности или?
Просто интересно, что кто-нибудь может рассказать мне об этом синтаксисе "= ANY".
CheerZ!
Ответы
Ответ 1
ANY
(или его синоним SOME
) является синтаксическим сахаром для EXISTS
с простой корреляцией:
SELECT *
FROM mytable
WHERE x <= ANY
(
SELECT y
FROM othertable
)
совпадает с:
SELECT *
FROM mytable m
WHERE EXISTS
(
SELECT NULL
FROM othertable o
WHERE m.x <= o.y
)
С условием равенства для поля, отличного от нуля, оно становится похожим на IN
.
Все основные базы данных, включая SQL Server
, MySQL
и PostgreSQL
, поддерживают это ключевое слово.
Ответ 2
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
например:
Найдите сотрудников, которые получают ту же зарплату, что и минимальная заработная плата для каждого отдела:
SELECT last_name, salary,department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);
Сотрудники, которые не являются ИТ-программистами и чья зарплата меньше, чем у любого ИТ-программиста:
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';
Сотрудники, чья зарплата меньше зарплаты всех сотрудников с идентификатором работы IT_PROG и чья работа не 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';
....................
Надеюсь, это поможет.
-Норин Фатима
Ответ 3
Проще говоря и цитируя О'Рейли "Освоение Oracle SQL":
"Использование IN с подзапросом функционально эквивалентно использованию ANY и возвращает TRUE, если совпадение найдено в наборе, возвращаемом подзапросом."
"Мы думаем, вы согласитесь, что IN более интуитивно, чем ANY, поэтому IN почти всегда используется в таких ситуациях".
Надеюсь, что вы очистите свой вопрос о ЛЮБОЙ против IN.
Ответ 4
Я считаю, что вы ищете следующее:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298
(Ссылка найдена на Блог Эдди Авада)
Подводя итог этому:
last_name IN ('SMITH', 'KING',
'JONES')
преобразуется в
last_name = 'SMITH' OR last_name =
'KING' OR last_name = 'JONES'
а
salary > ANY (:first_sal,
:second_sal)
преобразуется в
salary > :first_sal OR salary >
:second_sal
Оптимизатор преобразует условие который использует оператор ANY или SOME а затем подзапрос в условие, содержащее СУЩЕСТВУЮЩИЕ оператор и коррелированный подзапрос
Ответ 5
Синтаксис ANY позволяет писать такие вещи, как
WHERE x > ANY(a, b, c)
или событие
WHERE x > ANY(SELECT ... FROM ...)
Не уверен, что на самом деле есть кто-либо на планете, который использует ЛЮБОЕ (и его брат ВСЕ).
Ответ 6
Быстрый google нашел это http://theopensourcery.com/sqlanysomeall.htm
Любой разрешает вам использовать оператор, отличный от =, в большинстве случаев (специальные случаи для нулей), он действует как IN. Вы можете думать о IN как ЛЮБОЙ с помощью оператора =.
Ответ 7
Это стандарт. Стандартные состояния SQL 1992
8.4 < в предикате >
[...]
<in predicate> ::=
<row value constructor>
[ NOT ] IN <in predicate value>
[...]
2) Пусть RVC - конструктор значений строки и ltp, а IPV - значение < in predicate > .
[...]
4) Выражение
RVC IN IPV
эквивалентно
RVC = ANY IPV
Таким образом, определение поведения <in predicate>
основано на 8.7 <quantified comparison predicate>
. Другими словами, Oracle правильно реализует стандарт SQL здесь
Ответ 8
Возможно, одна из связанных статей указывает на это, но не правда ли, что при поиске соответствия (=) оба возвращают одно и то же. Однако, если вы ищете диапазон ответов ( > , <, etc), вы не можете использовать "IN" и использовать "ANY"...
Я новичок, простите, если я пропустил что-то очевидное...
Ответ 9
MySql полностью очищает в нем документацию:
Ключевое слово ANY, которое должно следовать за оператором сравнения, означает "return TRUE, если сравнение TRUE для ЛЮБЫХ значений в столбец, который возвращает подзапрос". Например:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
Предположим, что в таблице t1 есть строка, содержащая (10). выражение TRUE, если таблица t2 содержит (21,14,7), поскольку существует значение 7 в t2, которое меньше 10. Выражение FALSE, если таблица t2 содержит (20,10), или если таблица t2 пуста. Выражение неизвестный (т.е. NULL), если таблица t2 содержит (NULL, NULL, NULL).
https://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html
Кроме того, изучение SQL Аланом Болье утверждает следующее:
Хотя большинство людей предпочитают использовать IN, использование = ANY эквивалентно используя оператор IN.