Каверзные вопросы на интервью аналитика: В каком порядке обрабатываются SQL-запросы?

d574333b3489bc415f7eaff695d2e3ec.jpeg

Поздравляем всех хабровцев с новым рабочим годом и продолжаем посты на тему технических интервью. Сегодня короткий пост для джунов и выпускников ИТ-курсов по специальности «системный аналитик». На техническом интервью вам могут попасться разные нестандартные вопросы. Вот один из них: «В каком порядке обрабатываются SQL-запросы?». На первый взгляд кажется, что SQL-запросы выполняются в том порядке, в котором мы их пишем: сначала SELECT, затем FROM, WHERE и так далее. Однако, на самом деле, SQL обрабатывает запросы в иной логической последовательности, которая отличается от порядка написания.

Логический порядок выполнения SQL-запроса

Возьмем ниже для примера какой-нибудь простой SQL-запрос, который часто встречается в компаниях по заказу менеджмента и выполняется аналитиком. Это может быть подсчет материальных ценностей, бюджетов или иных ресурсов.

Запрос должен быть сформулирован по правилам языка, чтобы система управления базами данных (СУБД) смогла его обработать. Напомним, что структура типичного SQL-запроса состоит из обязательных операторов — SELECT и FROM, а также опциональных: WHERE, GROUP BY, HAVING и ORDER BY. Эти операторы относятся к категории команд Data Query Language (DQL).

Начнем сразу с порядка выполнения запроса (и он будет отличается от порядка написания операторов в запросе).  

  1. FROM: Определение источника данных. 

  2. WHERE: Фильтрация строк на основе заданных условий. 

  3. GROUP BY: Группировка строк по одному или нескольким столбцам.

  4. HAVING: Фильтрация групп, созданных с помощью GROUP BY. 

  5. SELECT: Выбор столбцов и выражений для вывода. 

  6. ORDER BY: Сортировка результата. 

  7. LIMIT / OFFSET: Ограничение количества возвращаемых строк.

Обратите внимание, что этот порядок начинается с FROM и заканчивается SELECT, что противоположно порядку написания запроса.

Пример: Сводка по зарплатам сотрудников

Предположим, у нас есть таблица зарплат сотрудников ИТ-отдела (employees), пусть для наглядности их будет всего 5 человек в 3 рабочих группах:  

id,name,group_id,salary
1,Alice,101,170000
2,Boris,102,150000
3,Mike,101,180000 
4,Dana,103,160000 
5,Elena,101,190000

со следующими столбцами: employee_id, department_id, salary.

Стоит простая задача: найти общую сумму зарплат для каждой рабочей группы ИТ-отдела со следующими условиями:

  • Включить только те рабочие группы, где общая сумма зарплат превышает 250 000 тугриков.

  • Отсортировать результат по общей сумме зарплат в порядке убывания.

Запрос будет выглядеть следующим образом:

SELECT group_id, SUM(salary) AS total_salary
FROM employees
GROUP BY group_id
HAVING SUM(salary) > 250000
ORDER BY total_salary DESC;

Рассмотрим пошаговое выполнение запроса:
1. FROM: Определяется таблица `employees` как источник данных.
2. WHERE: Накладывается фильтр на уровне строки. В данном случае отсутствует, поэтому все строки включаются в обработку. Если бы фильтр был, то мог выглядеть так (например, обработать все зарплаты выше 100К).

WHERE salary > 100,000 

3. GROUP BY: Строки группируются по `group_id` и таблица принимает вид:

101, [170_000 180_000 190_000]
102, [150_000]
103, [160_000]

Для каждой группы вычисляются агрегатные функции, такие как SUM:

group_id, total_salary 
101, 540000 
102, 150000
103, 160000

4. HAVING: Отфильтровываются группы, где `SUM (salary)` меньше или равна 250 000.

group_id, total_salary 
101, 540000 

5. SELECT: Выбираются столбцы `group_id` и вычисляемое значение `SUM (salary)` с присвоением ему псевдонима `total_salary`.

6. ORDER BY: Результат сортируется по `total_salary` в порядке убывания.

group_id, total_salary 
101, 540000 

