SQL-i liitumistüüpide sissejuhatus
SQL-i liitumisklausel on eesmärk kahe või enama tabeli ridade ühendamiseks. Ridade ühendamise protsess sõltub veerust, mis on nendega seotud. SQL-i nelja erinevat tüüpi liitumisi nimetatakse sisemiseks liitumiseks, vasakpoolseks liitumiseks, paremaks liitumiseks ja täielikuks liitumiseks. Enne kui saame hakata kasutama igat tüüpi liitumist, vajame RDBMS-i või relatsiooniandmebaasi haldussüsteemi, kuhu andmed laadime. Üks väga lihtsaid viise liitumiste mõistmiseks on Venni diagrammi kasutamine. Venni diagrammi kasutamine võimaldab hõlpsalt hinnata kõiki võimalikke ja loogilisi seoseid erinevate andmekogumite vahel. Mõistagem seda ükshaaval, kasutades Venni diagrammi. Hiljem mõistame nende erinevust mõne praktilise näite abil. Oletagem, et meie andmebaasis on kaks andmekogumit, mis on salvestatud tabeli esimese ja tabeli kujul. Kahe tabeli vahel on teatud seos, mis täpsustatakse primaarvõtme ja võõra võtme kontseptsiooni kujul. Kui liitute kahe tabeliga, millel on mingisugused seosed, saab stsenaariumi Venni diagrammi kujundus midagi sellist,
Selle kattumise suurus määrab kahe tabeli, st tabeli A ja tabeli B sarnasuse ulatuse. See tähendab, et tabeli 1 kirjete arv, mis sobib tabeli 2 kirjetega, on tähistatud kattuvuse jaotisega. See on üks andmete alamhulk. Kahest tabelist valitud andmete alamhulga põhjal saame neli erinevat tüüpi liitumist.
Liitumise süntaks:
SELECT column-names FROM table-name1 JOIN table-name2 ON column-name1 = column-name2 WHERE condition
Liitumiste tüübid SQL-is
- Sisemine liitumine
- Vasak liituma
- Parempoolne liitumine
- Täielik liitumine
Allpool selgitame üksikasjalikke erinevat tüüpi liitumisi.
1. Sisemine liitumine
Siseühenduses valime ainult need andmed, mis on ühised mõlemas tabelis. (st 3. osa siin) Täpsuse huvides on selles liitumises valitud mõlemad kirjed mõlemast tabelist, mis vastavad liitumisega mainitud tingimusele.
Sisemise liitumise süntaks:
SELECT column-names FROM table-name1 INNER JOIN table-name2 ON column-name1 = column-name2 WHERE condition
2. Vasak liitumine
Vasakpoolse liitumise korral valime vasakult tabelilt kõik andmed ja paremast tabelist ainult selle andmekogumi, mis vastab liitumisega mainitud tingimusele (siin ala 1 + 3)
Vasakpoolse süntaks:
SELECT column-names FROM table-name1 LEFT JOIN table-name2 ON column-name1 = column-name2 WHERE condition
3. Parempoolne liitumine
Parempoolses liitumises valime paremast tabelist kõik andmed ja vasakpoolsest tabelist valige ainult andmekogum, mis vastab liitumisega mainitud tingimusele (siin 3 + 2)
Parempoolse liitmise süntaks:
SELECT column-names FROM table-name1 RIGHT JOIN table-name2 ON column-name1 = column-name2 WHERE condition
4. Täielik liitumine
Täieliku liitmise korral liidetakse ja valitakse kõik tabeli moodustavad kirjed sõltumata sellest, millist tingimust mainitakse, kas liitumine on täidetud või mitte. (siin 1 + 2 + 3)
Täieliku liitumise süntaks:
SELECT column-names FROM table-name1 FULL JOIN table-name2 ON column-name1 = column-name2 WHERE condition
SQL-i liitumiste näited
Vaatleme kahte allpool toodud tabelit:
1. ORDER_DETAILSi näide
Tabelitellimus sisaldab üksikasju kliendi esitatud tellimuse kohta, näiteks tellimuse ID, tellitud toodete arvu, tellimuse summa, tellimuse teinud kliendi id ja tellimuse esitamise kuupäeva. Sellist lauda saab tellimuse üksikasjade hoidmiseks kasutada iga veebipõhine veebisait.
ORDER_DETAILS tabel:
Tellimuse ID | Elementide nr | Tellimus_kogus | Kliendi ID | Telli_kuupäev |
123 | 3 | 5500 | P_1 | 01.01.2019 |
234 | 2 | 6500 | P_12 | 02/10/2019 |
345 | 1 | 10000 | P_13 | 27.05.2019 |
456 | 4 | 4000 | P_14 | 11/07/2019 |
567 | 2 | 20656 | P_1 | 15.12.2019 |
678 | 3 | 15000 | P_11 | 27.10.2019 |
2. CUSTOMER_DETAILS näide
Nüüd võtame veel ühe tabeli, kuhu kliendi andmed salvestatakse, et saaksime tellimuse edastada vastavatele aadressidele. Klienditabelis on seega kliendi andmed, näiteks kliendi ID (cust_id), mis on iga kliendi jaoks ainulaadne. Nüüd on ees- ja perekonnanimi salvestatud väljale nimega - Cust_First_Name ja Cust_Last_Name. Teistele väljadele salvestatakse teave, näiteks e-posti aadress, kliendi mobiilinumber koos aadressiga, PIN-kood, linn ja osariik. Seega näeme, et meie klientide tabel näeb välja midagi sellist -
CUSTOMER_DETAILS tabel:
Kliendi ID | Cust_First_Name | Kliendi_viimati_nimi | PIN-koodi | Aadress | Cust_Mobile | Linn | Osariik | Klientide_post |
P_50 | Alice | Peeter | 111111 | 330 xyz tänav | 123 | Bangalore | KA | |
P_12 | James | Dsouza | 155511 | 420 abc koloonia | 234 | Hyderabad | AP | |
P_15 | Harry | Pottsepp | 123456 | 551 mg teed | 444 | Noida | Delhi | |
P_40 | Miley | Parker | 111121 | 11 jalga tee | 224 | Bangalore | KA | |
P_10 | Herman | Bush | 123423 | 34 th thanco tänav | 432 | Delhi | Delhi | |
P_18 | Dan | Pruun | 134523 | 50. iseseisev tee | 145 | Gurugram | Harjaana | |
P_20 | James | Russel | 111111 | 101 mg teed | 678 | Bangalore | KA | |
P_1 | Miley | Madison | 100011 | 45. kaverappa paigutus | 987 | Chennai | TN |
Kasutagem nüüd seda näidet, saagem aru liitumiste funktsionaalsusest. Näeme, et kahe tabeli, st tabeli ORDER_DETAILS ja tabeli CUSTOMER_DETAILS vaheline seos luuakse võtmega, millel on kliendi id väärtus, st klient_Id, mis on tabelis CUSTOMER_DETAILS esmane võti, ja võõrvõti tabelis ORDER_DETAILS tabel.
Enne jätkamist on siin mõned olulised märkused:
- Mitte kõik kliendid tabelis CUSTOMER_DETAILS pole tellimustaotlust esitanud.
- Kõigil tellimustaotlustel, mis meie tabelis ORDER_DETAILS on, pole kliendi ID, mis on meie tabelis CUSTOMER_DETAILS, mis tähendab, et mõne tellimuse puhul pole kliendi kohta üksikasju.
3. Sisemine liitumine
Sisemine liitumine annab teile ainult need kirjed, mille tingimus on täidetud.
Päring:
select Cust_First_Name, Cust_email, No_of_Items, Order_Amount, Order_Date
from CUSTOMER_DETAILS cd
inner join ORDER_DETAILS od
on cd.Cust_Id = od.Customer_Id
Väljund:
Cust_First_Name | Klientide_post | Elementide nr | Tellimus_kogus | Telli_kuupäev |
Miley | 3 | 5500 | 01.01.2019 | |
James | 2 | 6500 | 02/10/2019 | |
Miley | 2 | 20656 | 15.12.2019 |
4. Vasakpoolne liitumine
Vasakpoolne liitumine annab teile kõik vasakpoolsest tabelist pärinevad kirjed, st CUSTOMER_DETAILS tabel. Kui klient ei ole tellimusi esitanud, tagastab ta tabeli ORDER_DETAILS veergude jaoks nullväärtuse.
Päring:
select Cust_First_Name, Cust_email, No_of_Items, Order_Amount, Order_Date
from CUSTOMER_DETAILS cd
left join ORDER_DETAILS od
on cd.Cust_Id = od.Customer_Id
Väljund:
Cust_First_Name | Klientide_post | Elementide nr | Tellimus_kogus | Telli_kuupäev |
Alice | NULL | NULL | NULL | |
James | 2 | 6500 | 02/10/2019 | |
Harry | NULL | NULL | NULL | |
Miley | NULL | NULL | NULL | |
Herman | NULL | NULL | NULL | |
Dan | NULL | NULL | NULL | |
James | NULL | NULL | NULL | |
Miley | 3 | 5500 | 01.01.2019 | |
Miley | 2 | 20656 | 15.12.2019 |
5. Parempoolne liitumine
Õige, Liituge, saate kõik kirjed parempoolsest tabelist, st tabelist ORDER_DETAILS. Kui tellimuse jaoks pole kliendikirjeid leitud, tagastab see tabeli CUSTOMER_DETAILS veergude jaoks nullväärtuse.
Päring:
select Cust_First_Name, Cust_email, No_of_Items, Order_Amount, Order_Date
from CUSTOMER_DETAILS cd
right join ORDER_DETAILS od
on cd.Cust_Id = od.Customer_Id
Väljund:
Cust_First_Name | Klientide_post | Elementide nr | Tellimus_kogus | Telli_kuupäev |
Miley | 3 | 5500 | 01.01.2019 | |
James | 2 | 6500 | 02/10/2019 | |
NULL | NULL | 1 | 10000 | 27.05.2019 |
NULL | NULL | 4 | 4000 | 11/07/2019 |
Miley | 2 | 20656 | 15.12.2019 | |
NULL | NULL | 3 | 15000 | 27.10.2019 |
6. Täielik liitumine
Täielik liitumine annab teile kõik mõlemast tabelist täpsustatud kirjed.
Päring:
select Cust_First_Name, Cust_email, No_of_Items, Order_Amount, Order_Date
from CUSTOMER_DETAILS cd
full join ORDER_DETAILS od
on cd.Cust_Id = od.Customer_Id
Väljund:
Cust_First_Name | Klientide_post | Elementide nr | Tellimus_kogus | Telli_kuupäev |
Alice | NULL | NULL | NULL | |
James | 2 | 6500 | 02/10/2019 | |
Harry | NULL | NULL | NULL | |
Miley | NULL | NULL | NULL | |
Herman | NULL | NULL | NULL | |
Dan | NULL | NULL | NULL | |
James | NULL | NULL | NULL | |
Miley | 3 | 5500 | 01.01.2019 | |
Miley | 2 | 20656 | 15.12.2019 | |
NULL | NULL | 1 | 10000 | 27.05.2019 |
NULL | NULL | 4 | 4000 | 11/07/2019 |
NULL | NULL | 3 | 15000 | 27.10.2019 |
Liitumiste eelised SQL-is
- Kiirem täitmine, mis tähendab soovitud veergude kiiremat allalaadimist.
- Optimeeritud, loetav ja arusaadav
- Jõudluse suurenemine.
Järeldus
Nagu näha, kasutame erinevate tabelite väljade lisamiseks ja hankimiseks JOIN-e.
- Inner Join tõmbab kirjed, kus antud tingimus on täidetud.
- Vasakpoolne liitumine annab teile kõik vasakpoolsest tabelist olevad read, isegi kui antud tingimus ei vasta.
- Parempoolne liitumine annab teile kõik vasakpoolsest lauast pärit read, isegi kui antud tingimus ei vasta.
- Täielik liitumine tagastab kõik read, kui ühes tabelis on vaste.
- Liitumispäringuid saab kasutada selliste käskudega nagu - SELECT, INSERT, UPDATE, DELETE.
- Liitumised saavad läbi ka erinevate klauslitega, näiteks - GROUP BY, SUB QUERIES, WHERE, AGREGATE FUNKTSIOONID jne.
Soovitatav artikkel
See on SQL-i liitumistüüpide juhend. Siin käsitleme SQL-i eri tüüpi liitumisi ja selle eeliseid koos näidetega. Lisateavet leiate ka meie muudest soovitatud artiklitest -
- NoSQL eelised
- SQL-i haldustööriistad
- Andmebaas SQL-is
- Metamärk SQL-is
- MySQL-i 6 parimat liitumistüüpi koos näidetega