Различия между операторами EXISTS и IN в SQL

Автор: Peter Berry
Дата создания: 12 Август 2021
Дата обновления: 12 Май 2024
Anonim
SQL вложенные запросы в EXISTS, IN, FROM, SELECT. Практика SQL
Видео: SQL вложенные запросы в EXISTS, IN, FROM, SELECT. Практика SQL

Содержание

Постоянной проблемой при использовании SQL является определение правильного использования операторов EXISTS и IN. Два оператора могут давать одинаковые результаты, но не всегда. Кроме того, ведутся серьезные споры о том, как каждый оператор оптимизирован по скорости. Пользователи должны понимать различные атрибуты каждого оператора и экспериментировать с ними, чтобы определить подходящее использование.


Учитывайте свои цели SQL при выборе EXISTS или IN (Jupiterimages / Photos.com / Getty Images)

Оператор IN

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

Пример 1: WHERE table.field IN ('a', 'b', 'c') Пример 2: WHERE table.field IN (Подзапрос, который возвращает набор)

СУЩЕСТВУЕТ оператор

Оператор EXISTS возвращает все основные строки, если подзапрос содержит какие-либо строки. Он используется только в сочетании с подзапросом. Возвращаемые строки определяются фильтром в основном запросе.

Пример: ГДЕ СУЩЕСТВУЕТ (подзапрос, который возвращает набор)

разница

Оператор IN не может оценить значения NULL, поэтому такие строки всегда будут ложными и не будут возвращаться, в отличие от оператора EXISTS, который оценивает и возвращает строки со значениями NULL.


сходство

И EXISTS, и IN поддерживают коррелированные и некоррелированные подзапросы, и оба могут давать схожие результаты. При корреляции они удовлетворяют основному полю запроса для поля подзапроса (например: Principal.id = subquery.id). Подзапрос оценивает строку за строкой для каждого найденного вхождения. В этом случае IN и EXISTS будут возвращать одинаковые строки, основываясь на одинаковых условиях «id». При отсутствии корреляции оба оператора обрабатывают свои подзапросы, а затем объединяют результаты для основного запроса.

производительность

Производительность определяется оптимизатором базы данных и планом выполнения, используемым для исполняемого кода. Для EXISTS и IN оптимизатор может выбирать разные пути. В Oracle NOT EXISTS обычно быстрее, чем NOT IN. В конце, некоторые попытки и ошибки требуются для сортировки кратчайшего пути, в зависимости от используемой базы данных и версии. Обязательно сначала используйте оператор, который гарантирует правильные результаты, а затем попытайтесь заменить операторов, чтобы увидеть, какой из них самый быстрый.