Ühinemist kasutatakse alati sisselülitatud operaatoriga. Oracle'i toetatud ühenduse tüübid SQL-is: JOIN ja teised. JOIN operaatori süntaks

Oracle toetab mitut tüüpi liiteid, mis erinevad kahe või enama tabeli või vaate ridade ühendamise viisi poolest. See ajaveebi postitus kirjeldab Oracle'is kõige sagedamini kasutatavaid ühenduse tüüpe.

Võrdsusühendus

Võrdühendus ühendab kaks või enam tabelit veergude võrdsuse alusel. Teisisõnu, samal veerul on kõigis ühendatud tabelites sama väärtus. Allpool on näide võrdsusühenduse kasutamisest:

SQL> SELECT e.last_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;

Ülal näidatud liitumisteate võib kasutada ka järgmist uut süntaksit:

SQL> SELECT e.last_name, d.dept FROM emp e JOIN dept d USING (emp_id);

Kui soovite ühendada mitu veergu, saate loetleda nende nimed komadega eraldatud loendina, näiteks: USING (dept_id, emp_name).

Loomulik ühendus

Loomulik ühendus on võrdusühendus, milles veerud, mis tuleb liitmise teostamiseks sobitada, ei ole konkreetselt määratud. Oracle määrab kahe tabeli vastavate veergude põhjal automaatselt, millised veerud ühendada. Allpool on näide loodusliku ühendi kasutamisest:

SQL> SELECT e.last_name, d.dept FROM emp e NATURAL JOIN osakond d;

Selles näites on liitumise tingimuseks see, et tabeli emp ja dept veerus perekonnanimi peavad olema identsed väärtused.

Refleksiivne ühendus

Refleksiivne liitmine tähendab tabeli ühendamist endaga varjunimede kasutamise kaudu. Järgmine näide ühendab töötajate tabeli endaga aliast kasutades ja eemaldab kõik topeltread.

SQL> DELETE FROM töötajatest X WHERE ROWID > 2 (valige MIN(rida) FROM töötajatelt Y 3 kus X.key_values ​​​​= Y.key_values);

Sisemine liitmine

Sisemine ühendus, mida nimetatakse ka lihtühenduseks, tagastab kõik read, mis vastavad määratud liitumistingimusele. Varem nõudis sisemine liitumissüntaks WHERE-klauslit, et määrata, kuidas tabelid tuleks ühendada, näiteks järgmiselt:

SQL> SELECT e.flast_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;

Oracle võimaldab teil nüüd määrata liitumiskriteeriumid sisemises (või lihtsas) liitumise süntaksis, kasutades näiteks uut ON või USING konstruktsiooni:

SQL> SELECT DISTINCT NVL(dname, "No Dept"), COUNT(empno) nbr_emps FROM emp JOIN DEPT ON emp.deptno = dept.deptno KUS emp.job IN ("JUHT", "MÜÜJAMEES", "ANALÜÜSIK") GROUP d-nime järgi;

Väline liitmine

Välist liitumist kasutatakse kõigi määratud liitumistingimustele vastavate ridade tagastamiseks, pluss mõned või kõik read tabelist, millel ei ole vastavaid ridu, mis vastavad määratud liitumistingimusele. Välisühendusi on kolme tüüpi: vasakpoolne välimine ühendus, parempoolne välimine ühendus ja täielik välimine ühendus. Täielikus välimises liitumislauses jäetakse sõna VÄLIS tavaliselt välja.

Varem uurisime ühest andmebaasitabelist andmete valimiseks SELECT-lause kasutamist. Kui Transact-SQL piirduks ainult selliste lihtsate SELECT-lausete toetamisega, oleks võimatu kahte või enamat tabelit päringus ühendada, et neist andmeid hankida. Järelikult tuleks kõik andmebaasi andmed salvestada ühte tabelisse. Kuigi selline lähenemine on täiesti võimalik, on sellel üks märkimisväärne puudus – sel viisil salvestatud andmeid iseloomustab suur liiasus.

Transact-SQL kõrvaldab selle puuduse, pakkudes JOIN operaator, mis võimaldab hankida andmeid rohkem kui ühest tabelist. See operaator on tõenäoliselt relatsiooniliste andmebaasisüsteemide jaoks kõige olulisem operaator, kuna see võimaldab jagada andmeid mitme tabeli vahel, tagades seega andmebaasisüsteemide olulise omaduse - andmete liiasuse puudumise.

Operaator UNION, mida me varem vaatlesime, võimaldab teil ka päringuid teha mitmest tabelist. Kuid see operaator võimaldab teil ühendada mitu SELECT-lauset, samas kui operaator JOIN ühendab mitu tabelit, kasutades ainult ühte SELECT-lauset. Lisaks ühendab operaator UNION tabeli ridu, operaator JOIN aga veerge.

Ühinemisoperaatorit saab kasutada ka aluseks olevate tabelite ja vaadetega. Operaatoril JOIN on mitu erinevat vormi. See artikkel hõlmab järgmisi selle operaatori põhivorme:

    loomulik ühendus;

    Descartes'i toode või ristliitmine;

    välimine liitmine;

    teeta-liitmine, iseliitmine ja poolliitmine.

Enne kui vaatleme liite erinevaid vorme, vaatleme selles jaotises operaatori JOIN erinevaid variatsioone.

Kaks süntaktilist vormi seoste rakendamiseks

Tabelite ühendamiseks saate kasutada kahte erinevat liitmisoperaatori süntaktilist vormi:

    selgesõnaline liitumise süntaks (ANSI SQL:1992 liitumise süntaks);

    kaudne liitumise süntaks ("vana stiili" liitumise süntaks).

ANSI SQL:1992 liitumissüntaksi võttis kasutusele SQL92 standard ja see määratleb liitmise operatsioonid selgesõnaliselt, st. kasutades igat tüüpi liitumistoimingu jaoks sobivat nime. Ühenduse sõnaselgelt deklareerimisel kasutatakse järgmisi märksõnu:

  • LEFT JOIN;

    PAREM LIITU;

    TÄIELIK LIITUMINE.

Märksõna CROSS JOIN määratleb kahe tabeli Descartes'i korrutise. Märksõna INNER JOIN defineerib loomuliku ühenduse kahe tabeli vahel ning LEFT OUTER JOIN ja RIGHT OUTER JOIN defineerivad sama nimega liitumistoimingud. Lõpuks defineerib märksõna FULL OUTER JOIN parem- ja vasakpoolse välisühenduse. Kõiki neid ühendamistoiminguid käsitletakse järgmistes osades.

