Gå med (SQL)

En inre koppling kräver att varje rad i de två sammanfogade tabellerna har matchande kolumnvärden och är en vanlig kopplingsoperation i applikationer men bör inte antas vara det bästa valet i alla situationer. Inre koppling skapar en ny resultattabell genom att kombinera kolumnvärden för två tabeller (A och B) baserat på kopplingspredikatet. Frågan jämför varje rad A med varje rad B för att hitta alla par av rader som uppfyller kopplingspredikatet. När föreningspredikatet uppfylls genom att matcha icke-NULL-värden kombineras kolumnvärden för varje matchat par rader av A och B till en resultatrad.

Resultatet av föreningen kan definieras som resultatet av att först ta den kartesiska produkten (eller tvärföreningen) av alla rader i tabellerna (kombinera varje rad i tabell A med varje rad i tabell B) och sedan returnera alla rader som uppfyller anslutningspredikatet. Faktiska SQL-implementeringar använder normalt andra tillvägagångssätt, såsom hash-sammanfogningar eller sorteringsfogar, eftersom beräkning av den kartesiska produkten är långsammare och ofta kräver en alltför stor mängd minne att lagra.

SQL anger två olika syntaktiska sätt att uttrycka sammanfogningar: ”explicit anslutningsnotation” och ”implicit anslutningsnotation”. Den ”implicita anslutningsnotationen” anses inte längre vara en bästa praxis, även om databassystem fortfarande stöder den.

”Explicit join notation” använder nyckelordet JOIN, valfritt föregås av nyckelordet INNER, för att ange tabellen som ska gå med, och ON nyckelordet för att specificera predikaten för kopplingen, som i följande exempel:

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;

Employee.LastName Employee.DepartmentID Department.DepartmentName
Robinson 34 Kontor
Jones 33 Engineering
Smith 34 Kontorschef
Heisenberg 33 Engineering
Rafferty 31 Försäljning

Den ”implicita anslutningsnotationen” listar helt enkelt t han tabeller för att gå med i FROM -satsen i SELECT -uttrycket med kommatecken för att separera dem. Således specificerar den en tvärförening och WHERE -satsen kan tillämpa ytterligare filterpredikat (som fungerar jämförbart med kopplingspredikaten i den uttryckliga notationen).

Följande exempel motsvarar det föregående, men den här gången med implicit anslutningsnotation:

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;

Frågorna i exemplen ovan kommer att gå med i tabellerna Anställda och avdelningar med hjälp av kolumnen DepartmentID i båda tabellerna. Där DepartmentID för dessa tabeller matchar (d.v.s. föreningspredikatet är uppfyllt), kombinerar frågan kolumnerna LastName, DepartmentID och DepartmentName från de två tabellerna till en resultatrad. Om DepartmentID inte matchar genereras ingen resultatrad.

Således blir resultatet av frågan ovan:

Employee.LastName Employee.DepartmentID Department.DepartmentName
Robinson 34 Kontorschef
Jones 33 Ingenjör
Smith 34 Kontorsarbete
Heisenberg 33 Engineering
Rafferty 31 Försäljning

Den anställde ”Williams” och avdelningen ”Marketing” visas inte i resultaten för frågekörningen. Ingen av dessa har några matchande rader i den andra respektive tabellen: ”Williams” har ingen tillhörande avdelning och ingen anställd har avdelnings-ID 35 (”marknadsföring”). Beroende på önskade resultat kan detta beteende vara ett subtilt fel, vilket kan undvikas genom att ersätta den inre kopplingen med en yttre koppling.

Inre koppling och NULL-värden Redigera

Programmerare bör ta särskild försiktighet när du går med i tabeller på kolumner som kan innehålla NULL-värden, eftersom NULL aldrig kommer att matcha något annat värde (inte ens NULL i sig), om inte kopplingsvillkoret uttryckligen använder ett kombinationspredikat som först kontrollerar att kolumnerna är NOT NULL innan du använder de återstående predikatvillkoren. Den inre anslutningen kan endast användas säkert i en databas som tillämpar referensintegritet eller där kopplingskolumnerna garanteras att inte vara NULL. Många relationsbaserade transaktionsbaserade databaser är beroende av Atomicity, Consistency, Isolation, Durability (ACID) datauppdateringsstandarder för att säkerställa dataintegritet, vilket gör inre sammanfogningar till ett lämpligt val. Transaktionsdatabaser har dock vanligtvis också önskvärda kopplingskolumner som får vara NULL.Många rapporterande relationsdatabaser och datalager använder batchvolymer för extrahering, omvandling, laddning (ETL) med hög volym som gör referensintegritet svår eller omöjlig att genomdriva, vilket resulterar i potentiellt NULL-kopplingskolumner som en SQL-författarförfattare inte kan ändra och som orsakar att inre kopplingar utelämnas data utan indikation på ett fel. Valet att använda en inre koppling beror på databasens design och dataegenskaper. En vänster yttre koppling kan vanligtvis ersättas med en inre koppling när kopplingskolumnerna i en tabell kan innehålla NULL-värden.

Alla datakolumner som kan vara NULL (tomma) ska aldrig användas som en länk i en inre koppling, såvida inte det avsedda resultatet är att eliminera raderna med NULL-värdet. Om NULL-kopplingskolumner avsiktligt ska tas bort från resultatuppsättningen kan en inre koppling vara snabbare än en yttre koppling eftersom tabellen sammanfogas och filtreras i ett enda steg. Omvänt kan en inre koppling resultera i katastrofalt långsam prestanda eller till och med en serverkrasch när den används i en stor volymfråga i kombination med databasfunktioner i en SQL Where-sats. En funktion i en SQL-sats kan leda till att databasen ignorerar relativt kompakta tabellindex. Databasen kan läsa och förena de valda kolumnerna från båda tabellerna innan antalet rader minskas med hjälp av filtret som beror på ett beräknat värde, vilket resulterar i en relativt enorm mängd ineffektiv bearbetning.

När ett resultat ställer in produceras genom att sammanfoga flera tabeller, inklusive mastertabeller som används för att slå upp fullständiga textbeskrivningar av numeriska identifieringskoder (en uppslagstabell), ett NULL-värde i någon av de främmande nycklarna kan resultera i att hela raden elimineras från resultatuppsättningen, utan felindikering. En komplex SQL-fråga som innehåller en eller flera inre kopplingar och flera yttre kopplingar har samma risk för NULL-värden i kolumnerna för inre kopplingslänk.

Ett åtagande om SQL-kod som innehåller inre kopplingar förutsätter att kolumnerna för anslutning med NULL inte kommer att introduceras av framtida ändringar, inklusive leverantörsuppdateringar, designändringar och massbearbetning utanför applikationens datavalideringsregler som datakonvertering, migrering, bulkimport och sammanslagningar.

Man kan ytterligare klassificera inre sammanfogningar som equi-fogar, som naturliga fogar, eller som tvärfogar.

Equi-joinEdit

En equi-fog är en specifik typ av komparatorbaserad fog, som endast använder jämställdhetsjämförelser med hjälp av andra jämförelsesoperatorer (som <) diskvalificeras en koppling som en equi-koppling. Frågan som visas ovan har redan gett ett exempel på en equi-koppling:

SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;

Vi kan skriva equi-join som nedan,

SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;

Om co kolumner i en equi-koppling har samma namn, SQL-92 ger en valfri stenografisk notation för att uttrycka equi-sammanfogningar, med hjälp av USING -konstruktionen:

SELECT *FROM employee INNER JOIN department USING (DepartmentID);

USING -konstruktionen är mer än bara syntaktiskt socker, eftersom resultatuppsättningen skiljer sig från resultatet uppsättning av versionen med det uttryckliga predikatet. Specifikt kommer alla kolumner som nämns i USING -listan endast att visas en gång med ett okvalificerat namn snarare än en gång för varje tabell i kopplingen. I fallet ovan kommer det att finnas en enda DepartmentID kolumn och ingen employee.DepartmentID eller department.DepartmentID .

USING -satsen stöds inte av MS SQL Server och Sybase.

Natural joinEdit

The natural join är ett speciellt fall av equi-join. Natural join (⋈) är en binär operator som skrivs som (R ⋈ S) där R och S är relationer. Resultatet av den naturliga sammanfogningen är uppsättningen av alla kombinationer av tuplar i R och S som är lika på deras vanliga attributnamn.För ett exempel överväga tabellerna Anställd och avdelning och deras naturliga sammanfogning:

Anställd
Namn EmpId DeptName
Harry 3415 Finance
Sally 2241 Försäljning
George 3401 Finans
Harriet 2202 Försäljning
Avdelning
DeptName Manager
Finance George
Försäljning Harriet
Produktion Charles
Anställd ⋈ {\ displaystyle \ bowtie} Inst
Namn EmpId DeptName Manager
Harry 3415 Ekonomi George
Sally 2241 Försäljning Harriet
George 3401 Ekonomi George
Harriet 2202 Försäljning Harriet

Detta kan också användas för att definiera sammansättningen av relationer. Till exempel är sammansättningen av anställd och avdelning deras sammanfogning som visas ovan, projicerad på alla utom det gemensamma attributet DeptName. I kategoriteori är kopplingen exakt fiberprodukten.

