Приоритеты операций: скобки для управления порядком условий
Почему порядок условий важен? 🧐
Когда SQL обрабатывает условия в WHERE, он делает это не просто слева направо, а по строгим правилам приоритета операций. Без скобок вы можете получить совершенно неожиданные результаты!
-- Пример: хотим найти активных пользователей из Москвы ИЛИ администраторов
SELECT * FROM users
WHERE is_active = TRUE AND city = 'Москва' OR is_admin = TRUE;
Казалось бы, запрос простой. Но база прочитает его так:
(is_active AND city) OR is_admin — и вернёт всех админов, даже неактивных из других городов!
Как скобки меняют логику запроса 🔄
Скобки — это мощный инструмент управления приоритетом. Они работают так же, как в математике: сначала вычисляется то, что внутри.
Исправим наш пример:
-- Теперь условие работает как задумано!
SELECT * FROM users
WHERE is_active = TRUE AND (city = 'Москва' OR is_admin = TRUE);
Теперь логика чёткая:
is_active AND (любое из условий в скобках).
Практикуемся на реальных сценариях 🛠️
Пример 1: Фильтрация заказов
Нужно найти все «горячие» заказы: либо дороже 10 000, либо срочные, но только за последний месяц.
SELECT * FROM orders
WHERE (amount > 10000 OR is_urgent = TRUE)
AND created_at >= NOW() - INTERVAL '1 month';
Пример 2: Поиск по категориям
Ищем книги: должны быть или бестселлерами, или новинками, но только в жанре «Фантастика».
SELECT * FROM books
WHERE genre = 'Фантастика'
AND (is_bestseller = TRUE OR is_new_release = TRUE);
Главные правила приоритета в SQL 🏆
- Сначала
NOT— инверсия выполняется до других операций. - Потом
AND— имеет более высокий приоритет, чемOR. - Затем
OR— выполняется в последнюю очередь.
Без скобок запрос A AND B OR C превращается в (A AND B) OR C.
Продвинутый лайфхак: вложенные скобки 🌀
Скобки можно комбинировать для сложной логики:
SELECT * FROM products
WHERE category = 'Электроника'
AND (
(price < 500 AND rating >= 4)
OR
(is_flash_sale = TRUE AND stock > 0)
);
Здесь мы ищем:
- электронику, которая либо дешёвая и с высоким рейтингом,
- либо участвует в распродаже при наличии на складе.
Как избежать ошибок: 3 совета от Данилы Бежина ✅
- Всегда рисуйте логику на бумаге перед написанием условия.
- Проверяйте через EXPLAIN — иногда скобки влияют на оптимизацию запроса.
- Тестируйте на крайних случаях — например, когда одно из условий всегда
TRUE.
👉 Подробнее о тонкостях оптимизации — в разборе сложных запросов от профессионала.
Итог: скобки = контроль 💪
Без скобок SQL сам решает, в каком порядке вычислять условия. Со скобками вы берёте управление на себя. Запоминаем:
ANDбез скобок «перетягивает»OR- Вложенные скобки = сложная логика
- Тестируйте, тестируйте и ещё раз тестируйте!
-- Финальный пример: ищем либо активных москвичей, либо любого админа
SELECT username FROM users
WHERE (is_active = TRUE AND city = 'Москва') OR is_admin = TRUE;
Теперь ваши запросы будут работать именно так, как вы задумали! 🎉