Как устроены таблицы и джойны в SQL
Что проверяют
Понимаете ли вы таблицу глазами аналитика: что в ней одна строка (зерно), какой ключ, как таблицы связаны. Джойны проверяют не по определениям, а по последствиям: сколько строк получится и не задвоятся ли суммы. Следом часто дают две маленькие таблицы и просят назвать число строк после LEFT JOIN.
Как отвечать
Про таблицы коротко: строки, столбцы с типами, первичный и внешние ключи. Главное для аналитика это зерно: «одна строка на заказ» или «одна строка на позицию заказа». Связи бывают один к одному, один ко многим и многие ко многим через промежуточную таблицу.
Джойны:
INNER JOIN: только пары, где условие совпало;LEFT JOIN: все строки левой таблицы, справаNULL, где пары нет;RIGHT JOIN: то же зеркально, обычно его переписывают вLEFT;FULL OUTER JOIN: все строки обеих таблиц, сNULLтам, где пары не нашлось. В MySQL его нет, эмулируют черезUNIONдвух внешних соединений;CROSS JOIN: декартово произведение, полезен для сетки «все даты × все категории»;- self join: таблица с самой собой, например сотрудник и его руководитель.
Отдельно назовите полусоединение и антисоединение: EXISTS отвечает «есть ли пара» без размножения строк, а NOT EXISTS или LEFT JOIN ... WHERE b.id IS NULL находит строки без пары, например клиентов без заказов.
При соединении со стороной «многие» строки размножаются. Если пристыковать к заказам и позиции, и оплаты, сумма оплат умножится на число позиций. Агрегируйте до джойна или считайте COUNT(DISTINCT ...).
В ClickHouse LEFT JOIN без пары по умолчанию даёт не NULL, а значение типа по умолчанию (0, пустую строку), пока не включена настройка join_use_nulls.
Где спотыкаются
Ставят фильтр по правой таблице в WHERE после LEFT JOIN. Строки с NULL отсекаются, и соединение фактически становится внутренним; если нужны все строки слева, условие переносят в ON.
Ждут, что NULL совпадёт с NULL в условии соединения. Не совпадёт, и такие строки молча выпадут из INNER JOIN.
Не проверяют число строк после джойна. Простая сверка COUNT(*) до и после ловит задвоение раньше, чем неверная цифра попадёт в отчёт.