Сегодня предлагаю разобрать популярную задачу с SQL-собесов
Звучит она обычно так: Есть таблицы t1 и t2, состоящие из одного столбца и имеющие m и n строк соответственно. Какое минимальное и максимальное количество строк будет в конечной таблице T, полученной в результате джойна t1 и t2?
- t1 inner join t2
- t1 left join t2
- t1 right join t2
- t1 full outer join t2
- t1 cross join t2 ! Учитывая, что значения могут повторяться или быть равны NULL.
Для наглядности работы джойнов представим, что обе таблицы содержат по 5 строк с уникальными значениями от 1 до 5, типа: t1 = [1,2,3,4,5] t2 = [1,2,3,4,5]
🔸Все типы джойнов, кроме CROSS JOIN, вернут по 5 строк, т.к. для каждого значения в t1 есть ровно одно совпадающее значение в t2. 🔸CROSS JOIN создает все возможные комбинации пар строк: 5×5 = 25 строк. 🔸То есть, если значения одинаковые и уникальные, результат всех основных джойнов (INNER, LEFT, RIGHT, FULL OUTER) - это количество уникальных строк, а CROSS JOIN - произведение их количества.
Усложняемся, добавим в наборы данных NULL и дубликаты:
t1 = [1, 2, 2, NULL, 5] t2 = [2, 2, 3, NULL, NULL]
🔸INNER JOIN В t1 и t2 совпадают только значения “2”, следовательно, количество строк: 2×2=4 (каждая двойка из t1 с каждой двойкой из t2). NULL с NULL не совпадает, строк с NULL в результате нет. 🔸LEFT JOIN Все 5 строк из t1 гарантированы. Значения с “2” вернут + две дополнительные строки, количество = 7 строк. 🔸RIGHT JOIN Аналогично LEFT JOIN, но со всеми строками t2, количество = 7 строк. 🔸FULL OUTER JOIN Включает все: дубликаты, NULL с обеих таблиц. Количество = 10 строк. 🔸CROSS JOIN Каждая строка из первой таблицы умножается на каждую из второй = 25 строк.
💡Становится понятно, что минимум будет достигаться в случае отсутствия пересечения вообще. В таком случае: 🔸INNER JOIN вернет 0 строк, т.к. нет совпадений. 🔸LEFT JOIN вернет все строки из t1 с NULL в местах столбцов t2 ➡️ минимум m строк. 🔸RIGHT JOIN вернет все строки из t2 с NULL в местах столбцов t1 ➡️ минимум n строк. 🔸FULL OUTER JOIN вернет сумму количества строк из обеих таблиц (m + n), т.к. ни одна строка не совпала. 🔸CROSS JOIN остается без изменений ➡️ m × n строк.
💡А максимум будет достигаться, когда каждая строка t1 совпадает с каждой строкой t2: При полном пересечении, когда каждая строка t1 совпадает с каждой строкой t2, все типы джойнов вернут максимальное количество строк m × n, потому что каждый элемент из одной таблицы сочетается с каждым элементом из другой, образуя полный набор пар совпадающих строк.
💡Если одна из таблиц полностью пустая (не содержит строк): 🔸INNER JOIN вернет 0 строк, т.к. нет данных для совпадений. 🔸LEFT JOIN, если пустая таблица справа, вернет все строки из левой таблицы с NULL в столбцах правой таблицы (число строк равно количеству строк в левой таблице). 🔸RIGHT JOIN, если пустая таблица слева, вернет все строки из правой таблицы с NULL в столбцах левой таблицы (число строк равно количеству строк в правой таблице). 🔸FULL OUTER JOIN вернет все строки из непустой таблицы с NULL в столбцах пустой таблицы (число строк равно количеству строк непустой таблицы). 🔸CROSS JOIN вернет 0 строк, т.к. произведение по пустому множеству всегда пусто. А вам попадалась эта задача на собеседованиях?🧐 ©️что-то на инженерном
__ В этом посте были ссылки, но мы их удалили по правилам Сетки
· 23.10.2025
Да, только это задача не с собеса, а с опросника HR перед собесом.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 23.10.2025
Видимо зависит от компании,мне как-то на третьем этапе тех собеса дали ее 🤷♀️
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 23.10.2025
У меня обычно там какие нибудь хитрые джойны или оконочки. Из самого прикольного было данные с временной меткой разделить на сессии. По времени и по клиентам.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 23.10.2025
О, звучит интересно
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён