В таблице users 100 000 строк, в таблице user_profiles — ровно одна строка на каждого user_id. Вы делаете INNER JOIN по user_id. Что верно про число строк результата?
AВсегда будет ровно 100 000 строк, потому что соответствие «один к одному» гарантирует совпадение ключей в обеих таблицах независимо от пропусков
BМожет вырасти до 100 000 × 100 000 строк из-за размножения строк при
JOIN, даже если справа на каждый user_id по одной записиCСтанет равно числу колонок в таблице
user_profiles, потому что INNER JOIN соединяет столбцы и приводит результат к ширине справочникаDНе может быть больше 100 000: при соответствии «один к одному»
INNER JOIN может только уменьшить число строк, если у каких-то пользователей нет профиляПравильный ответ. При связи «один к одному»
INNER JOIN не размножает строки, а может только отбросить несовпавшие ключи.Разбор
При связи «один к одному» на каждый user_id с каждой стороны есть максимум одна строка, поэтому множителя нет. INNER JOIN вернёт только пары, где ключ есть в обеих таблицах. Если часть пользователей без профиля, число строк уменьшится; если профили есть для всех, получится 100 000. Поэтому варианты «всегда ровно 100 000» или «может вырасти до 100 000 × 100 000» некорректны для такой структуры данных.
Проверь себя · 1/3разбор после ответа
Вы считаете «уникальные покупатели по бренду». Данные:
order_items(user_id, product_id) и products(product_id, brand). Один пользователь может купить несколько товаров одного бренда. Какой расчёт на объединённых данных соответствует цели и устойчив к дублированию строк?Ещё вопросы по теме «JOIN и кардинальность»
- Вы соединяете таблицы пользователей и заказов по `user_id`, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?
- Для одного `order_id` в `order_items` есть 3 строки, а в `payments` — 2 строки. Вы соединили обе таблицы по `order_id` без предварительной агрегации. Сколько строк получится для этого заказа и почему?
- Нужен набор данных на уровне `user_id`: выручка из `orders` и число сессий из `sessions`. В обеих таблицах по пользователю много строк (один-ко-многим). Какой подход минимизирует риск размножения строк в соединении?
- Вы хотели посчитать средний чек по заказам как `AVG(order_total)`. Но перед этим соединили `orders` с `order_items` по `order_id` (связь один-ко-многим). Почему `AVG()` может измениться по сравнению с расчётом на таблице `orders`?
- В каком случае `SUM(order_amount)` после `JOIN` скорее всего останется корректным, без эффекта размножения строк?
- Все вопросы по «JOIN и кардинальность» →