TGViewer
Data Дзен с Олегом Дмитриевым Data Дзен с Олегом Дмитриевым @data_dzen · 1.75K subscribers
Post #408 591
Поговорим о собесах (часть 2) 😎

В прошлом посте затронули софты, методологию STAR и Excel. Это базовый набор. Теперь идём дальше, SQL.

Если вы хорошо освоили Excel, вы уже понимаете основы: как данные связываются, какие проблемы бывают при связках, как работают группировки. Переход к SQL на старте это по сути 5 команд: SELECT, FROM, WHERE, JOIN, GROUP BY. Оконные функции и временные таблицы полезны, но на старте не критичны.

А вот теперь к главному. Основная проблема не в синтаксисе. Проблема в блоках, которые не роняют запрос. Код отрабатывает, интерпретатор молчит, а результат не тот, который ждёт интервьюер. Именно на этом сыпятся.

1️⃣NOT IN + NULL: тишина вместо данных

В SQL: NULL ≠ пусто ≠ 0. Кто изучал Python, знает: ноль это ноль, а NULL это пустота, ничто. Держите в голове.

Задача: найти пользователей не из чёрного списка.

❌
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked)

Казалось бы, всё верно. Но если в blocked хоть одна строка с user_id = NULL, результат: 0 строк. SQL не может сравнить с NULL и молча возвращает пустоту.

✅
SELECT * FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blocked b
WHERE b.user_id = u.id
)

Кстати, NOT EXISTS ещё и быстрее: берёт id, идёт во вторую таблицу, нашёл первое вхождение, остановился. NOT IN шерстит таблицу сверху донизу целиком. На больших таблицах разница заметная.

2️⃣ LEFT JOIN, который молча стал INNER JOIN

Про типы JOIN подробно разберём в следующих постах серии. Сейчас только суть ловушки.
❌
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.status = 'completed'

Что происходит: WHERE убивает NULL-строки из правой таблицы. Клиенты без заказов просто исчезли. LEFT JOIN превратился в INNER JOIN. А результат мимо.
✅
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON c.id = o.customer_id
AND o.status = 'completed'

Одна строчка через AND. Разница принципиальная.

3️⃣AVG врёт красиво

Вот вам задачка. 10 строк по продажам. У трёх NULL. Сколько вернёт AVG? Среднее по 7, не по 10. Если значения похожи на правду, подвох заметить сложно. Цифра реалистична, но искажена.
❌
SELECT AVG(salary) FROM employees


✅
SELECT AVG(COALESCE(salary, 0)) FROM employees

COALESCE: встретил NULL, заменил на 0. Можно и без него, но тогда объясните интервьюеру, что понимаете поведение AVG и принимаете его осознанно. Оба варианта зачтутся 👌

4️⃣Порядок выполнения: главный подвох

Пишем: SELECT → FROM → WHERE → GROUP BY.
Выполняется: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.

Нелогично? Ещё как 🤷‍♀️

❌
SELECT category, AVG(sales) AS avg_sales
FROM orders
WHERE avg_sales > 1000
GROUP BY category

Алиас avg_sales ещё не существует на этапе WHERE. Система просто не знает этого поля.

✅
SELECT category, AVG(sales) AS avg_sales
FROM orders
GROUP BY category
HAVING AVG(sales) > 1000

HAVING это фильтрация после группировки. Подробнее разберём в отдельном посте серии.

5️⃣Забыли синтаксис? Не паникуйте

Бывает: нервы, давно не касались темы. Ну с кем не бывает. Говорите прямо: «Я понимаю логику, могу описать шаги. Точный синтаксис загуглил бы». Любой адекватный специалист это оценит. Логику понимать одно дело. Функцию загуглить = 30 секунд.

Бонус напоследок: первый вопрос при тестовом = «Какая у вас СУБД?».
DATE_TRUNC — PostgreSQL. DATE_FORMAT — MySQL. Правильный запрос для неправильной базы = ошибка на ровном месте.

В следующем посте SQL: Retention и когорты. А завтра пост и статья про кейс моей команды с компанией Гранд-Альфа. Занимаются кормами для животных.

Вопрос к вам. У вас бывало такое, что забыли ответ и хоть убей не помнишь ? Как действовали в этой ситуации? 👇

#собесы

@data_dzen 🙂
  • ⚡ 7
  • 🥰 6
  • 😁 6
  • 🤩 2
More from @data_dzen
  1. Sep 25, 2026Работа, за которую нужно платить самому 🤔 Мечта любого работодателя, не так ли? )) И знае…
  2. Sep 18, 2026Пятница. Я остался без рук 🤦‍♂️ Но я все равно похвалю себя, потому что есть за что ✅ А в…
  3. Sep 11, 2026Пересекая границы 😎 Если во всех банках подряд отказали в карте, не спорь, собирайся в ви…
  4. Sep 8, 2026Один вопрос, который выдаёт новичка 🤦‍♂️ Мне частенько пишут с вопросом. Что учить, чтобы…
  5. Sep 4, 2026Здесь молчать нельзя. Особенно в больнице 🌟 И именно поэтому я молодец на этой неделе: не…
  6. Aug 28, 2026Беру «Хреновое ТЗ» за 300 🎯 Мой друг Семён собрал «Свою игру», только целиком по аналитик…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →