OUTER JOIN Operator

All lectures for UZ purposes
Daraja, Dars
Mavjud

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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION