Что такое соединения SQL?

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

Примечание перед тем, как двигаться дальше: в этом сообщении предполагается, что вы знаете базовый синтаксис SQL и имеете общее представление о реляционных базах данных. Это не слишком техническое чтение, но я подумал, что было бы полезно заранее согласовать ожидания.

Что это обозначает?

Допустим, в вашей базе данных есть две таблицы: пользователи и комментарии.

Схема базы данных настроена таким образом, что существует связь «один: много». У пользователя может быть ноль или более комментариев. Это означает, что для каждой пользовательской записи существует либо ноль, либо одна, либо много записей комментариев, у которых есть столбец внешнего ключа, указывающий на этот столбец первичного ключа записи пользователя.

Если вы хотите визуализировать, вот великолепная диаграмма:

Для справки мы можем сказать, что наша база данных в настоящее время выглядит так:

Если ваша цель - вернуть данные из вашей базы данных, где вы хотите организовать каждого пользователя с комментариями, которые они сделали, это идеальный вариант использования для SQL JOIN.

Интересно, во что это переводится в коде SQL?

Больше не интересно. Ну вот:

Предложение ON содержит условие, при котором строки записей соединяются друг с другом.

В этом случае для каждой записи в пользователях, где столбец id равен столбцу user_id для комментария, имя пользователя будет возвращено вместе с телом комментария. Эти столбцы будут объединены в одну строку следующим образом:

Типы соединений

1. Внутреннее соединение (также известное как JOIN)

Первый (и наиболее распространенный) тип JOIN, о котором я расскажу, - это INNER JOIN. Иногда его называют Simple JOIN или просто JOIN.

INNER JOIN будет возвращать строки данных с обеих сторон соединения на основе условия, указанного в предложении ON. Если записи не удовлетворяют этому условию, они не будут возвращены.

Когда я могу использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ?

ВНУТРЕННЕЕ СОЕДИНЕНИЕ показано во введении выше. Если вы посмотрите на результаты запроса, вы заметите, что пользователь Cynthia не возвращается, потому что у нее нет никаких связанных комментариев.

Пользователь без комментариев не будет возвращен запросом. Точно так же не будет возвращена запись для комментария, который не принадлежит пользователю.

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

2. Левое соединение (также известное как левое внешнее соединение)

LEFT JOIN, также известный как LEFT OUTER JOIN, вернет все записи из таблицы, указанной в предложении FROM (левая таблица), соединенные с записями из правой таблицы, которые удовлетворяют предложению ON.

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

Вот такой запрос:

А вот данные, возвращаемые нашей базой данных:

Приведенный выше запрос возвращает имя каждого пользователя, а также количество оставленных ими комментариев.

В отличие от INNER JOIN, приведенного выше, LEFT JOIN вернул ВСЕ значения для столбца name во всех пользовательских записях, даже если у этого пользователя не было комментария. Это демонстрируется тем фактом, что Синтия была возвращена, но ее comment_count равен нулю.

Когда следует использовать ЛЕВОЕ СОЕДИНЕНИЕ?

Когда вам нужны все записи из левой таблицы, и вы хотите объединить только те строки с записями в правой таблице, которые удовлетворяют условию в предложении ON.

3. Правое соединение (также известное как правое внешнее соединение)

RIGHT JOIN, также известный как RIGHT OUTER JOIN, по сути, является полной противоположностью LEFT JOIN. По этой причине я не буду вдаваться в подробности об этом.

Когда мне следует использовать ПРАВИЛЬНОЕ СОЕДИНЕНИЕ?

Когда вам нужны все записи из правой таблицы, и вы хотите объединить только те строки с записями в левой таблице, которые удовлетворяют условию в предложении ON.

4. Перекрестное соединение

CROSS JOIN, также известный как CARTESIAN JOIN, вернет все записи из обеих таблиц, где для каждой записи в одной таблице она объединяется в строку с каждой записью из другой таблицы.

Другими словами, CROSS JOIN по сути является INNER JOIN без условия для оценки в предложении ON.

Вот пример использования существующей базы данных из трех предыдущих объединений:

И вот результат этого запроса:

Как вы можете видеть, для каждой записи пользователя имя пользователя добавляется в строку с текстом каждого комментария.

До следующего раза

Вот и все! Я надеюсь, что этот краткий обзор SQL JOIN проливает свет на то, что они делают.

Если вы считаете, что что-то здесь было неточным, или если вам нужно пояснение, пожалуйста, дайте мне знать!