Друзья, всем привет 👋. Врываемся в рабочую неделю! 🫠
Итак, давайте разберем результаты решения вот это
й задачки.
Правильно ответили всего лишь 33% 😳. Возможно, варианты ответов были запутанные (я старался 🤝), но все-таки кто знает, как работают джоины решил бы легко. Думал будет больше правильных ответов.
Я попробую разжевать как решаются данные задачи🫡.
Пойдем поэтапно. Я сделал 3 схемы, скрин прикрепил. Внимательно изучите.
Дальше попробую объяснить текстом ( это сложновато, но попробую).
Объяснение:
1) Посмотрим, как соединяются строки с числами без null и без дублей. Здесь все легко.
• inner join – берем все что пересекается в двух таблицах, 2 и 3 есть в двух таблицах, значит берем 2 строки.
• left join – сразу берем все из левой таблицы (1,2,3) и ищем соответствия из правой (2, 3 соответствует), если в правой таблице нет равного значения ставим null.
• right join - наоборот, берем все из правой (2,3,4) , берем такие же значения из левой, если в левой таблице такого значения нет – ставим null.
• full join – как бы соединяем left и right, берем все из левой (1,2,3) и все из правой таблицы (2,3,4), если соответствий нет - ставим null. У 1 (единицы) из левой таблицы нет равного значения в правой, ставим null, у 4 (четверки) из правой таблицы, нет равного равного значения в левой - тоже ставим null.
• cross join. Запомните, при cross join-e всегда тупо все перемножаем. Без разницы равно или не равно. Проходимся по всем строкам в цикле. Берем 1 из левой таблицы, пробегаемся по всей правой ( (1,2), (1,3),(1,4)). Потом берем следующие строки..
2) Как соединятся строки с числа и с дублями, без null.
Что в этом случае будет отличаться. У нас здесь в левой таблице одна 2, а правой таблице две 2. Значит эти 2 (двойки) везде просто замножатся. Достаточно посмотреть на скрин.
3) Как соединяются null-ы (наша задачка)
Вот этот третий случай, на самом деле не очень простой (как и показал результат опроса). Его советую разок прям покрутить, создать таблицы и посмотреть, как выполняются соединения. Скрипты отправлю в комменты.
Здесь самое главное понять: Null не равно Null ❗️‼️
То есть null = null вернет False. Null is Null вернет True, но в соединении стоит = (равно). Поэтому в результате соединения с null-ми у нас всегда будет ложь и никаких соответствий не будет. И тем более не будет дублей.
Разберем. В левой таблиц три null-a, в правой два null-a.
• inner join – берем только то, что пересекается. Null из левой таблице не равен Null из правой. В результате у нас ничто ничему не равно. Возвращается 0 строк.
• left join - берем все из левой таблицы, это три null-a. У нас нет соответствии из правой таблицы (null не равен null), и тут интересный момент – мы все равно ставим null из справой. Но это как бы Null не из правой таблицы, а null то есть нет соответствия. Это надо осознать 🤔 . В рез-те возвращается 3 строки.
• right join – аналогично. Берем все из правой таблицы (два null-a), равных значений в левой таблице нет, значит ставим null. В рез-те возвращается 2 строки.
• full join – тоже сложновато представить. Мы берем все из левой таблицы (три null), равных значений в правой таблице – нет, значит ставим null. Далее также берем все из правой таблицы (два null), равных значений в левой таблице нет, ставим null. В результате возвращается 5 строк ( 3 из левой+ 2 из справой).
• cross join. Как писал ранее – тупо перемножаем. 3 null-a из левой * 2 null-a из правой таблицы = 6 строк со всеми null-ми. Нам без разницы равно что-то друг другу или нет, мы просто в цикле пробегаемся по все строкам.
Что касается, нашей задачки❗️. Слева 4 строки с null-ми, справа 10 строк с null-ми.
• inner join ничего не вернет ( 0 строк).
• left join вернет 4 строки (все из левой)
• right join вернет 10 строк (все из правой).
• full join 4 + 10 = 14 строк, все из левой + все из правой, а пересечений нет (null != null).
• cross join, перемножаем, 4*10=40 строк.
Если остались вопросы, смело задавайте!
#sql #база #jun