Csatlakozás (SQL)

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:

Alkalmazott
Név EmpId Osztálynév
Harry 3415 Pénzügy
Sally 2241 Értékesítés
George 3401 Pénzügy
Harriet 2202 Értékesítés
Osztály
Osztálynév Menedzser
Pénzügy George
Értékesítés Harriet
Termelés Charles
Alkalmazott ⋈ {\ displaystyle \ bowtie} Osztály
Név EmpId OsztályNév Kezelő
Harry 3415 Pénzügy George
Sally 2241 Értékesítés Harriet
George 3401 Pénzügy George
Harriet 2202 Értékesítés Harriet

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.

Write a Comment

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük