Все статьи

Топ-50 SQL-запросов для собеседования

2026-03-0418 мин чтения

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

Практикуйте SQL прямо сейчас — 500+ задач с мгновенной проверкой

Начать бесплатно