Join (SQL)

Join — операція з'єднання таблиць в SQL, яка сполучає дві таблиці в реляційній базі даних, утворюючи нову тимчасову таблицю, яку інколи називають «з'єднаною таблицею».

Згідно з ANSI-стандартом, в SQL існують такі типи з'єднання: внутрішнє — INNER, зовнішнє — OUTER та перехресне — CROSS. Зовнішнє з'єднання поділяється на ліве — LEFT OUTER, праве — RIGHT OUTER та повне — FULL OUTER. Особливим випадком є з'єднання таблиці з собою, що має назву самоз'єднання (англ. self-join).

З математичної точки зору операція з'єднання є фундаментальною операцією реляційної алгебри.

Таблиці для прикладів

Всі приклади про типи з'єднання в цій статті використовуватимуть такі дві таблиці:

Таблиця Відділ
КодВідділуНазваВідділу
31Продажі
33Розробка
34Бухгалтерія
35Маркетинг
Таблиця Працівник
ПрізвищеКодВідділуСтрок
Луценко314
Ющенко33
Тимошенко335
Янукович3450
Литвин34
Симоненко36

Зауваження: Відділ маркетингу, код якого 35, тепер не має працівників. З іншого боку, працівник «Симоненко» має код відділу, який не вказує на жоден відділ у таблиці Відділ.

Перехресне з'єднання

Оператор декартового з'єднання CROSS JOIN з'єднує дві таблиці. Порядок таблиць для оператора неважливий, оскільки оператор є симетричним.

Заголовок таблиці-результату є об'єднанням (конкатенацією) заголовків таблиць, що з'єднуються.

Тіло результату формується таким чином: кожен рядок однієї таблиці з'єднується з кожним рядком іншої таблиці, даючи тим самим в результаті всі можливі поєднання рядків двох таблиць.

Внутрішнє з'єднання

Внутрішнє з'єднання з'єднує записи двох таблиць (A та B) на основі заданого предикату з'єднання. При цьому обчислюється декартів добуток усіх записів таблиць. Таким чином, усі записи таблиці A буде з'єднано з кожним із записів таблиці B, після чого в результатній таблиці залишаться лише ті записи, які задовольняють предикат з'єднання.

Цей тип з'єднання трапляється найчастіше[джерело?].


Приклад явного внутрішнього з'єднання:

SELECT *  FROM Працівник       INNER JOIN Відділ       ON Працівник.КодВідділу = Відділ.КодВідділу

Приклад неявного внутрішнього з'єднання:

SELECT *  FROM Працівник, Відділ WHERE Працівник.КодВідділу = Відділ.КодВідділу

Результат внутрішнього з'єднання:

Працівник.ПрізвищеПрацівник.КодВідділуВідділ.НазваВідділуВідділ.КодВідділу
Литвин34Бухгалтерія34
Ющенко33Розробка33
Янукович34Бухгалтерія34
Тимошенко33Розробка33
Луценко31Продажі31

Зауваження: Працівник «Симоненко» та відділ «Маркетинг» відсутні в результатній таблиці, тому що працівник «Симоненко» має КодВідділу = 36, а відділу з таким кодом у таблиці Відділ немає. У свою чергу, відділ «Маркетинг» з КодВідділу = 35 не має жодного елементу з таким кодом у таблиці Працівник.

Внутрішнє з'єднання та значення NULL

Див. також: Null (SQL)

Еквіз'єднання

Природне з'єднання

Зовнішнє з'єднання

Ліве зовнішнє з'єднання

Результат лівого зовнішнього з'єднання для таблиць А і Б містить всі кортежі з лівої таблиці (А), навіть якщо умова об'єднання не містить збігів з кортежами правої таблиці (Б). Це означає те, що, якщо умова порівняння не знайде записів у таблиці Б, то з'єднання в результаті все ж поверне рядки, але значення з колонок таблиці Б будуть порожніми. Іншими словами, ліве зовнішнє з'єднання повертає всі значення з лівої таблиці і додає значення колонок з правої таблиці або NULL, якщо немає збігу за предикатом з'єднання.

Наприклад, це дозволяє знаходити відділи працівників, але все ж показувати працівника, навіть якщо не існує їхнього відділу. Результат відрізняється від внутрішнього з'єднання тим, що працівники в неіснуючих відділах відфільтровуються.

Приклад лівого зовнішнього з'єднання:

SELECT *FROM Працівник     LEFT OUTER JOIN Відділ     ON Працівник.КодВідділу = Відділ.КодВідділу
Працівник.ПрізвищеПрацівникаПрацівник.КодВідділуВідділ.НазваВідділуВідділ.КодВідділу
Луценко31Продажі31
Ющенко33Розробка33
Тимошенко33Розробка33
Янукович34Бухгалтерія34
Литвин34Бухгалтерія34
Симоненко36NULLNULL

Альтернативні синтаксиси

Праве зовнішнє з'єднання

