50 вопросов по SQL на собеседовании
SUM(amount) по каждому дню, затем AVG по дням. Какой запрос соответствует этой логике?Базовые (1–15)
1. Чем WHERE отличается от HAVING?
WHERE фильтрует строки до группировки. HAVING — группы после. В WHERE нельзя агрегаты, в HAVING можно.
2. Что быстрее — UNION или UNION ALL?
UNION ALL (не делает dedup). Используйте UNION только если нужна дедупликация.
3. Чем INNER отличается от LEFT JOIN?
INNER — только совпадения. LEFT — все из левой + совпадения справа, для несовпадающих NULL.
4. Что такое DISTINCT?
Убирает дубликаты строк по всем выбранным столбцам.
5. Порядок выполнения SELECT?
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT.
6. Можно ли использовать алиас из SELECT в WHERE?
Нет — WHERE выполняется до SELECT. Используйте подзапрос или CTE.
7. Что такое NULL?
Отсутствие значения. Любая операция с NULL даёт NULL (кроме IS NULL).
8. Почему COUNT(*) != COUNT(col)?
COUNT(*) считает все строки. COUNT(col) — только не-NULL значения колонки.
9. Чем TRUNCATE отличается от DELETE?
TRUNCATE быстрее, не логирует каждую строку, сбрасывает auto-increment. DELETE транзакционен, с WHERE.
10. Что делает LIMIT?
Ограничивает количество строк результата. Обычно с ORDER BY.
11. Primary Key vs Unique Key?
PK = UNIQUE + NOT NULL + один на таблицу. UNIQUE — несколько, может быть NULL.
12. Что такое Foreign Key?
Ссылка на PK другой таблицы. Обеспечивает ссылочную целостность.
13. SELECT * FROM t WHERE id = NULL — что вернёт?
Ничего (0 строк). Правильно: WHERE id IS NULL.
14. Чем VARCHAR отличается от CHAR?
VARCHAR — переменная длина. CHAR — фиксированная (дополняет пробелами).
15. Что такое CASCADE в FK?
ON DELETE CASCADE — при удалении parent-записи автоматически удаляются child.
JOIN (16–25)
16. Типы JOIN?
INNER, LEFT, RIGHT, FULL OUTER, CROSS, SELF.
17. Что такое CROSS JOIN?
Декартово произведение — каждая строка левой × каждая правой.
18. Когда LEFT JOIN превращается в INNER?
Если условие на правую таблицу — в WHERE (а не в ON).
19. NATURAL JOIN — что это?
JOIN по всем одноимённым столбцам автоматически. В продакшне не используется (опасно).
20. SELF JOIN — зачем?
JOIN таблицы с самой собой: для иерархий, пар записей, сравнения соседних.
21. USING vs ON?
USING — если столбец называется одинаково. ON — для любых условий.
22. Как найти записи в A, которых нет в B?
A LEFT JOIN B ... WHERE B.key IS NULL или NOT EXISTS.
23. NOT IN + NULL — в чём ловушка?
Если подзапрос возвращает NULL — NOT IN даст 0 строк. Используйте NOT EXISTS.
24. Чем EXISTS отличается от IN?
EXISTS возвращает TRUE на первое совпадение. IN может сравнивать со всем списком.
25. FULL OUTER JOIN — когда нужен?
Для сверки двух источников, когда нужны все строки с обеих сторон.
Оконные функции (26–35)
26. Что такое оконная функция?
Функция, вычисляемая на «окне» строк без свёртки. OVER (PARTITION BY ... ORDER BY ...).
27. Чем ROW_NUMBER отличается от RANK?
ROW_NUMBER всегда уникален (1,2,3). RANK при дублях — одинаковый, с пропуском (1,1,3). DENSE_RANK без пропуска (1,1,2).
28. Что делает LAG?
Возвращает значение из предыдущей строки окна.
29. Как считать нарастающий итог?
SUM(x) OVER (ORDER BY date) — идёт от начала до текущей строки.
30. ROWS BETWEEN — зачем?
Определяет рамку окна для агрегатов (скользящее среднее).
31. Что такое PARTITION BY?
Делит строки на группы для оконных функций. Аналог GROUP BY, но без свёртки.
32. RANGE vs ROWS?
ROWS — физические строки. RANGE — по значениям ORDER BY (включает дубли).
33. Почему нельзя оконную функцию в WHERE?
Оконные вычисляются после WHERE. Обернуть в CTE и фильтровать снаружи.
34. Топ-3 в каждой группе — как?
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY g ORDER BY x DESC) AS rn FROM t
) t WHERE rn <= 3;35. Что такое FIRST_VALUE / LAST_VALUE?
Первое / последнее значение окна. Осторожно с LAST_VALUE — нужен ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
Попробовать силы на подобных вопросах проще всего в тренажёре Карьерник — прямо в Telegram, без регистрации через сайт.
GROUP BY и агрегаты (36–42)
36. Все столбцы SELECT должны быть в GROUP BY?
Да, если они не внутри агрегата.
37. Как посчитать медиану?
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY x) в PostgreSQL.
38. FILTER WHERE vs CASE WHEN?
FILTER — новый стандарт, чище. CASE WHEN — работает везде.
39. Как посчитать долю в группе?
SELECT x, COUNT(*) * 1.0 / SUM(COUNT(*)) OVER () AS share FROM t GROUP BY x;40. GROUPING SETS — что это?
Несколько уровней группировки в одном запросе.
41. ROLLUP и CUBE?
ROLLUP — иерархические итоги. CUBE — все комбинации подмножеств.
42. COUNT(DISTINCT x) на 100M строк — быстро?
Нет. Нужен approximate count (uniqCombined в ClickHouse, APPROX_COUNT_DISTINCT в BigQuery).
CTE и подзапросы (43–47)
43. CTE vs подзапрос?
CTE читабельнее, переиспользуемо в запросе. Подзапрос — компактнее, одноразовый.
44. Рекурсивный CTE — зачем?
Иерархии (менеджер → подчинённые), генерация календаря, графы.
45. Материализуется ли CTE?
В PostgreSQL до 12 — всегда. С 13+ — оптимизатор сам решает. В ClickHouse — inline.
46. Коррелированный подзапрос — что это?
Подзапрос, ссылающийся на внешнюю таблицу. Выполняется для каждой строки.
47. Как ускорить коррелированный подзапрос?
Заменить на оконную функцию или JOIN с агрегатом.
Оптимизация (48–50)
48. Как ускорить медленный запрос?
EXPLAIN → искать Seq Scan → добавить индекс. Или переписать без функций на индексированных столбцах.
49. Композитный индекс (a, b, c) работает для WHERE b = 1?
Нет. Только для leftmost prefix: (a), (a, b), (a, b, c).
50. Seq Scan vs Index Scan?
Seq Scan — полный перебор. Index Scan — через индекс. Smart для больших таблиц + узкий фильтр.
Как готовиться
Проработайте эти 50 вопросов вслух — через неделю они «в пальцах». Для глубокого — решайте задачи.
Читайте также
- Задачи по SQL для junior
- Задачи по SQL для middle
- Задачи на оконные функции
- JOIN SQL шпаргалка
- CTE SQL шпаргалка
FAQ
Хватит ли этих 50 для junior?
Да, на 80%. Остальное — практические задачи.
Что добавить для middle?
CUPED, session analysis, оптимизация на больших данных, ClickHouse specifics.
Реально ли спрашивают все 50?
Нет. Обычно 5–10 из этих + 2–3 задачи. Знание всех даёт уверенность.
Как быстро повторить перед собесом?
За 2 часа по этой статье — повторить все ответы вслух. Плюс 3-5 SQL-задач.