Saytdan foydalanishda muammoga duch kelsangiz, qo'llab-quvvatlash xizmatiga murojaat qiling: @fast_support_admin
JOIN lar3 daqiqa o'qish

INNER JOIN va LEFT JOIN farqi

INNER JOIN faqat ikkala jadvalda mosi bor qatorlarni qoldiradi, LEFT JOIN esa chap jadvalning hammasini saqlaydi. Buyurtmasiz mijozlarni topish misolida ko'ramiz.

JOIN ikki jadvalni umumiy ustun bo'yicha birlashtiradi. Eng ko'p ishlatiladigan ikki turi — INNER JOIN va LEFT JOIN. Ularning farqi bitta savolda: mosi topilmagan qatorlar bilan nima qilamiz?

Jadval: customers

idname
1Aziz
2Dilnoza
3Bekzod

Jadval: orders

idcustomer_idamount
101120000
11145000
12280000

Bekzodning buyurtmasi yo'q.

INNER JOIN — faqat juftlari borlar

SELECT c.name, o.amount
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
nameamount
Aziz120000
Aziz45000
Dilnoza80000

Bekzod natijada yo'q — unga mos buyurtma topilmadi, shuning uchun qator tashlandi.

LEFT JOIN — chap jadval to'liq qoladi

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
nameamount
Aziz120000
Aziz45000
Dilnoza80000
BekzodNULL

Bekzod qoldi, lekin orders dagi ustunlar o'rniga NULL keldi. Aynan shu NULL dan foydalanib "hech narsa qilmaganlar"ni topamiz.

Amaliy vazifa: hech qachon buyurtma bermagan mijozlar

To'g'ri yechim
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;
name
Bekzod

Bu usul "anti-join" deb ataladi va intervyularda juda ko'p so'raladi.

Ko'p uchraydigan xato: shartni WHERE ga qo'yib, LEFT JOIN ni "o'ldirish"

Vazifa: har bir mijozni va uning 100 000 dan katta buyurtmalarini chiqarish (buyurtmasi bo'lmasa ham mijoz ko'rinsin).

Noto'g'ri yondashuv
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 100000;

Natijada faqat Aziz qoladi. Sababi: Dilnoza va Bekzod qatorlarida o.amount yoki 80 000, yoki NULL. NULL > 100000 esa rost emas, shuning uchun WHERE ularni tashladi va LEFT JOIN amalda INNER JOIN ga aylandi.

To'g'risi — o'ng jadval bo'yicha shartni ON ichiga yozish:

To'g'ri yechim
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
 AND o.amount > 100000;
nameamount
Aziz120000
DilnozaNULL
BekzodNULL

Xulosa

  • INNER JOIN — faqat ikkala tomonda mosi borlar.
  • LEFT JOIN — chap jadval to'liq, mos kelmaganida o'ng ustunlar NULL.
  • "Hech qachon … qilmaganlar" — LEFT JOIN + WHERE o.id IS NULL.
  • O'ng jadval bo'yicha filtrni ON ga yozing, aks holda LEFT JOIN o'z ma'nosini yo'qotadi.

Endi o'zingiz yechib ko'ring

O'rganganingizni mustahkamlang — so'rovingiz brauzerda darhol tekshiriladi.

Telegram'da muhokama qilish