Oracle: '= ANY ()' против 'IN ()' - PullRequest
       4

Oracle: '= ANY ()' против 'IN ()'

50 голосов
/ 19 февраля 2010

Я только что наткнулся на что-то в ORACLE SQL (не уверен, если это в других), что мне любопытно. Я спрашиваю здесь, как вики, так как трудно попытаться найти символы в Google ...

Я только что обнаружил, что при проверке значения по набору значений вы можете сделать

WHERE x = ANY (a, b, c)

В отличие от обычного

WHERE x IN (a, b, c)

Так что мне любопытно, в чем причина этих двух синтаксисов? Является ли один стандартный и один какой-то странный синтаксис Oracle? Или они оба стандартные? И есть ли предпочтение одного над другим по причинам производительности или?

Просто любопытно, что кто-нибудь может сказать мне об этом "ЛЮБОМ" синтаксисе. CheerZ!

Ответы [ 9 ]

33 голосов
/ 19 февраля 2010

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, поддерживают это ключевое слово.

19 голосов
/ 13 апреля 2013
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);

Сотрудники, которые не являются IT-программистами и чья зарплата ниже, чем у любого IT-программиста:

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';

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

Надеюсь, это поможет. -Нуорин Фатима

16 голосов
/ 19 февраля 2010

Проще говоря, и цитата из «Освоения Oracle SQL» О'Рейли:

"Использование IN с подзапросом функционально эквивалентно использованию ANY и возвращает TRUE, если в наборе, возвращенном подзапросом, найдено соответствие."

«Мы думаем, вы согласитесь, что IN более интуитивен, чем ЛЮБОЙ, поэтому IN почти всегда используется в таких ситуациях».

Надеюсь, что прояснит ваш вопрос о ЛЮБОМ против IN.

9 голосов
/ 19 февраля 2010

Я верю , что вы ищете это:

http://download -west.oracle.com / Docs / кд / 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

Оптимизатор преобразует условие который использует оператор ЛЮБОЙ или НЕКОТОРЫЙ с последующим подзапросом в условие, содержащее СУЩЕСТВУЮЩИЕ оператор и коррелированный подзапрос

6 голосов
/ 19 февраля 2010

ЛЮБОЙ синтаксис позволяет писать такие вещи, как

WHERE x > ANY(a, b, c)

или событие

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

Не уверен, есть ли на планете кто-нибудь, кто использует ЛЮБОГО (и его брата ВСЕ).

5 голосов
/ 19 февраля 2010

Быстрый Google нашел это http://theopensourcery.com/sqlanysomeall.htm

Любой позволяет использовать оператор, отличный от =, в большинстве других случаев (в особых случаях для нулей) он действует как IN Вы можете думать о IN как о ЛЮБОМ с оператором =.

1 голос
/ 05 ноября 2017

MySql довольно хорошо проясняет ЛЮБОЕ в своей документации:

Ключевое слово ANY, которое должно следовать за оператором сравнения, означает «вернуть TRUE, если сравнение равно TRUE для ЛЮБЫХ значений в столбцечто подзапрос возвращает. »Например:

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

Предположим, что в таблице t1 есть строка, содержащая (10).Выражение TRUE, если таблица t2 содержит (21,14,7), потому что в t2 есть значение 7, которое меньше 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.

1 голос
/ 08 февраля 2013

Возможно, одна из связанных статей указывает на это, но не правда ли, что при поиске совпадения (=) оба возвращают одно и то же.Однако, если вы ищете диапазон ответов (>, <и т. Д.), Вы не можете использовать «IN» и должны были бы использовать «ЛЮБОЙ» ... </p>

Я новичок, простите, если ямы упустили что-то очевидное ...

1 голос
/ 10 апреля 2012

Это стандарт. Стандарт 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 здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...