Implitsiitne liitumisoperaatori süntaks on "vana stiili" süntaks, kus iga liitumisoperatsioon määratletakse kaudselt WHERE-klausliga, kasutades niinimetatud liitumisveerge.

Liitimistoimingute jaoks on soovitatav kasutada selgesõnalist süntaksit, kuna see parandab päringute usaldusväärsust. Seetõttu kasutatakse kõigis järgmistes näidetes, mis hõlmavad liitumistoiminguid, selgesõnalise süntaksi vorme. Kuid paar esimest näidet demonstreerivad ka "vana stiili" süntaksit.

Loomulik ühendus

Mõisteid loomulik liitumine ja equi-join kasutatakse sageli sünonüümidena, kuid nende vahel on väike erinevus. Samaväärsuse liitmise operatsioonil on alati igas reas üks või mitu veergu, millel on identsed väärtused. Toimingut, mis elimineerib sellised veerud samaväärsuse liitmise operatsiooni tulemustest, nimetatakse loomulikuks ühendamiseks. Parim viis loomuliku seose selgitamiseks on näide:

KASUTAGE SampleDb; SELECT Employee.*, Department.* FROM Employee INNER JOIN Department ON Employee.DepartamentNumber = Osakond.Number;

Päring tagastab kogu teabe kõigi töötajate kohta: ees- ja perekonnanimi, personalinumber ning osakonna nimi, number ja asukoht, samas kui osakonna numbri jaoks kuvatakse erinevatest tabelitest pärinevad duplikaatveerud.

Selles näites valib käsk SELECT kõik tabelite töötajad ja osakonna veerud. SELECT-lause FROM-klausel määratleb ühendatavad tabelid ja täpsustab ka liitumistoimingu tüübi - SISEMINE LIITUMINE. ON-klausel on osa FROM-klauslist ja määrab mõlemas tabeli veerud, mis tuleb ühendada. Avaldis "Employee.DepartamentNumber = Department.Number" määratleb liitumise tingimuse ja tingimuse mõlemat veergu nimetatakse liituda veergudega.

Samaväärne päring, mis kasutab kaudset süntaksit ("vana stiil"), näeks välja järgmine:

Sellel süntaksivormil on kaks olulist erinevust selgesõnalisest vormist: ühendatavate tabelite loend on määratud klauslis FROM ja vastav liitumise tingimus on WHERE-klauslis liidetavate veergude järgi.

Eelnevad näited illustreerivad liitmise toimimist. Kuid tuleb meeles pidada, et see on vaid idee ühendamisprotsessist, sest tegelikult valib andmebaasimootor mitme võimaliku strateegia hulgast liitumistoimingu teostuse. Kujutage ette, et tabeli Töötaja iga rida on ühendatud osakonna tabeli iga reaga. Tulemuseks on seitsme veeruga (4 veergu töötajate tabelist ja 3 osakonna tabelist) ja 21 reaga tabel.

Järgmisena kustutatakse sellest tabelist kõik read, mis ei vasta liitumise tingimusele "Töötaja.Arv = Osakond.Arv". Ülejäänud read esindavad ülaltoodud esimese näite tulemust. Ühendatud veergudel peab olema identne semantika, st. mõlemal veerul peab olema sama tõeväärtus. Ühendatavad veerud ei pea olema sama nimega (või isegi sama andmetüübiga), kuigi sageli on.

Andmebaasisüsteem ei saa veeru loogilist väärtust määrata. Näiteks ei saa see kindlaks teha, et projektinumbri ja töötajate personalinumbri veergudel pole midagi ühist, kuigi need on mõlemad täisarvude andmetüübid. Seetõttu saab andmebaasisüsteem kontrollida ainult andmetüüpi ja stringi pikkust. Andmebaasimootor nõuab, et ühendatavatel veergudel oleks ühilduvad andmetüübid, nagu INT ja SMALLINT.

SampleDb andmebaas sisaldab kolme veergude paari, kus iga paari veerul on sama tõeväärtus (ja ka sama nimi). Tabeleid Töötaja ja Osakond saab ühendada kasutades veerge Töötaja.Osakonnaarv ja Osakond.Arv. Tabelite Employee ja Works_on liitumisveerudeks on veerud Employee.Id ja Works_on.EmpId. Lõpuks saab tabeleid Project ja Works_on ühendada veergude Project.Number ja Works_on.ProjectNumber abil.

Veergude nimesid saate täpsustada lauses SELECT. Selles kontekstis tähendab kvalifitseerimine seda, et vältimaks ebaselgust selle kohta, millisesse tabelisse veerg kuulub, sisaldab veeru nimi selle tabeli (või tabeli pseudonüümi) nime, eraldatuna punktiga:

tabeli_nimi.veeru_nimi (tabeli_nimi.veeru_nimi)

Enamik SELECT-lauseid ei nõua veeru kvalifitseerimist, kuigi üldiselt soovitatakse koodi mõistmise parandamiseks kasutada veeru kvalifitseerimist. Kui veergude nimed SELECT-lauses on mitmetähenduslikud (näiteks tabelite Projekt ja osakond veerud Number), on kvalifitseeritud veerunimede kasutamine kohustuslik.

Ühendustoiminguga SELECT-lauses võib WHERE-klausel lisaks liitumistingimusele sisaldada ka muid tingimusi, nagu on näidatud allolevas näites:

KASUTAGE SampleDb; -- Selgesõnaline süntaks SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Budget FROM Works_on JOIN Project ON Project.Number = Works_on.ProjectNumber WHERE ProjectName = "Kaksikud"; -- Vana stiil SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Budget FROM Works_on, Project WHERE Project.Number = Works_on.ProjectNumber JA ProjektiNimi = "Kaksikud";

Kvalifitseeritud veeru nime Project.Number kasutamine ülaltoodud näites on valikuline, kuna sel juhul pole nende nimede osas kaheti mõistetav. Alljärgnevalt kasutatakse kõigis näidetes ainult selgesõnalist liitumise süntaksit.

Allolev näide näitab sisemise liitmise teist kasutamist:

Rohkem kui kahe laua ühendamine

Teoreetiliselt on SELECT-lauses liitatavate tabelite arv piiramatu. (Kuid üks liitumise tingimus ühendab ainult kaks tabelit!) Andmebaasimootor piirab aga ühendatavate tabelite arvu SELECT-lauses 64 tabelini.

Allolev näide näitab kolme SampleDb andmebaasi tabeli ühendamist:

