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

Ответ

Уверенно владею 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).

Ответ 18+ 🔞

Слушай, а вот у меня в резюме написано, что я SQL знаю. Ну, типа, знаю. Не просто «SELECT * FROM users WHERE дурак = true», а прям вот, блядь, на уровне, когда уже можно мозги сломать.

Что я умею, ёпта:

  • Запросы, от которых плачут: Эти ваши JOIN'ы на три таблицы, подзапросы, которые внутри других подзапросов сидят, как матрёшки ебаные. LEFT, RIGHT — мне похуй, я и FULL OUTER заставлю работать.
  • Считать всё, что шевелится: GROUP BY, HAVING — это моя любовь. Найду всех, кто купил больше пяти раз, но потратил меньше ста рублей, и отправлю их нахуй, то есть в отдел маркетинга.
  • Оконные функции — моя магия: ROW_NUMBER(), RANK(), LAG() — это когда нужно не просто посчитать, а ещё и по ранжиру разложить, кто самый жадный или самый активный. Красота, блядь.
  • Поправить то, что накосячили: UPDATE, DELETE, MERGE — иногда нужно не только читать, но и писать. Аккуратно, с WHERE, чтобы всю базу не хуйнуть.
  • Чтобы быстро летало: План выполнения (EXPLAIN) посмотрю, индекс посоветую поставить, если запрос тормозит, как пьяный мужик на льду.

Вот, смотри, пример из жизни, как я обычно тестирую какую-нибудь ебучую логику «поиска VIP-клиентов»:

-- Ищем царей, которые за последний месяц заказали больше 5 раз,
-- насумили больше тысячи рублей, и считаем, сколько в среднем они оставляют.
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;

А ещё, чтобы не заскучать, иногда в MongoDB агрегации пинаю — там такие пайплайны строить можно, что просто пиздец. И для API-тестов запросы сочиняю, в GraphQL и REST. Короче, если в данных есть хоть какая-то логика, я её, блядь, найду и проверю.