Результат правого зовнішнього з'єднання для таблиць А і Б містить всі кортежі з правої таблиці (Б), навіть якщо умова з'єднання не містить збігів з кортежами лівої таблиці (А). Це означає те, що, якщо умова порівняння не знайде записів в таблиці А, то з'єднання в результаті все ж поверне рядки, але значення з колонок таблиці А будуть нульовими. Іншими словами, праве зовнішнє з'єднання повертає всі значення з правої таблиці і додає значення колонок з лівої таблиці або NULL, якщо немає збігу за предикатом з'єднання.

Наприклад, це дозволяє знаходити відділи працівників, але все ж показувати відділи, навіть якщо в них не буде працівників. Результат відрізняється від внутрішнього з'єднання тим, що працівники в неіснуючих відділах відфільтровуються.

Приклад правого зовнішнього з'єднання:

SELECT *FROM Працівник     RIGHT OUTER JOIN Відділ     ON Працівник.КодВідділу = Відділ.КодВідділу
Працівник.ПрізвищеПрацівникаПрацівник.КодВідділуВідділ.НазваВідділуВідділ.КодВідділу
Луценко31Продажі31
Ющенко33Розробка33
Тимошенко33Розробка33
Янукович34Бухгалтерія34
Литвин34Бухгалтерія34
NULLNULLМаркетинг35

Повне зовнішнє з'єднання

Повне зовнішнє з'єднання сполучає результати лівого та правого зовнішніх з'єднань. Результатна таблиця містить усі записи з обох таблиць, позначаючи NULL-значеннями відсутність збігів з кожного боку.

Приклад повного зовнішнього з'єднання:

SELECT *  FROM Працівник       FULL OUTER JOIN Відділ       ON Працівник.КодВідділу = Відділ.КодВідділу


Деякі системи баз даних, як-от DB2 до версії 2 включно, не підтримують цієї функціональності явно, але можуть емулювати її за допомогою об'єднання лівого та правого зовнішніх з'єднань. Наприклад:

SELECT *  FROM Працівник       LEFT JOIN Відділ       ON Працівник.КодВідділу = Відділ.КодВідділу UNIONSELECT *  FROM Працівник       RIGHT JOIN Відділ       ON Працівник.КодВідділу = Відділ.КодВідділу WHERE Працівник.КодВідділу IS NULL

або:

SELECT *   FROM Працівник        LEFT JOIN Відділ        ON Працівник.КодВідділу = Відділ.КодВідділу  UNION SELECT *   FROM Відділ        LEFT JOIN Працівник        ON Працівник.КодВідділу = Відділ.КодВідділу  WHERE Працівник.КодВідділу IS NULL

або:

SELECT *   FROM Відділ        RIGHT JOIN Працівник        ON Працівник.КодВідділу = Відділ.КодВідділу  UNION SELECT *   FROM Працівник        RIGHT JOIN Відділ        ON Працівник.КодВідділу = Відділ.КодВідділу  WHERE Працівник.КодВідділу IS NULL

Самоз'єднання

Самоз'єднання — з'єднання таблиці з собою[1].

Приклад

Альтернативи

Ефект зовнішнього з'єднання також можна отримати за допомогою UNION ALL між INNER JOIN та SELECT рядків «головної» таблиці, які не задовольняють умову з'єднання. Наприклад,

SELECT Працівник.Прізвище, Працівник.КодВідділу, Відділ.НазваВідділуFROM ПрацівникLEFT OUTER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу;

можна переписати як

SELECT Працівник.Прізвище, Працівник.КодВідділу, Відділ.НазваВідділуFROM ПрацівникINNER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділуUNION ALLSELECT Працівник.Прізвище, Працівник.КодВідділу, cast(NULL as varchar(20))FROM ПрацівникWHERE NOT EXISTS (    SELECT * FROM Відділ             WHERE Працівник.КодВідділу = Відділ.КодВідділу)

Див. також

Примітки

🔥 Top keywords: Головна сторінкаЧемпіонат Європи з футболу 2024Спеціальна:ПошукВікіпедія:Культурна спадщина та видатні постаті (2024)Збірна України з футболуБріджертониЧемпіонат Європи з футболу 2020YouTubeУкраїнаЧемпіонат Європи з футболуЗбірна Румунії з футболуРебров Сергій СтаніславовичГлобальний саміт мируРадіо «Свобода»ДефолтРумуніяЛунін Андрій ОлексійовичНаціональна суспільна телерадіокомпанія УкраїниДень батькаДовбик Артем ОлександровичШевченко Андрій МиколайовичЯрмоленко Андрій МиколайовичЧемпіонат Європи з футболу 2024 (кваліфікаційний раунд)Мудрик Михайло Петрович138-ма зенітна ракетна бригада (Україна)FacebookЄрмак Андрій БорисовичСексВійськові звання України22-га окрема механізована бригада (Україна)Зінченко Олександр ВолодимировичТериторіальний центр комплектування та соціальної підтримкиДумками навиворіт 2Чемпіонат Європи з футболу 2016Список операторів систем розподілу України2024 у телебаченніMegogoСписок українських жіночих іменКиїв