FULL OUTER JOIN в SQL: объяснение на примере

Перевод статьи «SQL Outer Join Tutorial – With Example Syntax».

В SQL операторы JOIN используются для объединения строк двух или более таблиц. Объединение происходит по столбцу, который есть в каждой из таблиц.

JOIN-ы делятся на внутренние и внешние — INNER JOIN и OUTER JOIN. (Примечание редакции Techrocks: внутренние мы уже разбирали в другой статье — «INNER JOIN простыми словами»).

Внешнее объединение — OUTER JOIN — бывает трех видов: LEFT JOIN, RIGHT JOIN и FULL OUTER JOIN (левое, правое и полное). В этой статье мы разберем на примере FULL OUTER JOIN (полное внешнее объединение).

Что из себя представляет FULL OUTER JOIN?

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

Допустим, у нас есть таблица с клиентами и таблица с заказами. В каждой таблице есть столбец с идентификаторами клиентов. FULL OUTER JOIN этих таблиц вернет всех клиентов, даже тех, кто не делал заказов, а также все заказы. Строки с именами клиентов, сделавших заказы, будут скомбинированы со строками их заказов. Объединение произойдет на основе идентификатора клиента.

FULL OUTER JOIN может вернуть очень большое количество данных. Поэтому, прежде чем использовать его, подумайте, нет ли другого способа выполнить задачу.

Пример использования FULL OUTER JOIN

Представьте, что вы преподаете американскую литературу. У вас есть десять учеников. Каждый из них должен прочесть одну из рекомендованных книг (все ученики будут читать разные книги). Некоторые ребята уже выбрали себе книгу, а другие пока нет.

Вы создали таблицу со списком учеников, где для каждого ученика проставлен номер (т. е. ID).

student_idname
1Джон
2Саид
3Алиса
4Ной
5Элеанор
6Акико
7Отто
8Джамал
9Кьяра
10Клементина
Таблица students

В другой таблице у вас содержится список книг. Для каждой книги указано ее название, автор, номер ISBN и ID ученика, который выбрал эту книгу для чтения (если, конечно, книгу кто-то уже выбрал).

isbnstudent_idtitleauthor
15146497481Моби ДикГерман Мелвилл
00609354644Убить пересмешникаХарпер Ли
97800608375639Сын АмерикиРичард Райт
9780316769174NULLНад пропастью во ржиДжером Сэлинджер
01431356947Цвет пурпурныйЭлис Уокер
14516732643451 градус по ФаренгейтуРэй Брэдбери
9780743273565NULLВеликий ГэтсбиФрэнсис Скотт Фицджеральд
0807083690NULLРодняОктавия Батлер
1950435091NULLМаленькие женщиныЛуиза Мэй Олкотт
01401773962О мышах и людяхДжон Стейнбек
Таблица books

Как делается OUTER JOIN в SQL

Чтобы сделать внешнее объединение записей наших таблиц, нужно выполнить следующий запрос:

SELECT students.name, books.title
FROM students
FULL OUTER JOIN books ON students.student_id=books.student_id;

В этом примере мы выбираем имена учеников из таблицы students и названия книг из таблицы books. Записи объединяются по столбцу student_id, который присутствует в обеих таблицах.

Результат будет выглядеть следующим образом:

nametitle
ДжонМоби Дик
НойУбить пересмешника
КьяраСын Америки
NULLНад пропастью во ржи
ОттоЦвет пурпурный
Алиса451 градус по Фаренгейту
NULLВеликий Гэтсби
NULLРодня
NULLМаленькие женщины
СаидО мышах и людях
КлементинаNULL
ДжамалNULL
АкикоNULL
ЭлеанорNULL

Благодаря FULL OUTER JOIN мы можем увидеть список всех учеников, в том числе тех, кто еще не выбрал книгу. Также мы видим все книги, включая те, которые еще никто не выбрал.

Просматривая результат выполнения запроса, вы можете понять, кто из учеников еще не выбрал себе книгу, и какие книги остались для выбора.

Заключение

Использование FULL OUTER JOIN позволяет получить полное представление о данных в нескольких связанных таблицах. Но имейте в виду, что если у вас большой объем данных, этот запрос может вернуть просто огромное количество информации, так что пользуйтесь им с умом!

От редакции Techrocks: если хотите почитать об операторе JOIN более подробно, у нас есть хорошая статья — «SQL JOIN: руководство по объединению таблиц».

[customscript]techrocks_custom_after_post_html[/customscript]

[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх