Разница между EXISTS и IN в SQL? - PullRequest
       92

Разница между EXISTS и IN в SQL?

412 голосов
/ 24 августа 2008

В чем разница между предложениями EXISTS и IN в SQL?

Когда мы должны использовать EXISTS, и когда мы должны использовать IN?

Ответы [ 20 ]

3 голосов
/ 07 апреля 2016

Причина в том, что оператор EXISTS работает по принципу «по крайней мере найден». Возвращает true и останавливает сканирование таблицы, если найдена хотя бы одна подходящая строка.

С другой стороны, когда оператор IN объединяется с подзапросом, MySQL должен сначала обработать подзапрос, а затем использовать результат подзапроса для обработки всего запроса.

Общее правило состоит в том, что если подзапрос содержит большой Объем данных, оператор EXISTS обеспечивает лучшую производительность.

Однако запрос, использующий оператор IN, будет выполняться быстрее, если набор результатов, возвращаемый из подзапроса, очень мал.

3 голосов
/ 04 июля 2013

Какой из них быстрее, зависит от количества запросов, извлекаемых внутренним запросом:

  • Когда ваш внутренний запрос извлекает тысячи строк, тогда EXIST будет лучшим выбором
  • Когда ваш внутренний запрос извлекает несколько строк, IN будет быстрее

EXIST оценивает значение true или false, но IN сравнивает несколько значений. Если вы не знаете, существует запись или нет, вам следует выбрать EXIST

3 голосов
/ 21 марта 2012

Насколько мне известно, когда подзапрос возвращает значение NULL, тогда весь оператор становится NULL. В этих случаях мы используем ключевое слово EXITS. Если мы хотим сравнить конкретные значения в подзапросах, мы используем ключевое слово IN.

1 голос
/ 13 сентября 2016

Насколько я понимаю, оба должны быть одинаковыми, если мы не имеем дело со значениями NULL.

По той же причине, по которой запрос не возвращает значение для = NULL vs, имеет значение NULL. http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/

Что касается аргумента «булево против компаратора», то для генерации логического значения необходимо сравнить оба значения, и вот как это происходит, если работает условие. Так что я не понимаю, как IN и EXISTS ведут себя по разному ,

0 голосов
/ 27 июня 2017

Я обнаружил, что использование ключевого слова EXISTS часто очень медленно (это очень верно в Microsoft Access). Вместо этого я использую оператор соединения следующим образом: должен-я потребительной-ключевого слова существует в-SQL

0 голосов
/ 04 июня 2012

Если вы используете оператор IN, механизм SQL будет сканировать все записи, извлеченные из внутреннего запроса. С другой стороны, если мы используем EXISTS, движок SQL остановит процесс сканирования, как только найдет совпадение.

0 голосов
/ 24 марта 2017

Я полагаю, что это простой ответ. Почему бы вам не проверить это у людей, которые разработали эту функцию в своих системах?

Если вы являетесь разработчиком MS SQL, вот ответ напрямую от Microsoft.

IN

Определяет, соответствует ли указанное значение какому-либо значению в подзапросе или списке.

EXISTS

Указывает подзапрос для проверки существования строк.

0 голосов
/ 04 декабря 2012

Если подзапрос возвращает более одного значения, вам может потребоваться выполнить внешний запрос - если значения в столбце, указанном в условии, соответствуют любому значению в наборе результатов подзапроса. Для выполнения этой задачи вам необходимо использовать ключевое слово in.

Вы можете использовать подзапрос, чтобы проверить, существует ли набор записей. Для этого вам нужно использовать предложение exists с подзапросом. Ключевое слово exists всегда возвращает значение true или false.

0 голосов
/ 17 августа 2017

In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.

https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403

0 голосов
/ 09 апреля 2013

EXISTS быстрее по производительности, чем IN. Если большинство критериев фильтра находится в подзапросе, то лучше использовать IN, а если большинство критериев фильтра находится в основном запросе, то лучше использовать EXISTS.

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