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


Повне зовнішнє об'єднання[ред.ред. код]