SQL - IN vs EXISTS: Полное руководство для начинающих

Здравствуйте, будущие маги SQL! Я рад стать вашим проводником в этом захватывающем путешествии в мир SQL. Сегодня мы рассмотрим два мощных инструмента в нашем арсенале SQL: операторы IN и EXISTS. Не волнуйтесь, если вы новички в программировании - яstep by step, как я делал это для countless студентов в своей аудитории на протяжении многих лет.

SQL - IN vs EXISTS

Оператор SQL IN

Давайте начнем с оператора IN. Представьте, что вы планируете вечеринку и у вас есть список друзей, которых вы хотите пригласить. Оператор IN работает аналогичным образом - он позволяет вам указать несколько значений в предложении WHERE. Это как сказать: "Я хочу найти все данные, которые соответствуют любому из этих значений."

Основной синтаксис

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

Пример 1: Поиск конкретных фруктов

Давайте представим, что у нас есть таблица 'fruits' с колонками 'id' и 'name'. Мы хотим найти все фрукты, которые являются яблоками, бананами или апельсинами.

SELECT * FROM fruits
WHERE name IN ('apple', 'banana', 'orange');

Этот запрос вернет все строки, где имя фрукта равно apple, banana или orange. Это как спросить: "Можно ли мне все фрукты из этого списка?"

Пример 2: Использование IN с подзапросом

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

SELECT * FROM fruits
WHERE name IN (SELECT fruit_name FROM favorite_fruits);

Этот запрос находит все фрукты, которые кто-то любит. Это как сказать: "Покажи мне все фрукты, которые кто-то включил в свой список любимых."

Оператор SQL EXISTS

Теперь перейдем к оператору EXISTS. Если IN resembles checking items off a list, EXISTS больше похож на постановку да/нет вопросы. Он проверяет,是否存在 какие-либо строки, соответствующие определенному условию.

Основной синтаксис

SELECT column_name(s)
FROM table_name
WHERE EXISTS (subquery);

Пример 3: Поиск фруктов с заказами

Давайте представим, что у нас есть таблица 'orders', которая записывает заказы на фрукты. Мы хотим найти все фрукты, которые были заказаны хотя бы один раз.

SELECT * FROM fruits
WHERE EXISTS (
SELECT 1 FROM orders
WHERE orders.fruit_id = fruits.id
);

Этот запрос возвращает все фрукты, которые были заказаны хотя бы один раз. Это как спросить: "Есть ли у этого фрукта хотя бы один заказ? Если да, покажи мне этот фрукт."

Пример 4: Поиск клиентов без заказов

Мы также можем использовать NOT EXISTS для поиска обратного. Давайте найдем клиентов, которые не сделали ни одного заказа.

SELECT * FROM customers
WHERE NOT EXISTS (
SELECT 1 FROM orders
WHERE orders.customer_id = customers.id
);

Этот запрос находит всех клиентов, которые не сделали ни одного заказа. Это как спросить: "Есть ли клиенты, которые не сделали ни одного заказа? Покажи мне этих клиентов."

IN vs EXISTS: Which One to Use?

Теперь, когда мы видели и IN, и EXISTS в действии, вы можете задаться вопросом: "Когда мне использовать каждый из них?" Отличный вопрос! Давайте разберем это.

С учетом производительности

В общем:

  • IN часто быстрее, когда результаты подзапроса малы
  • EXISTS может быть более эффективным с большими объемами данных

Но помните, производительность базы данных может варьироваться, поэтому всегда полезно тестировать с вашими конкретными данными.

Читаемость и намерение

  • Используйте IN, когда у вас есть конкретный список значений для проверки
  • Используйте EXISTS, когда вы проверяете присутствие или отсутствие связанных данных

Обработка NULL

  • IN обрабатывает NULL значения по-разному (он не вернет строки с NULL)
  • EXISTS не имеет этого ограничения

Вот удобная таблица, резюмирующая, когда использовать каждый:

Сценарий Рекомендуемый оператор
Проверка против малого списка известных значений IN
Проверка существования связанных записей EXISTS
Работа с большими объемами данных EXISTS
Когда NULL значения должны быть включены в результаты EXISTS
Когда вам нужно проверить несколько условий EXISTS

Заключение

И вот мы arrived at the end of our journey through the lands of IN and EXISTS, exploring their strengths and use cases. Remember, just like choosing the right tool for a job, selecting between IN and EXISTS depends on your specific situation.

As you continue your SQL adventure, don't be afraid to experiment with both operators. Try them out, see how they perform with your data, and soon you'll develop an intuition for when to use each one.

Before I let you go, here's a little SQL humor: Why did the database administrator leave his wife? She had too many views and he couldn't handle her lack of commitment!

Keep practicing, stay curious, and happy querying!

Credits: Image by storyset