{"id":14293,"url":"\/distributions\/14293\/click?bit=1&hash=05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","hash":"05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0438 \u043a\u043e\u043f\u0435\u0439\u043a\u0438","buttonText":"","imageUuid":""}

Взламываем SQL-интервью на позиции в «Тинькофф» и в «Альфа-Банк»

Давайте разберём задачи по SQL, которые могут встретиться на интервью у таких крупных компаний, как «Тинькофф» и «Альфа-Банк».

Хитрые теоретические вопросы по SQL от Тинькофф

1) Может ли измениться результат запроса, если в LEFT JOIN поменять местами таблицы?
Да, если поменять местами таблицы в LEFT JOIN, результат запроса кардинально изменится. Все потому, что LEFT JOIN берет все строки из «левой» таблицы, дополняя их данными из «правой». Смена мест изменяет логику: теперь «правая» становится «левой» и наоборот. Это влияет на то, какие строки и как будут включены в результат.

2) 5 + NULL — это сколько?
В SQL, когда вы выполняете арифметическую операцию с NULL, результатом всегда будет NULL. Это связано с тем, что NULL представляет собой неопределенное значение, и любая операция с неопределенным значением также является неопределенной. Таким образом, 5 + NULL будет равно NULL.

3) Можно ли делать JOIN таблицы саму на себя?
Абсолютно! Это называется self-join и полезно для работы с иерархическими данными или для сравнения строк в таблице. Вот пример запроса:

SELECT e.EmployeeName AS Employee, m.EmployeeName AS Manager FROM Employees e JOIN Employees m ON e.ManagerID = m.EmployeeID

В этом примере таблица Employees соединяется сама с собой для того, чтобы получить имя сотрудника (Employee) и его непосредственного руководителя (Manager). Таблице Employees присваиваются два разных алиаса: e для сотрудников и m для руководителей. Условие соединения e.ManagerID = m.EmployeeID позволяет соединить сотрудников с их руководителями по идентификаторам.

4) Какой из операторов SELECT, FROM, WHERE, GROUP BY выполняется последним?
Тут главный герой — SELECT! Хотя он стоит на первом месте по синтаксису, логически данные выбираются после всех фильтраций и группировок. Так что, порядок такой:
1. FROM → 2. WHERE → 3. GROUP BY → 4. SELECT

5) Минимальное и максимальное количество записей в FULL JOIN таблицы на 10 и 100 строк?

С FULL JOIN всё работает так:
Минимум — 100 строк, если каждая из 10 нашла свою пару.
Максимум — 1000 строк, если каждая строка из одной таблицы сопоставляется с каждой строкой из другой таблицы, то получаем кросс-продукт (декартово произведение) этих таблиц, что означает, что каждая строка из таблицы на 10 строк будет соединена с каждой строкой из таблицы на 100 строк.

Задача с собеседования в Альфа-Банк №1:

Вывести имена покупателей, каждый из которых приобрёл Laptop и Monitor (использовать наименование товара product.name) в марте 2024 года.

Схема БД

Относительно несложная задача. Попробуйте решить её самостоятельно в онлайн тренажёре.

Ход решения:

Шаг 1. Для начала давайте соединим 3 таблицы:
— Customer (клиенты) с Purchase (покупки) по customer_key,
— Purchase с Product (продукты) по product_key.

SELECT Customer.name FROM Customer JOIN Purchase ON Customer.customer_key = Purchase.customer_key JOIN Product ON Purchase.product_key = Product.product_key ...

Шаг 2. Далее нам необходимо отфильтровать записи в соответствии с условиями по наименованию товара и дате.

Добавим следующие фильтры в оператор WHERE:
— Product.name IN ("Laptop", "Monitor"),
— MONTH(Purchase.date) = 3 AND YEAR(Purchase.date) = 2024.

