SQL — обязательный навык для Data Engineer, Backend Developer, Data Analyst. Вот ключевые запросы, которые спрашивают на собеседованиях.
Базовые запросы
1. Найти дубликаты
SELECT email, COUNT(*) AS cnt
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
2. Второе по величине значение
SELECT MAX(salary) FROM employees
WHERE salary < (SELECT MAX(salary) FROM employees);
Или с оконной функцией:
SELECT salary FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rk
FROM employees
) t WHERE rk = 2;
3. N-ая запись
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM employees
) t WHERE rn = 5;
JOIN-задачи
4. Сотрудники без отдела
SELECT e.name FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id
WHERE d.id IS NULL;
5. Отделы без сотрудников
SELECT d.name FROM departments d
LEFT JOIN employees e ON d.id = e.dept_id
WHERE e.id IS NULL;
6. SELF JOIN — менеджер сотрудника
SELECT e.name, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
Агрегация
7. Топ-3 по зарплате в каждом отделе
SELECT * FROM (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
) t WHERE rn <= 3;
8. Накопительная сумма
SELECT date, amount,
SUM(amount) OVER (ORDER BY date) AS running_total
FROM orders;
9. Процент от общего
SELECT department,
SUM(salary) AS dept_total,
ROUND(100.0 * SUM(salary) / SUM(SUM(salary)) OVER (), 2) AS pct
FROM employees
GROUP BY department;
Работа с датами
10. Пользователи, активные 3 дня подряд
SELECT DISTINCT user_id FROM (
SELECT user_id, login_date,
login_date - ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date)::int AS grp
FROM logins
) t
GROUP BY user_id, grp
HAVING COUNT(*) >= 3;
Строки и NULL
11. COALESCE для NULL
SELECT name, COALESCE(phone, email, 'N/A') AS contact
FROM customers;
12. Pivot (строки в столбцы)
SELECT
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active,
SUM(CASE WHEN status = 'inactive' THEN 1 ELSE 0 END) AS inactive
FROM users;
Советы для собеседования
- Всегда уточняйте: есть ли NULL, уникальны ли значения, какой диалект SQL
- Начинайте с простого решения, потом оптимизируйте
- Проговаривайте логику вслух — интервьюеру важен ход мысли
- Знайте разницу между WHERE и HAVING, RANK и DENSE_RANK