Bosh sahifa Wiki INNER JOIN

INNER JOIN

INNER JOIN — ikki relationdagi join shartiga mos kelgan satrlarnigina birlashtiradigan SQL operatori. Chap yoki o‘ng tomonda mos jufti topilmagan satr natijaga kiritilmaydi. U bog‘langan jadvallardan birgalikda ma’lumot olishning eng ko‘p ishlatiladigan usullaridan biridir.

Asosiy sintaksis

Buyurtmani uning mijoz ma’lumoti bilan birlashtirish:

SELECT o.id, o.created_at, c.name
FROM orders AS o
INNER JOIN customers AS c
    ON c.id = o.customer_id;

INNER kalit so‘zi ixtiyoriy, ya’ni JOIN ko‘pincha ayni ma’noni beradi. ON bandi qaysi satrlar mos hisoblanishini belgilaydi. Foreign key integrityni himoya qilishi mumkin, join esa so‘rov vaqtida kerakli ustunlarni birga chiqaradi; biri ikkinchisining o‘rnini bosmaydi.

Cardinality va duplicate satrlar

Join natijasidagi qatorlar soni bog‘lanish turiga bog‘liq. Customer primary key bo‘lsa, har order ko‘pi bilan bitta customerga mos keladi. Ammo ikkala tomonda join kaliti takrorlansa, barcha mos kombinatsiyalar hosil bo‘ladi. Chap tomonda uchta va o‘ng tomonda to‘rtta bir xil kalit mavjud bo‘lsa, shu kalit uchun 12 qator chiqishi mumkin.

Kutilmagan duplicate natijani DISTINCT bilan yashirishdan oldin data modeli va join predicate tekshiriladi. Ko‘pincha yetishmagan kalit sharti, noto‘g‘ri cardinality taxmini yoki jadvaldagi duplicate sabab bo‘ladi. DISTINCT qo‘shimcha sort yoki hash xarajati keltiradi va asl xatoni yashirishi mumkin.

NULL semantikasi

Oddiy tenglikda NULL = NULL true emas, unknown natija beradi. Shu sabab ikkala jadvaldagi null kalitlar INNER JOIN orqali bir-biriga mos kelmaydi. Null-safe equality kerak bo‘lsa database mahsulotining maxsus operatori yoki aniq mantiq ishlatiladi.

WHERE filtri join tugagach natijani kamaytiradi, ammo optimizer inner join uchun ko‘p shartlarni xavfsiz tarzda erta qo‘llashi mumkin. ON va WHERE orasidagi farq outer joinda ancha muhim; u yerda noto‘g‘ri joylashtirilgan filter join ma’nosini o‘zgartiradi.

Bir nechta join

Uch va undan ortiq jadval qo‘shilganda SQLdagi yozilish tartibi har doim fizik bajarilish tartibi bo‘lmaydi. Query optimizer inner joinlarni associative va commutative xususiyatlardan foydalanib qayta tartiblashi mumkin. U kichik yoki kuchli filtrlangan natijani avval olishga harakat qiladi.

Aliaslar bir xil nomli ustunlarni ajratadi. Natijada id kabi ustunlar qaysi jadvaldan kelgani aniq yoziladi. SELECT * join qilingan schema o‘zgarganda ortiqcha ustun va nom to‘qnashuvini keltirishi mumkin.

Samaradorlik

Join kalitidagi index foydali bo‘lishi mumkin, lekin tanlangan algorithm va jadval hajmi muhim. Nested loop kichik tashqi oqim va indexli ichki qidiruvga, hash join katta tenglik joiniga, merge join tartiblangan oqimlarga mos kelishi mumkin. Yakuniy qarorni optimizer cost va statistikaga asoslanib chiqaradi.

EXPLAIN ANALYZE estimated va actual satrlarni, loop sonini hamda operator vaqtini ko‘rsatadi. Join oldidan kerakli filterlarni qo‘llash, mos tip va collationdan foydalanish, implicit castni yo‘qotish samaradorlikni oshiradi. Bir xil ko‘rinadigan integer va matn kalitlarini runtime cast bilan bog‘lash indexdan foydalanishni cheklashi mumkin.

Faqat mavjudlikni tekshirish uchun child jadval ustunlari kerak bo‘lmasa, EXISTS niyatni aniqroq ifodalashi mumkin. U bir nechta mos child sabab parent satrining ko‘payishini oldini oladi. Optimizer buni semi-join operatoriga aylantirishi mumkin.

Bog‘liq tushunchalar

SQL JOIN, Join predicate, Foreign key, Primary key, Nested loop, Hash join, Merge join, Cardinality