Join predicate — ikki relationdagi qaysi satrlar bir-biriga mos kelishini belgilaydigan mantiqiy shart. SQLda u ko‘pincha JOIN ... ON bandida yoziladi va join natijasining ma’nosi, cardinalitysi hamda samaradorligiga bevosita ta’sir qiladi.
Tenglik bo‘yicha bog‘lash
Eng odatiy predicate primary key va foreign keyni tenglik bilan solishtiradi:
SELECT o.id, c.name
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id;
Bu equi-join hisoblanadi. Agar customers.id unique bo‘lsa, har order ko‘pi bilan bitta customerga mos keladi. Foreign key mavjud bo‘lsa optimizer relation haqidagi qo‘shimcha ma’lumotdan foydalanishi mumkin, database esa yetim havolalarni cheklaydi.
Composite kalitda predicate barcha qismlarni qamrashi kerak. Faqat tenant_idni unutib, order_number bo‘yicha bog‘lash boshqa tenant satrlarini qo‘shib yuborishi va maxfiylik buzilishiga olib kelishi mumkin. Shuning uchun join sharti schema constraint bilan bir xil biznes identifikatorini ifodalaydi.
Teng bo‘lmagan predicate
Join faqat = bilan cheklanmaydi. Vaqt oralig‘i, narx diapazoni yoki geospatial munosabat bo‘yicha non-equi join bajarilishi mumkin:
SELECT e.id, p.rate
FROM events AS e
JOIN price_periods AS p
ON e.occurred_at >= p.valid_from
AND e.occurred_at < p.valid_to;
Yarim ochiq [from, to) interval qo‘shni davrlar chegarasida bitta eventning ikki periodga tushishini oldini oladi. Periodlar o‘zaro ustma-ust bo‘lsa natija baribir ko‘payadi; exclusion constraint yoki data audit talab qilinadi.
Qo‘shimcha filterlar
ON ichidagi har bir shart bog‘lanishning bir qismi bo‘lishi yoki o‘ng tomondagi qatorlarni cheklashi mumkin. INNER JOINda ko‘p shartlarni ON va WHERE orasida ko‘chirish mantiqan teng natija beradi. OUTER JOINda esa joylashuv muhim: WHEREdagi o‘ng jadval filtri null-kengaytirilgan satrlarni olib tashlab, saqlanadigan chap qatorlarni yo‘qotishi mumkin.
Predicate ichida OR, funksiya yoki cast ishlatilsa optimizer uchun indexdan foydalanish qiyinlashishi mumkin. Masalan, LOWER(a.email) = LOWER(b.email) functional index bo‘lmasa har qiymatni hisoblashni talab qiladi. Eng yaxshi yechim ko‘pincha canonical qiymatni schema darajasida saqlash va uning semantikasini aniq belgilashdir.
NULL va tiplar
SQL uch qiymatli mantiqda NULL = NULL true emas. Null qiymatlarni mos deb hisoblash kerak bo‘lsa IS NOT DISTINCT FROM kabi null-safe operator yoki aniq shart ishlatiladi. COALESCE bilan nullni sun’iy sentinelga aylantirish haqiqiy qiymat bilan to‘qnashishi mumkin.
Bog‘lanadigan ustunlar mos data type va collationga ega bo‘lishi kerak. Matn va integer orasidagi implicit cast xato, sekin plan yoki kutilmagan taqqoslash semantikasini yaratadi. Timestamp joinida timezone, decimalda precision, matnda Unicode va collation hisobga olinadi.
Tekshirish va optimallashtirish
Join predicate noto‘g‘ri bo‘lsa natija yo‘qoladi yoki Cartesian productga yaqin ko‘payadi. Har join uchun kutilgan one-to-one, one-to-many yoki many-to-many cardinality yozib olinadi. Testlar mos, mos bo‘lmagan, duplicate va null kalitlarni qamrab oladi.
Index predicate ustunlarida lookupni tezlashtirishi mumkin. Biroq optimizer join tartibi va algorithmni umumiy costga qarab tanlaydi. Query plan estimated va actual satrlar farqini ko‘rsatadi; katta farq statistika yoki predicate selectivitysi noto‘g‘ri baholanganidan darak beradi.
Bog‘liq tushunchalar
SQL JOIN, Equi-join, Non-equi join, Foreign key, Composite key, NULL, Cardinality, Query optimizer