4.3Kпросмотров
23 октября 2025 г.
📷 ФотоScore: 4.7K
Сегодня предлагаю разобрать популярную задачу с 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 строк, т.к. произведение по пустому множеству всегда пусто. А вам попадалась эта задача на собеседованиях?😈 ©️что-то на инженерном