Cross Join
Oʻzaro qoʻshilish yoki oʻzaro qoʻshish bir jadvaldagi har bir satr ikkinchi jadvaldagi har bir satr bilan birlashtirilgan qatorlar toʻplamini yaratadi. Masalan, Buyurtmalar jadvali va Mijozlar jadvaliga qo'shilamiz:
Agar Buyurtmalar jadvalida 3 qator va Mijozlar jadvalida 3 qator bo'lsa, u holda o'zaro bog'lanish natijasi qatorlar bog'langan yoki bog'lanmaganligidan qat'i nazar, 3 * 3 = 9 qatorga teng bo'ladi.
Yashirin o'zaro birlashma bilan siz CROSS JOIN iborasini o'tkazib yuborishingiz va natijada barcha jadvallarni ro'yxatlashingiz mumkin:
Bog'lanishlarda guruhlash
Guruhlash INNER/OUTER JOIN ifodalarida ham ishlatilishi mumkin. Masalan, har bir foydalanuvchi uchun u qilgan buyurtmalar sonini ko'rsatamiz:
Guruhlash mezoni xaridorning identifikatori va ismidir. SELECT bayonoti Buyurtmalar jadvalidagi Id ustunidan foydalanib, mijozning nomini va buyurtmalar sonini tanlaydi.
Bu ICHKI JOIN bo'lganligi sababli, guruhda faqat buyurtmasi bo'lgan xaridorlar bo'ladi.
Agar buyurtmaga ega bo'lmagan mijozlarni ham ko'rsatish kerak bo'lsa, OUTER JOIN ishlatiladi:
Yoki mahsulotlarni buyurtmalarning umumiy miqdori bilan ko'rsating:
UNION
UNION operatori, masalan, ichki birlashma yoki tashqi birlashma, ikkita jadvalni birlashtirishga imkon beradi. Ammo ichki/tashqi birlashmalardan farqli o'laroq, birlashmalar turli jadvallarning ustunlarini emas, balki bir xil turdagi ikkita to'plamni birlashtiradi. Rasmiy ittifoq sintaksisi:
Masalan, bank mijozlari (Mijozlar jadvali) va bank xodimlari (Xodimlar jadvali) uchun ma’lumotlar bazasida ikkita alohida jadval mavjud deylik:
Bu erda ikkala jadval, turli xil ma'lumotlarga ega bo'lishiga qaramay, ikkita umumiy atribut bilan tavsiflanishi mumkinligini ko'rishimiz mumkin - ism (Ism) va familiya (Familiya). Keling, bir vaqtning o'zida ikkala jadvaldan bankning barcha mijozlari va xodimlarini tanlaymiz:
Bunday holda, birinchi jadvaldan ikkita qiymat tanlanadi - mijozning ismi va familiyasi. Ikkinchi jadvaldan Xodimlar, shuningdek, ikkita qiymat tanlanadi - xodimlarning ismi va familiyasi. Ya'ni, birlashtirganda, tanlangan ustunlar soni va ularning turi ikkala tanlov uchun bir xil bo'ladi.
Bunday holda, birlashtirilgan tanlov ustunlari nomlari birinchi tanlov ustunlari nomlariga mos keladi. Va agar biz bir vaqtning o'zida saralashni xohlasak, TARTIBI BY iboralarida birinchi tanlovning ustunlari nomlariga e'tibor qaratishimiz kerak:
Bunday holda, har bir namunada mijoz yoki xodimning ismi va familiyasining birikmasini ifodalovchi bitta ustun mavjud. Ammo mijozlar uchun ustun to'liq ism, xodimlar uchun esa Xodimning nomi deb nomlanadi. Shunga qaramay, birinchi tanlovdagi ustun nomi saralash uchun ishlatiladi va u natijada ham bo'ladi:
Agar bitta tanlovda boshqasidan ko'ra ko'proq ustun bo'lsa, ularni birlashtirib bo'lmaydi. Misol uchun, quyidagi holatda qo'shilish xato bilan muvaffaqiyatsiz bo'ladi:
Bundan tashqari, tegishli ustunlar turiga mos kelishi kerak. Misol uchun, quyidagi misol ma'lumotlar turiga mos kelmasligi sababli bajarilmaydi:
Bunda birinchi tanlovning birinchi ustuni NVARCHAR tipidagi, ya'ni satrni saqlaydi. Ikkinchi namunaning birinchi ustuni - Id INT tipidagi, ya'ni raqamni saqlaydi.
Agar ikkala birlashtirilgan to'plamlar qatorlarida bir xil qiymatlarni o'z ichiga olsa, u holda birlashtirish paytida ikki nusxadagi qatorlar o'chiriladi. Masalan, Mijozlar va Xodimlar jadvallarida bank xodimlari bir vaqtning o'zida uning mijozlari bo'lishlari va ikkala jadvalda ham bo'lishi mumkin. Yuqoridagi misollarda birlashtirilganda, takroriy satrlar olib tashlandi. Agar birlashtirganda hamma narsani, shu jumladan takroriy satrlarni saqlash kerak bo'lsa, buning uchun ALL operatoridan foydalanish kerak:
Xuddi shu jadvaldagi tanlovlarni ham birlashtirishingiz mumkin. Masalan, mijozning hisobidagi summaga qarab, biz unga ma'lum foizlarni undirishimiz kerak:
Bunday holda, agar summa 3000 dan kam bo'lsa, hisobvaraqdagi summaning 10% miqdorida foizlar undiriladi. Hisobda 3000 dan ortiq bo'lsa, foiz 30% gacha oshadi.
Do'stlaringiz bilan baham: |