Sisäinen liitos edellyttää, että kahden liitetyn taulukon jokaisella rivillä on vastaavat sarakearvot, ja se on sovelluksissa yleisesti käytetty liitosoperaatio, mutta sen ei pitäisi olettaa olevan paras valinta kaikissa tilanteissa. Sisäinen liitos luo uuden tulostaulukon yhdistämällä kahden taulukon (A ja B) sarakearvot liittymis predikaatin perusteella. Kysely vertaa A: n kutakin riviä B: n jokaiseen riviin löytääksesi kaikki riviparit, jotka täyttävät liittymispredikaatin. Kun liitto-predikaatti tyydytetään sovittamalla muut kuin NULL-arvot, sarakkeiden arvot kullekin sovitetulle A- ja B-riviparille yhdistetään tulosriviksi.
Liittämisen tulos voidaan määritellä tulos, kun otetaan ensin taulukoiden kaikkien rivien suorakulmion tulos (tai ristiliitos) (yhdistetään taulukon A jokaiset rivit taulukon B jokaisen rivin kanssa) ja palautetaan sitten kaikki liiton predikaatin tyydyttävät rivit. Todellisissa SQL-toteutuksissa käytetään yleensä muita lähestymistapoja, kuten hajautusliitännät tai lajittelu- ja yhdistämisliitännät, koska suorakulmio-tuotteen laskeminen on hitaampaa ja vaatii usein kohtuuttoman paljon muistia.
SQL määrittelee kaksi erilaista syntaktista tapoja ilmaista liittymistä: ”eksplisiittinen liittymämerkintä” ja ”implisiittinen liittymämerkintä”. ”Implisiittistä liittymismerkintää” ei enää pidetä parhaana käytäntönä, vaikka tietokantajärjestelmät edelleen tukevat sitä.
”eksplisiittisen liittymisen merkintätapa” käyttää avainsanaa JOIN
, valinnaisesti edeltää avainsana INNER
, jotta määritetään liitettävä taulukko ja avainsana ON
, jotta määritetään liittymisen predikaatit, kuten seuraava esimerkki:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
toimisto |
Jones |
33 |
tekniikka |
Smith |
34 |
toimisto |
Heisenberg |
33 |
Suunnittelu |
Rafferty |
31 |
Myynti |
”implisiittisen liittymisen merkintätapa” yksinkertaisesti listaa t liittymistä varten taulukot FROM
-lausekkeessa SELECT
, erottamalla ne pilkuilla. Täten se määrittelee ristiliitoksen, ja WHERE
-lauseke voi soveltaa muita suodatin-predikaatteja (jotka toimivat verrattavissa nimenomaisen notaation liitos-predikaatteihin).
Seuraava esimerkki vastaa edellistä, mutta tällä kertaa käytetään implisiittistä liittymämerkintää:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Esimerkeissä annetut kyselyt Yllä oleva liittyy Työntekijä- ja Osasto-taulukoihin käyttämällä molempien taulukoiden DepartmentID-saraketta. Jos näiden taulukoiden DepartmentID täsmää (eli liittymäennuste on tyydyttävä), kysely yhdistää kahden taulukon LastName, DepartmentID ja DepartmentName -sarakkeet tulosriviksi. Jos DepartmentID ei täsmää, tulosriviä ei luoda.
Näin ollen yllä olevan kyselyn suorittamisen tulos on:
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
toimisto |
Jones |
33 |
Tekniikka |
Smith |
34 |
toimisto |
Heisenberg |
33 |
tekniikka |
Rafferty |
31 |
Myynti |
Työntekijä ”Williams” ja osasto ”Markkinointi” eivät näy kyselyn suoritustuloksissa. Kummallakaan näistä ei ole vastaavia rivejä toisessa vastaavassa taulukossa: ”Williamsilla” ei ole liitettyä osastoa eikä yksikään työntekijä ole osastotunnusta 35 (”markkinointi”). Haluttuista tuloksista riippuen tämä käyttäytyminen voi olla hienovarainen vika, joka voidaan välttää korvaamalla sisempi liitos ulkoisella liitoksella.
Sisäinen liitos ja NULL-arvotMuokkaa
Ohjelmoijien tulisi ottaa erityisen varovainen, kun yhdistetään taulukoita sarakkeisiin, jotka voivat sisältää NULL-arvoja, koska NULL ei koskaan vastaa mitään muuta arvoa (ei edes NULL-arvoa itse), ellei liittämisehdossa nimenomaisesti käytetä yhdistelmää, joka ensin tarkistaa, että liittymissarakkeet ovat NOT NULL
ennen jäljellä olevien predikaattiehtojen soveltamista. Sisäistä liittämistä voidaan käyttää turvallisesti vain tietokannassa, joka noudattaa viitteellistä eheyttä tai jossa liitosarakkeet eivät ole TAKAISIA. Monet tapahtumien käsittelyn relaatiotietokannat tukeutuvat Atomicity, Consistency, Isolation, Durability (ACID) -tietojen päivitysstandardeihin tietojen eheyden varmistamiseksi, jolloin sisäiset liitokset ovat sopiva valinta. Tapahtumatietokannoissa on kuitenkin yleensä myös toivottavia liittymissarakkeita, joiden sallitaan olla NULL.Monet raportoivat relaatiotietokannat ja tietovarastot käyttävät suuria määriä pura, muunna, lataa (ETL) -eräpäivityksiä, jotka tekevät viitetietojen eheyden vaikeaksi tai mahdottomaksi toteuttaa, mikä johtaa mahdollisesti NULL-liittymisarakkeisiin, joita SQL-kyselyn kirjoittaja ei voi muokata ja jotka aiheuttavat sisäisten liitosten jättämisen pois tietoja ilman virheitä. Sisäliitoksen käyttö riippuu tietokannan suunnittelusta ja tietojen ominaisuuksista. Vasen ulompi liitos voidaan yleensä korvata sisäisellä liitoksella, kun yhden taulukon liitos sarakkeet voivat sisältää NULL-arvoja.
Mitään tietosaraketta, joka voi olla NULL (tyhjä), ei tule koskaan käyttää linkkinä sisempi liitos, ellei aiottu tulos ole NULL-arvon sisältävien rivien poistaminen. Jos NULL-liitos sarakkeet on tarkoitus poistaa tarkoituksellisesti tulosjoukosta, sisäinen liitos voi olla nopeampi kuin ulompi liitos, koska pöydän liitos ja suodatus tehdään yhdessä vaiheessa. Toisaalta sisäinen liitos voi johtaa hitaasti hitaaseen suorituskykyyn tai jopa palvelimen kaatumiseen, kun sitä käytetään suuressa määrässä kyselyjä yhdessä SQL Where -lausekkeen tietokantatoimintojen kanssa. Toiminto SQL: ssä, jossa lauseke voi johtaa siihen, että tietokanta jättää huomiotta suhteellisen pienet taulukkoindeksit. Tietokanta voi lukea ja liittää valitut sarakkeet molemmista taulukoista ennen kuin pienennetään rivien määrää suodattimella, joka riippuu lasketusta arvosta, mikä johtaa suhteellisen valtavaan tehottomuuteen.
Kun tulosjoukko asetetaan tuotetaan yhdistämällä useita taulukoita, mukaan lukien päätaulukot, joita käytetään etsimään numeeristen tunnistekoodien kokotekstikuvauksia (hakutaulukko), minkä tahansa vieraan avaimen NULL-arvo voi johtaa siihen, että koko rivi poistetaan tulosjoukosta, ilman virheitä. Monimutkaisella SQL-kyselyllä, joka sisältää yhden tai useamman sisäisen liitoksen ja useita ulompia liitoksia, on sama riski sisäisten liitoslinkkien sarakkeiden NULL-arvoille.
Sitoutuminen sisäisiä liitoksia sisältävään SQL-koodiin olettaa, että NULL-liitos sarakkeet eivät tulevaisuuden muutokset, mukaan lukien toimittajien päivitykset, suunnittelumuutokset ja joukkokäsittely sovelluksen tietojen validointisääntöjen ulkopuolella, kuten datan muuntaminen, siirrot, joukkotuonti ja sulautumiset.
Sisäiset liitokset voidaan edelleen luokitella equi-joins, luonnollisina liitoksina tai ristiliitoksina.
Equi-joinEdit
Equi-join on tietyntyyppinen vertailupohjainen liitos, joka käyttää vain tasa-arvon vertailuja liittymispredikaatissa. Muiden vertailuoperaattoreiden (kuten <
) käyttäminen sulkee liittymisen tasa-liittymäksi. Edellä esitetty kysely on jo antanut esimerkin equi-liitoksesta:
SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;
Voimme kirjoittaa equi-join kuten alla,
SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Jos yhteistyössä equi-liittymän lumneilla on sama nimi, SQL-92 tarjoaa valinnaisen lyhenteen merkinnän equi-liitosten ilmaisemiseksi USING
-rakenteen avulla:
SELECT
read more