LEFT JOIN — chap relationdagi barcha satrlarni va o‘ng relationdan join shartiga mos kelgan satrlarni qaytaradigan SQL outer join turi. O‘ng tomonda mos satr topilmasa ham chap satr saqlanadi, o‘ng tomondan tanlangan ustunlar esa NULL bilan to‘ldiriladi.
Asosiy ishlash tartibi
Barcha mijozlarni, buyurtmasi bo‘lsa uning ma’lumoti bilan chiqarish:
SELECT c.id, c.name, o.id AS order_id, o.total
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.id;
Buyurtmasi yo‘q mijoz uchun order_id va total null bo‘ladi. Bitta mijozda bir nechta buyurtma bo‘lsa, mijoz satri har bir mos buyurtma uchun takrorlanadi. LEFT JOIN “har chap satr aynan bir marta chiqadi” degani emas; u kamida bir marta chiqishini ta’minlaydi.
ON va WHERE farqi
Outer joinda filter joyi natija ma’nosini o‘zgartiradi. Faqat to‘langan buyurtmalarni ulab, barcha mijozlarni saqlash uchun shart ON ichida yoziladi:
LEFT JOIN orders AS o
ON o.customer_id = c.id
AND o.status = 'paid'
Agar o.status = 'paid' tashqi WHEREga qo‘yilsa, buyurtmasi yo‘q mijozning o.status qiymati NULL bo‘ladi va filterdan o‘tmaydi. Natijada so‘rov amalda shu shart bo‘yicha INNER JOINga o‘xshab qoladi. Bu LEFT JOIN bilan bog‘liq eng keng tarqalgan mantiqiy xatolardan biridir.
Mos satri yo‘qlarni topish
Anti-join vazifasi uchun LEFT JOIN va IS NULL ishlatilishi mumkin:
SELECT c.id, c.name
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id
WHERE o.id IS NULL;
Null tekshiriladigan ustun o‘ng jadvalda ishonchli NOT NULL, odatda primary key bo‘lishi kerak. Aks holda haqiqiy mos satr bo‘lsa ham nullable ustun null chiqib, noto‘g‘ri xulosa berishi mumkin. NOT EXISTS ko‘pincha anti-join niyatini aniqroq ifodalaydi va optimizer uni mos operatorga aylantira oladi.
Aggregate bilan ishlash
Har mijoz buyurtmalari sonini sanashda COUNT(*) va COUNT(o.id) farq qiladi. LEFT JOIN mos topilmagan mijoz uchun ham bitta null-kengaytirilgan qator yaratadi, shu sabab COUNT(*) 1 qaytarishi mumkin. COUNT(o.id) esa o‘ng primary key null bo‘lganini hisoblamaydi va 0 beradi.
Aggregate oldidan bir-to-many joinlar natijani ko‘paytirishi mumkin. Bir vaqtda orders va payments jadvallari mijozga alohida bog‘lansa, har ikki tomondagi qatorlar kombinatsiyalanib summani oshiradi. Har child jadvalni avval kerakli darajada aggregate qilish yoki correlated subquery ishlatish zarur bo‘lishi mumkin.
Reja va aniqlik
Optimizer outer joinni inner join kabi erkin qayta tartiblay olmaydi, chunki saqlanadigan tomon semantik ahamiyatga ega. Constraint va filterlar ba’zan outer joinni inner joinga soddalashtirish imkonini beradi. Query plan real cardinality va join algorithmni ko‘rsatadi.
Ustun nomlarini alias bilan aniq berish nullning “mos satr yo‘q” yoki o‘ng jadvaldagi haqiqiy null ekanini tushunishga yordam beradi. APIga chiqarishda bu ikki holat farqlanishi zarur bo‘lsa, mavjudlikni bildiradigan alohida ustun yoki o‘ng primary key tekshiruvi qo‘llanadi.
LEFT JOINda chap tomonning biznes donadorligi oldindan belgilab olinadi.
Bog‘liq tushunchalar
Outer join, INNER JOIN, FULL OUTER JOIN, Anti-join, NULL, Join predicate, NOT EXISTS, Cardinality