0Pricing
Coding Interview Prep · Урок

Приоритет 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 — false
  • status = 'pending' — false
  • false AND false — false
  • false 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 — локальная установка не требуется.

Все уроки этого курса

  1. Приоритет AND и OR и расстановка скобок
  2. BETWEEN, IN и включение границ
  3. LIKE, подстановочные символы и экранирование
  4. Фильтрация по вычисляемым значениям
← Назад к Coding Interview Prep