MySQL | Outer Join

Последнее обновление: 22.05.2018

В предыдущей теме рассматривля Inner Join или внутреннее соединение таблиц. Но также в MySQL мы можем использовать и так называемое внешнее соединение или Outer Join. В отличие от Inner Join внешнее соединение возвращает все строки одной или двух таблиц, которые участвуют в соединении.

Outer Join имеет следующий формальный синтаксис:


SELECT столбцы
FROM таблица1
	{LEFT|RIGHT} [OUTER] JOIN таблица2 ON условие1
	[{LEFT|RIGHT} [OUTER] JOIN таблица3 ON условие2]...

Перед оператором JOIN указывается одно из ключевых слов LEFT или RIGHT, которые определяют тип соединения:

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

Например, соединим таблицы Orders и Customers:


SELECT FirstName, CreatedAt, ProductCount, Price, ProductId 
FROM Orders LEFT JOIN Customers 
ON Orders.
CustomerId = Customers.Id

Таблица Orders является первой или левой таблицей, а таблица Customers — правой таблицей. Поэтому, так как здесь используется выборка по левой таблице, то вначале будут выбираться все строки из Orders, а затем к ним по условию Orders.CustomerId = Customers.Id будут добавляться связанные строки из Customers.

По вышеприведенному результату может показаться, что левостороннее соединение аналогично INNER Join, но это не так. Inner Join объединяет строки из дух таблиц при соответствии условию. Если одна из таблиц содержит строки, которые не соответствуют этому условию, то данные строки не включаются в выходную выборку. Left Join выбирает все строки первой таблицы и затем присоединяет к ним строки правой таблицы. К примеру, возьмем таблицу Customers и добавим к покупателям информацию об их заказах:


#INNER JOIN
SELECT FirstName, CreatedAt, ProductCount, Price 
FROM Customers JOIN Orders 
ON Orders. CustomerId = Customers.Id;

#LEFT JOIN
SELECT FirstName, CreatedAt, ProductCount, Price 
FROM Customers LEFT JOIN Orders 
ON Orders.CustomerId = Customers.Id;

В случае с LEFT JOIN MySQL выбирает сначала всех покупателей из таблицы Customers, затем сопоставляет их с заказами из таблицы Orders через условие

Orders.CustomerId = Customers.Id. Однако не у всех покупателей есть заказы. В этом случае покупателю для соответствующих столбцов устанавливаются значения NULL.

Изменим в примере выше тип соединения для OUTER JOIN с левостороннего на правостороннее:


SELECT FirstName, CreatedAt, ProductCount, Price 
FROM Customers RIGHT JOIN Orders 
ON Orders.CustomerId = Customers.Id;

Теперь будут выбираться все строки из Orders (из правой таблицы), а к ним уже будет присоединяться связанные по условию строки из таблицы Customers:

Используем левостороннее соединение для добавления к заказам информации о пользователях и товарах:


SELECT Customers. FirstName, Orders.CreatedAt, 
       Products.ProductName, Products.Manufacturer
FROM Orders 
LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
LEFT JOIN Products ON Orders.ProductId = Products.Id;

И также можно применять более комплексные условия с фильтрацией и сортировкой. Например, выберем все заказы с информацией о клиентах и товарах по тем товарам, у которых цена больше 45000, и отсортируем по дате заказа:


SELECT Customers.FirstName, Orders.CreatedAt, 
       Products.ProductName, Products.Manufacturer
FROM Orders 
LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
LEFT JOIN Products ON Orders.ProductId = Products.Id
WHERE Products.Price > 45000
ORDER BY Orders.CreatedAt;

Или выберем всех пользователей из Customers, у которых нет заказов в таблице Orders:


SELECT FirstName FROM Customers
LEFT JOIN Orders ON Customers.Id = Orders.CustomerId
WHERE Orders. CustomerId IS NULL;

Также можно комбинировать Inner Join и Outer Join:


SELECT Customers.FirstName, Orders.CreatedAt, 
       Products.ProductName, Products.Manufacturer
FROM Orders 
JOIN Products ON Orders.ProductId = Products.Id AND Products.Price > 45000
LEFT JOIN Customers ON Orders.CustomerId = Customers.Id
ORDER BY Orders.CreatedAt;

