Join (SQL)
Join - операція з'єднання таблиць в SQL, яка об'єднує дві таблиці в реляційній базі даних, утворюючи нову тимчасову таблицю, яку інколи називають "об'єднаною таблицею".
В SQL існують такі типи об'єднання: внутрішнє - INNER
, зовнішнє - OUTER
. Зовнішнє об'єднання поділяють на ліве зовнішнє - LEFT OUTER
та праве зовнішнє - RIGHT OUTER
. В деяких випадках таблиці можна об'єднувати з собою, таке об'єднання зветься самооб'єднанням.
З математичної точки зору операція об'єднання є фундаментальною операцією реляційної алгебри.
Таблиці для прикладів
Всі пояснення про типи об'єднання в цій статті будуть використовувати наступні дві таблиці:
КодВідділу | НазваВідділу |
---|---|
31 | Продажі |
33 | Розробка |
34 | Бухгалтерія |
35 | Маркетинг |
Прізвище | КодВідділу | Строк |
---|---|---|
Луценко | 31 | 4 |
Ющенко | 33 | - |
Тимошенко | 33 | 5 |
Янукович | 34 | 50 |
Литвин | 34 | - |
Симоненко | 36 | - |
Зауваження: Відділ маркетингу (код - 35) тепер не має працівників. З іншого боку працівник "Симоненко" має код відділу, який не вказує на жоден відділ в таблиці Відділ.
Внутрішнє об'єднання
Внутрішнє об'єднання об'єднує записи двох таблиць (А та В) на основі заданого предикату об'єднання. При цьому обчислюється декартів добуток всіх записів таблиць. Таким чином всі записи таблиці А буде об'єднано з кожним з записів таблиці В, при цьому в результуючій таблиці залишаться лише ті записи, які задовольняють предикат об'єднання.
Цей тип об'єднання трапляється найчастіше.
Приклад явного внутрішнього об'єднання:
SELECT *
FROM Працівник
INNER JOIN Відділ
ON Працівник.КодВідділу = Відділ.КодВідділу
Приклад неявного внутрішнього об'єднання:
SELECT *
FROM Працівник, Відділ
WHERE Працівник.КодВідділу = Відділ.КодВідділу
Результат явного внутрішнього об'єднання:
Працівник.Прізвище | Працівник.КодВідділу | Відділ.НазваВідділу | Відділ.КодВідділу |
---|---|---|---|
Литвин | 34 | Бухгалтерія | 34 |
Ющенко | 33 | Розробка | 33 |
Янукович | 34 | Бухгалтерія | 34 |
Тимошенко | 33 | Розробка | 33 |
Луценко | 31 | Продажі | 31 |
Зауваження: Працівник "Симоненко" та відділ "Маркетинг" відсутні в результуючій таблиці, бо Працівник "Симоненко" має КодВідділу = 36, а відділу з таким кодом в таблиці Відділ немає; а відділ "Маркетинг" з КодВідділу = 35 не має жодного елементу з таким кодом в таблиці Працівник.
Зовнішнє об'єднання
Ліве зовнішнє об'єднання
Результат лівого зовнішнього об'єднання для таблиць А і Б містить всі кортежі з лівої таблиці (А), навіть якщо умова об'єднання не містить збігів з кортежами правої таблиці (Б). Це означає що якщо умова порівняння не знайде записів в таблиці Б, об'єднання (приєднання) в результаті все ж поверне рядки, але значення з колонок таблиці Б будуть нульовими. Іншими словами ліве зовнішнє об'єднання (приєднання) повертає всі значення з лівої таблиці і додає значення колонок з правої таблиці або NULL, якщо немає збігу за предикатом об'єднання (приєднання).
На приклад, це дозволяє нам знайти відділи працівників, але все ж показувати працівника, навіть якщо не існує їхнього відділку. Результат відрізняється від внутрішнього об'єднання (приєднання) тим, що працівники в неіснуючих відділах відфільтровуються.
Приклад лівого зовнішнього об'єднання:
SELECT *
FROM працівник LEFT OUTER JOIN відділ
ON працівник.номер_відділу = відділ.номер_відділу
працівник.прізвище_працівника | працівник.номер_відділу | відділ.імя_відділу | відділ.номер_відділу |
---|---|---|---|
Луценко | 31 | Продажі | 31 |
Ющенко | 33 | Розробка | 33 |
Тимошенко | 33 | Розробка | 33 |
Янукович | 34 | Бухгалтерія | 34 |
Литвин | 34 | Бухгалтерія | 34 |
Симоненко | 36 | NULL | NULL |
Праве зовнішнє об'єднання
Результат правого зовнішнього об'єднання для таблиць А і Б містить всі кортежі з правої таблиці (Б, навіть якщо умова об'єднання не містить збігів з кортежами лівої таблиці (А). Це означає що якщо умова порівняння не знайде записів в таблиці А, об'єднання (приєднання) в результаті все ж поверне рядки, але значення з колонок таблиці А будуть нульовими. Іншими словами праве зовнішнє об'єднання (приєднання) повертає всі значення з правої таблиці і додає значення колонок з лівої таблиці або NULL, якщо немає збігу за предикатом об'єднання (приєднання).
На приклад, це дозволяє нам знайти відділи працівників, але все ж показувати відділи, навіть якщо в них не буде працівників. Результат відрізняється від внутрішнього об'єднання (приєднання) тим, що працівники в неіснуючих відділах відфільтровуються.
Приклад правого зовнішнього об'єднання:
SELECT *
FROM працівник RIGHT OUTER JOIN відділ
ON працівник.номер_відділу = відділ.номер_відділу
працівник.прізвище_працівника | працівник.номер_відділу | відділ.імя_відділу | відділ.номер_відділу |
---|---|---|---|
Луценко | 31 | Продажі | 31 |
Ющенко | 33 | Розробка | 33 |
Тимошенко | 33 | Розробка | 33 |
Янукович | 34 | Бухгалтерія | 34 |
Литвин | 34 | Бухгалтерія | 34 |
NULL | NULL | Маркетинг | 35 |
Повне зовнішнє об'єднання
CROSS JOIN
Оператор декартового з'єднання CROSS JOIN з'єднує дві таблиці. Порядок таблиць для оператора неважливий, оскільки оператор є симетричним.
Заголовок таблиці-результату є об'єднанням (конкатенацією) заголовків таблиць, що з'єднуються.
Тіло результату логічно формується таким чином: кожен рядок однієї таблиці з'єднується з кожним рядком другої таблиці, даючи тим самим в результаті всі можливі поєднання рядків двох таблиць.