Join — ikki yoki undan ortiq table yoki query natijasidagi rowlarni bog‘liq qiymatlar asosida birlashtiradigan relational amal. Join normalized schema’dagi alohida entitylardan yagona natija hosil qiladi.
Masalan, order table’dagi user_id orqali user table’dan ism olinadi.
INNER JOIN
Faqat ikkala tomonda shartga mos rowlar qaytariladi.
SELECT o.id, u.name
FROM orders AS o
INNER JOIN users AS u
ON u.id = o.user_id;
User topilmagan order natijaga kirmaydi.
Foreign key mavjud bo‘lsa bunday orphan holat kamayadi.
LEFT JOIN
Chap table’dagi barcha rowlar saqlanadi.
O‘ng tomonda mos row bo‘lmasa uning columnlari NULL bo‘ladi.
SELECT u.id, o.id
FROM users AS u
LEFT JOIN orders AS o
ON o.user_id = u.id;
Orderi yo‘q user ham natijada ko‘rinadi.
RIGHT JOIN
O‘ng table’dagi barcha rowlar saqlanadi.
U mantiqan tablelar o‘rnini almashtirgan LEFT JOIN bilan ifodalanishi mumkin.
Ko‘p codebase readability uchun asosan LEFT JOINdan foydalanadi.
FULL OUTER JOIN
Ikkala tomondagi barcha rowlarni saqlaydi.
Mos kelganlar birlashtiriladi.
Faqat bir tomonda mavjud row uchun ikkinchi tomon columnlari NULL.
Data reconciliation va ikki dataset farqini topishda ishlatiladi.
CROSS JOIN
Har chap row har o‘ng row bilan kombinatsiya qilinadi.
Agar bir table’da 100, boshqasida 1000 row bo‘lsa natija 100 000 row.
CROSS JOIN:
uchun ishlatiladi.
Noto‘g‘ri join sharti yo‘qolsa tasodifiy Cartesian product paydo bo‘lishi mumkin.
SELF JOIN
Table o‘zi bilan join qilinadi.
Masalan, employee va manager:
SELECT e.name, m.name AS manager_name
FROM employees AS e
LEFT JOIN employees AS m
ON m.id = e.manager_id;
Aliaslar har instance’ni ajratadi.
Join predicate
ON qismida rowlar qaysi shart bilan mos kelishi ko‘rsatiladi.
Ko‘pincha:
primary key = foreign key
ishlatiladi.
Join faqat equality bilan cheklanmaydi. Range, interval va boshqa conditionlar ham mumkin.
Noto‘g‘ri predicate duplicate yoki yo‘qolgan rowlar yaratadi.
Composite join
Bog‘lanish bir nechta column orqali bo‘lishi mumkin.
ON a.tenant_id = b.tenant_id
AND a.order_id = b.order_id
Faqat order_id bilan join qilish boshqa tenant ma’lumotlarini aralashtirishi mumkin.
Composite foreign key bo‘lsa join ham barcha key qismlarini ishlatadi.
NULL
SQL’da NULL = NULL true emas.
Join key null bo‘lsa oddiy equality bilan mos kelmaydi.
Null-safe comparison yoki explicit condition kerak bo‘lishi mumkin.
Outer join natijasidagi NULL bilan base table’dagi haqiqiy NULL semantikasi ajratiladi.
Filter joylashuvi
LEFT JOIN’dan keyin o‘ng table shartini WHEREga qo‘yish outer joinni amalda inner joinga aylantirishi mumkin.
Misol:
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
Orderi yo‘q userlar WHEREda chiqarib tashlanadi.
Agar barcha user saqlanishi kerak bo‘lsa condition ON ichiga yoziladi.
Duplicate row
One-to-many join chap rowni bir necha marta qaytaradi.
Bitta userning beshta orderi bo‘lsa user ma’lumoti besh rowda ko‘rinadi.
DISTINCT bilan yashirishdan oldin relationship va kerakli natija grain’i tushuniladi.
Aggregation yoki EXISTS to‘g‘riroq bo‘lishi mumkin.
Semi join
Chap table’dan o‘ng tomonda kamida bitta mos row mavjud bo‘lgan rowlar olinadi.
SQL’da ko‘pincha EXISTS orqali ifodalanadi.
SELECT *
FROM users u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
O‘ng table columnlari kerak bo‘lmasa duplicate yaratmaydi.
Anti join
O‘ng tomonda mos row mavjud bo‘lmagan chap rowlarni topadi.
NOT EXISTS keng tarqalgan:
SELECT *
FROM users u
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
NOT IN null mavjud bo‘lsa kutilmagan uch qiymatli mantiqqa ega bo‘lishi mumkin.
Join algoritmlari
Database physical execution uchun turli algoritm tanlaydi.
Nested loop
Tashqi rowlar bo‘yicha ichki manbani qidiradi.
Kichik tashqi to‘plam va indexed ichki lookup uchun samarali.
Hash join
Bir tomon keylari hash table’ga joylanadi.
Katta equality join uchun qulay.
Memory yetmasa diskka spill bo‘lishi mumkin.
Merge join
Ikkala input join key bo‘yicha tartiblangan bo‘lsa ketma-ket birlashtiradi.
Rangega yaqin va katta sorted datasetda samarali.
Join order
Uch yoki ko‘p table joinida qaysi table avval birlashtirilishi performance’ga katta ta’sir qiladi.
Optimizer row estimate va cost asosida tartib tanlaydi.
Kichik, kuchli filtrlangan natijani oldin olish intermediate row sonini kamaytiradi.
Index
Join keyda index nested loop lookupni tezlashtiradi.
Foreign key columniga index avtomatik yaratilmasligi mumkin.
Parent delete yoki child lookup uchun alohida index kerak bo‘lishi ehtimoli bor.
Distributed join
Tablelar boshqa shard yoki node’da bo‘lsa data network orqali ko‘chiriladi.
Strategiyalar:
- kichik table’ni broadcast;
- ikkala table’ni bir key bo‘yicha shuffle;
- co-location;
- precomputed read model.
Data movement queryning eng qimmat qismi bo‘lishi mumkin.
Bog‘liq tushunchalar
INNER JOIN, LEFT JOIN, FULL OUTER JOIN, CROSS JOIN, Self join, Join predicate, Nested loop, Hash join, Merge join, Foreign key