En indre sammenføyning krever at hver rad i de to sammenføyde tabellene har samsvarende kolonneverdier, og er en vanlig brukt sammenføyningsoperasjon i applikasjoner, men bør ikke antas å være det beste valget i alle situasjoner. Indre sammenføyning oppretter en ny resultattabell ved å kombinere kolonneverdier for to tabeller (A og B) basert på sammenføyningspredikatet. Spørringen sammenligner hver rad med A med hver rad med B for å finne alle parene med rader som tilfredsstiller sammenføyningspredikatet. Når sammenføyningspredikatet er tilfredsstilt ved å matche ikke-NULL-verdier, blir kolonneverdiene for hvert samsvarende par med rader A og B kombinert til en resultatrad.
Resultatet av sammenføyningen kan defineres som resultatet av å først ta det kartesiske produktet (eller kryssføyning) av alle radene i tabellene (kombinere hver rad i tabell A med hver rad i tabell B) og deretter returnere alle radene som tilfredsstiller sammenføyningspredikatet. Faktiske SQL-implementeringer bruker vanligvis andre tilnærminger, for eksempel hash-sammenføyninger eller sorteringsfusjoner, siden databehandling av det kartesiske produktet er tregere og ofte vil kreve en altfor stor mengde minne å lagre.
SQL spesifiserer to forskjellige syntaktiske måter å uttrykke sammen: «eksplisitt sammenføyningsnotasjon» og «implisitt sammenføyningsnotasjon». Den «implisitte sammenføyningsnotasjonen» blir ikke lenger ansett som en best praksis, selv om databasesystemer fremdeles støtter den.
«Eksplisitt foreningsnotasjon» bruker nøkkelordet JOIN
, valgfritt foran INNER
nøkkelordet, for å spesifisere tabellen som skal sammenføyes, og ON
nøkkelordet for å spesifisere predikatene for sammenføyningen, som i følgende eksempel:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
Kontorselskap |
Jones |
33 |
Engineering |
Smith |
34 |
Kontorist |
Heisenberg |
33 |
Engineering |
Rafferty |
31 |
Salg |
Den «implisitte sammenføyningsnotasjonen» viser bare t han tabeller for sammenføyning i FROM
-setningen i SELECT
-uttalelsen ved å bruke komma for å skille dem. Dermed spesifiserer den en kryssforbindelse, og WHERE
-klausulen kan bruke tilleggsfilterpredikater (som fungerer sammenlignbart med sammenføyningspredikatene i den eksplisitte notasjonen).
Følgende eksempel tilsvarer det forrige, men denne gangen ved bruk av implisitt tilknytningsnotasjon:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Spørringene gitt i eksemplene over vil bli medarbeider- og avdelingstabellene ved å bruke avdelingsID-kolonnen i begge tabellene. Der hvor avdelings-ID for disse tabellene samsvarer (dvs. sammenføyningspredikatet er oppfylt), vil spørringen kombinere kolonnen Lastnavn, DepartmentID og DepartmentName fra de to tabellene til en resultatrad. Der DepartmentID ikke samsvarer, genereres ingen resultatrad.
Dermed blir resultatet av kjøringen av spørringen ovenfor:
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
Kontormann |
Jones |
33 |
Ingeniørvitenskap |
Smith |
34 |
Kontorist |
Heisenberg |
33 |
Engineering |
Rafferty |
31 |
Salg |
Medarbeideren «Williams» og avdelingen «Marketing» vises ikke i resultatene for spørringsutførelsen. Ingen av disse har noen samsvarende rader i den andre respektive tabellen: «Williams» har ingen tilknyttet avdeling, og ingen ansatte har avdelings-ID 35 («markedsføring»). Avhengig av de ønskede resultatene, kan denne oppførselen være en subtil feil, som kan unngås ved å erstatte den indre skjøten med en ytre skjøte.
Indre sammenføyning og NULL-verdierEdit
Programmerere bør ta spesiell forsiktighet ved sammenføyning av tabeller på kolonner som kan inneholde NULL-verdier, siden NULL aldri vil matche noen annen verdi (ikke engang NULL selv), med mindre sammenføyningsbetingelsen eksplisitt bruker et kombinasjonspredikat som først sjekker at sammenføyningskolonnene er NOT NULL
før du bruker gjenværende predikat (er). Inner Join kan bare trygt brukes i en database som håndhever referanseintegritet, eller hvor sammenføyningskolonnene garantert ikke er NULL. Mange transaksjonsbehandlingsrelasjonsdatabaser er avhengige av standarder for oppdatering av Atomicity, Consistency, Isolation, Durability (ACID) for å sikre dataintegritet, noe som gjør indre sammenføyninger til et passende valg. Imidlertid har transaksjonsdatabaser vanligvis også ønskelige tilknytningskolonner som har lov til å være NULL.Mange rapporterende relasjonsdatabaser og datalager bruker batch-oppdateringer med høyt volum pakke ut, transformere, laste (ETL) som gjør referanseintegritet vanskelig eller umulig å håndheve, noe som resulterer i potensielt NULL sammenføyningskolonner som en SQL-spørringsforfatter ikke kan endre, og som fører til at indre sammenføyninger utelates data uten indikasjon på feil. Valget av å bruke en indre sammenføyning avhenger av databasedesign og datakarakteristikker. En venstre sammenføyning kan vanligvis erstattes av en indre sammenføyning når sammenføyningskolonnene i en tabell kan inneholde NULL-verdier.
En hvilken som helst datakolonne som kan være NULL (tom) skal aldri brukes som en lenke i en indre sammenføyning, med mindre det tiltenkte resultatet er å eliminere radene med NULL-verdien. Hvis NULL-sammenføyningskolonner bevisst skal fjernes fra resultatsettet, kan en indre sammenføyning være raskere enn en ytre sammenføyning fordi sammenføyningen og filtreringen av tabellen gjøres i ett trinn. Omvendt kan en indre sammenføyning resultere i katastrofalt langsom ytelse eller til og med en serverkrasj når den brukes i et stort volumspørsmål i kombinasjon med databasefunksjoner i en SQL Where-ledd. En funksjon i en SQL-paragraf kan føre til at databasen ignorerer relativt kompakte tabellindekser. Databasen kan lese og koble sammen de valgte kolonnene fra begge tabellene før den reduserer antall rader ved hjelp av filteret som er avhengig av en beregnet verdi, noe som resulterer i en relativt enorm mengde ineffektiv behandling.
Når et resultatsett er produsert ved å koble sammen flere tabeller, inkludert mastertabeller som brukes til å slå opp fulltekstbeskrivelser av numeriske identifikasjonskoder (en oppslagstabell), en NULL-verdi i en hvilken som helst av de utenlandske tastene kan føre til at hele raden blir eliminert fra resultatsettet, uten feilmelding. Et komplekst SQL-spørsmål som inkluderer en eller flere indre sammenføyninger og flere ytre sammenføyninger, har samme risiko for NULL-verdier i de innvendige sammenkoblingskolonnene.
En forpliktelse til SQL-kode som inneholder indre sammenføyninger forutsetter at NULL sammenføyningskolonner ikke vil bli introdusert av fremtidige endringer, inkludert leverandøroppdateringer, designendringer og massebehandling utenfor applikasjonens datavalideringsregler som datakonvertering, migrasjon, bulkimport og sammenslåing.
Man kan videre klassifisere indre sammenføyninger som equi-joins, som naturlige sammenføyninger, eller som kryssforbindelser.
Equi-joinEdit
En equi-join er en spesifikk type komparatorbasert sammenføyning, som bare bruker likestillingssammenligninger i sammenføyningspredikatet. Bruk av andre sammenligningsoperatorer (for eksempel <
) diskvalifiserer en sammenføyning som en equi-sammenføyning. Spørringen vist ovenfor har allerede gitt et eksempel på en equi-sammenføyning:
SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;
Vi kan skrive equi-join som nedenfor,
SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Hvis co kolonner i en equi-join har samme navn, SQL-92 gir en valgfri stenografisk notasjon for å uttrykke equi-join, ved hjelp av USING
-konstruksjonen:
SELECT
read more