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 |
| Симоненко | NULL | NULL | NULL |
Праве зовнішнє об'єднання [ред.]
Повне зовнішнє об'єднання [ред.]
|
||||||||
