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 эквивалентно используя в оператор.