> SmartGate 41 752 9863

IN и BETWEEN

Проверка по списку значений и по диапазону

Теория

Иногда условие в WHERE получается слишком длинным и однотипным. Например, нужно:
• выбрать пользователей только из нескольких конкретных городов;
• показать товары в определённом диапазоне цен;
• найти заказы за нужный промежуток дат.

Во всех таких случаях 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
IN работает со списком значений. Это могут быть числа, строки или даты.

Примеры:
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. Выбираем работников из нескольких отделов

Здесь IN заменяет несколько однотипных условий по отделам. Такой запрос читается заметно проще, чем длинная цепочка через OR.

🔄 Попробуйте изменить запрос:

  • • Замените список на (2, 3, 5) и сравните выборку
  • • Попробуйте получить такой же результат, только не через IN, а через OR

2. Ищем пользователей из конкретных городов

Это тот же принцип, только уже для текстовых значений. Когда вариантов несколько, IN делает условие короче и понятнее.

🔄 Попробуйте изменить запрос:

  • • Поменяйте один из городов в списке
  • • Добавьте условие AND registration_date >= '2023-07-01'

3. Показываем товары в нужном диапазоне цен

Здесь BETWEEN проверяет диапазон цен. В выборку попадут товары с ценой от 30000 до 90000 включительно.

🔄 Попробуйте изменить запрос:

  • • Поменяйте границы диапазона на 50000 и 120000
  • • Перепишите это условие без BETWEEN через два сравнения и AND

4. Находим заказы за определённый период и с нужными статусами

Этот пример показывает комбинацию: диапазон по датам плюс список допустимых статусов. Так пользователь одновременно видит и BETWEEN, и IN в одном запросе.

🔄 Попробуйте изменить запрос:

  • • Замените список статусов на ('доставлен', 'отменён')
  • • Добавьте в условие вариант без статуса: 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, логика становится неочевидной и результат может удивить. В таких местах лучше быть особенно внимательным.

Практика

Проверь себя

Ответьте на вопросы, чтобы закрепить материал:

1
Какую запись удобнее всего использовать, если нужно оставить только отделы 2, 4 и 5?
2
Что важно помнить про условие salary BETWEEN 60000 AND 90000?
3
Как короче всего переписать условие city = 'Москва' OR city = 'Минск'?
4
Что вернёт выражение SELECT 75000 BETWEEN 60000 AND 90000;? Введите только результат: TRUE или FALSE.
5
Напишите запрос к таблице workers, который выведет worker_id, first_name, department_id и salary только для работников из отделов 2, 4 и 5, у которых зарплата находится в диапазоне от 60000 до 95000 включительно. Сначала должны идти большие зарплаты, а при равной зарплате — меньший worker_id.
6
Какое условие точнее всего соответствует диапазону без включения границ от 50000 до 90000?
7
Напишите запрос к таблице order_items, который выведет order_item_id, order_id, product_id и quantity только для строк, где product_id входит в список (2, 5, 8, 11), а quantity находится в диапазоне от 2 до 6 включительно. Сначала должны идти строки с большим количеством товаров, а при равном количестве — меньший order_item_id.