KASUTAGE SampleDb; -- Tagastab ainsa töötaja "Vasili Frolov" SELECT Eesnimi, Perekonnanimi FROM Works_on JOIN Töötaja ON Works_on.EmpId = Töötaja.Id JOIN Department ON Employee.DepartamentNumber = Osakond.Number JA Location = "Peterburi" AND Töökoht ;

Selles näites on valitud kõigi analüütikute ees- ja perekonnanimed (Töö = "Analüütik"), kelle osakond asub Peterburis (Asukoht = "Peterburi"). Ülaltoodud näites toodud päringu tulemuse saab ainult siis, kui ühendate vähemalt kolm tabelit: Works_on, Employee ja Department. Neid tabeleid saab ühendada kahe paari ühendusveeru abil:

(Works_on.EmpId, Employee.Id) (Employee.DepartmentNumber, Department.Number)

Pange tähele, et kolme tabeli loomuliku ühendamiseks kasutatakse kahte liitumistingimust, millest igaüks ühendab kaks tabelit. Ja nelja laua ühendamisel on vaja kolme sellist liitumistingimust. Üldjuhul tuleb n tabeli ühendamisel Descartes'i toote saamise vältimiseks rakendada n - 1 liitumistingimusi. Loomulikult on lubatud kasutada rohkem kui n - 1 liitumistingimusi, aga ka muid tingimusi, et vähendada elementide arvu saadud andmekogumis.

Descartes'i toode

Eelmises osas vaatlesime võimalikku viisi loomuliku ühenduse loomiseks. Selle protsessi esimene samm ühendab tabeli Töötaja iga rea ​​osakonna tabeli iga reaga. Seda operatsiooni nimetatakse Descartes'i toode. Päring töötajate ja osakonna tabelite vahelise ühenduse loomiseks, kasutades Descartes'i toodet, on näidatud allolevas näites:

KASUTAGE SampleDb; SELECT Employee.*, osakond.* FROM Töötaja RISTLIITUMINE Osakond;

Descartes'i korrutis ühendab esimese tabeli iga rea ​​teise tabeli iga reaga. Üldiselt annab esimese n reaga tabeli ja teise m reaga tabeli Descartes'i korrutis tulemuseks n*m reaga tabeli. Seega on ülaltoodud näites esitatud päringutulemuses 7 x 3 = 21 rida (need read sisaldavad korduvaid väärtusi).

Praktikas kasutatakse Descartes'i toodet äärmiselt harva. Mõnikord jõuavad kasutajad kahe tabeli Descartes'i korrutisele, kui nad unustavad "vana stiili" kaudse liitumise süntaksi kasutamisel lisada WHERE-klauslisse liitumise tingimuse. Sel juhul ei vasta saadud tulemus oodatud, sest sisaldab lisaridu. Ootamatult suure arvu ridade olemasolu tulemuses on märk sellest, et kahe tabeli nõutava loomuliku ühenduse asemel saadi Descartes'i korrutis.

Väline liitmine

Eelmistes loomuliku liitumise näidetes sisaldas tulemuskomplekt ainult neid ridu ühest tabelist, millel olid teises tabelis vastavad read. Kuid mõnikord on lisaks ridade sobitamisele vaja ühest või mõlemast tabelist välja võtta vasteteta read. Seda operatsiooni nimetatakse välimine liitmine.

Allolev näide näitab valikut kogu teabest töötajate kohta, kes elavad ja töötavad samas linnas. See kasutab UNION-operaatorit käsitledes tabelit EmployeeEnh, mille lõime artiklis "Täpsem SELECT avaldus".

KASUTAGE SampleDb; SELECT DISTINCT EmployeeEnh.*, Department.Location FROM EmployeeEnh LIITU osakonnaga ON Linn = Asukoht;

Selle päringu tulemus:

Selles näites saadakse vajalikud read loomuliku ühenduse kaudu. Kui see tulemus peaks hõlmama teistes asukohtades elavaid töötajaid, tuleks rakendada vasakpoolset välimist liitumist. Seda välimist ühendust nimetatakse vasakühenduseks, kuna see tagastab kõik võrdlusoperaatori vasakpoolses tabelis olevad read, olenemata sellest, kas tabelis on paremas servas sobivaid ridu. Teisisõnu, see välimine liitmine tagastab rea vasakpoolsest tabelist, isegi kui sellel ei ole vastet parempoolses tabelis, vastava veeru väärtusega NULL kõigi ridade jaoks, mille veeru väärtus ei ühti teises parempoolses tabelis. Vasakpoolse välimise ühendamise toimingu tegemiseks kasutab andmebaasimootor operaatorit VASAKU VÄLIMISE LIITUMINE.

Parempoolse välisühenduse toiming sarnaneb vasakpoolse ühendusega, kuid kõik avaldise paremal küljel olevad tabeliread tagastatakse. Õige välise liitumistoimingu sooritamiseks kasutab andmebaasimootor operaatorit PAREM VÄLILINE LIITUMINE.

KASUTAGE SampleDb; SELECT EmployeeEnh.*, osakond.Asukoht FROM EmployeeEnh VASAKULE VÄLISEMA LIITUMINE Osakond ON Linn = Asukoht;

See näide valib töötajad (kaasa arvatud täielik teave) linnade jaoks, kus töötajad kas ainult elavad (Tabeli EmployeeEnh veerg Linn) või elavad ja töötavad. Selle päringu tulemus:

Nagu näete päringu tulemusest, kui vasakpoolse tabeli real (antud juhul EmployeeEnh) pole paremas tabelis (antud juhul osakond) sobivat rida, tagastab vasakpoolne välimine liitumistehte ikkagi selle rea, täites kõik vastava veeru lahtrid NULL-iga, kui tabeli parempoolse veeru väärtus ei sobi. Parempoolse välisühenduse kasutamine on näidatud allolevas näites:

KASUTAGE SampleDb; SELECT EmployeeEnh.City, Department.* FROM EmployeeEnh PAREMAL VÄLISEL LIITUMINE Osakond ON Linn = Asukoht;

Selles näites valitakse osakonnad (sh täielik teave nende kohta) linnade jaoks, kus töötajad kas ainult töötavad või elavad ja töötavad. Selle päringu tulemus:

Lisaks vasakpoolsele ja parempoolsele välisühendusele on olemas ka täielik välimine ühendus, mis on vasak- ja parempoolsete väliste ühenduste liit. Teisisõnu, sellise liite tulemuse komplekt koosneb mõlema tabeli kõigist ridadest. Kui ühe tabeli real ei ole teises tabelis vastavat rida, määratakse teise tabeli rea kõik lahtrid väärtuseks NULL. Täieliku välise ühendamise toimingu tegemiseks kasutage operaatorit TÄIELIK VÄLILINE LIITUMINE.

