← Назад к вопросам

В чем разница между операторами IN и BETWEEN в SQL?

1.6 Junior🔥 101 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различия между IN и BETWEEN в SQL

Оба оператора используются для фильтрации данных, но работают совсем по-разному и решают разные задачи.

IN оператор

IN проверяет, находится ли значение в списке конкретных значений.

Синтаксис:

SELECT * FROM users WHERE status IN ('active', 'pending', 'premium');
SELECT * FROM orders WHERE id IN (1, 5, 10, 25);

Характеристики:

  • Проверяет точное совпадение с одним из значений в списке
  • Список может содержать любые значения
  • Может быть несвязанный набор значений
  • Может быть неограниченное количество элементов
  • Может использоваться с подзапросами
-- Пример 1: Список статусов
SELECT * FROM users 
WHERE status IN ('active', 'premium', 'vip');

-- Пример 2: Список ID
SELECT * FROM products 
WHERE category_id IN (1, 2, 5, 10, 15);

-- Пример 3: С подзапросом (очень мощно)
SELECT * FROM orders 
WHERE user_id IN (SELECT id FROM users WHERE country = 'USA');

-- Пример 4: NOT IN (инверсия)
SELECT * FROM users 
WHERE status NOT IN ('banned', 'suspended');

BETWEEN оператор

BETWEEN проверяет, находится ли значение в диапазоне от одного значения ДО другого (включительно).

Синтаксис:

SELECT * FROM orders WHERE amount BETWEEN 100 AND 500;
SELECT * FROM events WHERE date BETWEEN '2024-01-01' AND '2024-12-31';

Характеристики:

  • Проверяет диапазон от минимума до максимума
  • Требует два значения (границы диапазона)
  • Включает обе границы (>= и <=)
  • Работает с числами, датами, строками
  • Не может использоваться со списками
-- Пример 1: Диапазон цен
SELECT * FROM products 
WHERE price BETWEEN 10 AND 100;

-- Пример 2: Диапазон дат
SELECT * FROM orders 
WHERE created_date BETWEEN '2024-01-01' AND '2024-12-31';

-- Пример 3: Диапазон чисел
SELECT * FROM users 
WHERE age BETWEEN 18 AND 65;

-- Пример 4: NOT BETWEEN (инверсия)
SELECT * FROM products 
WHERE price NOT BETWEEN 10 AND 100;

Таблица сравнения

ПараметрINBETWEEN
Тип условияСписок конкретных значенийДиапазон от X до Y
СинтаксисIN (value1, value2, ...)BETWEEN min AND max
ГраницаНеограниченное количество элементовТолько две границы
Включает границыN/AДа (>= и <=)
С подзапросамиДаРедко
ПроизводительностьЗависит от количества элементовОбычно быстрее
ПримерыСтатусы, категории, IDДиапазоны, даты, цены

Практические примеры

Пример 1: Поиск по статусам (IN)

-- Найти все активные, премиум и VIP пользователей
SELECT id, name, status FROM users 
WHERE status IN ('active', 'premium', 'vip');

-- Результат:
-- id | name  | status
-- 1  | John  | active
-- 2  | Jane  | premium
-- 5  | Bob   | vip

Пример 2: Поиск по диапазону цен (BETWEEN)

-- Найти товары стоимостью от 50 до 200
SELECT id, name, price FROM products 
WHERE price BETWEEN 50 AND 200;

-- Результат:
-- id | name       | price
-- 1  | Laptop     | 150
-- 3  | Monitor    | 200
-- 5  | Keyboard   | 75

Пример 3: Объединение IN и BETWEEN

-- Найти заказы от VIP и Premium пользователей сумме от 100 до 500
SELECT o.id, o.amount, u.status 
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.status IN ('premium', 'vip')
AND o.amount BETWEEN 100 AND 500;

Эквивалентность операторов

IN можно переписать через OR:

-- Исходный запрос
SELECT * FROM users WHERE status IN ('active', 'premium', 'vip');

-- Эквивалент через OR
SELECT * FROM users 
WHERE status = 'active' 
OR status = 'premium' 
OR status = 'vip';

BETWEEN можно переписать через AND:

-- Исходный запрос
SELECT * FROM products WHERE price BETWEEN 50 AND 200;

-- Эквивалент через AND
SELECT * FROM products 
WHERE price >= 50 AND price <= 200;

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

IN с большим списком:

-- Медленнее при большом количестве элементов
SELECT * FROM users 
WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...1000);

-- Быстрее использовать JOIN
SELECT u.* FROM users u
JOIN ids_to_find i ON u.id = i.id;

BETWEEN всегда быстро:

-- Очень быстро, индекс работает эффективно
SELECT * FROM orders 
WHERE created_date BETWEEN '2024-01-01' AND '2024-12-31';

IN с подзапросом

-- Очень мощная конструкция
SELECT * FROM orders 
WHERE user_id IN (
    SELECT id FROM users 
    WHERE country = 'USA' AND age > 18
);

-- Эквивалент через JOIN
SELECT DISTINCT o.* FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.country = 'USA' AND u.age > 18;

NULL значения

-- IN с NULL: NULL в IN всегда дает NULL
SELECT * FROM users 
WHERE status IN ('active', NULL);  -- NULL не будет найден!

-- Правильно
SELECT * FROM users 
WHERE status IN ('active') OR status IS NULL;

-- BETWEEN с NULL: работает интуитивно
SELECT * FROM products 
WHERE price BETWEEN 50 AND 200;  -- NULL исключается автоматически

Случаи использования

Используй IN когда:

  • Нужно проверить значение против списка
  • Значения не связаны между собой
  • Есть подзапрос для поиска значений
  • Количество значений небольшое (< 100)
# Python пример с SQL
import sqlite3

db = sqlite3.connect(':memory:')
cursor = db.cursor()

statuses = ['active', 'premium', 'vip']
placeholders = ','.join('?' * len(statuses))
query = f"SELECT * FROM users WHERE status IN ({placeholders})"
cursor.execute(query, statuses)

Используй BETWEEN когда:

  • Нужно проверить диапазон
  • Работаешь с датами
  • Ищешь значения в интервале
  • Нужна оптимальная производительность
# Python пример
import sqlite3
from datetime import datetime, timedelta

db = sqlite3.connect(':memory:')
cursor = db.cursor()

start_date = datetime(2024, 1, 1)
end_date = datetime(2024, 12, 31)

query = "SELECT * FROM orders WHERE created_date BETWEEN ? AND ?"
cursor.execute(query, (start_date, end_date))

Итог

IN — для проверки значения в списке конкретных элементов. BETWEEN — для проверки значения в диапазоне. IN может содержать подзапросы, BETWEEN всегда работает быстро. Выбор оператора зависит от типа условия: множество отдельных значений → IN, непрерывный диапазон → BETWEEN.

В чем разница между операторами IN и BETWEEN в SQL? | PrepBro