MySQL OUTER JOIN


 У попередній темі розглядався 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 , які визначають тип з'єднання:

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 .


Наш партнер:
beta test mp3 playlist downloader