Mis tahes välist liitumisoperatsiooni saab emuleerida, kasutades operaatorit UNION koos funktsiooniga NOT EXISTS. Seega on allolevas näites näidatud päring samaväärne varem näidatud vasakpoolse välimise liitumispäringuga. See päring valib töötajad (sh täielik teave) linnade jaoks, kus töötajad ainult elavad või elavad ja töötavad:

Ühenduse esimene SELECT-lause määratleb tabelite EmployeeEnh ja Department loomuliku ühenduse, kasutades liitumisveerge Linn ja Asukoht. See juhend tagastab kõigi töötajate kohta kõik linnad, kus töötajad nii elavad kui ka töötavad. Lisaks tagastab ühenduse teine ​​SELECT-lause kõik tabeli EmployeeEnh read, mis ei vasta loomuliku ühenduse tingimusele.

Muud liitumisoperatsioonide vormid

Eelmistes osades vaatlesime kõige olulisemaid ühenduse vorme. Kuid sellel operatsioonil on ka teisi vorme, mida käsitleme järgmistes alajaotistes.

Teeta ühendus

Ühendusveeru võrdlustingimus ei pea olema võrdsus, vaid see võib olla mis tahes muu võrdlus. Kutsutakse ühendust, mis kasutab liitmise veergude võrdlemiseks üldtingimust teeta ühendus. Allolevas näites on kujutatud teeta liitumistoimingut, mis kasutab tingimust vähem kui. See päring tagastab kõik töötaja ja osakonna teabe kombinatsioonid juhtudel, kui töötaja kodukoht on tähestikulises järjekorras enne iga osakonna asukohta, kus töötaja töötab:

KASUTAGE SampleDb; VALI eesnimi, perekonnanimi, linn, asukoht FROM EmployeeEnh LIITUMINE linna osakonnaga

Selle päringu tulemus:

See näide võrdleb veergude Linn ja Asukoht vastavaid väärtusi. Tulemuse iga rida võrdleb veeru Linn väärtust tähestikulises järjekorras vastava veeru Asukoht väärtusega.

Ise liitumine või tabeli endaga ühendamine

Lisaks kahe või enama erineva tabeli ühendamisele saab ühele tabelile rakendada loomulikku liitmistoimingut. Selles toimingus liidetakse tabel iseendaga, kus võrreldakse üht tabeli veergu iseendaga. Veeru endaga võrdlemine tähendab, et tabeli nime kasutatakse kaks korda lause SELECT lauses FROM. Seetõttu on vaja kaks korda samale tabelinimele viidata. Seda saab teha kasutades vähemalt ühte varjunime. Sama kehtib veergude nimede kohta liitumistingimuses SELECT-lauses. Samanimeliste veergude eristamiseks peate kasutama kvalifitseeritud nimesid.

Allolev näide demonstreerib tabeli endaga ühendamist:

See näide valib kõik osakonnad (täieliku teabega), mis asuvad vähemalt ühe teise osakonnaga samas kohas. Selle päringu tulemus:

Siin sisaldab klausel FROM osakonnatabeli kahte varjunime: t1 ja t2. WHERE-klausli esimene tingimus määratleb liitumisveerud ja teine ​​eemaldab mittevajalikud duplikaadid, tagades iga osakonna võrdlemise teiste osakondadega.

Poolliitu

Poolliitmine sarnaneb loomuliku ühendusega, kuid tagastab ainult ühe tabeli kõigi ridade komplekti, millel on teises tabelis üks või mitu vastet. Poolühenduse kasutamine on näidatud allolevas näites:

Taotluse tulemus:

Nagu näete, sisaldab poolliitumise loend SELECT ainult tabeli Töötaja veerge. See on poolliitmise toimingu iseloomulik tunnus. Seda toimingut kasutatakse tavaliselt hajutatud päringute töötlemisel, et minimeerida edastatavate andmete hulka. Andmebaasimootor kasutab poolliitmise toimingut, et rakendada funktsioone, mida nimetatakse tähtliitumiseks.

Operaator LIITU kasutatakse kahe komplekti andmete üheks tulemuskomplektiks ühendamiseks. SELECT sooritamisel saab kasutada mitut erinevat tüüpi liitumisoperatsioone. Millised read tulemuskomplekti kaasatakse, sõltuvad liitumistoimingu tüübist ja selgelt määratletud liitumistingimusest. Ühenduse tingimus, s.o. tabeli ridade omavahelise sobitamise tingimus on loogiline avaldis.

Kui teil on vaja ühendada mitu tabelit, tuleb liitmistoimingut rakendada mitu korda järjest.

JOIN operaatori süntaks

Süntaks täiendava tabeli ühendamiseks päringuga operaatori abil LIITU võib esitada järgmisel kujul:

VALI väli1, väli1, [,... n] TAbelist 1 t1 (SISEMINE | (VASAKULE | PAREMLE | TÄIS) VÄLIMINE | RIST ) LIITUMINE Tabel 2 (SEES) | KASUTAMINE (välja_nimi [,... n]))

Enamikus DBMS-ides operaatori kasutamisel LIITU kombinatsioonis märksõnadega LEFT, RIGHT, FULL, võib VÄLIMISE operandi ära jätta. SISE operandi ei pea enamikus DBMS-ides kasutama.

Kui veergude nimed, millega tabelid on ühendatud, on samad, siis saab ON asemel kasutada KASUTAMINE. Operaatori jaoks RISTLIITUMINE tingimust ei täpsustata.

Testitabelid JOIN kontrollimiseks

Edasiste näidete jaoks loome kaks lihtsat testtabelit. Viitetabelid kasutajatele ja nende sõidukitele. Esimene tabel salvestab kasutaja ID ja tema nime (hüüdnime). Teises tabelis on autode nimekiri (identifikaator, nimi) ja nende omanike/kasutajate tunnused. Tuleb märkida, et kasutajal võib olla mitu autot või üldse mitte.

Kasutajate tabel

CREATE TABLE kasutajad (id int mitte null, nimi varchar(32) mitte null, primaarvõti (id)); - Sisestage tabelisse mitu kirjet sisestage kasutajate (id, nimi) väärtused (1, "alex"); sisestage kasutajatesse (id, nimi) väärtused (2, "piter"); sisestage kasutajate (id, nimi) väärtused (3, "serg"); sisestage kasutajate (id, nimi) väärtused (4, "olga"); sisestage kasutajate (id, nimi) väärtused (5, "ostap");

Auto laud

