Oracle: '= ANY () 'vs.' IN ()'
Я просто наткнулся на что-то в ORACLE SQL (не уверен, что это в других), что мне интересно. Я спрашиваю здесь как wiki, так как трудно пытаться искать символы в google...
Я только что обнаружил, что при проверке значения против набора значений вы можете сделать
WHERE x = ANY (a, b, c)
в отличие от обычных
WHERE x IN (a, b, c)
Итак, мне любопытно, каковы рассуждения для этих двух синтаксисов? Один стандартный и один какой-то странный синтаксис Oracle? Или они стандартные? И есть ли предпочтение одного над другим по соображениям производительности, или ?
просто любопытно, что кто-нибудь может сказать мне об этом синтаксисе "= ANY". CheerZ!
9 ответов
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
поддержка данного сайта.
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';
....................
надеюсь, что это помогает. -Noorin Фатима
проще говоря, и цитата из "освоения Oracle SQL" О'Рейли:
" использование IN с подзапросом функционально эквивалентно использованию ANY и возвращает TRUE, если совпадение найдено в наборе, возвращаемом подзапросом."
" мы думаем, вы согласитесь, что IN более интуитивен, чем любой, поэтому IN почти всегда используется в таких ситуациях."
надеюсь, что проясняет ваш вопрос о любом vs IN.
Я верить что то, что вы ищете это:
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 затем подзапрос в условие, содержащее EXISTS оператор и коррелированный подзапрос
любой синтаксис позволяет писать такие вещи, как
WHERE x > ANY(a, b, c)
или событие
WHERE x > ANY(SELECT ... FROM ...)
Не уверен, есть ли на самом деле никого на планете, кто использует любой (и его брат).
быстрый google нашел это http://theopensourcery.com/sqlanysomeall.htm
Any позволяет использовать оператор, отличный от=, в большинстве других случаев (особые случаи для нулей) он действует как IN. Вы можете думать о IN как о любом с оператором=.
Это стандартная. The SQL 1992 стандартные государств
8.4
[...]
<in predicate> ::= <row value constructor> [ NOT ] IN <in predicate value>
[...]
2) Пусть RVC будет конструктором , а IPV-значением .
[...]
4) выражение
RVC IN IPV
эквивалентно
RVC = ANY IPV
так на самом деле,<in predicate>
определение поведения базируется на 8.7 <quantified comparison predicate>
. Другими словами, Oracle правильно реализует стандарт SQL здесь
возможно, одна из связанных статей указывает на это, но не правда ли, что при поиске совпадения (=) два возвращают одно и то же. Однако, если вы ищете диапазон ответов ( > ,
я новенькая, простите, если я пропустил что-то очевидное...
MySql очищает любую документацию в ней довольно хорошо:
ключевое слово ANY, которое должно следовать за оператором сравнения, означает "верните TRUE, если сравнение истинно для любого из значений в столбец, возвращаемый вложенным запросом."Например:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
предположим, что в таблице t1 есть строка, содержащая (10). Этот выражение истинно, если таблица 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, using = ANY эквивалентно используя в оператор.