IN и BETWEEN
Проверка по списку значений и по диапазону
Теория
• выбрать пользователей только из нескольких конкретных городов;
• показать товары в определённом диапазоне цен;
• найти заказы за нужный промежуток дат.
Во всех таких случаях SQL можно записать короче и понятнее.
Для этого есть два удобных оператора:
• IN — когда нужно проверить, входит ли значение в список;
• BETWEEN — когда нужно проверить, попадает ли значение в диапазон.
IN удобно воспринимать как короткую замену нескольким одинаковым условиям через OR. Вместо длинной записи вида city = 'Москва' OR city = 'Алматы' OR city = 'Казань' можно написать компактнее: city IN ('Москва', 'Алматы', 'Казань').
BETWEEN помогает выразить диапазон без пары сравнений. Например, вместо price >= 50000 AND price <= 100000 можно написать price BETWEEN 50000 AND 100000.
Важно: BETWEEN включает обе границы. То есть если значение равно нижней или верхней границе, оно тоже попадёт в результат.
Синтаксис
SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, value3);
SELECT column1, column2, ...
FROM table_name
WHERE column_name BETWEEN start_value AND end_value;
SQL
Примеры:
• department_id IN (1, 3, 5)
• city IN ('Москва', 'Алматы')
BETWEEN работает с диапазоном. Чаще всего его используют для чисел и дат.
Примеры:
• price BETWEEN 50000 AND 100000
• order_date BETWEEN '2024-01-01' AND '2024-03-31'
Если диапазон должен быть строгим, без включения границ, тогда уже лучше писать обычные сравнения через >, <, AND.
Оба оператора спокойно комбинируются с уже знакомыми темами: AND, OR, NOT, ORDER BY и проверками на NULL.
Примеры
1. Выбираем работников из нескольких отделов
🔄 Попробуйте изменить запрос:
- • Замените список на (2, 3, 5) и сравните выборку
- • Попробуйте получить такой же результат, только не через IN, а через OR
2. Ищем пользователей из конкретных городов
🔄 Попробуйте изменить запрос:
- • Поменяйте один из городов в списке
- • Добавьте условие AND registration_date >= '2023-07-01'
3. Показываем товары в нужном диапазоне цен
🔄 Попробуйте изменить запрос:
- • Поменяйте границы диапазона на 50000 и 120000
- • Перепишите это условие без BETWEEN через два сравнения и AND
4. Находим заказы за определённый период и с нужными статусами
🔄 Попробуйте изменить запрос:
- • Замените список статусов на ('доставлен', 'отменён')
- • Добавьте в условие вариант без статуса: OR status IS NULL
Типичные ошибки
Думают, что BETWEEN не включает границы
На самом деле включает. Условие price BETWEEN 30000 AND 90000 захватит и 30000, и 90000.
Забывают кавычки для текста и дат внутри IN
Числа пишутся без кавычек, а строки и даты — с кавычками. Например: city IN ('Москва', 'Казань').
Путают IN с несколькими значениями в одном сравнении
Запись вида city = ('Москва', 'Казань') не подходит. Если значений несколько, нужен именно IN.
Неправильно задают диапазон через BETWEEN
Нижняя граница должна идти первой, верхняя — второй. Если перепутать их местами, результат будет не таким, как ожидалось.
Неосторожно используют NOT IN рядом с NULL
Если в списке для NOT IN появляется NULL, логика становится неочевидной и результат может удивить. В таких местах лучше быть особенно внимательным.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал: