Объясните принцип работы `INNER JOIN`. Приведите пример.

Ответ

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

Представьте две таблицы: users (пользователи) и orders (заказы).

SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Этот запрос вернет список имен пользователей вместе с продуктами, которые они заказали. Пользователи, не сделавшие ни одного заказа, в результат не попадут.

Пример использования в Go с database/sql:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq" // Пример с драйвером PostgreSQL
)

func main() {
    // db - это ваш экземпляр *sql.DB
    rows, err := db.Query(`
        SELECT u.name, o.product
        FROM users AS u
        INNER JOIN orders AS o ON u.id = o.user_id`)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var name, product string
        if err := rows.Scan(&name, &product); err != nil {
            log.Println(err)
            continue
        }
        fmt.Printf("Пользователь: %s, Продукт: %sn", name, product)
    }

    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
}

Ключевые особенности:

  • Только совпадения: Возвращает только пересекающиеся данные из обеих таблиц.
  • Симметричность: A INNER JOIN B эквивалентно B INNER JOIN A (хотя порядок столбцов в результате может отличаться).
  • Производительность: Эффективность запроса сильно зависит от наличия индексов на соединяемых полях (users.id и orders.user_id).
  • Стандарт: Является наиболее часто используемым типом соединения.