Несколько условий: 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.