CREATE tabel autos (id int not null, -- auto identifikaatori nimi varchar(32) not null, -- auto name oid int int not null, -- omaniku identifikaator primaarvõti (id)); - Sisestage tabelisse mitu kirjet, sisestage autode (id, oid, nimi) väärtustesse (1, 1, "toyota camry"); sisestage autodesse (id, oid, nimi) väärtused (2, 1, "toyota prado"); sisestage autosse (id, oid, nimi) väärtused (3, 2, "renault megane"); sisestage autosse (id, oid, nimi) väärtused (4, 3, "nissan x-trail"); sisestage autosse (id, oid, nimi) väärtused (5, 4, "suzuki swift"); sisestage autosse (id, oid, nimi) väärtused (6, 4, "suzuki vitara");

Sisemine ühendus, SISEMINE

SISEMINE LIITUMINE on sisemine liiteoperaator kahe tabeli vahel. See on sümmeetriline, seega pole tabelite järjekord operaatori jaoks oluline.

Kohaldatav SISEMINE LIITUMINE et tuua välja ainult need read, mille puhul on põhi- ja ühendatud tabeli kirjete vahel vastavus. Tulemuse genereerimise algoritm: põhitabeli iga rida võrreldakse ühendatud tabeli iga reaga. Pärast seda kontrollitakse ühenduse seisukorda. Kui tingimus on tõene, lisatakse tulemuste komplekti vastav rida "liitunud".

Päring koos tulemuste komplekti veergude valikuga vali omanikuks u.name, kasutajalt a.name as auto u inner join autos a ON a.oid = u.id -- Päringu tulemuse omanik auto alex toyota camry alex toyota prado piter renault megane serg nissan x-trail olga suzuki swift olga suzuki vitara -- päring ilma tulemikomplekti veerge valimata valige * kasutajatest u sisemine liitumine autos a ON a.oid = u.id -- Päringu tulemuse id nimi id1 nimi1 oid 1 alex 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 3 renault megane 2 3 serg 4 nissan x-trail 3 4 olga 5 suzuki swift 4 4 olga 6 suzuki vitara 4

Tingimustele mittevastavate andmete saamiseks peate kasutama välist liitumist - VÄLINE LIITUMINE.

Välimine liitumine, VÄLILINE LIITUMINE

Kahe laua ühendamisel operaatori abil VÄLINE LIITUMINE tulemuskomplekt sisaldab tingimata ridu kas ühest või mõlemast tabelist. Märksõna OUTER võib ära jätta. MÄRKUS LEFT JOIN on identne LEFT OUTTER JOIN-ga.

Välisühendusi on kahte tüüpi. See VASAKU VÄLIMISE LIITUMINE Ja PAREM VÄLILINE LIITUMINE. Need operaatorid töötavad samamoodi. Erinevus seisneb selles, et LEFT JOIN kasutamisel on esmaseks tabeliks FROM-klausli järel määratud tabel. Määratud tingimustel lisatakse ühendatud tabeli andmed selle tabeli ridadele. Operaatori RIGHT OUTER JOIN jaoks on kõik täpselt vastupidine.

Välisühenduse operaator VÄLINE LIITUMINE ei ole sümmeetriline, seega on operaatori jaoks oluline tabelitevahelise seose loomise järjekord.

Näide LEFT OUTER JOIN operaatori kasutamisest

Valige u.name omanikuks, a.name kui auto kasutajatelt, kes lahkusite liituda autodega a ON a.oid = u.id -- Päringu tulemuse omanik auto alex toyota camry alex toyota prado piter renault megane serg nissan x-trail olga suzuki swift olga suzuki vitara ostap

Graafiliselt saab töö tulemust kujutada järgmiselt:

LEFT OUTER JOIN operaator koos filtreerimisega

Lisades eelmise näite koodile tingimuse “kus a.nimi on null”. Valikusse jääb ainult üks rekordiline "ostap", kuna see on ainus, millel pole autot määratletud.

Graafiliselt saab töö tulemust kujutada järgmiselt:

Ristliitumise operaator, RISTÜHENDAMINE

CROSS JOIN on ristliitumise operaator (Cartesiuse toode). Operaator on sümmeetriline ja tabelite järjekord ei ole operaatori jaoks oluline.

Tulemuste komplekt moodustatakse järgmiselt: ühe tabeli iga rida liidetakse teise tabeli iga reaga, mille tulemuseks on kahe tabeli kõikvõimalikud ridade kombinatsioonid. Meie näites saadakse tulemuseks 30 rida.

Valige * kasutajate hulgast cross join autos -- Päringu tulemuse ID nimi id1 nimi1 oid 1 alex 1 toyota camry 1 2 piter 1 toyota camry 1 3 serg 1 toyota camry 1 4 olga 1 toyota camry 1 5 ostap 1 toyota camry 2 toy1 prado 1 2 piter 2 toyota prado 1 3 serg 2 toyota prado 1 4 olga 2 toyota prado 1 5 ostap 2 toyota prado 1 . . .

Tippimistulemustes kuvatakse ainult 12 esimest rida.

See Oracle'i õpetus selgitab, kuidas seda kasutada LIITUB(sisemine ja välimine) Oracle'is koos süntaksi, visuaalsete illustratsioonide ja näidetega.

Kirjeldus

Oracle JOINSi kasutatakse andmete toomiseks mitmest tabelist. Oracle JOIN tehakse alati, kui kaks või enam tabelit on ühendatud SQL-lausega.

Oracle'i liitumisi on 4 erinevat tüüpi:

  • Oracle INNER JOIN (või mõnikord nimetatakse seda lihtsaks liitumiseks)
  • Oracle LEFT OUTTER JOIN (või mõnikord nimetatakse LEFT JOIN)
  • Oracle RIGHT OUTTER JOIN (või mõnikord nimetatakse seda RIGHT JOIN)
  • Oracle FULL OUTTER JOIN (või mõnikord nimetatakse seda FULL JOIN)

Nii et arutleme Oracle JOIN süntaksi üle, vaatame Oracle JOINSi visuaalseid illustratsioone ja uurime Oracle JOIN näiteid.

SISEMINE LIITUMINE (lihtne liitumine)

Tõenäoliselt olete juba kirjutanud avalduse, mis kasutab Oracle INNER JOIN. See on kõige levinum liitmise tüüp. Oracle INNER JOINS tagastab kõik read mitmest tabelist, kus liitumise tingimus on täidetud.

Süntaks

Oracle/PLSQL-i INNER JOIN süntaks on:

VALI veerud FROM tabelist1 SISEMINE JOIN tabel2 ON tabel1.veerg = tabel2.veerg;

Visuaalne illustratsioon

Sellel visuaalsel diagrammil tagastab Oracle INNER JOIN varjutatud ala:

Oracle INNER JOIN tagastaks kirjed, kus Tabel 1 ja tabel2 ristuvad.

Näide

Siin on näide Oracle'i sisemisest liitumisest:

See Oracle INNER JOIN näide tagastab kõik tarnijate ja tellimuste tabelite read, kus nii tarnijate kui ka tellimuste tabelites on sobiv tarnija_id väärtus.

Vaatame mõningaid andmeid, et selgitada, kuidas SISEMINE LIITUSED töötavad:

Meil on laud nimega tarnijad

tarnija_id Tarnija nimi
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

Meil on veel üks laud nimega korraldusi

Tellimuse ID tarnija_id tellimuse_kuupäev
500125 10000 2003/05/12
500126 10001 2003/05/13
500127 10004 2003/05/14

Kui käivitame allpool Oracle SELECT lause (mis sisaldab INNER JOIN):

VALI tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt SISEMINE LIITUMINE tellimused ON tarnijad.tarnija_id = tellimused.tarnija_id;

tarnija_id nimi tellimuse_kuupäev
10000 IBM 2003/05/12
10001 Hewlett Packard 2003/05/13

read jaoks Microsoft ja NVIDIA tarnija tabelist jäetakse välja, kuna tarnija_id 10002 ja 10003 ei eksisteeri mõlemas tabelis. Tellimuste tabelist jäetakse välja rida 500127 (order_id), kuna tarnija_id 10004 tarnijate tabelis ei eksisteeri.

Vana süntaks

Viimase märkusena tasub mainida, et ülaltoodud Oracle INNER JOIN näidet saab vanemat kaudset süntaksit kasutades ümber kirjutada järgmiselt (kuid soovitame siiski kasutada märksõna INNER JOIN süntaksit):

SELECT tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt, tellimustelt KUS tarnijad.tarnija_id = tellimused.tarnija_id;

VASAKU VÄLIMISE LIITUMINE

Teist tüüpi liitumist nimetatakse Oracle LEFT OUTER JOINiks. Seda tüüpi liitumine tagastab kõik VASAKpoolse tabeli read, mis on määratud tingimuses ON ja ainult

Süntaks

Oracle'i süntaks VASAKU VÄLIMISE LIITUMINE on:

SELECT veerud FROM tabel1 LEFT JOIN tabel2 ON tabel1.veerg = tabel2.veerg;

Mõnes andmebaasis on LEFT OUTER JOIN märksõnad asendatud LEFT JOIN-iga.

Visuaalne illustratsioon

Sellel visuaalsel diagrammil tagastab Oracle LEFT OUTER JOIN varjutatud ala:

Oracle LEFT OUTTER JOIN tagastab kõik kirjed Tabel 1 ja ainult need kirjed alates tabel2 mis ristuvad Tabel 1.

Näide

Siin on näide Oracle LEFT OUTER JOIN'ist:

See LEFT OUTER JOIN näide tagastaks kõik tarnijate tabelis olevad read ja ainult need read tellimuste tabelist, kus ühendatud väljad on võrdsed.

> tulemuste komplektis.

Vaatame mõningaid andmeid, et selgitada, kuidas LEFT OUTTER JOINS toimivad:

Meil on laud nimega tarnijad kahe väljaga (tarnija_id ja tarnija_nimi). See sisaldab järgmisi andmeid:

tarnija_id Tarnija nimi
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

korraldusi kolme väljaga (tellimuse_id, tarnija_id ja tellimuse_kuupäev). See sisaldab järgmisi andmeid:

Tellimuse ID tarnija_id tellimuse_kuupäev
500125 10000 2003/05/12
500126 10001 2003/05/13

Kui käivitame alloleva SELECT-lause (mis sisaldab LEFT OUTER JOIN):

VALI tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt VASAKUID VÄLISEMA JOIN tellimused tarnijad.tarnija_id = tellimused.tarnija_id;

Meie tulemuste komplekt näeks välja selline:

tarnija_id Tarnija nimi tellimuse_kuupäev
10000 IBM 2003/05/12
10001 Hewlett Packard 2003/05/13
10002 Microsoft
10003 NVIDIA

read jaoks Microsoft ja NVIDIA kaasatakse, kuna kasutati LEFT OUTTER JOIN. Siiski märkate, et nende kirjete väli order_date sisaldab a väärtus.

Vana süntaks

Viimase märkusena tasub mainida, et ülaltoodud LEFT OUTER JOIN näite saab ümber kirjutada, kasutades vanemat kaudset süntaksit, mis kasutab välimise liitumise operaatorit (+), järgmiselt (kuid soovitame siiski kasutada võtmesõna LEFT OUTER JOIN süntaksit):

SELECT tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt, tellimustelt WHERE tarnijad.tarnija_id = tellimused.tarnija_id(+);

PAREM VÄLILINE LIITUMINE

Teist tüüpi liitumist nimetatakse Oracle RIGHT OUTER JOINiks. Seda tüüpi liitumine tagastab kõik PAREMpoolse tabeli read, mis on määratud tingimuses ON ja ainult need teise tabeli read, kus ühendatud väljad on võrdsed (liitmise tingimus on täidetud).

Süntaks

Oracle'i süntaks PAREM VÄLILINE LIITUMINE on:

SELECT veerud FROM tabelist1 RIGHT JOIN tabel2 ON tabel1.veerg = tabel2.veerg;

Mõnes andmebaasis asendatakse märksõnad RIGHT OUTER JOIN märksõnaga RIGHT JOIN.

Visuaalne illustratsioon

Sellel visuaalsel diagrammil tagastab Oracle RIGHT OUTER JOIN varjutatud ala:

Oracle RIGHT OUTER JOIN tagastab kõik kirjed tabel2 ja ainult need kirjed alates Tabel 1 mis ristuvad tabel2.

Näide

Siin on näide Oracle RIGHT OUTER JOIN'ist:

See RIGHT OUTER JOIN näide tagastaks kõik read tellimuste tabelist ja ainult need read tarnijate tabelist, kus ühendatud väljad on võrdsed.

Kui tellimuste tabelis tarnija_id väärtust tarnijate tabelis ei ole, kuvatakse kõik tarnijate tabeli väljad kujul > tulemuste komplektis.

Vaatame mõningaid andmeid, et selgitada, kuidas RIGHT OUTTER JOINS toimivad:

Meil on laud nimega tarnijad kahe väljaga (tarnija_id ja tarnija_nimi). See sisaldab järgmisi andmeid:

