Взламываем SQL-интервью на позиции в «Тинькофф» и в «Альфа-Банк»
Давайте разберём задачи по SQL, которые могут встретиться на интервью у таких крупных компаний, как «Тинькофф» и «Альфа-Банк».
Хитрые теоретические вопросы по SQL от Тинькофф
1) Может ли измениться результат запроса, если в LEFT JOIN поменять местами таблицы?
Да, если поменять местами таблицы в LEFT JOIN, результат запроса кардинально изменится. Все потому, что LEFT JOIN берет все строки из «левой» таблицы, дополняя их данными из «правой». Смена мест изменяет логику: теперь «правая» становится «левой» и наоборот. Это влияет на то, какие строки и как будут включены в результат.
2) 5 + NULL — это сколько?
В SQL, когда вы выполняете арифметическую операцию с NULL, результатом всегда будет NULL. Это связано с тем, что NULL представляет собой неопределенное значение, и любая операция с неопределенным значением также является неопределенной. Таким образом, 5 + NULL будет равно NULL.
3) Можно ли делать JOIN таблицы саму на себя?
Абсолютно! Это называется self-join и полезно для работы с иерархическими данными или для сравнения строк в таблице. Вот пример запроса:
В этом примере таблица 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.
Шаг 2. Далее нам необходимо отфильтровать записи в соответствии с условиями по наименованию товара и дате.
Добавим следующие фильтры в оператор WHERE:
— Product.name IN ("Laptop", "Monitor"),
— 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.
Итоговое решение:
Задача с собеседования в Альфа-Банк №2:
Найдите средний возраст клиентов, приобретавших Smartwatch в 2024 году.
Задача среднего уровня сложности, чуть посложнее предыдущей. Её вы можете также попробовать решить самостоятельно в онлайн тренажёре.
Ход решения:
Шаг 1. Для начала необходимо соединить все необходимые таблицы:
— Customer и Purchase по customer_key,
— Purchase и Product по ключу product_key.
Шаг 2. Далее, необходимо отфильтровать данные в соответствии с условием задачи:
— по названию продукта: Product.name = "Smartwatch",
— по году покупки: YEAR(Purchase.date) = 2024.
На данном шаге мы имеем следующий запрос:
Шаг 3. Для того чтобы учесть каждого клиента только один раз, вне зависимости от количества покупок, совершённых им, необходимо получить уникальные записи с идентификаторами клиентов и их возрастами.
Шаг 4. Теперь, когда мы имеем список уникальных пользователей и их возрастов, мы можем произвести расчет среднего возраста клиентов. Для этого используем функцию AVG().
Итого, мы получаем следующий запрос:
Кроме того, на сайте SQL Academy есть задачи с собеседований других крупных компаний. Заходите, решайте, и удачи на собеседованиях!
Также мы активно ведём наш телеграм-канал с полезной информацией по SQL.
Скажите, а как FROM можно назвать оператором? У меня кровь из глаз пошла читая объяснение про «какой оператор выполняется последним». Тут скорее подходит обьяснение что SELECT это единственный оператор из предложенного, все что кроме него, это параметры
Соответственно, он и первый и последний
Амазон с тобой не согласен) https://docs.aws.amazon.com/de_de/kinesisanalytics/latest/sqlref/sql-reference-standard-sql-operators.html
Первые 5 вопросов они еще на hr-скрининге на системного без предупреждения спрашивают - кекнул с этого.
5+ NULL отдельный кек - не могу представить такого кейса.
а так- sql-ex первые 100 пройдите и к любому скуль-интервью будете в принципе готовы, да про explain углубленно почитать.
5+NULL - например у тебя задача к каждой цене в прайслисте добавить 5 рублей себе на пиво. Для товара Х цена не нашлась, подзапрос вернул NULL, тогда общая цена будет тоже NULL, это логично
Чо, правда, начинающий системный аналитик должен у этих работодателей понимать выдачу explain?
И как он будет это использовать в своей работе, интересно...
Устраиваться в Тинькофф чтобы работать за копейки?