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
| id | name |
|---|---|
| 1 | Aziz |
| 2 | Dilnoza |
| 3 | Bekzod |
Jadval: orders
| id | customer_id | amount |
|---|---|---|
| 10 | 1 | 120000 |
| 11 | 1 | 45000 |
| 12 | 2 | 80000 |
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;| name | amount |
|---|---|
| Aziz | 120000 |
| Aziz | 45000 |
| Dilnoza | 80000 |
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;| name | amount |
|---|---|
| Aziz | 120000 |
| Aziz | 45000 |
| Dilnoza | 80000 |
| Bekzod | NULL |
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
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).
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:
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
AND o.amount > 100000;| name | amount |
|---|---|
| Aziz | 120000 |
| Dilnoza | NULL |
| Bekzod | NULL |
Xulosa
INNER JOIN— faqat ikkala tomonda mosi borlar.LEFT JOIN— chap jadval to'liq, mos kelmaganida o'ng ustunlarNULL.- "Hech qachon … qilmaganlar" —
LEFT JOIN+WHERE o.id IS NULL. - O'ng jadval bo'yicha filtrni
ONga 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.
