SQLite liitumistabelid: sisemine, looduslik, vasakpoolne, rist (näited)

Lang L: none (table-of-contents):

Anonim

SQLite toetab erinevaid SQL-i ühenduste tüüpe, näiteks INNER JOIN, LEFT OUTER JOIN ja CROSS JOIN. Igat tüüpi JOIN-i kasutatakse erinevates olukordades, nagu näeme selles õpetuses.

Selles õpetuses saate teada

  • Sissejuhatus SQLite JOIN -lausesse
  • SISSE LIITU
  • LIITU ... KASUTAMINE
  • LOODUSLIK LIITUMINE
  • VASEM VÄLIS LIITUMINE
  • RISTI LIITU

Sissejuhatus SQLite JOIN -lausesse

Kui töötate mitme tabeliga andmebaasi kallal, peate sageli neist mitmest tabelist andmeid hankima.

JOIN-klausli abil saate linkides ühendada kaks või enam tabelit või alaküsimust. Samuti saate määratleda, millise veeru abil peate tabelid linkima ja milliste tingimustega.

Igal JOIN-klauslil peab olema järgmine süntaks:

Iga liitumisklausel sisaldab:

  • Tabel või alaküsimus, mis on vasakpoolne tabel; tabel või alampäring enne liitmisklauslit (sellest vasakul).
  • JOIN operaator - määrake liitumise tüüp (INNER JOIN, LEFT OUTER JOIN või CROSS JOIN).
  • JOIN-piirang - pärast liidetavate tabelite või alampäringute määramist peate määrama liitumispiirangu, mis on tingimus, mille korral sellele tingimusele vastavad sobivad read valitakse sõltuvalt liitumistüübist.

Pange tähele, et kõigi järgmiste näidete puhul peate käivitama sqlite3.exe ja avama vooluühenduse näidisandmebaasiga:

1. samm) Selles etapis

  1. Avage Minu arvuti ja navigeerige järgmisse kataloogi " C: \ sqlite " ja
  2. Seejärel avage " sqlite3.exe ":

Samm 2) Avage järgmise käsuga andmebaas " TutorialsSampleDB.db ":

Nüüd olete andmebaasis valmis käivitama mis tahes tüüpi päringuid.

SQLite INNER LIITU

INNER JOIN tagastab ainult read, mis vastavad liitumistingimusele ja kõrvaldavad kõik muud read, mis ei vasta liitumistingimusele.

Näide

Järgmises näites ühendame kaks tabelit " Õpilased " ja " Osakonnad " koos DepartmentId-ga, et saada iga õpilase osakonna nimi järgmiselt:

VALIÕpilased. Õpilase nimi,Osakonnad. Osakonna nimiÕpilasteltINNER JOIN Osakonnad on üliõpilased.DepartmentId = Departments.DepartmentId;

Koodi selgitus:

INNER JOIN töötab järgmiselt:

  • Klauslis Select saate kahest viidatud tabelist valida mis tahes veeru, mille soovite valida.
  • Klausel INNER JOIN kirjutatakse pärast esimest tabelit, millele on viidatud klausliga "From".
  • Seejärel määratakse liitumistingimus olekuga ON.
  • Viidatud tabelite jaoks saab määrata varjunimed.
  • Sisemine sõna on valikuline, võite lihtsalt kirjutada LIITU.

Väljund:

  • INNER JOIN toodab kirjed mõlemalt - üliõpilastelt ja osakonna tabelitelt, mis vastavad tingimusele, mis on " S tudents.DepartmentId = Departments.DepartmentId ". Vastamata ridu ignoreeritakse ja neid ei kaasata tulemusse.
  • Seetõttu tagastati selle päringu põhjal IT, matemaatika ja füüsika osakondadega ainult 8 õpilast 10 õpilasest. Kusjuures õpilasi "Jena" ja "George" ei kaasatud, kuna neil on null osakonna ID, mis ei ühti osakondade tabeli veeruga departmentId. Järgmiselt:

SQLite LIITU ... KASUTAMINE

INNER JOIN saab koondamise vältimiseks kirjutada klausli "USING" abil, nii et selle asemel, et kirjutada "ON Students.DepartmentId = Departments.DepartmentId", võite lihtsalt kirjutada "USING (DepartmentID)".

Võite kasutada "LIITU ... KASUTADA" alati, kui liitumistingimuses võrreldavad veerud on sama nimega. Sellistel juhtudel pole vaja neid tingimusega korrata ja öelge lihtsalt veergude nimed ning SQLite tuvastab selle.

Erinevus sisemise liitumise ja liitumise vahel… KASUTAMINE:

Koos "LIITU

