Какой у тебя уровень владения SQL?

«Какой у тебя уровень владения SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Уверенный продвинутый уровень (Advanced). Я могу эффективно работать с данными, оптимизировать запросы и проектировать схемы.

Ключевые навыки:

  • Сложные запросы: Многотабличные JOIN (INNER, LEFT, RIGHT, FULL), коррелированные и некоррелированные подзапросы, рекурсивные CTE (Common Table Expressions).
  • Аналитические функции: Оконные функции (ROW_NUMBER(), RANK(), LAG()/LEAD()) с PARTITION BY и ORDER BY.
  • Оптимизация: Понимание и использование индексов (B-tree, составные, покрывающие), анализ планов выполнения (EXPLAIN ANALYZE), избегание N+1 проблемы.
  • Целостность данных: Транзакции, уровни изоляции (ACID), ограничения (CONSTRAINTS).

Пример сложного аналитического запроса:

-- Найти сотрудников, чья зарплата выше средней по их отделу за последний год
WITH DeptAvg AS (
    SELECT
        department_id,
        AVG(salary) AS avg_salary
    FROM employees
    WHERE hire_date >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
    GROUP BY department_id
)
SELECT
    e.id,
    e.name,
    e.salary,
    d.name AS department,
    da.avg_salary AS department_avg,
    e.salary - da.avg_salary AS diff_from_avg
FROM employees e
JOIN departments d ON e.department_id = d.id
JOIN DeptAvg da ON e.department_id = da.department_id
WHERE e.salary > da.avg_salary
ORDER BY diff_from_avg DESC;

Опыт с СУБД: PostgreSQL, MySQL, Oracle.