Learnly
SQL для аналитиков/Глава 5/Урок 3

Несколько условий: AND, OR, IN, BETWEEN

Несколько условий: AND, OR, IN, BETWEEN

Одного условия часто мало. Разберём как комбинировать несколько.

AND, оба условия должны выполняться

-- Пользователи из Москвы И старше 25 лет
SELECT *
FROM users
WHERE city = 'Москва' AND age > 25;

Обе части должны быть истинными. Если хотя бы одна ложная, строка не попадёт в результат.

OR, хотя бы одно условие

-- Пользователи из Москвы ИЛИ из СПб
SELECT *
FROM users
WHERE city = 'Москва' OR city = 'СПб';

Важно: приоритет AND выше OR

-- Это: (city = 'Москва' AND age > 25) OR city = 'СПб'
WHERE city = 'Москва' AND age > 25 OR city = 'СПб'

-- А это совсем другое:
WHERE city = 'Москва' AND (age > 25 OR city = 'СПб')

Всегда используй скобки когда смешиваешь AND и OR, это предотвращает трудные ошибки.

IN, список значений

Вместо множества OR используй IN:

-- Неудобно
WHERE city = 'Москва' OR city = 'СПб' OR city = 'Казань'

-- Удобно
WHERE city IN ('Москва', 'СПб', 'Казань')

-- NOT IN, исключить значения
WHERE status NOT IN ('cancelled', 'refunded')

NOT, отрицание

WHERE NOT city = 'Москва'  -- то же что city != 'Москва'
WHERE NOT is_deleted        -- активные записи

Практический пример: сложный фильтр

-- Проблемные заказы за январь с суммой от 500 руб
SELECT
    order_id,
    customer_name,
    amount,
    status
FROM orders
WHERE
    created_at BETWEEN '2024-01-01' AND '2024-01-31'
    AND status IN ('pending', 'delayed', 'error')
    AND amount > 500
    AND customer_id IS NOT NULL
ORDER BY amount DESC;

Читается понятно: "заказы за январь, со статусом проблемный, суммой больше 500, с привязанным клиентом, от дорогих к дешёвым".

💡 Главная мысль: AND сужает выборку (оба условия), OR расширяет (хотя бы одно). IN, удобная замена многим OR. Всегда ставь скобки при смешивании AND и OR.