Приоритет AND и OR и расстановка скобок
Самая распространённая ошибка фильтрации, которую интервьюеры закладывают в свои вопросы.
«Приоритет AND и OR и расстановка скобок» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Ловушка, которую устраивают на собеседовании
Самая распространённая ошибка фильтрации на собеседованиях с первого взгляда выглядит правильно. Вам предлагают: найдите заказы клиента 5, у которых статус — ожидает обработки или отправлен. Кандидат пишет WHERE с комбинацией AND и OR и получает лишние строки.
Почему? Потому что AND имеет более высокий приоритет, чем OR. База данных сначала вычисляет все пары с AND, затем выражения с OR. Этот урок поможет довести правило до автоматизма, чтобы Вы никогда не теряли за него баллы.
Приоритет операторов в одном предложении
Во всех диалектах SQL логические операторы имеют такой приоритет: сначала NOT, затем AND, а последним — OR.
NOTимеет наивысший приоритетANDзанимает среднее местоORимеет наименьший приоритет
Поэтому A OR B AND C читается как A OR (B AND C), а не как (A OR B) AND C. Интервьюер рассчитывает, что Вы об этом забудете.
Ошибочный запрос
Вот запрос, который кандидат пишет для задачи клиент 5, статус — ожидает обработки или отправлен. Он выглядит правильно, но ошибочен.
Поскольку AND имеет более высокий приоритет, SQL читает его так: (customer_id = 5 AND status = 'pending') OR status = 'shipped'. Вторая ветвь вообще не содержит фильтра по клиенту, поэтому возвращает отправленные заказы всех клиентов.
SELECT *
FROM orders
WHERE customer_id = 5
AND status = 'pending'
OR status = 'shipped';Исправление: скобки
Заключите ветвь OR в скобки, чтобы фильтр клиента применялся к обоим статусам. Скобки отменяют приоритет операторов и явно показывают намерение.
Теперь SQL сначала вычисляет сгруппированное выражение с OR, а затем применяет customer_id = 5 ко всей группе. Опытные проверяющие добавляют скобки даже тогда, когда приоритет и так даёт правильный результат, — исключительно ради читаемости.
SELECT *
FROM orders
WHERE customer_id = 5
AND (status = 'pending' OR status = 'shipped');Разбор таблицы истинности
Возьмём отправленный заказ клиента 9. Проследим выполнение ошибочного варианта:
customer_id = 5— falsestatus = 'pending'— falsefalse AND false— falsefalse OR (status = 'shipped' is true)— true
Строка возвращается, хотя она относится не к клиенту 5. Именно такой разбор конкретной строки вслух интервьюеры хотят увидеть.
NOT имеет наивысший приоритет
NOT применяется только к условию, которое стоит сразу после него. Поэтому NOT status = 'open' AND priority = 'high' означает (NOT status = 'open') AND priority = 'high'.
Если Вы хотели инвертировать всё выражение, необходимо использовать скобки: NOT (status = 'open' AND priority = 'high'). По закону де Моргана это равносильно status <> 'open' OR priority <> 'high'.
SELECT *
FROM tickets
WHERE NOT (status = 'open' AND priority = 'high');Пример с тремя условиями
Найдите товары, которые являются (электроникой или бытовой техникой) и есть в наличии. Без скобок фильтр наличия относился бы только к бытовой технике.
Сгруппированный ниже запрос легко читается: выберите одну из двух категорий, затем потребуйте, чтобы товар был в наличии. Правило, которое стоит держать в уме: когда в запросе одновременно используются AND и OR, почти всегда нужно заключать группу с OR в скобки.
SELECT *
FROM products
WHERE (category = 'electronics' OR category = 'appliances')
AND in_stock = true;IN как более понятная альтернатива
Длинная цепочка OR для одного столбца подвержена ошибкам и многословна. Замените её на IN: он однозначен и не требует скобок.
Запрос ниже полностью эквивалентен предыдущему, но его сложнее случайно нарушить. Интервьюеры любят такой рефакторинг, потому что он показывает, что Вы понимаете и корректность, и удобство чтения.
SELECT *
FROM products
WHERE category IN ('electronics', 'appliances')
AND in_stock = true;Приоритет операторов в вычисляемых фильтрах
Приоритет операторов действует и при сочетании арифметики с логикой. В выражении price * 1.2 > 100 OR discount = 0 AND active = true сначала вычисляются арифметика и сравнение, затем AND, а затем OR.
Итак, оно читается как (price * 1.2 > 100) OR ((discount = 0) AND (active = true)). Если сомневаетесь, не вспоминайте таблицу при волнении — просто заключите каждую группу в скобки.
Как отвечать во время собеседования
Когда интервьюер показывает Вам фильтр со смешанными AND/OR и спрашивает что он возвращает, выполните три действия:
- Сформулируйте правило приоритета:
ANDвыполняется раньшеOR - Заново расставьте скобки в запросе вслух, чтобы показать его настоящую группировку
- Проследите выполнение для одной строки, в которой проявляется ошибка
Затем предложите исправленную версию со скобками. Такая последовательность демонстрирует строгость на уровне опытного специалиста.
Защитная привычка
Профессиональная привычка такова: всегда заключайте каждую группу OR в скобки. Это требует всего двух символов и устраняет целый класс ошибок и замечаний при проверке кода.
Проверяющим код никогда не должно приходиться мысленно вычислять приоритет операторов, чтобы убедиться в правильности фильтра. Сделайте группировку видимой. Это один из немногих случаев, когда избыточный синтаксис все считают хорошим стилем.
SELECT order_id, status
FROM orders
WHERE customer_id = 5
AND (status = 'pending' OR status = 'shipped');Быстрая проверка
Перед ответом рассуждайте, учитывая правило приоритета.
Итоги
Основные выводы:
- Приоритет логических операторов: NOT, затем AND, затем OR
- Смешанные фильтры с
AND/ORпочти всегда требуют скобок вокруг группы сOR - Пропущенная скобка незаметно расширяет выборку и часто полностью исключает фильтр
- Заменяйте длинные цепочки
ORдля одного столбца наIN - Чтобы ответить во время собеседования: сформулируйте правило, расставьте скобки, проследите одну строку, затем исправьте запрос
Всегда заключайте группы с OR в скобки, даже если приоритет операторов и так даёт нужную группировку.
Часто задаваемые вопросы
Урок «Приоритет AND и OR и расстановка скобок» бесплатный?
Да — полный текст урока «Приоритет AND и OR и расстановка скобок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Приоритет AND и OR и расстановка скобок»?
Самая распространённая ошибка фильтрации, которую интервьюеры закладывают в свои вопросы. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Приоритет AND и OR и расстановка скобок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Приоритет AND и OR и расстановка скобок
- BETWEEN, IN и включение границ
- LIKE, подстановочные символы и экранирование
- Фильтрация по вычисляемым значениям