SQLite atbalsta dažāda veida SQL savienojumus, piemēram, INNER JOIN, LEFT OUTER JOIN un CROSS JOIN. Katrs JOIN veids tiek izmantots atšķirīgai situācijai, kā mēs redzēsim šajā apmācībā.
Šajā apmācībā jūs uzzināsiet
- Ievads SQLite JOIN klauzulā
- IEKŠĒJA PIEVIENOTIES
- PIEVIENOTIES ... LIETOŠANA
- DABISKS PIEVIENOŠANĀS
- PA KREISO ĀRĒJO PIEVIENOŠANOS
- PĀRKRUSIES PIEVIENOTIES
Ievads SQLite JOIN klauzulā
Strādājot ar datu bāzi ar vairākām tabulām, jums bieži jāiegūst dati no šīm vairākām tabulām.
Izmantojot klauzulu JOIN, varat saistīt divas vai vairākas tabulas vai apakškomandas, pievienojot tām. Varat arī definēt, pēc kuras kolonnas jums ir jāsaista tabulas un ar kādiem nosacījumiem.
Jebkurai JOIN klauzulai ir jābūt šādai sintaksei:
Katrā pievienošanās klauzulā ir:
- Tabula vai apakšvaicājums, kas ir kreisā tabula; tabula vai apakšvaicājums pirms pievienošanās klauzulas (tās kreisajā pusē).
- JOIN operators - norādiet pievienošanās veidu (INNER JOIN, LEFT OUTER JOIN vai CROSS JOIN).
- JOIN-ierobežojums - pēc tam, kad esat norādījis pievienojamās tabulas vai apakšvaicājumus, jums jānorāda pievienošanās ierobežojums, kas būs nosacījums, saskaņā ar kuru tiks atlasītas atbilstošās rindas, kas atbilst šim nosacījumam atkarībā no pievienošanās veida.
Ņemiet vērā, ka visiem šiem piemēriem ir jāpalaiž sqlite3.exe un jāatver savienojums ar datu bāzes paraugu kā plūstošu:
1. solis) Šajā solī
- Atveriet Mans dators un dodieties uz šādu direktoriju " C: \ sqlite " un
- Pēc tam atveriet " sqlite3.exe ":
2. solis) Atveriet datubāzi " TutorialsSampleDB.db " ar šādu komandu:
Tagad esat gatavs datu bāzē palaist jebkura veida vaicājumus.
SQLite INNER PIEVIENOTIES
INNER JOIN atgriež tikai tās rindas, kas atbilst pievienošanās nosacījumam un izslēdz visas citas rindas, kas neatbilst pievienošanās nosacījumam.
Piemērs
Šajā piemērā mēs pievienosim divas tabulas " Studenti " un " Departamenti " ar DepartmentId, lai iegūtu katra studenta nodaļas nosaukumu šādi:
SELECTStudenti.StudentName,Departments.DepartmentNameNO studentiemINNER JOIN Departamenti ON Students.DepartmentId = Departments.DepartmentId;
Koda skaidrojums:
INNER JOIN darbojas šādi:
- Klauzulā Atlasiet abas atsauces tabulas, kuras vēlaties atlasīt.
- INNER JOIN klauzula tiek rakstīta aiz pirmās tabulas, uz kuru ir atsauce ar klauzulu “From”.
- Tad pievienošanās nosacījums tiek norādīts ar ON.
- Atsauces tabulām var norādīt aizstājvārdus.
- Iekšējais vārds nav obligāts, jūs varat vienkārši rakstīt PIEVIENOTIES.
Izeja:
- INNER JOIN veido ierakstus no abiem - studentiem un katedras tabulām, kas atbilst nosacījumam " S tudents.DepartmentId = Departments.DepartmentId ". Nesaskaņotās rindas tiks ignorētas un netiks iekļautas rezultātā.
- Tāpēc IT, matemātikas un fizikas nodaļās no šī vaicājuma tika atgriezti tikai 8 studenti no 10 studentiem. Tā kā studenti "Jena" un "George" netika iekļauti, jo viņiem ir nulles nodaļas ID, kas neatbilst departamenta tabulas kolonnai DepartmentId. Kā sekojošais:
SQLite PIEVIENOTIES ... LIETOŠANA
INNER JOIN var uzrakstīt, izmantojot klauzulu "USING", lai izvairītos no liekā darba, tāpēc tā vietā, lai rakstītu "ON Students.DepartmentId = Departments.DepartmentId", jūs varat vienkārši uzrakstīt "USING (DepartmentID)".
Varat izmantot “PIEVIENOTIES… LIETOŠANU” ikreiz, kad pievienošanās nosacījumā salīdzināmās kolonnas ir ar tādu pašu nosaukumu. Šādos gadījumos nav nepieciešams tos atkārtot, izmantojot nosacījumu on un vienkārši norādiet kolonnu nosaukumus, un SQLite to noteiks.
Atšķirība starp INNER JOIN un JOIN… LIETOŠANA:
Ar "PIEVIENOTIES
... IZMANTOJOT "jūs nerakstāt pievienošanās nosacījumu, jūs vienkārši rakstāt kolonnu" Pievienoties ", kas ir kopīgs starp abām savienotajām tabulām, nevis rakstāt tabulu1" INNER JOIN table2 ON table1.cola = table2.cola "mēs to rakstām tāpat kā" tabula1 PIEVIENOTIES tabula2 LIETOŠANA (kola) ".Piemērs
Šajā piemērā mēs pievienosim divas tabulas " Studenti " un " Departamenti " ar DepartmentId, lai iegūtu katra studenta nodaļas nosaukumu šādi:
SELECTStudenti.StudentName,Departments.DepartmentNameNO studentiemINNER JOIN Departamenti LIETOŠANA (DepartmentId);
Paskaidrojums
- Atšķirībā no iepriekšējā piemēra, mēs nerakstījām “ ON Students.DepartmentId = Departments.DepartmentId ”. Mēs tikko uzrakstījām " USING (DepartmentId) ".
- SQLite automātiski secina pievienošanās nosacījumu un salīdzina DepartmentId no abām tabulām - Studenti un Departamenti.
- Šo sintaksi varat izmantot ikreiz, kad abas salīdzinātās kolonnas ir ar vienu un to pašu nosaukumu.
Rezultāts
- Tas dos jums tādu pašu precīzu rezultātu kā iepriekšējais piemērs:
SQLite DABISKA PIEVIENOŠANĀS
DABISKS PIEVIENOŠANĀS ir līdzīgs PIEVIENOŠANĀS ... LIETOŠANAI, atšķirība ir tā, ka tas automātiski pārbauda vienādību starp katras kolonnas vērtībām, kas pastāv abās tabulās.
Atšķirība starp INNER JOIN un NATURAL JOIN
- I INNER LOIN, jums jānorāda savienojuma nosacījums, kuru iekšējā savienošana izmanto, lai savienotu abas tabulas. Tā kā dabiskajā savienojumā jūs nerakstāt pievienošanās nosacījumu. Jūs vienkārši uzrakstāt divu tabulu nosaukumus bez nosacījumiem. Tad dabiskais savienojums automātiski pārbaudīs vienlīdzību starp katras kolonnas vērtībām, kas pastāv abās tabulās. Dabiskais savienojums automātiski nosaka pievienošanās nosacījumu.
- DABAS PIEVIENOJUMĀ visas abu tabulu kolonnas ar tādu pašu nosaukumu tiks saskaņotas viena ar otru. Piemēram, ja mums ir divas tabulas ar diviem kopīgiem kolonnu nosaukumiem (abās kolonnās ar tādu pašu nosaukumu pastāv abas tabulas), dabiskais savienojums pievienosies abām tabulām, salīdzinot abu kolonnu vērtības, nevis tikai no vienas. kolonna.
Piemērs
SELECTStudenti.StudentName,Departments.DepartmentNameNO studentiemNatural JOIN nodaļas;
Paskaidrojums
- Mums nav jāraksta pievienošanās nosacījums ar kolonnu nosaukumiem (kā mēs to darījām INNER JOIN). Mums pat nevajadzēja vienreiz rakstīt kolonnas nosaukumu (kā mēs to darījām JOIN USING).
- Dabiskais savienojums skenēs abas kolonnas no abām tabulām. Tas noteiks, ka nosacījums jāsastāda, salīdzinot DepartmentId no abām tabulām Studenti un Departamenti.
Rezultāts
- Natural JOIN sniegs jums tādu pašu precīzu izvadi kā produkts, ko ieguvām no INNER JOIN un JOIN USING piemēriem. Jo mūsu piemērā visi trīs vaicājumi ir līdzvērtīgi. Bet dažos gadījumos izeja atšķirsies no iekšējās savienojuma, nekā dabiskajā savienojumā. Piemēram, ja ir vairāk tabulu ar vieniem un tiem pašiem nosaukumiem, dabiskais savienojums sakritīs visas kolonnas savā starpā. Tomēr iekšējā savienošana sakritīs tikai ar kolonnām savienojuma nosacījumā (sīkāka informācija par nākamo sadaļu; starpība starp iekšējo savienojumu un dabisko savienojumu).
SQLite PA KREISO ĀRĒJO PIEVIENOŠANOS
SQL standarts nosaka trīs OUTER JOINS veidus: LEFT, RIGHT un FULL, bet SQLite atbalsta tikai LEFT OUTER JOIN.
Sadaļā LEFT OUTER JOIN visas vaicājuma rezultātos tiks iekļautas kolonnu vērtības, kuras izvēlaties no kreisās tabulas, tāpēc neatkarīgi no tā, vai vērtība atbilst pievienošanās nosacījumam vai nē, tā tiks iekļauta rezultātā.
Tātad, ja kreisajā tabulā ir “n” rindas, vaicājuma rezultātos būs “n” rindas. Tomēr kolonnu vērtībām, kas nāk no labās tabulas, ja kāda vērtība, kas neatbilst pievienošanās nosacījumam, tajā būs vērtība “null”.
Tātad jūs saņemsiet rindu skaitu, kas ir vienāds ar rindu skaitu kreisajā savienojumā. Lai jūs iegūtu atbilstošās rindas no abām tabulām (piemēram, INNER JOIN rezultāti), kā arī kreisās tabulas nesaskaņotās rindas.
Piemērs
Šajā piemērā mēs mēģināsim "LEFT JOIN" pievienoties divām tabulām "Students" un "Departamenti":
SELECTStudenti.StudentName,Departments.DepartmentNameNO studentiem - šī ir kreisā tabulaLEFT JOIN Departamenti ON Students.DepartmentId = Departments.DepartmentId;
Paskaidrojums
- LEFT JOIN sintakse ir tāda pati kā INNER JOIN; jūs rakstāt LEFT JOIN starp abām tabulām, un pēc pievienošanās nosacījums nāk pēc klauzulas ON.
- Pirmā tabula aiz klauzulas no kreisās tabulas. Tā kā otrā tabula, kas norādīta pēc kreisā savienojuma, ir labā tabula.
- Klauzula OUTER nav obligāta; LEFT OUTER JOIN ir tas pats, kas LEFT LOIN.
Rezultāts
- Kā redzat, ir iekļautas visas studentu tabulas rindas, kas kopā ir 10 studenti. Pat ja ceturtais un pēdējais students, Jena un George departmentIds tabulā Departamenti nepastāv, tie tiek iekļauti arī.
- Un šajos gadījumos departamentsName vērtība gan Jēnai, gan Džordžam būs "nulle", jo nodaļu tabulā nav nodaļasNosaukums, kas atbilstu viņu departamenta ID vērtībai.
Dosim iepriekšējo vaicājumu, izmantojot kreiso savienojumu, dziļāku skaidrojumu, izmantojot Van diagrammas:
KREISĀ PIEVIENOŠANA visiem studentiem dos vārdus no studentu tabulas, pat ja studentam ir nodaļas ID, kura nodaļu tabulā nav. Tātad vaicājums nedos jums tikai atbilstošās rindas kā INNER JOIN, bet sniegs papildu daļu, kurai ir nesakritošās rindas no kreisās tabulas, kas ir studentu tabula.
Ņemiet vērā, ka jebkuram studenta vārdam, kuram nav atbilstoša katedras, katedras nosaukumam būs “null” vērtība, jo tam nav atbilstošas vērtības, un šīs vērtības ir vērtības neatbilstošās rindās.
SQLite CROSS PIEVIENOTIES
CROSS JOIN dod Dekarta preci atlasīto divu pievienoto tabulu kolonnām, saskaņojot visas pirmās tabulas vērtības ar visām otrās tabulas vērtībām.
Tātad par katru pirmās tabulas vērtību jūs iegūsiet “n” atbilstību no otrās tabulas, kur n ir otrās tabulas rindu skaits.
Atšķirībā no INNER JOIN un LEFT OUTER JOIN, ar CROSS JOIN jums nav jānorāda pievienošanās nosacījums, jo SQLite tas nav vajadzīgs CROSS JOIN.
SQLite rezultātā tiks iegūti loģiski rezultāti, apvienojot visas pirmās tabulas vērtības ar visām otrās tabulas vērtībām.
Piemēram, ja atlasījāt kolonnu no pirmās tabulas (colA) un citu kolonnu no otrās tabulas (colB). ColA satur divas vērtības (1,2), un colB satur arī divas vērtības (3,4).
Tad CROSS JOIN rezultāts būs četras rindas:
- Divas rindas, apvienojot pirmo colA vērtību, kas ir 1, ar divām colB (3,4) vērtībām, kas būs (1,3), (1,4).
- Tāpat divas rindas, apvienojot otro colA vērtību, kas ir 2, ar divām colB (3,4) vērtībām, kas ir (2,3), (2,4).
Piemērs
Šajā vaicājumā mēs izmēģināsim CROSS JOIN starp studentu un katedru tabulām:
SELECTStudenti.StudentName,Departments.DepartmentNameNO studentiemCROSS JOIN nodaļas;
Paskaidrojums
- Atlases klauzulā mēs tikko atlasījām divas kolonnas “studentname” no studentu tabulas un “departmentName” no nodaļu tabulas.
- Krustojuma savienojumam mēs nenorādījām nevienu pievienošanās nosacījumu, tikai divas tabulas kopā ar CROSS JOIN to vidū.
Izeja:
Kā redzat, rezultāts ir 40 rindas; 10 vērtības no studentu tabulas sakrita ar 4 nodaļām no nodaļu tabulas. Kā sekojošais:
- Četras vērtības četrām nodaļām no nodaļu tabulas sakrita ar pirmo studentu Mišelu.
- Četras vērtības četrām nodaļām no nodaļu tabulas sakrita ar otro studentu Džonu.
- Četras vērtības četrām nodaļām no nodaļu tabulas sakrita ar trešo studentu Džeku.
… un tā tālāk.
Kopsavilkums
Izmantojot SQLite JOIN, jūs varat sasaistīt vienu vai vairākas tabulas vai apakškomisijas kopā, lai atlasītu kolonnas no abām tabulām vai apakšvaicājumiem.