Итоговое резюме:  

  • SQL-запросы обрабатываются в определенном логическом порядке, начиная с FROM и заканчивая LIMIT. 

  • Понимание этого порядка помогает отлаживать и оптимизировать запросы.

  • Учитывайте, что выполнение SQL-запросов является логическим, а не синтаксическим, соответственно, пишите запросы, зная, как запрос обрабатывается на самом деле. 

А теперь будет предложение закрепить этот материал практическим заданием.
Пусть это будет подсчёт стоимости мебели и компьютеров в рабочей группе.

Рассмотрим таблицу `products` со следующими столбцами:  

— `product_id`
— `category`
— `price`

id ,product, category, price
1, Laptop, Electronics, 100000
2, Phone, Electronics, 7000
3, Chair, Furniture, 1500
4, Desk, Furniture, 3000

Задача по этому примеру:
1. Рассчитать общую стоимость товаров для каждой категории.
2. Исключить категории, где общая стоимость ниже 5000.
3. Отсортировать результаты по общей стоимости в порядке возрастания.

Запрос будет следующим (и уверены, вы его легко составите сами):

SELECT category, SUM(price) AS total_price
FROM products
GROUP BY category
HAVING SUM(price) >= 5000
ORDER BY total_price ASC;

А вот теперь само задание — напишите, что происходит в процессе пошагового выполнения запроса:

1. FROM: Какая таблица определяется …
2. WHERE: Что включаются или нет в обработку…
3. GROUP BY: Какие строки группируются …
4. HAVING: Какие исключаются группы …
5. SELECT: Как выбираются столбцы и вычисляется значение SUM (price) …
6. ORDER BY: Результат сортируется по `total_price` и что получаем …

Заключение

Дополнительные советы при подготовке к интервью:

  1. Поиграйте с последовательностью: Попробуйте поменять порядок операторов в запросе и посмотрите, что произойдет. Это поможет вам понять ошибки компиляции SQL.

  2. Используйте объяснение запросов: С помощью команды EXPLAIN можно узнать, как база данных интерпретирует ваш запрос. В частности, команда EXPLAIN анализирует запрос и возвращает план выполнения, показывающий, какие шаги база данных выполняет для обработки запроса. Это полезно для выявления узких мест и оптимизации. Например:

    EXPLAIN SELECT category, SUM (price) AS total_price
    FROM products
    GROUP BY category
    HAVING SUM (price) >= 5000 
    ORDER BY total_price ASC;

    При выполнении команды вы получите информацию про:

  • Методы доступа к данным, такие как сканирование таблицы или индекса.

  • Оценка количества строк на каждом этапе выполнения.

  • Используемые индексы (если есть) и их эффективность.

Используйте эту информацию для улучшения запросов, добавляя индексы или меняя структуру запроса, чтобы минимизировать объем данных, который нужно обработать.

  1. Визуализация данных: Если вам сложно представить группировку и фильтрацию, нарисуйте это на бумаге в виде таблиц или используйте инструменты визуализации (например, загрузите и используйте SQLite DB Browser).

    Это бесплатный инструмент с графическим интерфейсом для работы с SQLite-базами данных. Он позволяет открывать базы, выполнять запросы, редактировать данные и визуализировать таблицы без необходимости писать сложные команды в консоли. Браузер — полезный выбор для студентов и начинающих аналитиков при изучении базовых принципов работы с реляционными базами данных.

  2. Практикуйтесь с более объемными реальными данными: Используйте бесплатные датасеты на платформах Kaggle или Google Dataset Search, чтобы задавать себе вопросы и находить решения.

Понимание логического порядка выполнения SQL-запросов является важным навыком для написания эффективных и корректных запросов. Это знание помогает в оптимизации запросов и упрощает их отладку, что особенно важно при подготовке к техническому интервью и в повседневной работе системного аналитика.

Капля HR-рекламы от нашего блога: мы будем рады видеть в рядах компании SSP SOFT специалистов, готовых работать оффлайн в Москве и Томске, а также удаленно из любой точки России. Текущие вакансии на нашей странице на hh.ru. Если вашей специальности нет в списке вакансий, не стесняйтесь прислать нам резюме — в SSP SOFT новые позиции открываются регулярно, и мы всегда рады новым талантам. Резюме можно направить в Telegram или на почту job@ssp-soft.com.

Успехов на интервью и при работе с SQL на ваших проектах!

© Habrahabr.ru