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

Взламываем 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.

36
51 комментарий

Скажите, а как FROM можно назвать оператором? У меня кровь из глаз пошла читая объяснение про «какой оператор выполняется последним». Тут скорее подходит обьяснение что SELECT это единственный оператор из предложенного, все что кроме него, это параметры

4
Ответить

Соответственно, он и первый и последний

1
Ответить

Первые 5 вопросов они еще на hr-скрининге на системного без предупреждения спрашивают - кекнул с этого.
5+ NULL отдельный кек - не могу представить такого кейса.
а так- sql-ex первые 100 пройдите и к любому скуль-интервью будете в принципе готовы, да про explain углубленно почитать.

2
Ответить

5+NULL - например у тебя задача к каждой цене в прайслисте добавить 5 рублей себе на пиво. Для товара Х цена не нашлась, подзапрос вернул NULL, тогда общая цена будет тоже NULL, это логично

2
Ответить

Чо, правда, начинающий системный аналитик должен у этих работодателей понимать выдачу explain?

И как он будет это использовать в своей работе, интересно...

Ответить

Устраиваться в Тинькофф чтобы работать за копейки?

1
Ответить