SQL спрашивают на собеседовании у аналитиков данных, backend-разработчиков, QA и DevOps. Требования разные, но базовые вопросы одинаковые. Вот что реально задают.
Базовый SQL (вопросы 1–15)
1. Что такое SQL?
Structured Query Language — язык запросов к реляционным базам данных. DDL (CREATE, ALTER, DROP), DML (SELECT, INSERT, UPDATE, DELETE), DCL (GRANT, REVOKE).
2. Что такое первичный ключ (PRIMARY KEY)?
Уникальный идентификатор строки в таблице. Не может быть NULL. Автоматически создаёт индекс.
3. Что такое внешний ключ (FOREIGN KEY)?
Ссылка на PRIMARY KEY другой таблицы. Обеспечивает ссылочную целостность: нельзя добавить строку с несуществующим ID.
4. Чем WHERE отличается от HAVING?
WHERE фильтрует строки до агрегации. HAVING фильтрует группы после GROUP BY. `WHERE age > 18` — до группировки. `HAVING COUNT(*) > 5` — после.
5. Что такое JOIN? Виды?
Объединение таблиц по условию. INNER JOIN — только совпадающие строки. LEFT JOIN — все строки из левой + совпадающие из правой (NULL если нет совпадения). RIGHT JOIN — обратно. FULL OUTER JOIN — все из обеих.
6. Что даст LEFT JOIN с условием IS NULL?
Строки из левой таблицы, для которых нет совпадения в правой. Используется для поиска «сирот»: `WHERE right_table.id IS NULL`.
7. Что такое GROUP BY?
Группировка строк по значению одного или нескольких полей. С агрегатными функциями: `COUNT, SUM, AVG, MIN, MAX`.
8. Что такое DISTINCT?
Убирает дублирующиеся строки из результата. `SELECT DISTINCT city FROM users`.
9. Что такое подзапрос (subquery)?
Запрос внутри другого запроса. Может быть в SELECT, FROM (inline view), WHERE, HAVING. Коррелированный подзапрос ссылается на внешний запрос.
10. Что такое CTE (Common Table Expression)?
Именованный подзапрос через WITH: `WITH cte AS (SELECT ...) SELECT * FROM cte`. Улучшает читаемость, используется для рекурсивных запросов.
11. Что такое UNION и UNION ALL?
Объединяют результаты нескольких SELECT. UNION убирает дубликаты (медленнее). UNION ALL сохраняет все строки (быстрее).
12. Как работает ORDER BY?
Сортирует результат. `ASC` — по возрастанию (по умолчанию). `DESC` — по убыванию. Можно сортировать по нескольким полям.
13. Что такое NULL в SQL?
Отсутствие значения. NULL не равен ничему, даже NULL: `NULL = NULL` → false. Проверка: `IS NULL` или `IS NOT NULL`. Функции: `COALESCE(a, b)` — первое не-NULL значение.
14. Что делает `CASE WHEN`?
Условное выражение в SQL: `CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END`. Аналог `if/else`.
15. Что такое `LIMIT` и `OFFSET`?
`LIMIT n` — вернуть не более n строк. `OFFSET n` — пропустить n строк. Используется для пагинации.
Оконные функции и продвинутый SQL (вопросы 16–25)
16. Что такое оконные функции?
Функции, работающие над набором строк, не сворачивая их в одну. Используют `OVER(PARTITION BY ... ORDER BY ...)`. Не изменяют количество строк, в отличие от GROUP BY.
17. Что такое `ROW_NUMBER()`?
Присваивает уникальный номер каждой строке в разделе. `ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC)` — нумерация сотрудников по зарплате в каждом отделе.
18. Чем `RANK()` отличается от `DENSE_RANK()`?
`RANK()` — одинаковые значения получают одинаковый ранг, следующий ранг пропускается (1,1,3). `DENSE_RANK()` — ранги не пропускаются (1,1,2).
19. Что такое `LAG()` и `LEAD()`?
`LAG(col, n)` — значение предыдущей строки на n позиций. `LEAD(col, n)` — следующей. Используются для вычисления изменений: рост продаж к прошлому периоду.
20. Что такое `SUM() OVER()`?
Нарастающая сумма: `SUM(amount) OVER (ORDER BY date)` — накопленная сумма по дате. Или по разделу: `SUM(sales) OVER (PARTITION BY region)` — сумма по каждому региону для каждой строки.
21. Напишите запрос для топ-3 сотрудников по зарплате в каждом отделе.
```sql
WITH ranked AS (
SELECT *, DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
FROM employees
)
SELECT * FROM ranked WHERE rn <= 3;
```
22. Что такое `NTILE(n)`?
Делит строки на n примерно равных групп. `NTILE(4) OVER (ORDER BY score)` — квантили (квартили).
23. Как найти дубликаты в таблице?
```sql
SELECT email, COUNT(*) as cnt
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
```
24. Как удалить дубликаты, оставив одну запись?
```sql
DELETE FROM users
WHERE id NOT IN (
SELECT MIN(id) FROM users GROUP BY email
);
```
25. Что такое `PIVOT` / `UNPIVOT`?
PIVOT — преобразование строк в столбцы. В PostgreSQL через `CASE WHEN` + `GROUP BY`. В MSSQL — через `PIVOT`. UNPIVOT — обратно.
Индексы, транзакции, оптимизация (вопросы 26–30)
26. Что такое индекс?
Структура данных, ускоряющая поиск строк. B-tree индекс — для сравнений. Hash — для точного равенства. Ускоряет SELECT, замедляет INSERT/UPDATE/DELETE.
27. Когда индекс не помогает?
Функция над индексированной колонкой: `WHERE YEAR(date) = 2024` (нет, нужно `WHERE date BETWEEN...`). `LIKE '%pattern'` — нет. Low cardinality (boolean поле) — не эффективен.
28. Что такое ACID?
Atomicity (атомарность), Consistency (согласованность), Isolation (изоляция), Durability (долговечность). Гарантии транзакций в РСУБД.
29. Что такое уровни изоляции транзакций?
READ UNCOMMITTED, READ COMMITTED (по умолчанию в PostgreSQL), REPEATABLE READ, SERIALIZABLE. Чем выше — тем меньше аномалий, тем больше блокировок.
30. Как оптимизировать медленный запрос?
`EXPLAIN ANALYZE` — посмотреть план выполнения. Добавить индекс на WHERE/JOIN колонки. Убрать `SELECT *`, выбирать только нужные поля. Переписать подзапрос как JOIN. Избегать функций в WHERE.
FAQ
Какую СУБД учить для аналитика?
PostgreSQL — open source, мощный, много вакансий. Знание одного SQL достаточно для перехода на другие диалекты.
Нужно ли SQL backend-разработчику?
Да, обязательно. Оконные функции и оптимизация — для senior, базовые JOIN — для junior.
---