Что такое FULL OUTER JOIN, как он работает и чем отличается от других видов JOIN?

Ответ

FULL OUTER JOIN (в некоторых СУБД просто FULL JOIN) — это тип объединения таблиц, который возвращает все строки из обеих таблиц.

Принцип работы:

  1. Возвращаются все строки, для которых выполняется условие объединения (как в INNER JOIN).
  2. Возвращаются все строки из левой таблицы, для которых не нашлось совпадений в правой (как в LEFT JOIN), при этом столбцы правой таблицы заполняются NULL.
  3. Возвращаются все строки из правой таблицы, для которых не нашлось совпадений в левой (как в RIGHT JOIN), при этом столбцы левой таблицы заполняются NULL.

Пример SQL-запроса:

SELECT c.name, o.order_id
FROM customers c
FULL OUTER JOIN orders o ON c.id = o.customer_id;

Результат будет содержать:

  • Клиентов, у которых есть заказы.
  • Клиентов, у которых нет заказов (поле order_id будет NULL).
  • Заказы, у которых по какой-то причине нет связанного клиента (поле name будет NULL).

Применение в Go:

В Go вы просто пишете SQL-запрос как строку и выполняете его с помощью пакета database/sql. Go не интерпретирует сам SQL, а отправляет его в СУБД. Ключевой момент — правильная обработка NULL значений, которые вернет запрос. Для этого в Go используются специальные типы из пакета database/sql, такие как sql.NullString, sql.NullInt64 и т.д.

var customerName sql.NullString
var orderID sql.NullInt64

err := row.Scan(&customerName, &orderID)
// ...

if customerName.Valid {
    // Используем customerName.String
}
// Если !customerName.Valid, значит, в базе было NULL