Ч
что-то на инженерном
@chtotonainzhenernom1.2K подп.
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 строк, т.к. произведение по пустому множеству всегда пусто. А вам попадалась эта задача на собеседованиях?😈 ©️что-то на инженерном
4.3K
просмотров
3329
символов
Да
эмодзи
Да
медиа

Другие посты @chtotonainzhenernom

Все посты канала →
Сегодня предлагаю разобрать популярную задачу с SQL-собесов. — @chtotonainzhenernom | PostSniper