Хабрахабр

Понимание джойнов сломано. Продолжение. Попытка альтернативной визуализации

Круги Венна не могут полноценно проиллюстрировать некоторые моменты, например, если значения в таблице повторяются. Многие из вас читали предыдущую статью про то, как неправильная визуализация для объяснения работы JOIN-ов в некоторых случаях может запутать.

Кроме того, в комментариях к изначальной статье тоже предлагали похожий вариант. При подготовке к записи шестого выпуска подкаста "Цинковый прод" (где мы договорились обсудить статью) кажется удалось нащупать один интересный вариант визуализации.

Все желающие приглашаются под кат

Как мы выяснили в комментах к предыдущей статье, join — это скорее декартово произведение, чем пересечение. Итак, визуализация. Таким образом элементы таблицы будут представлять собой все комбинации всего. Если посмотреть, как иллюстрируют декартово произведение, то можно заметить, что зачастую это прямоугольная таблица, где по одной оси идет первое отношение, а по другой — второе.

Сложно абстрактно это нарисовать, поэтому придется на примере.

В одной из них Допустим у нас есть две таблицы.

id
--
1
1
6
5

В другой:

id
--
1
1
2
3
5

Многие в прошлой статье возмущались, как это так — id повторяются, безобразие. Сразу disclaimer: я назвал поле словом "id" просто для краткости. В общем, не суть. Не стоит сильно переживать, ну
представьте, например, что это таблица с ежедневной статистикой, где для каждого дня и каждого юзера есть данные по посещению какого-нибудь сайта.

Начнем с CROSS JOIN: Итак, мы хотим узнать, что же получится при различных джойнах таблиц.

CROSS JOIN

SELECT t1.id, t2.id
FROM t1 CROSS JOIN t2

CROSS JOIN — это все все возможные комбинации, которые можно получить из двух таблиц.

Визуализировать это можно так: по оси x — одна таблица, по оси y — другая, все клеточки внутри (выделены оранжевым) — это результат

INNER JOIN

Обратите внимание на ситуацию, когда записи дублируются — результатов с единичками будет четыре штуки. INNER JOIN (или просто JOIN) — это тот же самый CROSS JOIN, у которого оставлены только те элементы, которые удовлетворяют условию, записанному в конструкции "ON".

SELECT t1.id, t2.id
FROM t1 INNER JOIN t2 ON t1.id = t2.id

LEFT JOIN

LEFT OUTER JOIN (или просто LEFT JOIN) — это тоже самое, что и INNER JOIN, но дополнительно мы добавляем null для строк из первой таблицы, для которой ничего не нашлось во второй

SELECT t1.id, t2.id
FROM t1 LEFT JOIN t2 ON t1.id = t2.id

RIGHT JOIN

Т.е. RIGHT OUTER JOIN ( или RIGHT JOIN) — это тоже самое, что и LEFT JOIN, только наоборот. это INNER JOIN + null для строк из второй таблицы, для которой ничего не нашлось в первой

SELECT t1.id, t2.id
FROM t1 RIGHT JOIN t2 ON t1.id = t2.id

→ Поиграть с запросами можно здесь

Выводы

Хотя в ней есть ограничения: здесь показан случай, когда в ON записано равенство, а не что-то хитрое (любое булево выражение). Вроде бы получилась простая визуализация. Т.е. Кроме того не рассмотрен случай, когда среди значений таблицы есть null. это всё равно некоторое упрощение, но вроде бы получилось лучше и точнее, чем круги Венна.

Подписывайтесь на наш подкаст "Цинковый прод", там мы обсуждаем базы данных, разработку софта и прочие интересные штуки.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть