MySQL - Полное объединение (Full Join)

Здравствуйте, будущие энтузиасты баз данных! Сегодня мы окунемся в захватывающий мир MySQL и рассмотрим мощный инструмент в нашем арсенале SQL: Полное объединение (Full Join). Не волнуйтесь, если вы новички в программировании; я проведу вас через это понятие шаг за шагом, так же, как я делал это для countless студентов на протяжении многих лет моей преподавательской деятельности. Так что возьмите杯 кофе (или чай, если это ваш выбор) и отправляйтесь в это обучение приключение вместе со мной!

MySQL - Full Join

Что такое Полное объединение?

Before мы перейдем к деталям Полного объединения в MySQL, давайте начнем с простой аналогии. Представьте, что вы планируете вечеринку и у вас есть два списка гостей: один от вашего лучшего друга и один от вашего брата. Полное объединение похоже на combine этих списков так, чтобы включить всех из обоих списков, даже если они appear на только одном списке.

В терминах базы данных, Полное объединение combines строки из двух или более таблиц на основе связанной колонки между ними, включая все строки из всех таблиц, даже если нет соответствия в других таблицах.

Синтаксис

Вот базовый синтаксис для Полного объединения в SQL:

SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

Теперь я почти слышу, как вы говорите: "Но подождите! MySQL не имеет ключевого слова FULL JOIN!" И вы будете абсолютно правы! MySQL не поддерживает напрямую FULL JOIN, но не волнуйтесь – у нас есть хитрый обходной путь с использованием UNION. Давайте рассмотрим это подробнее.

Полное объединение в MySQL (используя UNION)

Поскольку MySQL не имеет встроенного Полного объединения, мы можем смоделировать его, используя комбинацию LEFT JOIN и RIGHT JOIN с UNION. Вот как это работает:

SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id;

Давайте разберем это:

  1. Мы выполняем LEFT JOIN, чтобы получить все строки из table1, вместе с соответствующими строками из table2.
  2. Затем мы объединяем это с UNION с RIGHT JOIN, который получает все строки из table2, вместе с соответствующими строками из table1.
  3. UNION combine эти результаты, эффективно давая нам Полное объединение.

Практический пример

Чтобы сделать это более конкретным, давайте используем реальный пример. Представьте, что мы управляем небольшой библиотекой, и у нас есть две таблицы: books и borrowers.

Сначала создадим эти таблицы:

CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);

CREATE TABLE borrowers (
borrower_id INT PRIMARY KEY,
book_id INT,
borrower_name VARCHAR(100)
);

INSERT INTO books VALUES (1, 'To Kill a Mockingbird', 'Harper Lee');
INSERT INTO books VALUES (2, '1984', 'George Orwell');
INSERT INTO books VALUES (3, 'Pride and Prejudice', 'Jane Austen');

INSERT INTO borrowers VALUES (1, 1, 'Alice');
INSERT INTO borrowers VALUES (2, NULL, 'Bob');
INSERT INTO borrowers VALUES (3, 4, 'Charlie');

Теперь выполним наше Полное объединение:

SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id;

Этот запрос даст следующий результат:

book_id title borrower_id borrower_name
1 To Kill a Mockingbird 1 Alice
2 1984 NULL NULL
3 Pride and Prejudice NULL NULL
NULL NULL 2 Bob
NULL NULL 3 Charlie

Давайте проанализируем этот результат:

  • Мы видим все книги, даже те, которые не взяты в借у (например, '1984' и 'Pride and Prejudice').
  • Мы видим всех заимодавцев, даже тех, кто в настоящее время не берет книги (например, Bob).
  • Мы даже видим Charlie, который берет книгу, не находящуюся в нашей таблице books (book_id 4).

Такова сила Полного объединения – оно дает нам полное представление о наших данных, подчеркивая как соответствия, так и несоответствия между нашими таблицами.

Полное объединение с WHERE ограничением

Иногда мы можем захотеть отфильтровать результаты нашего Полного объединения. Мы можем сделать это, добавив WHERE ограничение к нашему запросу. Например, давайте представим, что мы хотим найти все книги, которые в настоящее время не взяты в借у:

SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
WHERE br.borrower_id IS NULL
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id
WHERE b.book_id IS NULL;

Этот запрос вернет:

book_id title borrower_id borrower_name
2 1984 NULL NULL
3 Pride and Prejudice NULL NULL
NULL NULL 2 Bob
NULL NULL 3 Charlie

Этот результат показывает нам:

  • Книги, которые не взяты в借у ('1984' и 'Pride and Prejudice')
  • Заимодавцы, которые в настоящее время не берут книги (Bob)
  • Заимодавцы, которые берут книги, не находящиеся в нашей таблице books (Charlie)

Заключение

И вот мы и arrived, мои дорогие студенты! Мы совершили путешествие через мир Полного объединения в MySQL, от понимания концепции до внедрения ее с реальными примерами. Помните, что although MySQL не имеет встроенного Полного объединения, мы можем достичь того же результата, используя комбинацию LEFT JOIN, RIGHT JOIN и UNION.

Полные объединения incredibly полезны, когда вам нужно увидеть все данные из нескольких таблиц, независимо от того, есть ли между ними соответствующие значения. Они как inclusive друг на вечеринке, который убедиться, что все включены, независимо от того, знают ли они друг друга или нет!

Пока вы продолжаете свое приключение в MySQL, продолжайте практиковаться с различными сценариями. Чем больше вы играете с этими концепциями, тем комфортнее вы станете. И кто знает? Вы можете стать go-to database guru среди своих друзей!

Счастливо программируйте, и пусть ваши запросы всегда возвращают те результаты, которые вы ищете!

Credits: Image by storyset