tarnija_id Tarnija nimi
10000 Apple
10001 Google

Meil on teine ​​laud nimega korraldusi kolme väljaga (tellimuse_id, tarnija_id ja tellimuse_kuupäev). See sisaldab järgmisi andmeid:

Tellimuse ID tarnija_id tellimuse_kuupäev
500125 10000 2013/08/12
500126 10001 2013/08/13
500127 10002 2013/08/14

Kui käivitame alloleva lause SELECT (mis sisaldab RIGHT OUTER JOIN):

SELECT tellimused.tellimuse_id, tellimused.tellimuse_kuupäev, tarnijad.tarnija_nimi tarnijatelt PAREM VÄLISEMA JOIN tellimused tarnijad.tarnija_id = tellimused.tarnija_id;

Meie tulemuste komplekt näeks välja selline:

Tellimuse ID tellimuse_kuupäev Tarnija nimi
500125 2013/08/12 Apple
500126 2013/08/13 Google
500127 2013/08/14

Rida jaoks 500127 (order_id) lisataks, kuna kasutati RIGHT OUTTER JOIN. Siiski märkate, et selle kirje tarnija_nimi väli sisaldab a väärtus.

Vana süntaks

Viimase märkusena tasub mainida, et ülaltoodud RIGHT OUTER JOIN näite saab ümber kirjutada, kasutades vanemat kaudset süntaksit, mis kasutab välimise liitumise operaatorit (+), järgmiselt (kuid soovitame siiski kasutada märksõna süntaksit RIGHT OUTER JOIN):

SELECT tellimused.tellimuse_id, tellimused.tellimuse_kuupäev, tarnijad.tarnija_nimi tarnijatelt, tellimused KUS tarnijad.tarnija_id(+) = tellimused.tarnija_id;

TÄIELIK VÄLILINE LIITUMINE

Teist tüüpi liitumist nimetatakse Oracle FULL OUTTER JOINiks. Seda tüüpi liitmine tagastab kõik read VASAK- ja PAREMApoolsest tabelist nullpunktidega, kui liitumise tingimus ei ole täidetud.

Süntaks

Oracle'i süntaks TÄIELIK VÄLILINE LIITUMINE on:

VALI veerud FROM tabelist1 TÄIELIK LIITUMINE tabel2 ON tabel1.veerg = tabel2.veerg;

Mõnes andmebaasis asendatakse märksõnad FULL OUTER JOIN märksõnaga FULL JOIN.

Visuaalne illustratsioon

Sellel visuaalsel diagrammil tagastab Oracle FULL OUTER JOIN varjutatud ala:

Oracle FULL OUTTER JOIN tagastab mõlemad kirjed Tabel 1 ja tabel2.

Näide

Siin on näide Oracle FULL OUTER JOIN'ist:

See FULL OUTER JOIN näide tagastab kõik read tarnijate tabelist ja kõik read tellimuste tabelist ning alati, kui liitumise tingimus ei ole täidetud, laiendataks neile tulemuste komplekti kuuluvatele väljadele.

Kui tarnija_id väärtust tarnijate tabelis ei ole tellimuste tabelis, kuvatakse kõik tellimuste tabeli väljad kujul > tulemuste komplektis. Kui tellimuste tabelis tarnija_id väärtust tarnijate tabelis ei ole, kuvatakse kõik tarnijate tabeli väljad kujul tulemuste komplektis.

Vaatame mõningaid andmeid, et selgitada, kuidas TÄIELISED VÄLISED ÜHENDUSED töötavad:

Meil on laud nimega tarnijad kahe väljaga (tarnija_id ja tarnija_nimi). See sisaldab järgmisi andmeid:

tarnija_id Tarnija nimi
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

Meil on teine ​​laud nimega korraldusi kolme väljaga (tellimuse_id, tarnija_id ja tellimuse_kuupäev). See sisaldab järgmisi andmeid:

Tellimuse ID tarnija_id tellimuse_kuupäev
500125 10000 2013/08/12
500126 10001 2013/08/13
500127 10004 2013/08/14

Kui käivitame SELECT-lause (mis sisaldab FULL OUTER JOIN-i):

VALIK tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt TÄIELIK VÄLISEL JOIN tellimused ON tarnijad.tarnija_id = tellimused.tarnija_id;

Meie tulemuste komplekt näeks välja selline:

tarnija_id Tarnija nimi tellimuse_kuupäev
10000 IBM 2013/08/12
10001 Hewlett Packard 2013/08/13
10002 Microsoft
10003 NVIDIA
2013/08/14

read jaoks Microsoft ja NVIDIA kaasatakse, kuna kasutati FULL OUTER JOIN. Siiski märkate, et nende kirjete väli order_date sisaldab a väärtus.

Kaasatakse ka rida tarnija_id 10004, kuna kasutati FULL OUTER JOIN. Siiski märkate, et nende kirjete väljad tarnija_id ja tarnija_nimi sisaldavad a väärtus.

Vana süntaks

Viimase märkusena tasub mainida, et ülaltoodud FULL OUTER JOIN näidet ei oleks saanud vanas süntaksis kirjutada ilma

See Oracle'i õpetus selgitab, kuidas seda kasutada LIITUMISED (SISEMINE ja VÄLIMINE) Oracle'is koos süntaksi ja näidetega.

Kirjeldus

Oracle LIITUB kasutatakse andmete toomiseks mitmest tabelist. LIITU käivitatakse alati, kui kaks või enam tabelit on ühendatud SQL-lausega.

Oracle'i liitumisi on 4 erinevat tüüpi:

Vaatame Oracle JOIN süntaksit ja uurime ka Oracle JOIN näiteid.

SISEMINE LIITUMINE (lihtne liitumine)

Tõenäoliselt olete juba kirjutanud päringuid, mis kasutavad Oracle INNER JOIN. See on kõige levinum ühenduse tüüp. Oracle INNER JOINS tagastab kõik read mitmest tabelist, kus liitumistingimused on täidetud.

Süntaks

INNER JOIN süntaks Oracle'is/PLSQL-is:

VALI veerud
tabelist1
SISEMINE JOIN tabel2

Sellel joonisel tagastab Oracle INNER JOIN varjutatud piirkonna:

Oracle INNER JOIN tagastab kirjed, kus tabel1 ja tabel2 ristuvad.

Näide

Allpool on näide Oracle INNER JOIN'ist:

Oracle PL/SQL

VALI tarnijad.tarnija_id,

tarnijad.tarnija_nimi,

tellimused.tellimuse_kuupäev

tarnijatelt

INNER JOIN tellimused

