Продолжаем объединять таблицы. Если в Экселе это относительно пользовательский интерфейс (кейс описан в предыдущей статье) и все ориентировано для "среднего" пользователя ПК, то SQL - это уже более сложные материи, связанные с программированием, базами данных и т.д. Но все же, внутри лежат у нас те же самые таблицы. Как недавно увидел мем: 80% веб приложений - это всего лишь чуть иная обертка для Экселя.
В качестве примера базы с таблицами будем использовать базу коробочной версии Битрикс24. Если у вас есть пожелания на раскрытие подобных тем, пишите их в комментариях, в новых статьях постараюсь описать свое видение ваших кейсов.
- Объединение по основной левой "основной" таблице;
- Объединение по правой таблице;
- Объединение по вертикале, добавить строки снизу.
1. Объединение по основной левой таблице, добавляя только найденные значения
Сказал бы, самый частый кейс в моей практике, когда есть в основной таблице Ключ в каком-то столбце, но надо узнать, значение этого ключа, дополнив таблицу. Основной таблицей у нас будет таблица Сделок Битрикс24. Каждая сделка имеет свое направление/воронку продаж. В нашем примере есть 6 воронок по продажам на соответствующих маркетплейсах и нулевая "дефолтная" в продукте: Нулевая; YaMarket; Wildberries; Ozon; Новый маркетплейс; Off-line продажи.
Внутри эти данные лежат в SQL-таблицах. Основной таблицей будет b_crm_deal, в ней лежат значения основных полей сделок, а вот воронки продаж - это своего рода отдельная сущность, отдельная модель данных. Данные о пользовательских воронках лежат в другой таблице b_crm_deal_category.
Основная таблица, если ее выгрузить, например, в Эксель напрямую из базы не даст полной информации о названии воронки/категории.
Теперь, работая со сделками и желая получить сразу таблицу с текстовым значением воронки, нам нужно по ключу ID категории объединить эти две таблицы. В основной таблице b_crm_deal в поле/столбце CATEGORY_ID указан идентификатор/ID воронки, полная информация о которой лежит в таблице b_crm_deal_category, название - в поле NAME.
Для этого служит оператор "JOIN" в SQL. Он используется для объединения строк двух или более таблиц на основе общего поля между ними. Это позволяет совмещать данные из различных таблиц при создании комплексных запросов.
SQL-запрос будет иметь синтаксис:
SELECT b_crm_deal.ID, b_crm_deal.TITLE, b_crm_deal.CATEGORY_ID, b_crm_deal_category.NAME #Указываем, какие столбцы брать и из каких таблиц
FROM b_crm_deal #Основная "левая" таблица
LEFT JOIN b_crm_deal_category #таблица с данными о категориях, "правая"
ON b_crm_deal.CATEGORY_ID = b_crm_deal_category.ID; #по какому полю связываем таблицы
2. Объединение по правой таблице
"Основной" таблицей в запросе можно сделать и "правую" таблицу, где лежат данные о категориях. Для этого LEFT JOIN в запросе меняем на RIGHT JOIN. Тут уже будет особенность: в таблице категорий есть значения, которые не указаны ни для одной сделки. И вот такие категории без сделок будут просто выведены ниже, таблица станет больше на 2 строки:
3. Объединение по вертикале, добавить строки снизу
Работая с SQL, просто данные не перекопируешь из одной таблицы, вставив снизу в другую. Но данные нам периодически приходят новые, за последние периоды и их надо добавить снизу в имеющуюся таблицу. Т.е. на входе две SQL-таблицы с одинаковыми полями, на выходе нужно получить третью, объединяющую эти 2 таблицы.
Запрос будет такой:
CREATE TABLE title_new_table AS #Указываем название новой таблицы
SELECT * FROM old_table_1 #Указываем первую таблицу
UNION SELECT * FROM old_table_2 #вторую