Join — операція з'єднання таблиць в SQL, яка сполучає дві таблиці в реляційній базі даних, утворюючи нову тимчасову таблицю, яку інколи називають «з'єднаною таблицею».
Згідно з ANSI-стандартом, в SQL існують такі типи з'єднання: внутрішнє — INNER
, зовнішнє — OUTER
та перехресне — CROSS
. Зовнішнє з'єднання поділяється на ліве — LEFT OUTER
, праве — RIGHT OUTER
та повне — FULL OUTER
. Особливим випадком є з'єднання таблиці з собою, що має назву самоз'єднання (англ. self-join).
З математичної точки зору операція з'єднання є фундаментальною операцією реляційної алгебри.
Таблиці для прикладів
Всі приклади про типи з'єднання в цій статті використовуватимуть такі дві таблиці:
КодВідділу | НазваВідділу |
---|---|
31 | Продажі |
33 | Розробка |
34 | Бухгалтерія |
35 | Маркетинг |
Прізвище | КодВідділу | Строк |
---|---|---|
Луценко | 31 | 4 |
Ющенко | 33 | — |
Тимошенко | 33 | 5 |
Янукович | 34 | 50 |
Литвин | 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
Цей розділ статті ще . (серпень 2021) |
Еквіз'єднання
Цей розділ статті ще . (серпень 2021) |
Природне з'єднання
Зовнішнє з'єднання
Ліве зовнішнє з'єднання
Результат лівого зовнішнього з'єднання для таблиць А і Б містить всі кортежі з лівої таблиці (А), навіть якщо умова об'єднання не містить збігів з кортежами правої таблиці (Б). Це означає те, що, якщо умова порівняння не знайде записів у таблиці Б, то з'єднання в результаті все ж поверне рядки, але значення з колонок таблиці Б будуть порожніми. Іншими словами, ліве зовнішнє з'єднання повертає всі значення з лівої таблиці і додає значення колонок з правої таблиці або NULL, якщо немає збігу за предикатом з'єднання.
Наприклад, це дозволяє знаходити відділи працівників, але все ж показувати працівника, навіть якщо не існує їхнього відділу. Результат відрізняється від внутрішнього з'єднання тим, що працівники в неіснуючих відділах відфільтровуються.
Приклад лівого зовнішнього з'єднання:
SELECT * FROM Працівник LEFT OUTER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу
Працівник.ПрізвищеПрацівника | Працівник.КодВідділу | Відділ.НазваВідділу | Відділ.КодВідділу |
---|---|---|---|
Луценко | 31 | Продажі | 31 |
Ющенко | 33 | Розробка | 33 |
Тимошенко | 33 | Розробка | 33 |
Янукович | 34 | Бухгалтерія | 34 |
Литвин | 34 | Бухгалтерія | 34 |
Симоненко | 36 | NULL | NULL |
Альтернативні синтаксиси
Цей розділ статті ще . (серпень 2021) |
Праве зовнішнє з'єднання
Результат правого зовнішнього з'єднання для таблиць А і Б містить всі кортежі з правої таблиці (Б), навіть якщо умова з'єднання не містить збігів з кортежами лівої таблиці (А). Це означає те, що, якщо умова порівняння не знайде записів в таблиці А, то з'єднання в результаті все ж поверне рядки, але значення з колонок таблиці А будуть нульовими. Іншими словами, праве зовнішнє з'єднання повертає всі значення з правої таблиці і додає значення колонок з лівої таблиці або NULL, якщо немає збігу за предикатом з'єднання.
Наприклад, це дозволяє знаходити відділи працівників, але все ж показувати відділи, навіть якщо в них не буде працівників. Результат відрізняється від внутрішнього з'єднання тим, що працівники в неіснуючих відділах відфільтровуються.
Приклад правого зовнішнього з'єднання:
SELECT * FROM Працівник RIGHT OUTER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу
Працівник.ПрізвищеПрацівника | Працівник.КодВідділу | Відділ.НазваВідділу | Відділ.КодВідділу |
---|---|---|---|
Луценко | 31 | Продажі | 31 |
Ющенко | 33 | Розробка | 33 |
Тимошенко | 33 | Розробка | 33 |
Янукович | 34 | Бухгалтерія | 34 |
Литвин | 34 | Бухгалтерія | 34 |
NULL | NULL | Маркетинг | 35 |
Повне зовнішнє з'єднання
Повне зовнішнє з'єднання сполучає результати лівого та правого зовнішніх з'єднань. Результатна таблиця містить усі записи з обох таблиць, позначаючи NULL-значеннями відсутність збігів з кожного боку.
Приклад повного зовнішнього з'єднання:
SELECT * FROM Працівник FULL OUTER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу
Деякі системи баз даних, як-от DB2 до версії 2 включно, не підтримують цієї функціональності явно, але можуть емулювати її за допомогою об'єднання лівого та правого зовнішніх з'єднань. Наприклад:
SELECT * FROM Працівник LEFT JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу UNION SELECT * 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
Самоз'єднання
Самоз'єднання — з'єднання таблиці з собою.
Приклад
Цей розділ статті ще . (серпень 2021) |
Альтернативи
Ефект зовнішнього з'єднання також можна отримати за допомогою UNION ALL
між INNER JOIN
та SELECT
рядків «головної» таблиці, які не задовольняють умову з'єднання. Наприклад,
SELECT Працівник.Прізвище, Працівник.КодВідділу, Відділ.НазваВідділу FROM Працівник LEFT OUTER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу;
можна переписати як
SELECT Працівник.Прізвище, Працівник.КодВідділу, Відділ.НазваВідділу FROM Працівник INNER JOIN Відділ ON Працівник.КодВідділу = Відділ.КодВідділу UNION ALL SELECT Працівник.Прізвище, Працівник.КодВідділу, cast(NULL as varchar(20)) FROM Працівник WHERE NOT EXISTS ( SELECT * FROM Відділ WHERE Працівник.КодВідділу = Відділ.КодВідділу)
Див. також
Примітки
- Shah, 2005, с. 165
Ця стаття не містить . (квітень 2020) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Join operaciya z yednannya tablic v SQL yaka spoluchaye dvi tablici v relyacijnij bazi danih utvoryuyuchi novu timchasovu tablicyu yaku inkoli nazivayut z yednanoyu tabliceyu Zgidno z ANSI standartom v SQL isnuyut taki tipi z yednannya vnutrishnye span class k INNER span zovnishnye span class k OUTER span ta perehresne span class k CROSS span Zovnishnye z yednannya podilyayetsya na live span class k LEFT span span class w span span class k OUTER span prave span class k RIGHT span span class w span span class k OUTER span ta povne span class k FULL span span class w span span class k OUTER span Osoblivim vipadkom ye z yednannya tablici z soboyu sho maye nazvu samoz yednannya angl self join Z matematichnoyi tochki zoru operaciya z yednannya ye fundamentalnoyu operaciyeyu relyacijnoyi algebri Tablici dlya prikladivVsi prikladi pro tipi z yednannya v cij statti vikoristovuvatimut taki dvi tablici Tablicya Viddil KodViddilu NazvaViddilu 31 Prodazhi 33 Rozrobka 34 Buhgalteriya 35 Marketing Tablicya Pracivnik Prizvishe KodViddilu Strok Lucenko 31 4 Yushenko 33 Timoshenko 33 5 Yanukovich 34 50 Litvin 34 Simonenko 36 Zauvazhennya Viddil marketingu kod yakogo 35 teper ne maye pracivnikiv Z inshogo boku pracivnik Simonenko maye kod viddilu yakij ne vkazuye na zhoden viddil u tablici Viddil Perehresne z yednannyaOperator dekartovogo z yednannya span class k CROSS span span class w span span class k JOIN span z yednuye dvi tablici Poryadok tablic dlya operatora nevazhlivij oskilki operator ye simetrichnim Zagolovok tablici rezultatu ye ob yednannyam konkatenaciyeyu zagolovkiv tablic sho z yednuyutsya Tilo rezultatu formuyetsya takim chinom kozhen ryadok odniyeyi tablici z yednuyetsya z kozhnim ryadkom inshoyi tablici dayuchi tim samim v rezultati vsi mozhlivi poyednannya ryadkiv dvoh tablic Vnutrishnye z yednannyaVnutrishnye z yednannya z yednuye zapisi dvoh tablic A ta B na osnovi zadanogo predikatu z yednannya Pri comu obchislyuyetsya dekartiv dobutok usih zapisiv tablic Takim chinom usi zapisi tablici A bude z yednano z kozhnim iz zapisiv tablici B pislya chogo v rezultatnij tablici zalishatsya lishe ti zapisi yaki zadovolnyayut predikat z yednannya Cej tip z yednannya traplyayetsya najchastishe dzherelo Priklad yavnogo vnutrishnogo z yednannya SELECT FROM Pracivnik INNER JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu Priklad neyavnogo vnutrishnogo z yednannya SELECT FROM Pracivnik Viddil WHERE Pracivnik KodViddilu Viddil KodViddilu Rezultat vnutrishnogo z yednannya Pracivnik Prizvishe Pracivnik KodViddilu Viddil NazvaViddilu Viddil KodViddilu Litvin 34 Buhgalteriya 34 Yushenko 33 Rozrobka 33 Yanukovich 34 Buhgalteriya 34 Timoshenko 33 Rozrobka 33 Lucenko 31 Prodazhi 31 Zauvazhennya Pracivnik Simonenko ta viddil Marketing vidsutni v rezultatnij tablici tomu sho pracivnik Simonenko maye KodViddilu 36 a viddilu z takim kodom u tablici Viddil nemaye U svoyu chergu viddil Marketing z KodViddilu 35 ne maye zhodnogo elementu z takim kodom u tablici Pracivnik Vnutrishnye z yednannya ta znachennya NULL Div takozh Null SQL Cej rozdil statti she ne napisano Vi mozhete dopomogti proyektu napisavshi jogo serpen 2021 Ekviz yednannya Cej rozdil statti she ne napisano Vi mozhete dopomogti proyektu napisavshi jogo serpen 2021 Prirodne z yednannyaZovnishnye z yednannyaLive zovnishnye z yednannya Rezultat livogo zovnishnogo z yednannya dlya tablic A i B mistit vsi kortezhi z livoyi tablici A navit yaksho umova ob yednannya ne mistit zbigiv z kortezhami pravoyi tablici B Ce oznachaye te sho yaksho umova porivnyannya ne znajde zapisiv u tablici B to z yednannya v rezultati vse zh poverne ryadki ale znachennya z kolonok tablici B budut porozhnimi Inshimi slovami live zovnishnye z yednannya povertaye vsi znachennya z livoyi tablici i dodaye znachennya kolonok z pravoyi tablici abo NULL yaksho nemaye zbigu za predikatom z yednannya Napriklad ce dozvolyaye znahoditi viddili pracivnikiv ale vse zh pokazuvati pracivnika navit yaksho ne isnuye yihnogo viddilu Rezultat vidriznyayetsya vid vnutrishnogo z yednannya tim sho pracivniki v neisnuyuchih viddilah vidfiltrovuyutsya Priklad livogo zovnishnogo z yednannya SELECT FROM Pracivnik LEFT OUTER JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu Pracivnik PrizvishePracivnika Pracivnik KodViddilu Viddil NazvaViddilu Viddil KodViddilu Lucenko 31 Prodazhi 31 Yushenko 33 Rozrobka 33 Timoshenko 33 Rozrobka 33 Yanukovich 34 Buhgalteriya 34 Litvin 34 Buhgalteriya 34 Simonenko 36 NULL NULL Alternativni sintaksisi Cej rozdil statti she ne napisano Vi mozhete dopomogti proyektu napisavshi jogo serpen 2021 Prave zovnishnye z yednannya Rezultat pravogo zovnishnogo z yednannya dlya tablic A i B mistit vsi kortezhi z pravoyi tablici B navit yaksho umova z yednannya ne mistit zbigiv z kortezhami livoyi tablici A Ce oznachaye te sho yaksho umova porivnyannya ne znajde zapisiv v tablici A to z yednannya v rezultati vse zh poverne ryadki ale znachennya z kolonok tablici A budut nulovimi Inshimi slovami prave zovnishnye z yednannya povertaye vsi znachennya z pravoyi tablici i dodaye znachennya kolonok z livoyi tablici abo NULL yaksho nemaye zbigu za predikatom z yednannya Napriklad ce dozvolyaye znahoditi viddili pracivnikiv ale vse zh pokazuvati viddili navit yaksho v nih ne bude pracivnikiv Rezultat vidriznyayetsya vid vnutrishnogo z yednannya tim sho pracivniki v neisnuyuchih viddilah vidfiltrovuyutsya Priklad pravogo zovnishnogo z yednannya SELECT FROM Pracivnik RIGHT OUTER JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu Pracivnik PrizvishePracivnika Pracivnik KodViddilu Viddil NazvaViddilu Viddil KodViddilu Lucenko 31 Prodazhi 31 Yushenko 33 Rozrobka 33 Timoshenko 33 Rozrobka 33 Yanukovich 34 Buhgalteriya 34 Litvin 34 Buhgalteriya 34 NULL NULL Marketing 35 Povne zovnishnye z yednannya Povne zovnishnye z yednannya spoluchaye rezultati livogo ta pravogo zovnishnih z yednan Rezultatna tablicya mistit usi zapisi z oboh tablic poznachayuchi NULL znachennyami vidsutnist zbigiv z kozhnogo boku Priklad povnogo zovnishnogo z yednannya SELECT FROM Pracivnik FULL OUTER JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu Deyaki sistemi baz danih yak ot DB2 do versiyi 2 vklyuchno ne pidtrimuyut ciyeyi funkcionalnosti yavno ale mozhut emulyuvati yiyi za dopomogoyu ob yednannya livogo ta pravogo zovnishnih z yednan Napriklad SELECT FROM Pracivnik LEFT JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu UNION SELECT FROM Pracivnik RIGHT JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu WHERE Pracivnik KodViddilu IS NULL abo SELECT FROM Pracivnik LEFT JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu UNION SELECT FROM Viddil LEFT JOIN Pracivnik ON Pracivnik KodViddilu Viddil KodViddilu WHERE Pracivnik KodViddilu IS NULL abo SELECT FROM Viddil RIGHT JOIN Pracivnik ON Pracivnik KodViddilu Viddil KodViddilu UNION SELECT FROM Pracivnik RIGHT JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu WHERE Pracivnik KodViddilu IS NULLSamoz yednannyaSamoz yednannya z yednannya tablici z soboyu Priklad Cej rozdil statti she ne napisano Vi mozhete dopomogti proyektu napisavshi jogo serpen 2021 AlternativiEfekt zovnishnogo z yednannya takozh mozhna otrimati za dopomogoyu span class k UNION span span class w span span class k ALL span mizh span class k INNER span span class w span span class k JOIN span ta span class k SELECT span ryadkiv golovnoyi tablici yaki ne zadovolnyayut umovu z yednannya Napriklad SELECT Pracivnik Prizvishe Pracivnik KodViddilu Viddil NazvaViddilu FROM Pracivnik LEFT OUTER JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu mozhna perepisati yak SELECT Pracivnik Prizvishe Pracivnik KodViddilu Viddil NazvaViddilu FROM Pracivnik INNER JOIN Viddil ON Pracivnik KodViddilu Viddil KodViddilu UNION ALL SELECT Pracivnik Prizvishe Pracivnik KodViddilu cast NULL as varchar 20 FROM Pracivnik WHERE NOT EXISTS SELECT FROM Viddil WHERE Pracivnik KodViddilu Viddil KodViddilu Div takozhOperaciyi nad mnozhinamiPrimitkiShah 2005 s 165 Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno kviten 2020