Учу SQL и понимаю, что схема Join-ов основанная на пересекающихся кругах не корректна. Результатом джойнов всегда идет увеличение таблицы в ширь. А по схеме с кругами площадь кругов почти везде не увеличивается. И также круговая схема не показывает заполнение NULL-ами при LEFT и RIGHT джойнах. Предлагаю схему на прямоугольниках, где закрашенный красный это результирующая таблица джойнов, черный это заполнение NULL-ами. Серые прямоугольники оставлены просто для наглядности и ничего не означают.

Комментарии (26)


  1. pennanth
    11.10.2022 14:36
    +8

    Серые прямоугольники - это отфильтрованные join'ами данные, которые не включены в результат. Польза от них большая.


  1. maslbl4
    11.10.2022 14:38
    +4

    Хорошая схема есть в блоге jooq https://blog.jooq.org/say-no-to-venn-diagrams-when-explaining-joins/


  1. ARad
    11.10.2022 14:55
    +4

    1. Pavel_nobranch Автор
      11.10.2022 14:58
      +1

      Посмотрел. Нет. Не читал их.


  1. ITMatika
    11.10.2022 15:11
    +2

    У вас на прямоугольниках соединение один к одному.
    А один ко многим? А многие ко многим?


    1. Ivan22
      11.10.2022 15:15
      +1

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


    1. Pavel_nobranch Автор
      11.10.2022 15:17

      Долго думал над этими вариантами. Пока не увидел решение. Думаю картинка не сможет раскрыть эти варианты. Тут нужна какая нибудь анимация.


      1. Pavel_nobranch Автор
        11.10.2022 15:28
        +1

        Вообще на картинке прямоугольники джойнятся на плоскости по координате Y. А если добавить 3-е измерение может и получится


        1. funca
          12.10.2022 10:23
          +1

          Там под капотом ещё несколько операций Selection, Projection. Их проще изучать по-отдельности. На мой взгляд таблицы лучше всего подходят для иллюстрации. Хотя вместо конкретных значений можно попробовать цветовую раскраску как у вас, но различая для разных таблиц и колонок. А вообще Relational Algebra.


  1. BareDreamer
    11.10.2022 17:05
    +5

    Я слабо понимаю, зачем это нужно. Все эти схемы не дают понимания, что такое декартово произведение, что число строк может перемножаться. Связь в join может быть по не уникальным столбцам или там может быть какое-то другое условие кроме равенства.


    1. Ivan22
      11.10.2022 17:38
      +1

      при изучении джоинов как раз таки начинать надо не с декартова произведения, а с джоина по FK->PK. оно гораздо более и распространено и интуитивно понятно. Потом учатся различия между inner и outer - потом full, left, right. Потом джоины не по PK, потом не по эквисоединению.... и только потом cross join - как самый вырожденный случай


      1. funca
        12.10.2022 01:22

        У меня первой книжкой по базам была "Введение в системы баз данных" Дейта. Он сначала даёт реляционную алгебру, а потом на этой основе рассказывает про SQL. С пониманием джоинов вообще не было проблем. Cross join это вообще самое простое - тупо берём все возможные комбинации. Он не вырожденный, а наиболее общий. Вот для всех остальных частных случаев уже приходится включать воображение.


        1. Ivan22
          12.10.2022 10:38

          реляционную алгебру учить имеет смысл в университете. А на проекте, если я хочу подтянуть джуна в sql-е, последнее что я захочу делать - это обучать реляционной алгебре


  1. Linder666
    11.10.2022 17:09
    +3

    А как на вашей схеме будет тогда выглядеть FULL JOIN?


    1. Ivan22
      11.10.2022 17:35
      -1

      это задачка со звездочкой, на собесе джунов.


    1. ktotaika
      12.10.2022 17:20
      +2

      Как наложенные друг на друга лефт и райт без серых частей же


  1. Quark-Fusion
    11.10.2022 21:10
    +1

    а нужны схемы?


  1. edo1h
    12.10.2022 04:20

    не понял что даёт замена кругов на прямоугольники


    1. dopusteam
      12.10.2022 08:15

      Круги пересекали, а прямоугольники приставляют друг к другу)


    1. Ivan22
      12.10.2022 10:35
      +2

      дополнительная визуализация увеличения количества столбцов после джоина, что кстати не всем начинающим sql-щикам очевидно, так что смысл есть.


      1. edo1h
        12.10.2022 19:24

        точнее для иллюстрации появляющихся null'ов.


        да, мой вопрос был неуместен


        1. Ivan22
          13.10.2022 17:06

          и не только нулов, при inner joine никаких нулов не добавиться,а столбцы будут новые


  1. JordanCpp
    13.10.2022 00:01
    +1

    Предлагаю простую схему для понимания join' ов:)


    1. Pavel_nobranch Автор
      13.10.2022 05:47

      Inner join - стопка водки только с закуской

      Left - закуска есть или нет все равно пьем

      Right - я пока ем, а вы наливайте что есть

      Full - пьем жрем все до чего дотянулся

      Full exclusive - пьем жрем не закусываем

      Left exclusive - кто взял закуску не пьет

      Right exclusive - кому налили не жрет)


      1. Ivan22
        13.10.2022 17:08
        +1

        я бы уточнил, это CROSS - "пьем жрем все до чего дотянулся "

        а FULL - если и закусываем, то только подходящими закусками под каждый алкоголь