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 *FROM employee INNER JOIN department USING (DepartmentID);
Rakenne USING
on enemmän kuin pelkkä syntaktinen sokeri, koska tulosjoukko eroaa tuloksesta joukko versiota, jolla on nimenomainen predikaatti. Tarkemmin sanottuna kaikki USING
-luettelossa mainitut sarakkeet näkyvät vain kerran, nimettömällä nimellä, eikä kerran jokaiselle liitoksen taulukolle. Yllä olevassa tapauksessa sarakkeessa on yksi DepartmentID
-sarake eikä employee.DepartmentID
tai department.DepartmentID
.
MS SQL Server ja Sybase eivät tue lauseketta USING
.
Luonnollinen joinEdit
Luonnollinen liittyminen on equi-liittymisen erityistapaus. Luonnollinen liitos (⋈) on binäärioperaattori, joka kirjoitetaan muodossa (R ⋈ S), jossa R ja S ovat suhteita. Luonnollisen liitoksen tulos on joukko kaikkia R: n ja S: n joukkoyhdistelmiä, jotka ovat yhtä suuria kuin niiden yhteiset attribuuttien nimet.Tarkastellaan esimerkiksi taulukoita Työntekijä ja osasto ja niiden luonnollinen liitos:
|
|
|
Tätä voidaan käyttää myös määrittelemään suhteiden koostumus. Esimerkiksi työntekijän ja osaston kokoonpano on heidän liittymisensä, kuten yllä on esitetty, heijastettuna kaikille paitsi yhteiselle attribuutille DeptName. Luokkateoriassa liitos on nimenomaan kuitutuote.
Luonnollinen liitos on kiistatta yksi tärkeimmistä toimijoista, koska se on loogisen AND: n relaatiovastine. Huomaa, että jos sama muuttuja esiintyy kussakin kahdessa predikaatissa, jotka on yhdistetty AND: lla, muuttuja tarkoittaa samaa ja molemmat esiintymät on aina korvattava samalla arvolla. Luonnollinen liittyminen sallii erityisesti suhteiden yhdistämisen, joihin liittyy vieras avain. Esimerkiksi yllä olevassa esimerkissä vieras avain todennäköisesti omistaa Employee.DeptName – Dept.DeptName ja sitten työntekijän ja osaston luonnollinen liittyminen yhdistää kaikki työntekijät osastoihinsa. Tämä toimii, koska vieras avain on samannimisten määritteiden välillä. Jos näin ei ole, kuten ulkomaisessa avaimessa Dept.managerista Employee.Name, nämä sarakkeet on nimettävä uudelleen ennen kuin luonnollinen liitos otetaan. Tällaista liitosta kutsutaan joskus myös equi-liitokseksi.
Muodollisemmin luonnollisen liitoksen semantiikka määritellään seuraavasti:
R ⋈ S = {t ∪ s ∣ t ∈ R ∧ s ∈ S ∧ F un (t ∪ s)} {\ displaystyle R \ bowtie S = \ vasen \ {t \ cup s \ mid t \ in R \ \ land \ s \ in S \ \ land \ {\ mathit {Fun}} (t \ cup s) \ right \}},
missä Fun on predikaatti, joka on tosi suhteelle r vain silloin, kun r on funktio. Tavallisesti vaaditaan, että R: llä ja S: llä on oltava vähintään yksi yhteinen attribuutti, mutta jos tämä rajoitus jätetään pois ja R: llä ja S: llä ei ole yhteisiä attribuutteja, luonnollisesta liitoksesta tulee tarkalleen suorakulmainen tulo.
luonnollinen liitos voidaan simuloida Coddin primitiivien kanssa seuraavasti. Olkoon c1,…, cm R: lle ja S: lle yhteiset attribuuttien nimet, r1,…, rn ovat R: lle ainutlaatuiset attribuuttien nimet ja Oletetaan lisäksi, että attribuuttien nimet x1,…, xm eivät ole R: ssä eikä S: ssä. Ensimmäisessä vaiheessa S: n yleiset attribuuttien nimet voidaan nyt nimetä uudelleen:
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))}
Otetaan sitten suorakulmion tuote ja valitaan liitettävät sarjat:
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)}
Luonnollinen liitos on eräänlainen liittyä, missä liitto-predikaatti syntyy implisiittisesti vertaamalla molempien taulukoiden kaikkia sarakkeita, joilla on samat sarakkeiden nimet liitetyissä taulukoissa. Tuloksena oleva liitetty taulukko sisältää vain yhden sarakkeen kutakin saman nimisen sarakkeen paria kohti. Jos yhtään samannimistä saraketta ei löydy, tulos on ristiliitos.
Useimmat asiantuntijat ovat yhtä mieltä siitä, että NATURAL JOINit ovat vaarallisia, ja siksi ne estävät voimakkaasti niiden käyttöä. Vaara johtuu uuden sarakkeen vahingossa lisäämisestä, nimeltään sama kuin toisen sarakkeen toinen taulukko. Olemassa oleva luonnollinen liitos voi sitten ”luonnollisesti” käyttää uutta saraketta vertailuihin, jolloin vertailut / ottelut tehdään käyttämällä eri kriteerejä (eri sarakkeista) kuin aikaisemmin. Siten olemassa oleva kysely voisi tuottaa erilaisia tuloksia, vaikka taulukoiden tietoja ei ole muutettu, vaan vain täydennetty.Sarakkeiden nimien käyttö taulukon linkkien automaattiseen määrittämiseen ei ole vaihtoehto suurissa tietokannoissa, joissa on satoja tai tuhansia taulukoita, joissa se asettaisi epärealistisen rajoitteen nimeämiskäytännöille. Reaalimaailman tietokannat suunnitellaan yleisesti ulkomaisilla avaintiedoilla, joita ei jatkuvasti täytetä (NULL-arvot ovat sallittuja) liiketoimintasääntöjen ja kontekstin vuoksi. On yleistä käytäntöä muokata samanlaisten tietojen sarakkeiden nimiä eri taulukoissa, ja tämä jäykän johdonmukaisuuden puute johtaa luonnollisiin liitoksiin keskustelun teoreettiseen konseptiin.
Edellä oleva sisäisten liitosten esimerkkikysely voidaan ilmaista luonnollisena liittyä seuraavalla tavalla:
SELECT *FROM employee NATURAL JOIN department;
Kuten nimenomaisessa lausekkeessa USING
, liitetyssä taulukossa esiintyy vain yksi DepartmentID-sarake ilman tarkenninta:
DepartmentID | Employee.LastName | Department.DepartmentName |
---|---|---|
34 | Smith | toimisto |
33 | Jones | tekniikka |
34 | Robinson | toimisto |
33 | Heisenberg | tekniikka |
31 | Rafferty | Myynti |
PostgreSQL, MySQL ja Oracle su luonnolliset liitännät; Microsoft T-SQL ja IBM DB2 eivät. Liittämisessä käytetyt sarakkeet ovat implisiittisiä, joten liittymiskoodi ei näytä odotettavissa olevia sarakkeita, ja sarakkeiden nimien muutos voi muuttaa tuloksia. SQL: 2011-standardissa luonnolliset liitokset ovat osa valinnaista F401-pakettia ”Extended join table”.
Monissa tietokantaympäristöissä sarakkeiden nimiä hallitsee ulkopuolinen toimittaja, ei kyselyn kehittäjä. Luonnollinen liittyminen edellyttää sarakkeiden nimien vakautta ja yhdenmukaisuutta, jotka voivat muuttua toimittajan valtuuttamien versiopäivitysten aikana.