Вначале по условию к таблице Orders через Inner Join присоединяется связанная информация из Products, затем через Outer Join добавляется информация из таблицы Customers.

НазадСодержаниеВперед

База Данных MySQL FULL OUTER JOIN

HTML5CSS.ru

ЛУЧШИЙ САЙТ ДЛЯ РАЗРАБОТЧИКОВ

❮ Назад Дальше ❯


Ключевое слово полного внешнего соединения SQL

Полное внешнее ключевое слово Join возвращает все записи при совпадении в записях таблицы Left (Table1) или right (Table2).

Примечание: Полное внешнее соединение потенциально может возвращать очень большие результирующие наборы!

FULL OUTER JOIN Синтаксис

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2 ON table1. column_name = table2.column_name;


Демонстрационная база данных

В этом учебнике мы будем использовать хорошо известную базу данных Northwind Sample.

Ниже представлен выбор из таблицы «Customers»:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

И выбор из таблицы «Orders»:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
10308271996-09-183
103093731996-09-191
103107781996-09-202



Пример полного внешнего соединения SQL

Следующая инструкция SQL выбирает всех клиентов и все заказы:

SELECT Customers. CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID

ORDER BY Customers.CustomerName;

Выбор из результирующего набора может выглядеть так:

CustomerNameOrderID
Alfreds Futterkiste 
Ana Trujillo Emparedados y helados10308
Antonio Moreno Taquería10365
 10382
 10351

Примечание: Полное внешнее ключевое слово Join возвращает все строки из левой таблицы (Customers) и все строки из правой таблицы (Orders). Если есть строки в «Customers», которые не имеют совпадений в «заказы», или если есть строки в «заказы», которые не имеют совпадений в «Customers», эти строки будут перечислены также.

❮ Назад Дальше ❯

PHP\CSS\JS\HMTL Editor


Copyright 2018-2020 HTML5CSS.ru

Правила и Условия Политика конфиденциальности О нас Контакты

sql — Как я могу выполнить ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ в MySQL?

Ответ, который дал Пабло Санта-Крус, правильный; однако, если кто-то наткнулся на эту страницу и хочет получить дополнительные разъяснения, вот подробная разбивка.

Примеры таблиц

Предположим, у нас есть следующие таблицы:

 -- t1
идентификатор имя
1 Тим
2 марта
-- т2
идентификатор имя
1 Тим
3 Катарина
 

Внутренние соединения

Внутреннее соединение, например:

 SELECT *
ОТ `t1`
ВНУТРЕННЕЕ СОЕДИНЕНИЕ `t2` ON `t1`.`id` = `t2`.`id`;
 

Мы получим только те записи, которые присутствуют в обеих таблицах, например:

 1 Tim 1 Tim
 

Внутренние соединения не имеют направления (например, влево или вправо), поскольку они явно являются двунаправленными — нам требуется совпадение с обеих сторон.

Внешние соединения

Внешние соединения, с другой стороны, предназначены для поиска записей, которые могут не иметь соответствия в другой таблице. Таким образом, вы должны указать , на какой стороне соединения разрешено иметь отсутствующую запись.

ЛЕВОЕ СОЕДИНЕНИЕ и ПРАВОЕ СОЕДИНЕНИЕ являются сокращением для ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ и ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ ; Я буду использовать их полные имена ниже, чтобы укрепить концепцию внешних и внутренних соединений.

Левое внешнее соединение

Левое внешнее соединение, например:

 SELECT *