... KASUTADES "te ei kirjuta liitumistingimust, vaid kirjutate lihtsalt liitumisveeru, mis on kahe ühendatud tabeli vahel ühine, selle asemel, et kirjutada tabel1" INNER JOIN table2 ON table1.cola = table2.cola "kirjutame selle nagu" tabel1 LIITU tabel2 KASUTAMINE (koola) ".

Näide

Järgmises näites ühendame kaks tabelit " Õpilased " ja " Osakonnad " koos DepartmentId-ga, et saada iga õpilase osakonna nimi järgmiselt:

VALIÕpilased. Õpilase nimi,Osakonnad. Osakonna nimiÕpilasteltINNER JOIN Osakonnad KASUTADES (DepartmentId);

Selgitus

  • Erinevalt eelmisest näitest ei kirjutanud me " ON Students.DepartmentId = Departments.DepartmentId ". Kirjutasime just " USING (DepartmentId) ".
  • SQLite järeldab liitumistingimuse automaatselt ja võrdleb DepartmentId mõlemast tabelist - üliõpilased ja osakonnad.
  • Saate seda süntaksi kasutada alati, kui kaks võrreldavat veergu on sama nimega.

Väljund

  • See annab teile sama täpse tulemuse kui eelmine näide:

SQLite LOODUSLIK LIITUMINE

LOODUSLIK LIITUMINE sarnaneb JOIN… KASUTAMISEGA, erinevus seisneb selles, et see testib automaatselt mõlemas tabelis eksisteeriva iga veeru väärtuste võrdsust.

Erinevus sisemise liitumise ja loodusliku liitumise vahel:

  • I n sisemine liituda, siis pead määrama liituda seisukorras mille sisemine liituda kasutuseks liituda kaks tabelit. Kui loomulikus ühenduses ei kirjuta te liitumistingimust. Kirjutate lihtsalt kahe tabeli nimed ilma tingimusteta. Seejärel proovib loomulik liitumine automaatselt mõlema tabeli iga veeru väärtuste võrdsust. Loomulik liitumine järeldab liitumistingimuse automaatselt.
  • LOOMULIKUS LIITUMISES sobitatakse mõlema tabeli samanimelised veerud omavahel. Näiteks kui meil on kaks tabelit, millel on kaks ühist veerunime (kaks veergu eksisteerivad ühesuguse nimega kahes tabelis), siis loomulik liitumine ühendab need kaks tabelit mõlema veeru väärtuste võrdlemisel, mitte ainult ühest veerg.

Näide

VALIÕpilased. Õpilase nimi,Osakonnad. Osakonna nimiÕpilasteltLooduslikud JOIN-osakonnad;

Selgitus

  • Me ei pea veerunimedega kirjutama liitumistingimust (nagu me tegime INNER JOIN-is). Me ei pidanud kordagi veeru nime kirjutama (nagu me tegime jaotises JOIN USING).
  • Loomulik liitumine skaneerib mõlemad tabelid mõlemad veerud. See tuvastab, et tingimus peaks koosnema DepartmentId võrdlemisest mõlemast tabelist Student ja Department.

Väljund

  • Natural JOIN annab teile sama täpse väljundi kui väljund, mille saime näidetest INNER JOIN ja JOIN USING. Sest meie näites on kõik kolm päringut samaväärsed. Kuid mõnel juhul on väljund erinev sisemisest ühendamisest kui loomulikul ühendamisel. Näiteks kui samade nimedega tabeleid on rohkem, sobib loomulik liitumine kõigi veergudega üksteise vastu. Sisemine liitumine sobib aga ainult liitumistingimuse veergudega (lisateavet järgmise lõigu kohta; sisemise ühendamise ja loodusliku ühendamise vahe).

SQLite VASAKU VÄLISLIITUMINE

SQL-i standard määratleb kolm tüüpi VÄLISLIITUMISI: VASAK, PAREM ja TÄIS, kuid SQLite toetab ainult VASAKU VÄLJUNEMIST.

Jaotises LEFT OUTER JOIN lisatakse kõik vasakpoolsest tabelist valitud veergude väärtused päringu tulemusse, nii et sõltumata väärtusest, mis vastab liitumistingimusele või mitte, lisatakse see tulemusse.

Nii et kui vasakul tabelil on 'n' rida, on päringu tulemustel 'n' rida. Parempoolsest tabelist pärinevate veergude väärtuste puhul sisaldab aga väärtus null, kui mõni väärtus, mis ei vasta liitumistingimusele.

Niisiis saate ridade arvu, mis võrdub vasakpoolse liitumise ridade arvuga. Nii et saate mõlemalt tabelilt sobivad read (näiteks tulemused INNER JOIN), lisaks vasakpoolse tabeli mittevastavad read.

