
Ліве та праве з’єднання (left (right) outer join)
В SQL запитах таблиця, вказана зліва від оператора JOIN, називається лівою, а вказана справа від нього – правою. При лівому або правому з’єднанні в багатьох СУБД слово OUTER опускається.
При лівому зовнішньому з’єднанні невідповідні записи, які є в лівій таблиці, зберігаються в результатній таблиці, а ті, які є в правій таблиці – відкидаються.
Припустимо, в базі даних є дві таблиці:
Proposition (ID_tov, cina, opys);
Sklad(ID_tov, kilk).
При цьому в таблиці Sklad можуть міститись не всі товари, які пропонуються для продажу.
Щоб отримати список усіх товарів, які продаються з вказанням їх кількості на складі, достатньо виконати наступний запит:
SELECT Pr.ID_tov, Pr.opys, Sklad.kilk
FROM Proposition Pr LEFT JOIN Sklad
ON Pr.ID_tov=Sklad.ID_tov;
В результатній таблиці у стовпці kilk будуть пусті (тобто NULL) значення тих товарів, яких нема на складі.
Еквівалентний запит, який не використовує ключових слів LEFT JOIN, виглядає досить громіздким:
SELECT Pr.ID_tov, Pr.opys, Sklad.kilk
FROM Proposition Pr, Sklad
WHERE Pr.ID_tov=Sklad.ID_tov
UNION
SELECT Pr.ID_tov, Pr.opys, NULL
FROM Proposition Pr
WHERE Pr.ID_tov NOT IN
(SELECT Pr.ID_tov FROM Proposition Pr, Sklad
WHERE Pr.ID_tov=Sklad.ID_tov
При правому зовнішньому з’єднанні невідповідні записи, які є у правій таблиці, зберігаються в результатній таблиці, а ті, які є в лівій таблиці – відкидаються. Ключовими словами в такому запиті є RIGHT JOIN.
Щоб вирішити попередню задачу, використовуючи праве з’єднання, достатньо просто поміняти місцями імена таблиць:
SELECT Pr.ID_tov, Pr.opys, Sklad.kilk
FROM Sklad RIGHT JOIN Proposition Pr
ON Pr.ID_tov=Sklad.ID_tov;
Повне з’єднання (full join)
Повне з’єднання виконує одночасно і ліве, і праве з’єднання. Ключовими словами в такому запиті є FULL JOIN.
Припустимо, база даних деякої компанії містить відомості про свої представництва, відділи та співробітників. Ця інформація розміщена в трьох таблицях:
Predstavn(ID_pr, adress),
Viddil(ID_vid,ID_pr,nazva),
Spivrob(ID_spivr, ID_vid,name).
Щоб переглянути усі представництва, відділи і усіх співробітників, незалежно від того, чи є в одних таблицях відповідні записи з других, використовується повне з’єднання:
SELECT *
FROM Predstavn Pr FULL JOIN Viddil
ON Pr.ID_pr=Viddil.ID_pr
FULL JOIN Spivrob Sp
ON Viddil.ID_vid= Sp.ID_vid;
Зауважимо, що в MS Access оператор FULL JOIN не підтримується.
Об’єднане з’єднання (union join)
Операцію об’єднаного з’єднання ще називають об’єднаним злиттям. Ключовими словами в запиті з таким з’єднанням є UNION JOIN.
При об’єднаному з’єднанні створюється віртуальна таблиця, яка містить усі стовпці двох вихідних таблиць. При цьому стовпці з лівої вихідної таблиці містять усі свої записи, а в тих же записах в стовпцях з правої таблиці містяться значення NULL. Аналогічно, стовпці з правої таблиці містять усі свої записи, а ці ж записи з лівої таблиці містять NULL. Загальна кількість записів, які містяться в результатній таблиці рівна сумі кількості записів, які є в обох вихідних таблицях.
В якості прикладу приведемо простий запит:
SELECT * FROM T1 UNION JOIN T2;
Покажемо дві таблиці і результат їх об’єднаного з’єднання:
T1
A |
B |
C |
a1 |
b1 |
c1 |
a2 |
b2 |
c2 |
a3 |
b3 |
c3 |
a4 |
b4 |
c4 |
T2
X |
Y |
x1 |
y1 |
x2 |
y2 |
x3 |
y3 |
Об’єднане з’єднанняT1 та T2
A |
B |
C |
X |
Y |
a1 |
b1 |
c1 |
|
|
a2 |
b2 |
c2 |
|
|
a3 |
b3 |
c3 |
|
|
a4 |
b4 |
c4 |
|
|
|
|
|
x1 |
y1 |
|
|
|
x2 |
y2 |
|
|
|
x3 |
y3 |
Як правило, результат об’єднаного з’єднання розглядається в якості проміжкового при виконанні більш складного запиту.