ОТ `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
 

…получит все записи из левой таблицы независимо от того, есть ли у них совпадения в правой таблице, например:

 1 Тим 1 Тим
2 Марта NULL NULL
 

Правое внешнее соединение

Правое внешнее соединение, например:

 SELECT *
ОТ `t1`
ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ `t2` ON `t1`.`id` = `t2`.`id`;
 

…получит все записи из правой таблицы независимо от того, есть ли у них совпадения в левой таблице, например:

 1 Tim 1 Tim
NULL NULL 3 Катарина
 

Полное внешнее соединение

Полное внешнее соединение даст нам все записи из обеих таблиц, независимо от того, совпадают они или нет в другой таблице, с NULL на обеих сторонах, где совпадения нет. Результат будет выглядеть так:

 1 Тим 1 Тим
2 Марта NULL NULL
NULL NULL 3 Катарина
 

Однако, как указал Пабло Санта-Крус, MySQL не поддерживает это. Мы можем эмулировать это, выполнив UNION левого соединения и правого соединения, например:

 SELECT *
ОТ `t1`
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ `t2` ON `t1`.`id` = `t2`.`id`
СОЮЗ
ВЫБИРАТЬ *
ОТ `t1`
ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ `t2` ON `t1`.`id` = `t2`.`id`;
 

Вы можете думать о UNION

как о значении «запустить оба этих запроса, затем сложить результаты друг над другом»; некоторые строки будут получены из первого запроса, а некоторые из второго.

Следует отметить, что UNION в MySQL устранит точные дубликаты: Тим появится в обоих запросах здесь, но в результате UNION он указан только один раз. Мой коллега-гуру базы данных считает, что на такое поведение нельзя полагаться. Поэтому, чтобы быть более точным, мы могли бы добавить предложение WHERE ко второму запросу:

 SELECT *
ОТ `t1`
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ `t2` ON `t1`.`id` = `t2`.`id`
СОЮЗ
ВЫБИРАТЬ *
ОТ `t1`
ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ `t2` ON `t1`.`id` = `t2`. `id`
ГДЕ `t1`.`id` имеет значение NULL;
 

С другой стороны, если вы хотите, чтобы по какой-то причине видел дубликаты, вы можете использовать UNION ALL .

Ключевое слово SQL FULL OUTER JOIN

❮ Предыдущий Далее ❯


Ключевое слово SQL FULL OUTER JOIN

Ключевое слово FULL OUTER JOIN возвращает все записи при наличии совпадения в левые (таблица1) или правые (таблица2) записи таблицы.

Наконечник: ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ и FULL JOIN одинаковы.

Синтаксис FULL OUTER JOIN

SELECT имя_столбца(ов)
FROM table1
FULL OUTER JOIN table2
ON table1.colum n_name = table2.column_name
ГДЕ условие ;

Примечание: FULL OUTER JOIN потенциально может возвращать очень большие наборы результатов!


Демонстрационная база данных

В этом руководстве мы будем использовать известную учебную базу данных Northwind.

Ниже представлена ​​выборка из таблицы «Клиенты»:

CustomerID ИмяКлиента Контактное имя Адрес Город Почтовый индекс Страна
1 Альфред Футтеркисте Мария Андерс ул. Обере 57 Берлин 12209 Германия
2 Ана Трухильо Emparedados y helados Ана Трухильо Авда. Конститусьон 2222 Мексика Д.Ф. 05021 Мексика
3 Антонио Морено Такерия Антонио Морено Матадерос 2312 Мексика Д.Ф. 05023 Мексика

И выбор из таблицы «Заказы»:

ID заказа ID клиента ID сотрудника Дата заказа Код отправителя
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2


Научитесь фильтровать данные в SQL как аналитик данных

Попробуйте практические занятия с пошаговыми инструкциями от эксперта. Попробуйте управляемый проект, созданный в сотрудничестве с Coursera, прямо сейчас!

Начало работы


Пример SQL FULL OUTER JOIN

Следующая инструкция SQL выбирает всех клиентов и все заказы:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Заказы ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

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

CustomerName ID заказа
Нулевой 10309
Нулевой 10310
Альфред Футтеркисте Нулевой
Ана Трухильо Emparedados y helados 10308
Антонио Морено Такерия Нулевой

Примечание: Ключевое слово FULL OUTER JOIN возвращает все совпадения записи из обеих таблиц независимо от того, совпадает ли другая таблица или нет. Так что если есть строки в «Клиентах», которым нет совпадений в «Заказах», или если есть являются строками в «Заказах», которые не имеют совпадений в «Клиентах», эти строки будут также перечислено.

❮ Предыдущий Далее ❯

ВЫБОР ЦВЕТА



Лучшие учебники
Учебник по HTML
Учебник по CSS
Учебник по JavaScript
Учебник How To
Учебник по SQL
Учебник по Python
Учебник по W3.CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery
9000 3

Лучшие ссылки
Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery

Основные примеры
Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3.