Näide

Järgmises näites proovime "LEFT JOIN" liituda kahe tabeliga "Student" ja "Departement":

VALIÕpilased. Õpilase nimi,Osakonnad. Osakonna nimiÕpilastelt - see on vasak tabelLEFT JOIN Osakonnad on üliõpilased.DepartmentId = Departments.DepartmentId;

Selgitus

  • LEFT JOIN süntaks on sama mis INNER JOIN; kirjutate kahe tabeli vahele LEFT JOIN ja siis tuleb liitumistingimus pärast ON-klauslit.
  • Esimene tabel alates klauslist on vasak tabel. Kusjuures teine ​​vasakpoolse ühendamise järel määratud tabel on parem tabel.
  • Klausel OUTER on vabatahtlik; LEFT OUTER JOIN on sama mis LEFT JOIN.

Väljund

  • Nagu näete, on lisatud kõik õpilaste tabeli read, mis on kokku 10 õpilast. Isegi kui neljandat ja viimast üliõpilast, Jena ja George departmentIds tabelis Osakonnad ei eksisteeri, on need ka kaasatud.
  • Nendel juhtudel on nii Jena kui ka George'i departemangu väärtus väärtus "null", kuna osakondade tabelis pole osakonna nime, mis vastaks nende osakonna ID väärtusele.

Anname eelmise päringu vasakpoolse ühendamise abil sügavama selgituse, kasutades Van-diagramme:

LEFT JOIN annab kõigile õpilastele õpilaste tabelist nimed, isegi kui õpilasel on osakonna ID, mida osakondade tabelis pole. Niisiis, päring ei anna teile ainult INNER JOIN'ina sobivaid ridu, vaid annab teile lisaosa, millel on vasakpoolse tabeli, mis on õpilaste tabel, kattumatud read.

Pange tähele, et mis tahes õpilasenimel, millel pole vastavat osakonda, on osakonna nime väärtus "null", kuna sellele pole ühtegi väärtust ja need väärtused on väärtused mittevastavate ridade väärtustes.

SQLite RISTI LIITU

CROSS JOIN annab kahe ühendatud tabeli valitud veergude jaoks ristkülikukujulise toote, sobitades kõik esimese tabeli väärtused kõigi teise tabeli väärtustega.

Nii et iga esimese tabeli väärtuse eest saate teisest tabelist 'n' vasted, kus n on teise tabeli ridade arv.

Erinevalt INNER JOIN ja LEFT OUTER JOIN ei pea te CROSS JOIN-ga liitumistingimust määrama, sest SQLite ei vaja seda CROSS JOIN-i jaoks.

SQLite annab loogilised tulemused, ühendades kõik esimese tabeli väärtused kõigi teise tabeli väärtustega.

Näiteks kui valisite veeru esimesest tabelist (colA) ja teise veeru teisest tabelist (colB). ColA sisaldab kahte väärtust (1,2) ja colB sisaldab ka kahte väärtust (3,4).

Siis on CROSS JOIN tulemus neli rida:

  • Kaks rida, ühendades colA esimese väärtuse, mis on 1, ja colB (3,4) kahe väärtusega, milleks on (1,3), (1,4).
  • Samamoodi kaks rida, ühendades colA teise väärtuse, mis on 2, colB (3,4) kahe väärtusega, mis on (2,3), (2,4).

Näide

Järgmises päringus proovime CROSS JOINi õpilaste ja osakondade tabelite vahel:

VALIÕpilased. Õpilase nimi,Osakonnad. Osakonna nimiÕpilasteltCROSS JOIN osakonnad;

Selgitus

  • Valimisklauslis valisime just õpilaste tabelist kaks veergu "õpilase nimi" ja osakondade tabelist "osakonna nimi".
  • Ristühenduse jaoks ei täpsustanud me ühtegi liitumistingimust, vaid kaks tabelit koos nende keskel olevaga CROSS JOIN.

Väljund:

Nagu näete, on tulemuseks 40 rida; 10 väärtust õpilaste tabelist vastasid osakondade tabeli 4 osakonnale. Järgmiselt:

  • Osakondade tabeli nelja osakonna neli väärtust sobisid esimese õpilase Micheliga.
  • Osakondade tabeli nelja osakonna neli väärtust kattusid teise õpilase Johniga.
  • Osakondade tabeli nelja osakonna neli väärtust klappisid kolmanda õpilase Jackiga.

    … ja nii edasi.

Kokkuvõte

SQLite JOIN-ide abil saate linkida ühe või mitu tabelit või alampäringut, et valida veerud mõlemast tabelist või alampäringust.