En indre sammenføjning kræver, at hver række i de to sammenføjede tabeller har matchende kolonneværdier og er en almindeligt anvendt sammenføjningsoperation i applikationer, men bør ikke antages at være det bedste valg i alle situationer. Indre sammenføjning opretter en ny resultattabel ved at kombinere kolonneværdier for to tabeller (A og B) baseret på sammenføjningspredikatet. Forespørgslen sammenligner hver række A med hver række B for at finde alle par af rækker, der tilfredsstiller sammenføjningspredikatet. Når sammenføjningspredikatet er opfyldt ved at matche ikke-NULL-værdier, kombineres kolonneværdier for hvert matchede par af rækker af A og B til en resultatrække.
Resultatet af sammenføjningen kan defineres som resultatet af først at tage det kartesiske produkt (eller krydsføjning) af alle rækker i tabellerne (kombinere hver række i tabel A med hver række i tabel B) og derefter returnere alle rækker, der opfylder sammenføjningspredikatet. Faktiske SQL-implementeringer bruger normalt andre tilgange, såsom hash-sammenføjninger eller sorteringsfusioner, da beregning af det kartesiske produkt er langsommere og ofte kræver en uoverkommelig stor mængde hukommelse at gemme.
SQL specificerer to forskellige syntaktiske måder at udtrykke sammenføjninger på: “eksplicit sammenføjningsnotation” og “implicit tilslutningsnotation”. Den “implicitte sammenkædningsnotation” betragtes ikke længere som en bedste praksis, selvom databasesystemer stadig understøtter den.
“Eksplicit sammenkædningsnotation” bruger nøgleordet JOIN
, valgfrit forud for nøgleordet INNER
for at specificere den tabel, der skal sammenføjes, og nøgleordet ON
for at specificere prædikaterne for sammenføjningen 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 |
Kontorist |
Jones |
33 |
Engineering |
Smith |
34 |
Kontormed |
Heisenberg |
33 |
Ingeniørvirksomhed |
Rafferty |
31 |
Salg |
Den “implicit sammenføjningsnotation” viser blot t han tabeller til sammenføjning i FROM
-sætningen i SELECT
-sætningen ved hjælp af kommaer til at adskille dem. Det specificerer således en krydsforbindelse, og WHERE
-klausulen kan muligvis anvende yderligere filterprædikater (som fungerer sammenligneligt med sammenføjningspredikaterne i den eksplicitte notation).
Følgende eksempel svarer til det foregående, men denne gang ved hjælp af implicit join notation:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Forespørgslerne i eksemplerne ovenfor vil deltage i medarbejder- og afdelingstabellerne ved hjælp af kolonnen DepartmentID i begge tabeller. Hvor DepartmentID for disse tabeller matcher (dvs. sammenføjelsespredikatet er opfyldt), kombinerer forespørgslen kolonnerne LastName, DepartmentID og DepartmentName fra de to tabeller til en resultatrække. Hvor DepartmentID ikke stemmer overens, genereres der ingen resultatrækker.
Resultatet af udførelsen af forespørgslen ovenfor bliver således:
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
Kontormed |
Jones |
33 |
Ingeniørarbejde |
Smith |
34 |
Kontormedhjælper |
Heisenberg |
33 |
Engineering |
Rafferty |
31 |
Salg |
Medarbejderen “Williams” og afdelingen “Marketing” vises ikke i resultaterne af forespørgslens udførelse. Ingen af disse har nogen matchende rækker i den anden respektive tabel: “Williams” har ingen tilknyttet afdeling, og ingen medarbejdere har afdeling ID 35 (“Marketing”). Afhængigt af de ønskede resultater kan denne adfærd være en subtil fejl, som kan undgås ved at erstatte den indre sammenføjning med en ydre sammenføjning.
Indre sammenføjning og NULL-værdier Rediger
Programmører skal tage særlig forsigtighed ved sammenføjning af tabeller på kolonner, der kan indeholde NULL-værdier, da NULL aldrig vil matche nogen anden værdi (ikke engang NULL selv), medmindre sammenføjningsbetingelsen udtrykkeligt bruger et kombinationspredikat, der først kontrollerer, at sammenføjningskolonnerne er NOT NULL
før du anvender de resterende prædikatbetingelser. Den indre sammenføjning kan kun bruges sikkert i en database, der håndhæver referentiel integritet, eller hvor sammenføjningskolonnerne garanteret ikke er NULL. Mange transaktionsbehandlingsrelationsdatabaser er afhængige af standardopdateringsstandarder for atomicitet, konsistens, isolation, holdbarhed (ACID) for at sikre dataintegritet, hvilket gør indre sammenføjninger til et passende valg. Transaktionsdatabaser har dog normalt også ønskelige sammenføjningskolonner, der har tilladelse til at være NULL.Mange rapporterende relationsdatabaser og datalagre bruger batchopdateringer med høj volumen Extract, Transform, Load (ETL), som gør det vanskelig eller umuligt at håndhæve referenceintegritet, hvilket resulterer i potentielt NULL-sammenkædningskolonner, som en SQL-forespørgselsforfatter ikke kan ændre, og som medfører, at indre sammenføjninger udelades data uden indikation af en fejl. Valget om at bruge en indre sammenføjning afhænger af databasedesignet og datakarakteristikkerne. En ydre venstre sammenføjning kan normalt erstattes af en indre sammenføjning, når sammenføjningskolonnerne i en tabel kan indeholde NULL-værdier.
Enhver datakolonne, der kan være NULL (tom), bør aldrig bruges som et link i en indre sammenføjning, medmindre det tilsigtede resultat er at eliminere rækkerne med NULL-værdien. Hvis NULL sammenføjningskolonner bevidst skal fjernes fra resultatsættet, kan en indre sammenføjning være hurtigere end en ydre sammenføjning, fordi tabellen sammenføjes og filtreres i et enkelt trin. Omvendt kan en indre sammenføjning resultere i katastrofalt langsom ydeevne eller endda et servernedbrud, når det bruges i et stort volumenforespørgsel i kombination med databasefunktioner i en SQL Where-klausul. En funktion i en SQL Hvor klausul kan resultere i, at databasen ignorerer relativt kompakte tabelindekser. Databasen kan læse og indre sammenføje de valgte kolonner fra begge tabeller, før antallet af rækker reduceres ved hjælp af filteret, der afhænger af en beregnet værdi, hvilket resulterer i en relativt enorm mængde ineffektiv behandling.
Når et resultatsæt produceres ved at forbinde flere tabeller, herunder mastertabeller, der bruges til at slå op i fuldtekstbeskrivelser af numeriske identifikationskoder (en opslagstabel), en NULL-værdi i en hvilken som helst af de fremmede nøgler kan resultere i, at hele rækken elimineres fra resultatsættet uden indikation af fejl. En kompleks SQL-forespørgsel, der inkluderer en eller flere indre sammenføjninger og flere ydre sammenføjninger, har den samme risiko for NULL-værdier i de indvendige sammenføjningskolonnekolonner.
En forpligtelse til SQL-kode, der indeholder indre sammenføjninger forudsætter, at NULL sammenføjningskolonner ikke vil være introduceres ved fremtidige ændringer, herunder leverandøropdateringer, designændringer og massebehandling uden for applikationens datavalideringsregler såsom datakonverteringer, migreringer, bulkimport og fusioner.
Man kan yderligere klassificere indre sammenføjninger som equi-sammenføjninger, som naturlige sammenføjninger eller som tværføjninger.
Equi-joinEdit
En equi-join er en bestemt type komparatorbaseret sammenføjning, der kun bruger ligestillingssammenligninger ved hjælp af andre sammenligningsoperatorer (såsom <
) diskvalificerer en sammenføjning som en equi-sammenføjning. Forespørgslen vist ovenfor har allerede givet et eksempel på en equi-sammenføjning:
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 søjler i en equi-join har samme navn, SQL-92 giver en valgfri stenografisk notation til at udtrykke equi-joins ved hjælp af USING
-konstruktionen:
SELECT
read more