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