Булева логика и фильтры: вопросы для собеседования (часть 2)

AND, OR, NOT, законы де Моргана, приоритет операторов — булева логика лежит в основе фильтрации данных в SQL и Python. На собеседовании дают сложное условие с вложенными AND/OR и просят определить, какие строки пройдут фильтр. Ошибки в логических выражениях — одна из самых частых причин неправильных результатов.

Качество данных и инвариантыВоронки и когортные рассужденияJOIN и кардинальностьПостановка задачиДоли и процентыSanity-check и оценкаСегментация и конфаундингТеория множеств и дедупликацияВзвешенные средние и смешение

Вопросы 610 из 20

6В форме регистрации есть два флага: `has_email = 1` и `has_phone = 1`. Что означает фильтр `NOT (has_email = 1) AND NOT (has_phone = 1)`?
AУ пользователя указан хотя бы один контакт: `has_email = 1 OR has_phone = 1` после преобразования
BУ пользователя указаны оба контакта одновременно: `has_email = 1 AND has_phone = 1`
CУ пользователя не указан ни один контакт: ложно и `has_email = 1`, и `has_phone = 1`
DУ пользователя указан ровно один контакт: один из флагов равен 1, а другой 0
Ответ: Связка `NOT A AND NOT B` означает, что не выполнено ни одно из двух условий.

Чтобы строка прошла фильтр, должны быть ложными оба условия: и `has_email = 1`, и `has_phone = 1`. Это случай, когда не указан ни один контакт. Частая ошибка — путать с `NOT (A AND B)`, что по закону Де Моргана равно `NOT A OR NOT B` и допускает заполнение одного контакта из двух.

Подробный разбор →
7Какому выражению со скобками эквивалентно условие `is_new = 1 OR is_paying = 1 AND has_coupon = 1`, если `AND` выполняется раньше `OR`?
A`is_new = 1 OR (is_paying = 1 AND has_coupon = 1)`
B`(is_new = 1 OR is_paying = 1) AND has_coupon = 1`
C`(is_new = 1 AND is_paying = 1) OR has_coupon = 1`
D`is_new = 1 AND (is_paying = 1 OR has_coupon = 1)`
Ответ: `AND` имеет более высокий приоритет, поэтому сначала вычисляется `is_paying = 1 AND has_coupon = 1`.

В выражениях фильтрации `AND` обычно выполняется раньше `OR`. Поэтому запись без скобок читается как `is_new = 1 OR (is_paying = 1 AND has_coupon = 1)`. Если вы хотели сгруппировать иначе, добавьте скобки и не полагайтесь на приоритет операторов.

Подробный разбор →
8Вы хотите выбрать строки, которые не относятся к `country = 'RU' OR country = 'KZ'`. Какое выражение соответствует `NOT (country = 'RU' OR country = 'KZ')` по правилу де Моргана?
A`NOT (country = 'RU') OR NOT (country = 'KZ')`
B`country <> 'RU' OR country <> 'KZ'`
C`country = 'RU' AND country = 'KZ'`
D`NOT (country = 'RU') AND NOT (country = 'KZ')`
Ответ: По правилу де Моргана `NOT (A OR B)` эквивалентно `NOT A AND NOT B` — оба условия должны быть ложны.

Условие `country = 'RU' OR country = 'KZ'` означает «RU или KZ», то есть хотя бы одно из двух. Его отрицание — это «ни RU, ни KZ», то есть `NOT (country = 'RU') AND NOT (country = 'KZ')`. Частая ошибка — написать `OR` вместо `AND` в отрицании: получится условие, которое почти всегда истинно и пропускает лишние строки в выборку.

Подробный разбор →
9Флаг `is_active` принимает только 0 или 1. Какое условие истинно для любой строки и не отфильтрует ни одной?
A`is_active = 1 AND is_active = 0`
B`NOT (is_active = 1) AND is_active = 1`
C`is_active = 1 OR is_active = 0`
D`is_active = 1 AND NOT (is_active = 0)`
Ответ: Если флаг может быть только 0 или 1, то `is_active = 1 OR is_active = 0` истинно для любой строки и является тавтологией.

Это пример тавтологии: вы перечислили все возможные значения флага и соединили их `OR`. Такой фильтр часто появляется случайно, например при ошибочном объединении условий. На собеседовании полезно уметь быстро распознавать всегда истинные условия, потому что они маскируют ошибки сегментации.

Подробный разбор →
10Поле `country` содержит ровно одно значение на пользователя. Какое условие в фильтре никогда не будет истинным?
A`country = 'RU' OR country = 'KZ'` без других условий
B`country = 'RU' AND country = 'KZ'` без других условий
C`NOT (country = 'RU') AND country IS NOT NULL`
D`(country = 'RU' OR country = 'KZ') AND NOT (country = 'BY')`
Ответ: Условие `country = 'RU' AND country = 'KZ'` невозможно для одного поля и поэтому всегда ложно.

Противоречия часто появляются, когда по ошибке объединяют взаимоисключающие значения через `AND`. В результате фильтр возвращает пустой набор, и аналитик начинает искать проблему в данных, а не в логике запроса. На собеседовании важно быстро распознавать такие невозможные условия и объяснять, почему они не могут выполниться: одно поле не может одновременно содержать два разных значения.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Открыть Карьерник в Telegram

Другие темы: Логика

Качество данных и инвариантыВоронки и когортные рассужденияJOIN и кардинальностьПостановка задачиДоли и процентыSanity-check и оценкаСегментация и конфаундингТеория множеств и дедупликацияВзвешенные средние и смешение