JOIN — оператор языка SQL, предназначенный для выбора данных из двух таблиц и включения их в один результирующий набор. Если на примере: мы берем данные из двух таблиц, объединяем их по тем или иным правилам с помощью JOIN в единую таблицу, и выводим её.
В зависимости от того, какие правила объединения применяются, выделяются несколько типов оператора JOIN. Наиболее популярные мы и рассмотрим.
Синтаксис простого запроса с JOIN выглядит так:
SELECT fieldA, fieldB
FROM table1
JOIN table2
ON field1 = field2
Здесь мы объединяем две таблицы (table1 и table2) по одному ключевому полю. Если в обеих таблицах у этого поля одинаковые значения, то в результатах запроса данные этих таблиц будут выведены на одной строке. Проще всего рассмотреть это на примере.
У нас есть две таблицы: Cats и Shops. В таблице Cats нас интересует имя кота и shop_id. В таблице Shops хранятся id магазина и его название.
Допустим, мы хотим посмотреть, какие коты в каких магазинах живут. Для этого нам надо будет вывести имя кота и название магазина. А чтобы объединить таблицы, потребуется общий элемент (ключ), одинаковый для обеих таблиц. В данном случае подойдет shop_id. Ведь значение shop_id в таблице Cats полностью соответствует значениям Id в таблице Shops
Тогда наше правило объединения будет выглядеть так. Мы хотим объединить таблицы Cats и Shops и вывести имя кота и название магазина с тем же id, который указан для этого кота в поле shop_id
Здесь мы видим, что кот Мурзик живет в магазине Catland, а кот Пушок в магазине Pets Point. Это и называется объединением таблиц Cats и Shops по условию shop_id = id. Для JOIN наличие условия объединения обязательно, иначе СУБД не будет знать как сопоставить значения.
Код данного пример можно записать следующим образом:
SELECT name, shopname
FROM Cats
JOIN Shops
ON shop_id = id
В идеальном мире для каждого shop_id найдется значение в поле id таблицы Shops
Но в реальности может случиться так, что какому-то коту присвоен shop_id, которого в таблице Shops нет. Или в shop_id и вовсе отсутствует значение, например если котик уже был продан. Или в таблице Shops будет магазин, которому нет соответствующих shop_id в таблице Cats
Как запрос поступит в таких случаях?
Для работы с подобными ситуациями в SQL существует несколько видов JOIN. Они объединяют данные по различным правилам, которые пригодятся в разных ситуациях.
INNER JOIN или просто JOIN (внутреннее соединение)
Покажет только те записи, для которых нашлись пары. Остальные он просто не выведет.
Выведет все записи первой таблицы, а для ненайденных пар из второй проставит значение NULL
RIGHT JOIN (правое соединение)
Поступит наоборот, и выведет все записи второй таблицы, а на место нехватающей информации из первой таблицы подставит NULL
FULL JOIN или OUTER JOIN (внешнее соединение)
Работает как одновременно левый (LEFT) и правый (RIGHT) JOIN, и выводит все записи из обеих таблиц.
Давайте посмотрим, как будут выглядеть разные виды JOIN
INNER JOIN выведет всего две строки. Все остальные, для которых значения в одной из таблиц отсутствуют, он не выводит.
LEFT JOIN добавит к ним еще 2 значения из поля name, а в поле shopname проставит значение NULL
RIGHT JOIN тоже добавит 2 значения, но уже в поле shopname и проставит NULL в поле name.
FULL JOIN выдаст все значения, и LEFT JOIN и RIGHT JOIN. Обратите внимание, что при использовании FULL JOIN, финальных полей даже больше, чем в каждой из таблиц по отдельности.
Узнать больше об инструментах анализа данных вы можете на нашем бесплатном вебинаре «Как стать аналитиком данных за 6 месяцев и начать зарабатывать от 50 000 до 200 000 рублей в месяц удаленно».