SQL FULL OUTER JOINКлючевые слова
FULL OUTER JOIN — это тип соединения в SQL, который сохраняет все записи из обеих таблиц, даже если в одной из них нет совпадения.
Результат FULL OUTER JOIN включает записи, которые соответствуют условию в обеих таблицах (пересекающаяся часть), а также записи, которые не соответствуют условию (непересекающаяся часть объединения). Если запись существует в одной таблице, но не имеет совпадения в другой таблице, отсутствующие столбцы этой записи будут заполнены NULL.
Ключевое слово FULL OUTER JOIN возвращает строки, если есть совпадение либо в левой таблице (table1), либо в правой таблице (table2).
Ключевое слово FULL OUTER JOIN объединяет результаты LEFT JOIN и RIGHT JOIN.
Синтаксис SQL FULL OUTER JOIN
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;
- table1、table2: Две таблицы, которые нужно соединить.
- ON table1.column_name=table2.column_name: Указывает условие соединения, обычно общее поле двух таблиц.
- column_name(s) : Выберите нужные поля из двух таблиц.

Особенности
- Возвращает объединение двух таблиц: Содержит все совпавшие и несовпавшие записи.
- Несовпавшие записи заполняются
NULL: Если запись не имеет совпадения в одной таблице, соответствующие ей поля представляются какNULL. - Эквивалентность:
FULL OUTER JOINСодержитLEFT JOINиRIGHT JOINрезультатов.
Предположим, есть две таблицы:StudentsиCourses。
Таблица Students:
| StudentID | Name |
|---|---|
| 1 | Алиса |
| 2 | Боб |
| 3 | Чарли |
Таблица Courses:
| CourseID | StudentID | CourseName |
|---|---|---|
| 101 | 1 | Math |
| 102 | 2 | Наука |
| 103 | 4 | История |
Запрос с использованием FULL OUTER JOIN
SELECT Students.StudentID, Students.Name, Courses.CourseName FROM Students FULL OUTER JOIN Courses ON Students.StudentID = Courses.StudentID;
Результат вывода запроса:
| StudentID | Name | CourseName |
|---|---|---|
| 1 | Алиса | Math |
| 2 | Боб | Наука |
| 3 | Чарли | NULL |
| 4 | NULL | История |
Объяснение:
StudentID = 1и2Это часть пересечения, с данными в обеих таблицах.StudentID = 3Существует вStudentsтаблице, но вCoursesтаблице нет совпадения,CourseNameстолбец —NULL。StudentID = 4Существует вCoursesтаблице, но вStudentsтаблице нет совпадения,Nameстолбец —NULL。
Итог
| Тип JOIN | Возвращаемое содержимое |
|---|---|
INNER JOIN | Пересечение двух таблиц, совпадающие записи |
LEFT JOIN | Все записи из левой таблицы и совпадающие записи из правой таблицы |
RIGHT JOIN | Все записи из правой таблицы и совпадающие записи из левой таблицы |
FULL OUTER JOIN | Объединение двух таблиц, содержащее совпадающие и несовпадающие записи |
Демонстрационная база данных
В этом руководстве мы будем использовать образец базы данных EXAMPLE.
Ниже приведены данные, выбранные из таблицы "Websites":
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | Example | http://www.example.com/ | 4689 | CN | | 4 | 微博 | http://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND | +----+---------------+---------------------------+-------+---------+
Ниже приведены данные из таблицы записей доступа к сайту "access_log":
+-----+---------+-------+------------+ | aid | site_id | count | date | +-----+---------+-------+------------+ | 1 | 1 | 45 | 2016-05-10 | | 2 | 3 | 100 | 2016-05-13 | | 3 | 1 | 230 | 2016-05-14 | | 4 | 2 | 10 | 2016-05-14 | | 5 | 5 | 205 | 2016-05-14 | | 6 | 4 | 13 | 2016-05-15 | | 7 | 3 | 220 | 2016-05-15 | | 8 | 5 | 545 | 2016-05-16 | | 9 | 3 | 201 | 2016-05-17 | +-----+---------+-------+------------+ 9 rows in set (0.00 sec)
Пример SQL FULL OUTER JOIN
Следующая инструкция SQL выбирает все записи о доступе к сайту.
MySQL не поддерживает FULL OUTER JOIN; вы можете проверить следующий пример в SQL Server.
Пример
FROM Websites
FULL OUTER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
Примечание:Ключевое слово FULL OUTER JOIN возвращает все строки из левой таблицы (Websites) и правой таблицы (access_log). Если строка в таблице "Websites" не имеет совпадения в "access_log", или строка в таблице "access_log" не имеет совпадения в таблице "Websites", эти строки также будут перечислены.
Другие расширения