Что такое INNER JOIN? Приведите примеры использования в Go.

Ответ

INNER JOIN — это операция в SQL, которая объединяет строки из двух или более таблиц и возвращает только те из них, для которых выполняется условие объединения. Иными словами, в результат попадают только записи, имеющие совпадающие значения в обеих таблицах.

В Go INNER JOIN используется двумя основными способами:

1. Через Raw SQL с пакетом database/sql

Это фундаментальный способ, который работает с любой реляционной базой данных.

// Пример: получить заказы, у которых есть существующий пользователь
rows, err := db.Query(`
    SELECT o.id, o.amount, u.name 
    FROM orders AS o
    INNER JOIN users AS u ON o.user_id = u.id
`)
if err != nil {
    // обработка ошибки
}
defer rows.Close()
// ... и далее итерация по результатам

2. С помощью ORM (например, GORM)

ORM абстрагирует SQL-запросы, позволяя работать с объектами Go.

// Модели с определенной связью
type User struct {
    ID   uint
    Name string
}

type Order struct {
    ID     uint
    UserID uint
    Amount float64
    User   User `gorm:"foreignKey:UserID"`
}

// Запрос с автоматическим INNER JOIN
var orders []Order
// GORM на основе тега foreignKey сгенерирует INNER JOIN
db.Joins("User").Find(&orders)

// Сгенерированный SQL будет примерно таким:
// SELECT * FROM "orders" INNER JOIN "users" ON "users"."id" = "orders"."user_id"

Ключевая идея: INNER JOIN используется, когда нужно получить набор данных, где каждая запись гарантированно имеет связанные данные в другой таблице (например, «все заказы, у которых есть покупатель»).