Den naturliga kopplingen är utan tvekan en av de viktigaste operatörerna eftersom den är den relationella motsvarigheten till logisk AND. Observera att om samma variabel visas i vart och ett av två predikat som är anslutna av AND, så står variabeln för samma sak och båda utseendena måste alltid ersättas med samma värde. I synnerhet tillåter den naturliga sammanfogningen kombinationen av relationer som är associerade med en främmande nyckel. Till exempel, i ovanstående exempel finns det troligen en främmande nyckel från Employee.DeptName till Dept.DeptName och sedan kombinerar den naturliga anslutningen av Employee och Dept alla anställda med sina avdelningar. Detta fungerar eftersom den främmande nyckeln finns mellan attribut med samma namn. Om detta inte är fallet som i den främmande nyckeln från avdelningschef till anställd.namn måste dessa kolumner bytas om innan den naturliga kopplingen tas. En sådan sammanfogning kallas ibland också som en ekviförening.

Mer formellt definieras semantiken för den naturliga föreningen enligt följande:

R ⋈ S = {t ∪ s ∣ t ∈ R ∧ s ∈ S ∧ F un (t ∪ s)} {\ displaystyle R \ bowtie S = \ left \ {t \ cup s \ mid t \ in R \ \ land \ s \ in S \ \ land \ {\ mathit {Fun}} (t \ cup s) \ right \}},

där Fun är ett predikat som är sant för en relation r om och endast om r är en funktion. Det krävs vanligtvis att R och S måste ha minst ett gemensamt attribut, men om denna begränsning utelämnas och R och S inte har några gemensamma attribut, blir den naturliga kopplingen exakt den kartesiska produkten.

naturlig koppling kan simuleras med Codds primitiver enligt följande. Låt c1,…, cm vara attributnamnen som är gemensamma för R och S, r1,…, rn vara attributnamnen unika för R och låt s1,…, sk vara attribut unika för S. Vidare antar att attributnamnen x1,…, xm varken finns i R eller i S. I ett första steg kan de vanliga attributnamnen i S nu bytas om:

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))}

Sedan tar vi den kartesiska produkten och väljer de tupar som ska förenas:

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)}

En naturlig koppling är en typ av gå med där kopplingspredikatet uppstår implicit genom att jämföra alla kolumner i båda tabellerna som har samma kolumnnamn i de sammanfogade tabellerna. Den resulterande sammanfogade tabellen innehåller endast en kolumn för varje par lika namngivna kolumner. Om inga kolumner med samma namn hittas är resultatet en tvärförening.

De flesta experter är överens om att NATURLIGA FÖRENINGAR är farliga och avskräcker därför starkt deras användning. Faran beror på att man oavsiktligt lägger till en ny kolumn som heter samma som en annan kolumn i den andra tabellen. En befintlig naturlig koppling kan då ”naturligt” använda den nya kolumnen för jämförelser, vilket gör jämförelser / matchningar med hjälp av andra kriterier (från olika kolumner) än tidigare. Således skulle en befintlig fråga kunna ge olika resultat, även om data i tabellerna inte har ändrats, utan bara utökats.Användningen av kolumnnamn för att automatiskt bestämma tabellänkar är inte ett alternativ i stora databaser med hundratals eller tusentals tabeller där det skulle ge en orealistisk begränsning för namngivningskonventioner. Verkliga databaser utformas vanligen med främmande nyckeldata som inte är konsekvent befolkade (NULL-värden är tillåtna) på grund av affärsregler och sammanhang. Det är vanligt att ändra kolumnnamn på liknande data i olika tabeller och denna brist på styv konsistens hänvisar naturliga sammanfogningar till ett teoretiskt koncept för diskussion.

Ovanstående exempel på inre sammanfogningar kan uttryckas som en naturlig gå med på följande sätt:

SELECT *FROM employee NATURAL JOIN department;

Som med den uttryckliga USING -satsen, endast en DepartmentID-kolumn förekommer i den sammanfogade tabellen utan kvalificering:

DepartmentID Employee.LastName Department.DepartmentName
34 Smith Kontor
33 Jones Engineering
34 Robinson Kontorsarbete
33 Heisenberg Engineering
31 Rafferty Försäljning

PostgreSQL, MySQL och Oracle su pport naturliga sammanfogningar; Microsoft T-SQL och IBM DB2 inte. Kolumnerna som används i kopplingen är implicita så kopplingskoden visar inte vilka kolumner som förväntas, och en ändring av kolumnnamn kan ändra resultaten. I SQL: 2011-standarden är naturliga sammanfogningar en del av det valfria F401-paketet ”Utökad sammanfogad tabell”.

I många databasmiljöer kontrolleras kolumnnamnen av en extern leverantör, inte frågeutvecklaren. En naturlig koppling förutsätter stabilitet och konsistens i kolumnnamn som kan ändras under uppgraderingar av leverantörsuppdrag.

Write a Comment

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *