Ни одно собеседование на дата аналитика/дата инженера/мл инженера не проходит без блока про SQL. Вы можете работать в стартапе из трех человек, пользоваться таблицей excel из 10 строчек, но понимать как выполняются запросы из базы данных все равно надо.
Разберем топ вопросов на знание SQL, которые чаще всего задают на собеседованиях.
Я собрала в этот топ свой опыт и опыт коллег, которые недавно проходили собеседования.
❤️ Порядок выполнения операторов в запросе
Хороший вопрос на понимание работы запросов из базы данных.
1. FROM - выбор таблицы
2. WHERE - фильтрация строк
3. GROUP BY - группировка
4. Агрегатные функции (COUNT, SUM, AVG)
5. HAVING - фильтрация групп
6. SELECT - выбор полей
7. ORDER BY - сортировка
Обычно хотят услышать такой ответ, но будьте готовы ответить, что на самом деле последний в списке LIMIT - отбирает конкретное количество строк в выводе.
❤️ Отличие having от where
Честно вам скажу, я долгое время сама плавала в понимании этого вопроса.
Обычно просто отчеканивала выученный ответ и все, но недавно наконец до меня дошло, попробую объяснить своими словами.
Where - это просто оператор фильтрации. Мы поставили фильтр зарплата больше 100 рублей, и в таблице остались только те строки, которые удовлетворяют этому условию.
Having же фильтрует не весь датафрейм, а только результат группировки. Например, мы сначала группируем пользователей по отделам, считаем среднюю зарплату, и только потом мы накладываем условие что средняя зарплата больше 100 рублей.
Обратите внимание, что where стоит перед having и groupby в порядке выполнения запроса, поэтому если вы сразу поставите фильтр с помощью where, то эти значения не будут учтены при группировке.
WHERE
· Фильтрует строки ДО группировки
· Работает с отдельными записями
· Не может использовать агрегатные функции
· Выполняется раньше GROUP BY
HAVING
· Фильтрует группы ПОСЛЕ группировки
· Работает с результатами агрегации
· Обязательно использует агрегатные функции
· Выполняется после GROUP BY
Примеры:
WHERE (фильтрация до группировки):
SELECT department, AVG(salary)
FROM employees
WHERE salary > 30000 -- фильтруем сотрудников с з/п > 30k
GROUP BY department;
HAVING (фильтрация после группировки):
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000; -- фильтруем отделы со средней з/п > 50k
Комбинированное использование
SELECT department, COUNT(*) as emp_count, AVG(salary)
FROM employees
WHERE hire_date > '2020-01-01' -- только новейшие сотрудники
GROUP BY department
HAVING AVG(salary) > 40000 -- только отделы со средней з/п > 40k
AND COUNT(*) > 3; -- и более 3 сотрудников
Типичные ошибки:
Неправильно:
SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 50000 -- Ошибка! WHERE не может использовать агрегатные функции
GROUP BY department;
Правильно:
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000; -- Корректно
💜 Оконные функции
Что такое? Отличия от groupby? Какие бывают? Вопросы по агрегирующим функциям зависят от места, куда вы собеседуетесь.
Обо всем по порядку.
Оконные функции позволяют производить вычисления над "окном" данных — группой строк, связанных с текущей строкой, при этом сохраняя все исходные строки в результате.
Ключевые особенности:
· Не группируют данные (все строки сохраняются)
· Используют OVER() clause для определения "окна"
· Работают с контекстом текущей строки
Синтаксис:
function_name() OVER (
PARTITION BY column1, column2...
ORDER BY column3, column4...
frame_clause
)
Основные компоненты:
1. PARTITION BY — разделяет данные на группы (аналог GROUP BY, но без свертывания)
SELECT name, department, salary,
AVG(salary) OVER (PARTITION BY department) as avg_department_salary
FROM employees;
2. ORDER BY — определяет порядок данных внутри окна
SELECT name, salary,
SUM(salary) OVER (ORDER BY salary) as running_total
FROM employees;
=>