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
read more