Почему после JOIN появляются дубли строк

IT и разработка 20.03.2026 · 👁 705 просмотров
Почему после JOIN появляются дубли строк ❓ Часто замечаю, что многие, кто начинает свой путь в анал итике , не до конца понимают, как реально работают JOIN’ы в SQL. Может ошибочно казаться, что условный LEFT JOIN только подтягивает поля из второй таблицы, соответственно кол-во строк остается таким же. (как ВПР в excеl'e) Или INNER JOIN оставляет только строки из левой и правой таблиц, то есть количество строк останется таким же или становится меньше. Но на самом деле джойны строят все совпадения строк по условию соединения . Именно поэтому количество строк после них может не только уменьшиться или остаться тем же, но и вырасти . Разберем на примере: tbl1 id - 10 строк 12344556 NULL NULL tbl2 id - 7 строк 134456 NULL Выполняем: SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id Что получится: ➖ 1 → 1 совпадение ➖ 2 → нет совпадений, но в LEFT JOIN строка останется, а справа будут NULL ➖ 3 → 1 совпадение ➖ 4 → слева 2 строки, справа 2 строки → будет 4 строки ➖ 5 → слева 2 строки, справа 1 строка → будет 2 строки ➖ 6 → 1 совпадение ➖ NULL с NULL через = не матчится, поэтому обе строки с NULL слева просто останутся без пары (заполнятся NULL'ами справа) Итого: 12 строк Почему так? 👉 каждая строка слева соединяется со всеми подходящими строками справа То есть если ключ не уникален, строки начинают размножаться. Например: ➖ 2 строки слева × 2 строки справа = 4 строки ➖ 2 строки слева × 3 строки справа = 6 строк Именно поэтому я и говорю, что после JOIN количество строк может увеличиться. И это касается не только LEFT JOIN. ➖ В INNER JOIN строк тоже может стать больше, если есть множественные совпадения с обеих сторон ➖ В RIGHT JOIN — та же логика, просто сохраняется уже правая таблица ➖ В FULL JOIN — тоже могут появляться дополнительные строки за счет множественных совпадений и несовпавших записей с обеих сторон ➖ В CROSS JOIN вообще сразу строится декартово произведение, поэтому там рост количества строк очевиден изначально Еще раз закрепим: ключевая идея JOIN'ов не просто "подтянуть поля", а построить все пары строк, которые подходят под условие соединения Еще одна задача на закрепление понимания Если в левой таблице 100 строк и в правой таблице 100 строк, то сколько строк может быть после JOIN в минимальном и максимальном случае? (разберем на примере INNER'а и LEFT'а) Попробуйте сначала ответить сами и написать в комментах 👇 Ответ: ➖ для INNER JOIN минимум — 0, максимум — 10 000 ➖ для LEFT JOIN минимум — 100, максимум — 10 000 Разберем, почему так Минимум: ➖ INNER JOIN может дать 0 строк, если совпадений между таблицами нет вообще. ➖ LEFT JOIN меньше 100 строк здесь дать не может, потому что он в любом случае сохраняет все строки из левой таблицы. Если совпадений справа нет — просто получим NULL в колонках правой таблицы. Максимум: ➖ В предельном случае каждая строка слева может соединиться с каждой строкой справа (в обоих случаях). Тогда получаем: 100 × 100 = 10 000 строк Именно поэтому при работе с JOIN'ами важно не просто смотреть на условие соединения, но и всегда держать в голове гранулярность таблиц и возможную неуникальность ключей. ❤️‍🔥 Подписывайтесь и поддержите канал бустом ↗️ Менторю и помогаю выйти на оффер ❓ У кого после JOINа хоть раз ехали метрики из-за того, что выросло количество строк? 👇 @data_driven_bogdan
Откликнуться в Telegram →

⚠️ Никогда не платите «за оформление» или «гарантию трудоустройства» — это признак мошенников. Работа ТРУ не несёт ответственности за содержание вакансии.

🇮🇱 Не нашли подходящую зарплату? В Израиле платят от $3000 Без языка и опыта · жильё и легализация под ключ · официально Смотреть вакансии →