A belső összekapcsoláshoz a két összekapcsolt tábla minden sorának meg kell egyeznie az oszlopértékekkel, és az alkalmazásokban gyakran használt összekapcsolási művelet, de nem szabad feltételezni, hogy ez a legjobb választás minden helyzetben. A belső összekapcsolás új eredménytáblát hoz létre két táblázat (A és B) oszlopértékeinek kombinálásával, a csatlakozási predikátum alapján. A lekérdezés összehasonlítja az A minden sorát a B minden sorával, hogy megtalálja az összes sorpárt, amely kielégíti a csatlakozási predikátumot. Ha a csatlakozási predikátum kielégíti a nem NULL értékek egyezését, az A és B sorok párosított párjainak oszlopértékeit eredménysorokká egyesítik.
Az összekapcsolás eredménye meghatározható az eredmény, ha először vesszük a táblázatok összes sorának derékszögű szorzatát (vagy keresztösszekötését) (egyesítjük az A táblázat minden sorát a B táblázat minden sorával), majd visszaadunk minden olyan sort, amely kielégíti a csatlakozási predikátumot. A tényleges SQL-megvalósítások általában más megközelítéseket használnak, például hash-egyesítéseket vagy sort-merge-összekapcsolásokat, mivel a derékszögű termék kiszámítása lassabb, és gyakran túlzottan sok memóriát igényelne.
Az SQL két különböző szintaktikai megoldást határoz meg a csatlakozások kifejezésének módjai: az “explicit csatlakozás jelölése” és az “implicit csatlakozás jelölése”. Az “implicit csatlakozás jelölése” már nem számít bevált gyakorlatnak, bár az adatbázis-rendszerek továbbra is támogatják.
Az “explicit csatlakozás jelölése” a JOIN
kulcsszót használja, opcionálisan megelőzi a INNER
kulcsszót, hogy meghatározza a csatlakozni kívánt táblázatot, és a ON
kulcsszót a csatlakozás predikátumainak megadásához, mint a a következő példa:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;
Employee.LastName | Employee.DepartmentID | Department.DepartmentName |
---|---|---|
Robinson | 34 | irodai |
Jones | 33 | műszaki |
Smith | 34 | irodai |
Heisenberg | 33 | Mérnöki munka |
Rafferty | 31 | Értékesítés |
Az “implicit csatlakozás jelölése” egyszerűen felsorolja a t táblázatokat ír be a csatlakozáshoz a SELECT
utasítás FROM
záradékában, vesszőkkel elválasztva őket. Így megad egy keresztösszekapcsolást, és a WHERE
klauzula további szűrő-predikátumokat alkalmazhat (amelyek a explicit jelölésben hasonlítanak a csatlakozási predikátumokhoz).
A következő példa megegyezik az előzővel, de ezúttal implicit csatlakozási jelölést használ:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
A példákban megadott lekérdezések A fenti táblázat az Employee és az Department táblákhoz csatlakozik mindkét tábla DepartmentID oszlopának felhasználásával. Ahol ezeknek a tábláknak a DepartmentID-je megegyezik (azaz a csatlakozási predikátum teljesül), a lekérdezés a két tábla LastName, DepartmentID és DepartmentName oszlopait egyesíti eredménysorrá. Ahol a DepartmentID nem egyezik, nem jön létre eredménysor.
Így a fenti lekérdezés végrehajtásának eredménye a következő lesz:
Employee.LastName | Employee.DepartmentID | Department.DepartmentName |
---|---|---|
Robinson | 34 | irodai |
Jones | 33 | Mérnöki munka |
Smith | 34 | irodai |
Heisenberg | 33 | Mérnöki munka |
Rafferty | 31 | Értékesítés |
A “Williams” alkalmazott és a “Marketing” részleg nem jelennek meg a lekérdezés végrehajtásának eredményeiben. Ezek egyikének sincs megfelelő sora a másik megfelelő táblázatban: A “Williams” -nek nincs társított részlege, és egyetlen alkalmazottja sem rendelkezik az osztály 35-ös azonosítójával (“Marketing”). A kívánt eredményektől függően ez a viselkedés finom hiba lehet, amelyet elkerülhetünk, ha a belső illesztést egy külső illesztéssel helyettesítjük.
Belső illesztés és NULL értékekEdit
A programozóknak meg kell tenniük különös körültekintés a NULL értékeket tartalmazó oszlopok tábláinak összekapcsolásakor, mivel a NULL soha nem fog megfelelni más értékeknek (még magának a NULL sem), kivéve, ha a csatlakozási feltétel kifejezetten olyan kombinációs predikátumot használ, amely először ellenőrzi, hogy az egyesített oszlopok NOT NULL
a maradék predikátumfeltétel (ek) alkalmazása előtt. A belső csatlakozás csak olyan adatbázisban használható biztonságosan, amely érvényesíti a hivatkozási integritást, vagy ahol az összekapcsolási oszlopok garantáltan nem NULL értékűek. Számos tranzakciófeldolgozó relációs adatbázis az Atomicity, Consistency, Isolation, Durability (ACID) adatfrissítési szabványokra támaszkodik az adatok integritásának biztosítása érdekében, így a belső csatlakozások megfelelő választást jelentenek. A tranzakciós adatbázisok azonban általában tartalmaznak kívánatos csatlakozási oszlopokat is, amelyek NULL értékűek.Számos jelentési relációs adatbázis és adattárház nagy mennyiségű kibontás, átalakítás, betöltés (ETL) kötegelt frissítést használ, amelyek megnehezítik vagy lehetetlenné teszik a hivatkozási integritást, ami potenciálisan NULL csatlakozási oszlopokat eredményez, amelyeket az SQL lekérdezés szerzője nem tud módosítani, és amelyek a belső összekapcsolásokat kihagyják adatok hibajelzés nélkül. A belső összekapcsolás használata az adatbázis kialakításától és az adatok jellemzőitől függ. A bal külső illesztés általában helyettesíthető egy belső illesztéssel, ha az egyik táblázat összekapcsolási oszlopai NULL értékeket tartalmazhatnak.
Bármely NULL (üres) adatoszlopot soha nem szabad hivatkozásként használni belső összekapcsolás, kivéve, ha a kívánt eredmény a NULL értékű sorok kiküszöbölése. Ha a NULL csatlakozási oszlopokat szándékosan el akarjuk távolítani az eredményhalmazból, a belső összekapcsolás gyorsabb lehet, mint a külső összekapcsolás, mert a táblázat összekapcsolása és a szűrés egyetlen lépésben történik. Ezzel szemben egy belső csatlakozás katasztrofálisan lassú teljesítményt vagy akár egy kiszolgáló összeomlását is eredményezheti, ha nagy kötetű lekérdezésben használják az SQL Where záradék adatbázis-függvényeivel együtt. Egy SQL-függvény ahol a záradék azt eredményezheti, hogy az adatbázis figyelmen kívül hagyja a viszonylag kompakt táblaindexeket. Az adatbázis beolvashatja és összekapcsolhatja a kijelölt oszlopokat mindkét táblából, mielőtt a kiszámított értéktől függő szűrővel csökkenti a sorok számát, ami viszonylag hatalmas mennyiségű nem hatékony feldolgozást eredményez.
Amikor eredmény beállítva több tábla, köztük a fő táblák összekapcsolásával jön létre, amelyek a numerikus azonosító kódok teljes szöveges leírásainak megkeresésére szolgálnak (egy Lookup tábla), az idegen kulcsok bármelyikében a NULL érték azt eredményezheti, hogy az egész sor kikerül az eredményhalmazból, hibajelzés nélkül. Egy összetett SQL lekérdezés, amely egy vagy több belső összekapcsolást és több külső összekapcsolást tartalmaz, ugyanolyan kockázattal jár a belső összekapcsolási link oszlopok NULL értékeivel szemben.
A belső összekapcsolásokat tartalmazó SQL kód iránti elkötelezettség feltételezi, hogy a NULL csatlakozási oszlopok nem a jövőbeni változtatások bevezetik, beleértve a szállítói frissítéseket, a dizájnváltozásokat és az alkalmazás adatellenőrzési szabályain kívüli tömeges feldolgozást, mint például adatkonverziók, áttelepítések, tömeges importálás és összevonások.
A belső összekapcsolásokat tovább lehet osztályozni equi-joins, természetes vagy cross-joins.
Equi-joinEdit
Az equi-join az összehasonlító alapú összekapcsolás egy bizonyos típusa, amely csak egyenlőség-összehasonlításokat használ. a join-predikátumban. Más összehasonlító operátorok (például <
) használata kizárja a csatlakozást equi-join-ként. A fent bemutatott lekérdezés már adott egy példát az equi-join-ra:
SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;
Az alábbiak szerint írhatunk equi-join,
SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Ha társ Az equi-join lámpáknak ugyanaz a neve, az SQL-92 opcionális rövidítési jelölést biztosít az equi-joins kifejezéséhez a USING
konstrukció révén:
SELECT *FROM employee INNER JOIN department USING (DepartmentID);
A USING
konstrukció több, mint puszta szintaktikus cukor, mivel az eredményhalmaz eltér az eredménytől az explicit predikátumú verzió halmaza. Pontosabban, a USING
listában említett oszlopok csak egyszer jelennek meg minősítés nélküli névvel, nem pedig a csatlakozás minden egyes táblájához. A fenti esetben egyetlen DepartmentID
oszlop lesz és nincs employee.DepartmentID
vagy department.DepartmentID
.
A USING
záradékot az MS SQL Server és a Sybase nem támogatja.
Természetes joinEdit
A természetes a join az equi-join speciális esete. A természetes összekapcsolás (⋈) egy bináris operátor, amelyet (R ⋈ S) néven írunk, ahol R és S reláció. A természetes összekapcsolódás eredménye az R és S sorok összes olyan kombinációinak halmaza, amelyek megegyeznek a közös attribútumnevükön.Példaként vegyük figyelembe az Employee és Dept táblákat és azok természetes összekapcsolását:
|
|
|
Ez a kapcsolatok összetételének meghatározására is használható. Például az Employee és Dept összetétele az összekapcsolódásuk, amint az a fentiekben látható, kivetítve a DeptName közös attribútum kivételével. A kategóriaelméletben az illesztés éppen a rosttermék.
A természetes összekapcsolódás vitathatatlanul az egyik legfontosabb operátor, mivel ez a logikai ÉS relációs párja. Vegye figyelembe, hogy ha ugyanaz a változó jelenik meg az AND által összekapcsolt két predikátum mindegyikében, akkor ez a változó ugyanazt jelenti, és mindkét megjelenést mindig ugyanazzal az értékkel kell helyettesíteni. Különösen a természetes összekapcsolás teszi lehetővé azoknak a kapcsolatoknak a kombinációját, amelyeket idegen kulcs társít. Például a fenti példában egy külföldi kulcs valószínűleg az Employee.DeptName-től a Dept.DeptName-ig tart, majd az Employee and Dept természetes összekapcsolása egyesíti az összes alkalmazottat a részlegeikkel. Ez azért működik, mert az idegen kulcs megegyezik az azonos nevű attribútumok között. Ha ez nem így van, mint például a Dept.manager és az Employee.Name közötti idegen kulcsban, akkor ezeket az oszlopokat át kell nevezni, mielőtt a természetes csatlakozás megtörténne. Az ilyen összekapcsolást néha equi-csatlakozásnak is nevezik.
Formálisabban a természetes összekapcsolás szemantikáját a következőképpen határozzuk meg:
R ⋈ S = {t ∪ s ∣ t ∈ R ∧ s ∈ S ∧ F un (t ∪ s)} {\ displaystyle R \ bowtie S = \ left \ {t \ cup s \ t t közepe R \ \ land \ s \ in S \ \ land \ {\ mathit {Fun}} (t \ cup s) \ right \}},
ahol a Fun egy predikátum, amely akkor és akkor igaz r relációra, ha r függvény. Általában megkövetelik, hogy az R-nek és az S-nek legalább egy közös attribútummal kell rendelkeznie, de ha ezt a korlátozást elhagyják, és R-nek és S-nek nincsenek közös tulajdonságai, akkor a természetes összekapcsolás pontosan a derékszögű szorzat lesz. A természetes összekapcsolás Codd primitívjeivel az alábbiak szerint szimulálható. Legyen c1,…, cm az R és S közös attribútumneve, r1,…, rn legyen az R-nek egyedi attribútumnév, és legyen s1,…, sk a Tegyük fel továbbá, hogy az x1,…, xm attribútumnevek sem R-ben, sem S-ben nem szerepelnek. Első lépésben az S általános attribútumnevei átnevezhetők:
T = ρ x 1 / c 1,…, xm / cm (S) = ρ x 1 / c 1 (ρ x 2 / c 2 (… ρ xm / cm (S)…)) {\ displaystyle T = \ rho _ {x_ {1} / c_ {1}, \ ldots, x_ {m} / c_ {m}} (S) = \ rho _ {x_ {1} / c_ {1}} (\ rho _ {x_ {2} / c_ {2 }} (\ ldots \ rho _ {x_ {m} / c_ {m}} (S) \ ldots))}
Ezután vesszük a derékszögű szorzatot, és válasszuk ki az összekapcsolandó sorokat:
U = π r 1,…, rn, c 1,…, cm, s 1,…, sk (P) {\ displaystyle U = \ pi _ {r_ {1}, \ ldots, r_ {n}, c_ {1}, \ ldots, c_ {m}, s_ {1}, \ ldots, s_ {k}} (P)}
A természetes csatlakozás az egyenlőség típusa csatlakozzon ott, ahol a csatlakozási predikátum implicit módon merül fel, összehasonlítva mindkét tábla összes oszlopát, amelynek ugyanazok az oszlopnevei vannak az összekapcsolt táblákban. A kapott összekapcsolt táblázat csak egy oszlopot tartalmaz minden azonos nevű oszloppár után. Abban az esetben, ha nem találhatók azonos nevű oszlopok, az eredmény keresztkötés.
A legtöbb szakértő egyetért abban, hogy a TERMÉSZETES CSATLAKOZÁSOK veszélyesek, ezért erőteljesen elriasztják azok használatát. A veszély abból adódik, hogy akaratlanul hozzáad egy új oszlopot, amelynek neve megegyezik a másik táblázat másik oszlopával. Egy létező természetes csatlakozás ekkor “természetesen” felhasználhatja az új oszlopot összehasonlításokhoz, összehasonlításokat / egyezéseket készítve más kritériumok alapján (különböző oszlopokból), mint korábban. Így egy létező lekérdezés más eredményeket produkálhat, annak ellenére, hogy a táblázatok adatait nem változtatták meg, hanem csak bővítették.Az oszlopnevek használata a táblák linkjeinek automatikus meghatározására nem választható olyan nagy adatbázisokban, amelyek több száz vagy ezer táblázattal rendelkeznek, ahol irreális korlátot szabna a névadási konvencióknak. A valós világ adatbázisait általában olyan külföldi kulcsadatokkal tervezik, amelyek nincsenek folyamatosan kitöltve (NULL értékek megengedettek), az üzleti szabályok és a kontextus miatt. Általános gyakorlat, hogy a hasonló adatok oszlopneveit különböző táblázatokban módosítják, és ez a merev konzisztencia hiánya a természetes csatlakozásokat egy elméleti koncepcióhoz kapcsolja.
A belső összekapcsolások fenti lekérdezése természetesként kifejezhető csatlakozzon a következő módon:
SELECT *FROM employee NATURAL JOIN department;
Mint az explicit USING
záradéknál, csak egy DepartmentID oszlop fordul elő az összekapcsolt táblázatban, minősítő nélkül:
DepartmentID | Employee.LastName | Department.DepartmentName |
---|---|---|
34 | Smith | irodai |
33 | Jones | Mérnöki munka |
34 | Robinson | irodai |
33 | Heisenberg | mérnöki |
31 | Rafferty | Értékesítés |
PostgreSQL, MySQL és Oracle su természetes csatlakozások; A Microsoft T-SQL és az IBM DB2 nem. Az összekapcsolásban használt oszlopok implicitek, így a csatlakozási kód nem mutatja, hogy mely oszlopok várhatók, és az oszlopnevek megváltoztatása megváltoztathatja az eredményeket. Az SQL: 2011 szabványban a természetes összekapcsolások az opcionális F401 “Kiterjesztett összekapcsolt tábla” csomag részét képezik.
Sok adatbázis-környezetben az oszlopneveket egy külső szállító irányítja, nem pedig a lekérdezés fejlesztője. A természetes összekapcsolás feltételezi az oszlopnevek stabilitását és konzisztenciáját, amely megváltozhat a gyártó által előírt verziófrissítések során.