Перевод статьи «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_id | name |
---|---|
1 | Джон |
2 | Саид |
3 | Алиса |
4 | Ной |
5 | Элеанор |
6 | Акико |
7 | Отто |
8 | Джамал |
9 | Кьяра |
10 | Клементина |
В другой таблице у вас содержится список книг. Для каждой книги указано ее название, автор, номер ISBN и ID ученика, который выбрал эту книгу для чтения (если, конечно, книгу кто-то уже выбрал).
isbn | student_id | title | author |
---|---|---|---|
1514649748 | 1 | Моби Дик | Герман Мелвилл |
0060935464 | 4 | Убить пересмешника | Харпер Ли |
9780060837563 | 9 | Сын Америки | Ричард Райт |
9780316769174 | NULL | Над пропастью во ржи | Джером Сэлинджер |
0143135694 | 7 | Цвет пурпурный | Элис Уокер |
1451673264 | 3 | 451 градус по Фаренгейту | Рэй Брэдбери |
9780743273565 | NULL | Великий Гэтсби | Фрэнсис Скотт Фицджеральд |
0807083690 | NULL | Родня | Октавия Батлер |
1950435091 | NULL | Маленькие женщины | Луиза Мэй Олкотт |
0140177396 | 2 | О мышах и людях | Джон Стейнбек |
Как делается 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, который присутствует в обеих таблицах.
Результат будет выглядеть следующим образом:
name | title |
---|---|
Джон | Моби Дик |
Ной | Убить пересмешника |
Кьяра | Сын Америки |
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]