See Oracle INNER JOIN näide tagastab kõik tarnijate ja tellimuste tabelite read, kus mõlemas tabelis on vastavad tarnija_id välja väärtused.

Vaatame mõningaid andmeid, et mõista, kuidas INNER JOIN töötab:

Kui täidame Oracle SELECT-lause (mis sisaldab INNER JOIN-i) allpool:

Oracle PL/SQL

VALI tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt SISEMINE LIITUMINE tellimused ON tarnijad.tarnija_id = tellimused.tarnija_id;

Tarnijate tabelis olevad Microsofti ja NVIDIA read jäetakse välja, kuna tarnija_id väärtused 10002 ja 10003 puuduvad mõlemas tabelis. Tellimuste tabeli rida order_id 500127 jäetakse välja, kuna tarnija_id 10004 tarnijate tabelis ei eksisteeri.

Vana süntaks

Viimase märkusena tasub märkida, et ülaltoodud Oracle INNER JOIN näite saab vana kaudse süntaksi abil ümber kirjutada järgmiselt (kuid soovitatav on kasutada INNER JOIN süntaksit):

Teist tüüpi liitumist nimetatakse Oracle LEFT OUTER JOIN. Seda tüüpi ühendus tagastab kõik read tabelitest, mille vasakühendus on määratud klauslis ON, ja ainult need read teisest tabelist, kus liidetavad väljad on võrdsed.

Süntaks

Oracle'i LEFT OUTTER JOIN süntaks:

VALI veerud
tabelist1
LEFT JOIN tabel2
ON tabel1.veerg = tabel2.veerg;

Mõnes andmebaasis asendatakse LEFT OUTTER JOIN sõnaga LEFT JOIN.

Sellel joonisel tagastab Oracle LEFT OUTER JOIN varjutatud piirkonna:

Oracle LEFT OUTER JOIN tagastab kõik tabelist 1 olevad kirjed ja ainult need tabelist 2 olevad kirjed, mis ristuvad tabelist 1.

Näide

Oracle PL/SQL

VALI tarnijad.tarnija_id,

tarnijad.tarnija_nimi,

tellimused.tellimuse_kuupäev

tarnijatelt

LEFT OUTTER JOIN tellimused

ON tarnijad.tarnija_id=tellimused.tarnija_id;

See LEFT OUTTER JOIN näide tagastab kõik tarnijate tabelis olevad read ja ainult need read tellimuste tabelist, kus liidetavad väljad on võrdsed.

Kui tarnija_id väärtust tarnijate tabelis tellimuste tabelis ei eksisteeri, kuvatakse tulemuste komplektis kõik tellimuste tabeli väljad NULL-ina.

Vaatame mõningaid andmeid, et mõista, kuidas LEFT OUTTER JOIN töötab:

Meil on tarnijate tabel kahe väljaga (tarnija_id ja tarnija_nimi), mis sisaldab järgmisi andmeid:

Kui täidame Oracle SELECT lause (mis sisaldab LEFT OUTER JOIN):

Oracle PL/SQL

VALI tarnijad.tarnija_id, tarnijad.tarnija_nimi, tellimused.tellimuse_kuupäev tarnijatelt VASAKUID VÄLISEMA JOIN tellimused tarnijad.tarnija_id = tellimused.tarnija_id;

Microsofti ja NVIDIA read kaasatakse, kuna kasutati LEFT OUTTER JOIN. Siiski märkate, et nende kirjete väli order_date on NULL.

Teist tüüpi liitumist nimetatakse Oracle RIGHT OUTER JOINiks. Seda tüüpi ühendus tagastab kõik read tabelitest, mille parempoolne ühendus on määratud klauslis ON, ja ainult need read teisest tabelist, kus liidetavad väljad on võrdsed.

Süntaks

Oracle RIGHT OUTER JOIN süntaks:

VALI veerud
tabelist1
PAREMALE LIITUMINE tabel2
ON tabel1.veerg = tabel2.veerg;

Mõnes andmebaasis asendatakse RIGHT OUTER JOIN sõnaga RIGHT JOIN.

Sellel joonisel tagastab Oracle RIGHT OUTER JOIN varjutatud piirkonna:

Oracle RIGHT OUTER JOIN tagastab kõik tabelist 2 olevad kirjed ja ainult need tabelist 1 olevad kirjed, mis ristuvad tabelist 2.

Näide

Allpool on näide Oracle RIGHT OUTER JOIN'ist:

Oracle PL/SQL

SELECT orders.order_id,

orders.order_date,

tarnijad.tarnija_nimi

tarnijatelt

RIGHT OUTTER JOIN tellimused

ON tarnijad.tarnija_id=tellimused.tarnija_id;

See RIGHT OUTER JOIN näide tagastab kõik read tellimuste tabelist ja ainult need read tarnijate tabelist, kus liidetavad väljad on võrdsed.

Kui tellimuste tabelis tarnija_id väärtust tarnijate tabelis ei eksisteeri, kuvatakse tulemuste komplektis kõik tarnijate tabeli väljad NULL-ina.

Vaatame mõningaid andmeid, et mõista, kuidas RIGHT OUTTER JOIN töötab:

Meil on tarnijate tabel kahe väljaga (tarnija_id ja tarnija_nimi), mis sisaldab järgmisi andmeid:

Kui täidame Oracle SELECT lause (mis sisaldab RIGHT OUTER JOIN) allpool:

Oracle PL/SQL

SELECT tellimused.tellimuse_id, tellimused.tellimuse_kuupäev, tarnijad.tarnija_nimi tarnijatelt PAREM VÄLISEMA JOIN tellimused tarnijad.tarnija_id = tellimused.tarnija_id;

Tellimuse ID 500127 rida kaasatakse, kuna kasutati RIGHT OUTTER JOINS. Siiski märkate, et selle kirje tarnija_nimi väli on NULL.

Teist tüüpi liitumist nimetatakse Oracle FULL OUTER JOIN. Seda tüüpi liitumine tagastab kõik read vasakpoolsest tabelist ja parempoolsest tabelist NULL väärtustega kohas, kus liitumise tingimus ei ole täidetud.

Süntaks

Oracle'i FULL OUTTER JOIN süntaks:

VALI veerud
tabelist1
TÄIELIK LIITUMINE tabel2
ON tabel1.veerg = tabel2.veerg;

Mõnes andmebaasis asendatakse FULL OUTTER JOIN-id FULL JOIN-idega.

Sellel pildil tagastab FULL OUTER JOIN varjutatud ala:

Oracle FULL OUTER JOIN tagastab kõik tabelite tabel1 ja tabel2 kirjed.

Jaga: