Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Базовые концепции JOIN
intro

Базовые концепции JOIN

Введение в JOIN: что это, зачем нужен, базовый синтаксис и типы соединений

Базовые концепции JOIN

JOIN — это операция, которая позволяет комбинировать данные из нескольких таблиц на основе связанных колонок. Без JOIN вам пришлось бы выполнять множество отдельных запросов и объединять результаты в коде приложения.

#Зачем нужен JOIN

Представьте, что у вас есть две таблицы: users (пользователи) и orders (заказы). Информация о пользователе хранится отдельно от его заказов. Чтобы получить список заказов с именами пользователей, вам нужно объединить эти таблицы.

Без JOIN (плохой подход — N+1 запрос):

-- Сначала получаем все заказы SELECT * FROM orders; -- Затем для каждого заказа делаем отдельный запрос к users SELECT name FROM users WHERE id = 1; SELECT name FROM users WHERE id = 2; -- ... и так далее

С JOIN (один запрос):

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

#Базовый синтаксис JOIN

SELECT <колонки> FROM <таблица1> JOIN <таблица2> ON <условие_соединения>;

Ключевые компоненты:

  • FROM — указывает основную таблицу (левую)
  • JOIN — указывает таблицу для соединения (правую)
  • ON — определяет условие, по которому строки считаются связанными

#Пример данных

Создадим тестовые таблицы для примеров:

-- Таблица пользователей CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE ); -- Таблица заказов CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), product VARCHAR(100), amount DECIMAL(10, 2) ); -- Добавим данные INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com'), ('Charlie', 'charlie@example.com'); INSERT INTO orders (user_id, product, amount) VALUES (1, 'Laptop', 1200.00), (1, 'Mouse', 50.00), (2, 'Keyboard', 150.00);

Данные в таблицах:

users:
+----+---------+---------------------+
| id | name    | email               |
+----+---------+---------------------+
| 1  | Alice   | alice@example.com   |
| 2  | Bob     | bob@example.com     |
| 3  | Charlie | charlie@example.com |
+----+---------+---------------------+

orders:
+----+---------+----------+--------+
| id | user_id | product  | amount |
+----+---------+----------+--------+
| 1  | 1       | Laptop   | 1200.00|
| 2  | 1       | Mouse    | 50.00  |
| 3  | 2       | Keyboard | 150.00 |
+----+---------+----------+--------+

#Простой JOIN в действии

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

Результат:

+-------+----------+--------+
| name  | product  | amount |
+-------+----------+--------+
| Alice | Laptop   | 1200.00|
| Alice | Mouse    | 50.00  |
| Bob   | Keyboard | 150.00 |
+-------+----------+--------+

Обратите внимание:

  • Charlie отсутствует в результате, потому что у него нет заказов
  • Alice появляется дважды, потому что у неё два заказа (связь один-ко-многим)

#Типы JOIN

SQL поддерживает несколько типов JOIN, каждый из которых возвращает разные наборы данных:

Тип JOINВозвращает
INNER JOINТолько совпадающие строки из обеих таблиц
LEFT JOINВсе строки из левой таблицы + совпадения из правой
RIGHT JOINВсе строки из правой таблицы + совпадения из левой
FULL JOINВсе строки из обеих таблиц
CROSS JOINДекартово произведение (все комбинации)

Диаграмма Венна для визуализации:

INNER JOIN:     LEFT JOIN:      RIGHT JOIN:     FULL JOIN:
   ┌─────┐        ┌─────┐         ┌─────┐         ┌─────┐
   │  A  │        │  A  │         │     │         │  A  │
   │  ∩  │        │  ●  │         │  ●  │         │  ●  │
   │  B  │        │  B  │         │  B  │         │  B  │
   └─────┘        └─────┘         └─────┘         └─────┘
  (пересечение)  (левая + ∩)    (правая + ∩)    (объединение)

Примечание: В PostgreSQL ключевое слово INNER можно опускать — JOIN по умолчанию означает INNER JOIN.

#Условие соединения (ON clause)

Условие в ON определяет, какие строки считаются связанными. Чаще всего это сравнение по равенству:

-- Эквисоединение (equality join) FROM users JOIN orders ON users.id = orders.user_id

Но можно использовать и другие операторы:

-- Неэксисоединение (nonequijoin) FROM salaries JOIN tax_brackets ON salaries.amount BETWEEN tax_brackets.min AND tax_brackets.max

#Псевдонимы таблиц

Для удобства можно использовать псевдонимы:

SELECT u.name, o.product, o.amount FROM users AS u JOIN orders AS o ON u.id = o.user_id;

Ключевое слово AS опционально для псевдонимов таблиц:

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

#Соединение нескольких таблиц

JOIN позволяет соединять более двух таблиц:

SELECT u.name, o.product, p.category FROM users u JOIN orders o ON u.id = o.user_id JOIN products p ON o.product_id = p.id;

Каждый новый JOIN добавляет ещё одну таблицу к запросу.

#Важные замечания

  1. NULL в условии JOIN: NULL не равен NULL, поэтому строки с NULL в колонке соединения не совпадут.

  2. Дубликаты: Если связь один-ко-многим, строки из левой таблицы могут дублироваться.

  3. Производительность: Убедитесь, что колонки в условии ON проиндексированы (особенно внешние ключи).

  4. Читаемость: Используйте псевдонимы и явный синтаксис JOIN ... ON вместо старого стиля WHERE.

Далее: INNER JOIN