Bli med (SQL)

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 *FROM employee INNER JOIN department USING (DepartmentID);

USING -konstruksjonen er mer enn bare syntaktisk sukker, siden resultatsettet skiller seg fra resultatet sett med versjon med eksplisitt predikat. Spesielt vil alle kolonner som er nevnt i USING -listen bare vises en gang, med et ukvalifisert navn, i stedet for en gang for hver tabell i sammenføyningen. I tilfelle ovenfor vil det være en enkelt DepartmentID kolonne og ingen employee.DepartmentID eller department.DepartmentID .

USING -klausulen støttes ikke av MS SQL Server og Sybase.

Natural joinEdit

The natural delta er et spesielt tilfelle av equi-join. Natural join (⋈) er en binær operator som skrives som (R ⋈ S) hvor R og S er relasjoner. Resultatet av den naturlige sammenføyningen er settet med alle kombinasjoner av tupler i R og S som er like på deres vanlige attributtnavn.For eksempel, se på tabellene Employee and Dept og deres naturlige sammenføyning:

Medarbeider
Navn EmpId Avdelingsnavn
Harry 3415 Finans
Sally 2241 Salg
George 3401 Finans
Harriet 2202 Salg
Avdeling
Avdelingsnavn Manager
Finance George
Salg Harriet
Produksjon Charles
Medarbeider ⋈ {\ displaystyle \ bowtie} Avdeling
Navn EmpId Avdelingsnavn Manager
Harry 3415 Finans George
Sally 2241 Salg Harriet
George 3401 Finans George
Harriet 2202 Salg Harriet

Dette kan også brukes til å definere sammensetning av relasjoner. Sammensetningen av Employee and Dept er for eksempel deres sammenføyning som vist ovenfor, projisert på alle unntatt det vanlige attributtet DeptName. I kategoriteori er sammenføyningen nettopp fiberproduktet.

Den naturlige sammenføyningen er uten tvil en av de viktigste operatørene siden den er det relasjonelle motstykket til logisk AND. Merk at hvis den samme variabelen vises i hvert av de to predikatene som er koblet sammen med AND, så står den variabelen for den samme tingen, og begge utseendene må alltid erstattes av samme verdi. Spesielt tillater den naturlige sammenføyningen kombinasjonen av relasjoner som er assosiert med en fremmed nøkkel. For eksempel, i eksemplet ovenfor har det sannsynligvis en fremmed nøkkel fra Employee.DeptName til Dept.DeptName, og deretter kombinerer den naturlige sammenføyningen av Employee and Dept alle ansatte med sine avdelinger. Dette fungerer fordi den utenlandske nøkkelen holder mellom attributter med samme navn. Hvis dette ikke er tilfelle, slik som i den fremmede nøkkelen fra avdelingsleder til ansatt. Navn, må disse kolonnene omdøpes før den naturlige sammenføyningen tas. En slik sammenføyning blir noen ganger også referert til som en ekviforbindelse.

Mer formelt er semantikken til den naturlige sammenføyningen definert som følger:

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 \}},

der Moro er et predikat som er sant for en relasjon r hvis og bare hvis r er en funksjon. Det kreves vanligvis at R og S må ha minst ett felles attributt, men hvis denne begrensningen utelates, og R og S ikke har noen felles attributter, blir den naturlige sammenføyningen nøyaktig det kartesiske produktet.

naturlig sammenføyning kan simuleres med Codds primitiver som følger. La c1,…, cm være attributtnavnene som er felles for R og S, r1,…, rn være attributtnavnene unike for R og la s1,…, sk være attributter som er unike for S. Videre antar du at attributtnavnene x1,…, xm hverken er i R eller i S. I et første trinn kan de vanlige attributtnavnene i S nå omdøpes:

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

Så tar vi det kartesiske produktet og velger tuplene som skal sammenføyes:

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 sammenføyning er en type equi- bli med der sammenføyningspredikatet oppstår implisitt ved å sammenligne alle kolonnene i begge tabellene som har samme kolonnenavn i de sammenføyde tabellene. Den resulterende sammenføyde tabellen inneholder bare en kolonne for hvert par like navngitte kolonner. I tilfelle ingen kolonner med samme navn blir funnet, blir resultatet en kryssforbindelse.

De fleste eksperter er enige om at NATURLIGE JOIN er farlige og derfor fraråder dem sterkt å bruke dem. Faren skyldes utilsiktet å legge til en ny kolonne, kalt den samme som en annen kolonne i den andre tabellen. En eksisterende naturlig sammenføyning kan da «naturlig» bruke den nye kolonnen til sammenligning, og sammenligne / matche ved å bruke andre kriterier (fra forskjellige kolonner) enn før. Dermed kan en eksisterende spørring gi forskjellige resultater, selv om dataene i tabellene ikke er endret, men bare utvidet.Bruk av kolonnenavn for automatisk å bestemme tabellkoblinger er ikke et alternativ i store databaser med hundrevis eller tusenvis av tabeller der det vil legge en urealistisk begrensning for navnekonvensjoner. Virkelige databaser er ofte utformet med utenlandske nøkkeldata som ikke er konsekvent befolket (NULL-verdier er tillatt) på grunn av forretningsregler og kontekst. Det er vanlig å endre kolonnenavn på lignende data i forskjellige tabeller, og denne mangelen på stiv konsistens forvandler naturlige sammenføyninger til et teoretisk konsept for diskusjon.

Eksempler på forespørsel om indre sammenføyninger kan uttrykkes som en bli med på følgende måte:

SELECT *FROM employee NATURAL JOIN department;

Som med den eksplisitte USING -satsen, bare en DepartmentID-kolonne forekommer i den sammenføyde tabellen uten kvalifisering:

DepartmentID Employee.LastName Department.DepartmentName
34 Smith Clerical
33 Jones Engineering
34 Robinson Kontorist
33 Heisenberg Engineering
31 Rafferty Salg

PostgreSQL, MySQL og Oracle su pport naturlige sammenføyninger; Microsoft T-SQL og IBM DB2 ikke. Kolonnene som brukes i sammenføyningen er implisitte, slik at tilknytningskoden ikke viser hvilke kolonner som forventes, og en endring i kolonnenavn kan endre resultatene. I SQL: 2011-standarden er naturlige sammenføyninger en del av den valgfrie F401, «utvidet sammenføyningstabell», pakke.

I mange databasemiljøer blir kolonnenavnene kontrollert av en ekstern leverandør, ikke spørreutvikleren. En naturlig sammenkobling forutsetter stabilitet og konsistens i kolonnenavn som kan endres under versjonsoppgraderinger fra leverandøren.

Write a Comment

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *