OUTER JOIN ning paydo bo'lish sabablari
Aytgancha, eslaysanmi, biz jadvalni birlashtirib edik va ofisni tozalash vazifasi yo'qolib ketgan edi, chunki hali tozalovchi yo'q edi?
Agar shunday so'rov qilinsa:
SELECT * FROM task
Natija shunday bo'ladi:
| id | employee_id | name | deadline |
|---|---|---|---|
| 1 | 1 | Frontendda xatolarni to'g'rilash | 2022-06-01 |
| 2 | 2 | Backendda xatolarni to'g'rilash | 2022-06-15 |
| 3 | 5 | Kofe sotib olish | 2022-07-01 |
| 4 | 5 | Kofe sotib olish | 2022-08-01 |
| 5 | 5 | Kofe sotib olish | 2022-09-01 |
| 6 | (NULL) | Ofisni tozalash | (NULL) |
| 7 | 4 | Hayotdan zavqlanish | (NULL) |
| 8 | 6 | Hayotdan zavqlanish | (NULL) |
“Ofisni tozalash” vazifasi yo'qoladi, agar biz task jadvalini employee jadvali bilan employee_id orqali birlashtirmoqchi bo'lsak.
Bu muammoni hal qilish uchun JOIN operatoriga boshqa variantlar qo'shildi, ular boshqa jadvalda juft bo'lmagan satrlarni saqlab qolishga imkon beradi.
JOIN operatorining klassik ko'rinishi:
jadval1 JOIN jadval2 ON shart
Biz SQL serverga barcha ma'lumotlarni chap jadvaldan (jadval1) birlashtirilgan jadvalda albatta bo'lishini ayta olamiz. Agar ular uchun o'ng jadvalda juft bo'lmasa ham. Buning uchun shunchaki yozing:
jadval1 LEFT JOIN jadval2 ON shart
Agar esa o'ng jadvaldagi barcha satrlar birlashtirilgan jadvalda bo'lishini istasangiz, quyidagicha yozing:
jadval1 RIGHT JOIN jadval2 ON
shart
Keling, barcha vazifalar va xodimlarni birlashtiradigan so'rov yozamiz, shunda bajaruvchisi yo'q vazifalar yo'qolmaydi. Buning uchun quyidagi so'rov yozilishi kerak:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.employee_id
Mana shu so'rovning natijasi:
| id | name | occupation | salary | age | join_date | id | employee_id | name |
|---|---|---|---|---|---|---|---|---|
| 1 | Ivanov Ivan | Dasturchi | 100000 | 25 | 2012-06-30 | 1 | 1 | Frontendda xatolarni to'g'rilash |
| 2 | Petrov Petr | Dasturchi | 80000 | 23 | 2013-08-12 | 2 | 2 | Backendda xatolarni to'g'rilash |
| 4 | Rabinovich Moysha | Direktor | 200000 | 35 | 2015-05-12 | 7 | 4 | Hayotdan zavqlanish |
| 5 | Kirienko Anastasiya | Ofis-menejer | 40000 | 25 | 2015-10-10 | 3 | 5 | Kofe sotib olish |
| 5 | Kirienko Anastasiya | Ofis-menejer | 40000 | 25 | 2015-10-10 | 4 | 5 | Kofe sotib olish |
| 5 | Kirienko Anastasiya | Ofis-menejer | 40000 | 25 | 2015-10-10 | 5 | 5 | Kofe sotib olish |
| 6 | Vaska | mushuk | 1000 | 3 | 2018-11-11 | 8 | 6 | Hayotdan zavqlanish |
| (NULL) | (NULL) | (NULL) | (NULL) | (NULL) | (NULL) | 6 | (NULL) | Ofisni tozalash |
Bizning jadvalga yana bir satr qo'shildi va qiziqarli jihati shundaki, ko'p NULL qiymatlar mavjud. Employee jadvalidan olingan ma'lumotlar NULL ko'rinishida ko'rsatiladi, chunki “Ofisni tozalash” vazifasi uchun employee jadvalida bajaruvchi topilmadi.
JOIN turlari
Hozirgi vaqtda 4 turdagi JOIN mavjud. Ular quyidagi jadvalda keltirilgan:
| Qisqa yozuv | Uzun yozuv | Izoh | |
|---|---|---|---|
| 1 | JOIN | INNER JOIN | Faqat A va B jadvallarida mavjud yozuvlar |
| 2 | LEFT JOIN | LEFT OUTER JOIN | A jadvalidan juft bo'lmagan satrlar mavjud bo'lishi kerak |
| 3 | RIGHT JOIN | RIGHT OUTER JOIN | B jadvalidan juft bo'lmagan satrlar mavjud bo'lishi kerak |
| 4 | OUTER JOIN | FULL OUTER JOIN | A va B jadvallaridan juft bo'lmagan barcha satrlar mavjud bo'lishi kerak |
Oddiylik uchun, agar jadvalni to'plam sifatida tasavvur qilsak, JOIN ni rasmda ko'rsatishingiz mumkin:
To'plamlar kesishmasi deganda, boshqa jadvaldan mos yozuv mavjudligi tushuniladi, unga mos yozuv qayd etilgan.
Suhbat savoli
Ba'zida dasturchilarni suhbatda oddiy savol bilan yiqitishadi. Bizning jadvallarimizni hisobga olib, uni quyidagicha ifodalash mumkin:
“Kod yozing, bu barcha xodimlarni, ular uchun vazifalar yo'qligini ro'yhatini ko'rsatsin.” Avvalroq, biz ushbu savolni bir oz o'zgartirishga harakat qilamiz: “Kod yozing, bu employee jadvalidagi barcha xodimlarni, ularga task jadvalida vazifalar yo'qligini ro'yhatini ko'rsatsin.” Biz quyidagi to'plamni olishimiz kerak:
Bu masalani ko'p usullar bilan hal qilish mumkin, lekin men eng oddiydan boshlayman: Avvalo, siz LEFT JOIN yordamida jadvallarni birlashtirishingiz va keyin WHERE yordamida kerakli ma'lumotlar NULL bilan to'ldirilgan barcha satrlarni chiqarib tashlashingiz mumkin.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.employee_id WHERE t.id IS NULL
Mana shu so'rovning natijasi:
| id | name | occupation | salary | age | join_date | id | employee_id | name |
|---|---|---|---|---|---|---|---|---|
| 3 | Ivanov Sergey | Tester | 40000 | 30 | 2014-01-01 | (NULL) | (NULL) | (NULL) |
Ushbu yechimning yagona kamchiliklaridan biri shundaki, bu jadvalda NULL qiymatlar mavjud, lekin biz shartga ko'ra xodimlar ro'yhatini ko'rsatishimiz kerak.
Buning uchun employee jadvalidagi kerakli ustunlarni SELECT ichida sanash yoki agar ularning barchasini ko'rsatish kerak bo'lsa, quyidagi tuzilmani yozishingiz mumkin:
SELECT e.* FROM employee e, task t
To'liq so'rov quyidagicha ko'rinadi:
SELECT e.* FROM employee e LEFT JOIN task t ON e.id = t.employee_id WHERE t.id IS NULL
mana shu so'rovning natijasi:
| id | name | occupation | salary | age | join_date |
|---|---|---|---|---|---|
| 3 | Ivanov Sergey | Tester | 40000 | 30 | 2014-01-01 |
Boshqa usullar sizning uyga vazifangiz bo'lib qoladi. Ularni mustaqil ravishda topishdan zavq olishni xohlamayman.
GO TO FULL VERSION