В чем разница между EXISTS
и IN
пунктом в SQL?
Когда мы должны использовать EXISTS
, и когда мы должны использовать IN
?
exists
Ключевое слово может быть использовано таким образом, но на самом деле он предназначен как способ подсчета следует избегать:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
Это наиболее полезно, когда у вас есть if
условные операторы, так как это exists
может быть намного быстрее, чем count
.
in
Лучше всего использовать , когда у вас есть список статического пройти:
select * from [table]
where [field] in (1, 2, 3)
Когда у вас есть таблица в in
утверждении, имеет смысл использовать a join
, но в основном это не должно иметь значения. Оптимизатор запросов должен возвращать тот же план в любом случае. В некоторых реализациях (в основном старых, таких как Microsoft SQL Server 2000) in
запросы всегда получают вложенный план соединения , тогда как join
запросы будут использовать вложенные, слияния или хэширования в зависимости от ситуации. Более современные реализации умнее и могут корректировать план даже при in
использовании.
JOIN
ее вместоIN
.select * from [table] where [field] in (select [field] from [table2])
возвращает те же результаты (и план запроса), что иselect * from [table] join [table2] on [table2].[field] = [table].[field]
.table
, а второй возвращает все изtable
иtable2
. В некоторых (в основном старых) базах данных SQLin
запрос будет реализован как вложенное объединение, в то время какjoin
запрос может быть вложенным, объединенным, хэшированным и т. Д. - как угодно быстро.exists
может использоваться внутри оператора case, поэтому они могут быть полезны и в этом случае, например:select case when exists (select 1 from emp where salary > 1000) then 1 else 0 end as sal_over_1000
EXISTS
скажет вам, вернул ли запрос какие-либо результаты. например:IN
используется для сравнения одного значения с несколькими и может использовать литеральные значения, например:Вы также можете использовать результаты запроса с
IN
предложением, например так:источник
На основе правила оптимизатора :
EXISTS
гораздо быстрее, чемIN
, когда результаты подзапроса очень велики.IN
быстрее, чемEXISTS
, когда результаты подзапроса очень малы.На основе оптимизатора затрат :
источник
Я предполагаю, что вы знаете, что они делают, и, таким образом, они используются по-разному, поэтому я пойму ваш вопрос следующим образом: когда будет хорошей идеей переписать SQL-код, чтобы использовать IN вместо EXISTS, или наоборот.
Это справедливое предположение?
Редактировать : причина, по которой я спрашиваю, состоит в том, что во многих случаях вы можете переписать SQL на основе IN, чтобы использовать вместо него EXISTS, и наоборот, и для некоторых механизмов баз данных оптимизатор запросов будет обрабатывать их по-разному.
Например:
можно переписать на:
или с объединением:
Таким образом, мой вопрос все еще остается в силе: интересно ли оригинальному постеру узнать о том, что делает IN и EXISTS, и, следовательно, как его использовать, или он попросит переписать SQL-запрос с использованием IN, чтобы вместо него использовать EXISTS, или наоборот, будет хорошей идеей?
источник
JOIN
, вам понадобитсяDISTINCT
EXISTS
гораздо быстрее, чемIN
когда результаты подзапроса очень велики.IN
быстрее, чемEXISTS
когда результаты подзапроса очень малы.Запрос 1
Запрос 2
Если в
t1
вашем id есть нулевое значение, тогда Query 1 найдет их, но Query 2 не может найти нулевые параметры.Я имею в виду, что
IN
ничего нельзя сравнить с нулем, поэтому он не имеет результата для нуля, ноEXISTS
может сравнить все с нулем.источник
Если вы используете
IN
оператор, механизм SQL будет сканировать все записи, извлеченные из внутреннего запроса. С другой стороны, если мы используемEXISTS
, движок SQL остановит процесс сканирования, как только найдет совпадение.источник
IN поддерживает только отношения равенства (или неравенства, когда им предшествует NOT ).
Это синоним = любой / = некоторые , например,
EXISTS поддерживает разные типы отношений, которые нельзя выразить с помощью IN , например:
И на другой ноте -
Предполагаемая производительность и технические различия между EXISTS и IN могут быть результатом реализаций / ограничений / ошибок конкретного поставщика, но во многих случаях они являются не более чем мифами, созданными из-за непонимания внутренних структур баз данных.
Определение таблиц, точность статистики, конфигурация базы данных и версия оптимизатора оказывают влияние на план выполнения и, следовательно, на показатели производительности.
источник
Exists
Ключевое слово оценивает истинным или ложным, ноIN
ключевое слово сравнить все значения в соответствующем столбце юга запроса. Еще одинSelect 1
можно использовать сExists
командой. Пример:Но
IN
менее эффективно, такExists
быстрее.источник
Я думаю,
EXISTS
это когда вам нужно сопоставить результаты запроса с другим подзапросом. Результаты запроса # 1 должны быть получены там, где совпадают результаты SubQuery. Вид присоединения. Например, таблица клиентов № 1, которые также разместили таблицу заказов № 2IN предназначен для извлечения, если значение определенного столбца находится
IN
в списке (1,2,3,4,5). Например, выберите клиентов, которые находятся в следующих почтовых индексах, т.е. значения zip_code находятся в (....) списке.Когда использовать один поверх другого ... когда вы чувствуете, что он читается соответствующим образом (лучше информирует о намерениях).
источник
Разница заключается здесь:
Выше запрос вернет все записи, а ниже один вернется пустым.
Попробуйте и посмотрите на результат.
источник
Насколько я знаю, когда подзапрос возвращает
NULL
значение, тогда весь оператор становитсяNULL
. В этих случаях мы используемEXITS
ключевое слово. Если мы хотим сравнить конкретные значения в подзапросах, мы используемIN
ключевое слово.источник
Какой из них быстрее, зависит от количества запросов, извлекаемых внутренним запросом:
EXIST оценивает на true или false, но IN сравнивает множественное значение. Если вы не знаете, существует запись или нет, вы должны выбрать EXIST
источник
Причина в том, что оператор EXISTS работает по принципу «как минимум найден». Возвращает true и останавливает сканирование таблицы, если найдена хотя бы одна подходящая строка.
С другой стороны, когда оператор IN объединяется с подзапросом, MySQL должен сначала обработать подзапрос, а затем использовать результат подзапроса для обработки всего запроса.
источник
Я понимаю, что оба должны быть одинаковыми, если мы не имеем дело со значениями NULL.
По той же причине, по которой запрос не возвращает значение для = NULL против NULL. http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
Что касается аргумента «булево против компаратора», то для генерации логического значения необходимо сравнить оба значения, и вот как работает любое условие. Поэтому я не могу понять, как IN и EXISTS ведут себя по-разному.
источник
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
источник
Если подзапрос возвращает более одного значения, вам может потребоваться выполнить внешний запрос - если значения в столбце, указанном в условии, соответствуют какому-либо значению в наборе результатов подзапроса. Для выполнения этой задачи вам необходимо использовать
in
ключевое слово.Вы можете использовать подзапрос, чтобы проверить, существует ли набор записей. Для этого вам нужно использовать
exists
предложение с подзапросом.exists
Ключевое слово всегда возвращает истинное или ложное значение.источник
Я считаю, что это имеет прямой ответ. Почему бы вам не проверить это у людей, которые разработали эту функцию в своих системах?
Если вы являетесь разработчиком MS SQL, вот ответ непосредственно от Microsoft.
IN
:EXISTS
:источник
Я обнаружил, что использование ключевого слова EXISTS часто очень медленно (это очень верно в Microsoft Access). Вместо этого я использую оператор соединения следующим образом: should-i-use-the-keyword-существующие-in-sql
источник
EXISTS быстрее в производительности, чем IN. Если большинство критериев фильтра находится в подзапросе, то лучше использовать IN, а если большинство критериев фильтра находится в основном запросе, то лучше использовать EXISTS.
источник
Если вы используете оператор IN, механизм SQL будет сканировать все записи, извлеченные из внутреннего запроса. С другой стороны, если мы используем EXISTS, механизм SQL остановит процесс сканирования, как только найдет совпадение.
источник
IN
иEXISTS
может быть эквивалентным и преобразованным друг в друга.