Відмінності між операторами EXISTS і IN в SQL

Автор: Peter Berry
Дата Створення: 12 Серпень 2021
Дата Оновлення: 17 Листопад 2024
Anonim
Джоины в SQL запросах. Назначение. Разница между LEFT и INNER JOIN. Соединения таблиц / Илья Хохлов
Відеоролик: Джоины в SQL запросах. Назначение. Разница между LEFT и INNER JOIN. Соединения таблиц / Илья Хохлов

Зміст

Постійним завданням у використанні 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 повертає всі основні рядки, якщо підзапит містить будь-які рядки. Використовується тільки в поєднанні з підзапитом. Повернені рядки визначаються фільтром в основному запиті.

Приклад: WHERE EXISTS (Підзапит, який повертає набір)

Різниця

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


Подібності

І EXISTS, і IN підтримують корельовані і некоррельовані підзапити, і обидва можуть давати подібні результати. При кореляції вони задовольняють основне поле запиту для поля підзапит (наприклад: principal.id = subquery.id). Підзапит визначає рядок за рядком для кожного знайденого входження. У цьому випадку IN і EXISTS повертають ті ж лінії, що ґрунтуються на подібних умовах "id". Коли некорельований, два оператори обробляють свої підзапити, а потім об'єднують результати для основного запиту.

Продуктивність

Продуктивність визначається оптимізатором бази даних і планом виконання, який використовується для виконаного коду. Для EXISTS і IN оптимізатор може вибирати різні шляхи. У Oracle NOT EXISTS зазвичай швидше, ніж NOT IN. Зрештою, деякі спроби і помилки потрібні для сортування найкоротшого шляху, залежно від використовуваної бази даних і версії. Обов'язково спочатку скористайтеся оператором, який гарантує правильні результати, а потім спробуйте замінити операторів, щоб побачити, який найшвидший.