Alasan kanggo OUTER JOIN
Ngomong-ngomong, apa sampeyan kelingan nalika nggabungake spreadsheet lan tugas ngresiki kantor ilang amarga durung ana sing ngresiki?
Yen sampeyan mbukak pitakon kaya iki:
SELECT * FROM task
Banjur kita entuk asil iki:
id | id_karyawan | jeneng | deadline |
---|---|---|---|
1 | 1 | Ndandani bug ing frontend | 2022-06-01 |
2 | 2 | Ndandani bug ing backend | 2022-06-15 |
3 | 5 | Tuku kopi | 2022-07-01 |
4 | 5 | Tuku kopi | 2022-08-01 |
5 | 5 | Bakal tuku kopi | 2022-09-01 |
6 | (NULL) | Ngresiki kantor | (NULL) |
7 | 4 | Seneng urip | (NULL) |
8 | 6 | Seneng urip | (NULL) |
Tugas "Clear Office" bakal ilang yen kita nyoba nggabungake tabel tugas karo tabel karyawan dening employee_id.
Kanggo ngatasi masalah iki, macem-macem modifier wis ditambahake menyang operator JOIN sing ngidini baris yatim piatu bisa disimpen tanpa pasangan ing meja liyane.
Ayo kula ngelingake sampeyan babagan wangun klasik operator JOIN:
table 1 JOIN table 2 ON
condition
Kita bisa ngandhani SQL Server kanggo mesthekake yen kabeh data saka meja kiwa (table1) ana ing tabel gabungan. Malah yen ora ana pasangan kanggo wong-wong mau ing meja tengen. Kanggo nindakake iki, sampeyan mung kudu nulis:
table 1 LEFT JOIN table 2 ON condition
Yen sampeyan pengin tabel gabungan duwe kabeh baris saka tabel tengen , sampeyan kudu nulis:
table 1 RIGHT JOIN table 2 ON
condition
Ayo nulis pitakon sing bakal nggabungake kabeh tugas lan karyawan supaya tugas tanpa eksekutor ora ilang. Kanggo nindakake iki, tulis pitakon:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
Lan asil saka pitakonan iki:
id | jeneng | pendhudhukan | gaji | umur | join_date | id | id_karyawan | jeneng |
---|---|---|---|---|---|---|---|---|
1 | Iwan Iwan | Programmer | 100000 | 25 | 30-06-2012 | 1 | 1 | Ndandani bug ing frontend |
2 | Petrov Petruk | Programmer | 80000 | 23 | 2013-08-12 | 2 | 2 | Ndandani bug ing backend |
4 | Rabinovich Moisha | direktur | 200000 | 35 | 2015-05-12 | 7 | 4 | Seneng urip |
5 | Kirienko Anastasia | Kantor manager | 40000 | 25 | 10-10-2015 | 3 | 5 | Tuku kopi |
5 | Kirienko Anastasia | Kantor manager | 40000 | 25 | 10-10-2015 | 4 | 5 | Tuku kopi |
5 | Kirienko Anastasia | Kantor manager | 40000 | 25 | 10-10-2015 | 5 | 5 | Tuku kopi |
6 | Vaska | kucing | 1000 | 3 | 2018-11-11 | 8 | 6 | Seneng urip |
(NULL) | (NULL) | (NULL) | (NULL) | (NULL) | (NULL) | 6 | (NULL) | Ngresiki kantor |
Baris liyane wis ditambahake ing meja kita, lan sing menarik, ana akeh nilai NULL. Kabeh data sing dijupuk saka tabel karyawan ditampilake minangka NULL, amarga ora ana eksekutor saka meja karyawan kanggo tugas "kantor resik".
jinis JOIN
Ana 4 jinis JOIN total. Padha ditampilake ing tabel ing ngisor iki:
entri singkat | entri dawa | Panjelasan | |
---|---|---|---|
1 | GABUNG | GABUNGAN BATIN | Mung cathetan sing ana ing tabel A lan B |
2 | NINGGAL GABUNGAN | KIRI OUTER JOIN | Kabeh larik tanpa pasangan saka Tabel A kudu |
3 | TEngen gabung | TEngen njaba gabung | Kabeh larik tanpa pasangan saka tabel B kudu |
4 | OUTER JOIN | FULL OUTER JOIN | Kabeh baris pasangan basa saka tabel A lan B kudu |
Kanggo gamblang, yen kita makili tabel minangka set, banjur JOIN bisa ditampilake minangka gambar:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
Setel persimpangan tegese kanggo siji tabel ana rekaman sing cocog saka tabel liyane sing dirujuk.
Pitakonan saka wawancara
Kadhangkala programer anyar dibombardir karo pitakonan sing gampang banget nalika wawancara. Diwenehi tabel kita, bisa dirumusake kaya ing ngisor iki:
"Tulis pitakon sing bakal nampilake dhaptar kabeh karyawan sing ora ana tugas ." Kaping pisanan, ayo nyoba maneh pitakonan iki rada: "Tulis pitakon sing bakal nampilake dhaptar kabeh karyawan saka tabel karyawan sing ora ana tugas ing tabel tugas ." Kita kudu njaluk set iki:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
Ana akeh cara kanggo ngatasi masalah iki, nanging aku bakal miwiti karo sing paling gampang: Pisanan, sampeyan bisa nggabungake tabel kita kanthi KANGGO KIRI, banjur gunakake WHERE kanggo ngilangi kabeh baris sing data sing ilang wis diisi NULL.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
Lan asil saka pitakonan iki:
id | jeneng | pendhudhukan | gaji | umur | join_date | id | id_karyawan | jeneng |
---|---|---|---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40000 | telung puluh | 2014-01-01 | (NULL) | (NULL) | (NULL) |
Kerugian mung saka solusi iki yaiku ing kene baris ing tabel ngemot NULL, lan kanthi syarat kita kudu nampilake dhaptar karyawan.
Kanggo nindakake iki, sampeyan kudu dhaptar kolom sing dibutuhake ing tabel karyawan ing SELECT, utawa yen sampeyan kudu nampilake kabeh, sampeyan bisa nulis konstruksi ing ngisor iki:
SELECT e.* FROM employee e, task t
Panjaluk lengkap bakal katon kaya iki:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
asil saka pitakonan iki:
id | jeneng | pendhudhukan | gaji | umur | join_date |
---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40000 | telung puluh | 2014-01-01 |
Liyane saka cara ditinggalake kanggo PR. Aku ora pengin nyuda sampeyan saka kesenengan nemokake dhewe.