Какой у вас уровень навыков написания SQL-запросов?

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

Ответ

Уверенно владею SQL на уровне, необходимом для сложного анализа данных, валидации и подготовки тестовых сценариев.

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

  • Сложные выборки: Многотабличные JOIN (INNER, LEFT, RIGHT, FULL), коррелированные и некоррелированные подзапросы.
  • Агрегация и группировка: GROUP BY, агрегатные функции (COUNT, SUM, AVG, MIN/MAX), фильтрация групп через HAVING.
  • Оконные функции: ROW_NUMBER(), RANK(), DENSE_RANK(), LAG()/LEAD() для аналитических запросов.
  • Модификация данных: INSERT, UPDATE, DELETE, MERGE (UPSERT).
  • Оптимизация: Понимание планов выполнения (EXPLAIN), использование индексов.

Пример аналитического запроса для тестирования бизнес-логики:

-- Найти пользователей, сделавших более 5 заказов за последний месяц,
-- с общей суммой заказов > 1000 и их средним чеком.
SELECT 
    u.id AS user_id,
    u.email,
    COUNT(o.id) AS total_orders,
    SUM(o.total_amount) AS total_spent,
    AVG(o.total_amount) AS avg_order_value,
    -- Оконная функция для ранжирования по сумме трат среди таких пользователей
    RANK() OVER (ORDER BY SUM(o.total_amount) DESC) AS spending_rank
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed' 
    AND o.created_at >= DATEADD(month, -1, GETDATE())
GROUP BY u.id, u.email
HAVING COUNT(o.id) > 5 
    AND SUM(o.total_amount) > 1000
ORDER BY total_spent DESC;

Также имею опыт работы с NoSQL (MongoDB агрегации) и написания запросов для API-тестирования (GraphQL, REST).