Подтвердить что ты не робот

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

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

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

WHERE x = ANY (a, b, c)

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

WHERE x IN (a, b, c)

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

Просто интересно, что кто-нибудь может рассказать мне об этом синтаксисе "= ANY". CheerZ!

4b9b3361

Ответ 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.