← Назад к вопросам

Что такое FULL JOIN?

1.7 Middle🔥 231 комментариев
#Soft skills и карьера

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое FULL JOIN в SQL

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

Как работает FULL JOIN

При выполнении FULL JOIN:

  • Возвращаются все строки из левой (первой) таблицы (LEFT TABLE).
  • Возвращаются все строки из правой (второй) таблицы (RIGHT TABLE).
  • Совпадающие строки (те, для которых условие соединения ON истинно) объединяются в одну строку результирующего набора.
  • Несовпадающие строки из любой таблицы также включаются в результат. Для отсутствующих данных в столбцах "чужой" таблицы подставляется значение NULL.

Это можно наглядно представить как объединение результатов LEFT JOIN и RIGHT JOIN.

Синтаксис и пример использования

Базовый синтаксис запроса с FULL JOIN выглядит так:

SELECT
    table1.column1,
    table1.column2,
    table2.column3,
    table2.column4
FROM
    table1
FULL OUTER JOIN table2
    ON table1.matching_column = table2.matching_column;

Практический пример для QA Engineer

Представим ситуацию, типичную для тестирования: у нас есть таблица с пользователями (users) и таблица с заказами (orders). Нам нужно проанализировать полное соответствие между этими сущностями, чтобы выявить:

  1. Пользователей, которые сделали заказы.
  2. Пользователей, которые не сделали ни одного заказа (потенциальная проблема воронки продаж).
  3. "Сиротские" заказы, не привязанные к пользователю (потенциальная ошибка в данных).
-- Создаем тестовые таблицы
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    order_sum DECIMAL(10,2)
);

-- Вставляем тестовые данные
INSERT INTO users (user_id, username) VALUES
(1, 'Анна'),
(2, 'Борис'),
(3, 'Виктор');

INSERT INTO orders (order_id, user_id, order_sum) VALUES
(101, 1, 1500.00),
(102, 1, 200.50),
(103, 2, 750.00),
(104, NULL, 100.00); -- Заказ без привязки к пользователю (аномалия!)

-- Выполняем FULL JOIN для полного анализа
SELECT
    u.user_id,
    u.username,
    o.order_id,
    o.order_sum
FROM
    users u
FULL OUTER JOIN orders o
    ON u.user_id = o.user_id
ORDER BY
    u.user_id, o.order_id;

Ожидаемый результат запроса:

user_idusernameorder_idorder_sum
1Анна1011500.00
1Анна102200.50
2Борис103750.00
3ВикторNULLNULL
NULLNULL104100.00

Анализ результата с точки зрения QA:

  • Строки 1-2: Успешные соответствия. Пользователь "Анна" сделала два заказа.
  • Строка 3: Успешное соответствие. Пользователь "Борис" сделал заказ.
  • Строка 4: Несовпадение из левой таблицы (users). Пользователь "Виктор" не сделал ни одного заказа (order_id и order_sum = NULL). Это может быть ожидаемым поведением или указывать на проблему в интерфейсе оформления заказа.
  • Строка 5: Несовпадение из правой таблицы (orders). Заказ с id=104 не имеет привязанного пользователя (user_id и username = NULL). Это критическая аномалия данных, которая могла возникнуть из-за:
    *   Ошибки в коде при создании заказа (например, невалидный `user_id`).
    *   Проблемы с целостностью данных (если `user_id` в `orders` был внешним ключом, он мог быть удален каскадно).
    *   Ошибки в процессе миграции или импорта данных.

Ключевые отличия от других типов JOIN

  • INNER JOIN: Возвращает только совпадающие строки из обеих таблиц. Не покажет ни "Виктора" без заказов, ни "сиротский" заказ 104.
  • LEFT JOIN: Возвращает все строки из левой таблицы (users) и совпадения из правой. Покажет "Виктора", но не покажет заказ 104.
  • RIGHT JOIN: Возвращает все строки из правой таблицы (orders) и совпадения из левой. Покажет заказ 104, но не покажет "Виктора".

Важность FULL JOIN для QA Engineer

  1. Тестирование целостности данных: Самый эффективный способ найти расхождения и "осиротевшие" записи между связанными сущностями.
  2. Аналитическое тестирование: Позволяет проверить корректность отчетов, где требуется полный охват данных из нескольких источников.
  3. Регрессионное тестирование: После изменений в логике привязки сущностей (например, пользователей к заказам) с помощью FULL JOIN можно быстро проверить, не появились ли новые аномалии или не исчезли ли существующие связи.
  4. Валидация миграций данных: При переносе данных между системами FULL JOIN помогает убедиться, что все связи сохранились корректно и не было потеряно ни одной записи.

На практике FULL OUTER JOIN используется реже, чем INNER или LEFT JOIN, но в арсенале профессионального QA Engineer он является незаменимым инструментом для глубокой проверки качества данных в сложных, связанных системах.

Что такое FULL JOIN? | PrepBro