SELECT Customer.name FROM Customer JOIN Purchase ON Customer.customer_key = Purchase.customer_key JOIN Product ON Purchase.product_key = Product.product_key WHERE Product.name IN ('Laptop', 'Monitor') AND MONTH(Purchase.date) = 3 AND YEAR(Purchase.date) = 2024 ...

Шаг 3. Теперь с помощью GROUP BY Customer.customer_key cгруппируем данные по каждому клиенту, чтобы можно было агрегировать информацию о покупках на уровне отдельного клиента.

Шаг 4. И, наконец, с помощью HAVING COUNT(DISTINCT Product.name) = 2 отфильтруем уже сгруппированные данные и оставим только те группы клиентов, которые совершили покупку обоих товаров — Laptop и Monitor.

Итоговое решение:

SELECT Customer.name FROM Customer JOIN Purchase ON Customer.customer_key = Purchase.customer_key JOIN Product ON Purchase.product_key = Product.product_key WHERE Product.name IN ('Laptop', 'Monitor') AND MONTH(Purchase.date) = 3 AND YEAR(Purchase.date) = 2024 GROUP BY Customer.customer_key HAVING COUNT(DISTINCT Product.name) = 2

Задача с собеседования в Альфа-Банк №2:

Найдите средний возраст клиентов, приобретавших Smartwatch в 2024 году.

Схема БД

Задача среднего уровня сложности, чуть посложнее предыдущей. Её вы можете также попробовать решить самостоятельно в онлайн тренажёре.

Ход решения:

Шаг 1. Для начала необходимо соединить все необходимые таблицы:
— Customer и Purchase по customer_key,
— Purchase и Product по ключу product_key.

Шаг 2. Далее, необходимо отфильтровать данные в соответствии с условием задачи:
— по названию продукта: Product.name = "Smartwatch",
— по году покупки: YEAR(Purchase.date) = 2024.

На данном шаге мы имеем следующий запрос:

SELECT ... FROM Purchase JOIN Customer ON Purchase.customer_key = Customer.customer_key JOIN Product ON Purchase.product_key = Product.product_key WHERE Product.name = 'Smartwatch' AND YEAR(Purchase.date) = 2024

Шаг 3. Для того чтобы учесть каждого клиента только один раз, вне зависимости от количества покупок, совершённых им, необходимо получить уникальные записи с идентификаторами клиентов и их возрастами.

SELECT DISTINCT Customer.customer_key, Customer.age FROM Purchase JOIN Customer ON Purchase.customer_key = Customer.customer_key JOIN Product ON Purchase.product_key = Product.product_key WHERE Product.name = 'Smartwatch' AND YEAR(Purchase.date) = 2024

Шаг 4. Теперь, когда мы имеем список уникальных пользователей и их возрастов, мы можем произвести расчет среднего возраста клиентов. Для этого используем функцию AVG().

Итого, мы получаем следующий запрос:

SELECT AVG(uniqueCustomers.age) AS average_age FROM ( SELECT DISTINCT Customer.customer_key, Customer.age FROM Purchase JOIN Customer ON Purchase.customer_key = Customer.customer_key JOIN Product ON Purchase.product_key = Product.product_key WHERE Product.name = 'Smartwatch' AND YEAR(Purchase.date) = 2024 ) AS uniqueCustomers

Кроме того, на сайте SQL Academy есть задачи с собеседований других крупных компаний. Заходите, решайте, и удачи на собеседованиях!

Также мы активно ведём наш телеграм-канал с полезной информацией по SQL.

0
51 комментарий
Написать комментарий...
Сергей Николаев

Вопросы выглядят достаточно базовыми. Если собеседуемый не понимает даже их, то вопрос чуть в сторону и сразу становится понятно.

Прокатит, если вопросы задаются тупо зачитыванием по списку.

Ответить
Развернуть ветку
Николай Ладанов
Автор

Вопросы взяты из собеседования на позицию intern аналитик

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
48 комментариев
Раскрывать всегда