Union — ikki yoki undan ortiq query natijasini vertikal ravishda bitta result setga birlashtiradigan SQL set operation. Har query bir xil sonli column va mos data type’larni qaytarishi kerak.
Union tablelarni column bo‘yicha yonma-yon bog‘laydigan join emas. U rowlar to‘plamini ketma-ket qo‘shadi.
UNION
UNION natijalarni birlashtiradi va duplicate rowlarni olib tashlaydi.
SELECT email FROM customers
UNION
SELECT email FROM subscribers;
Ayni email ikkala queryda mavjud bo‘lsa yakuniy natijada bir marta qoladi.
Duplicate removal sort yoki hash operation talab qilishi mumkin.
UNION ALL
UNION ALL barcha rowlarni, jumladan duplicate’larni saqlaydi.
SELECT id, created_at FROM web_events
UNION ALL
SELECT id, created_at FROM mobile_events;
Duplicate tekshiruvi bo‘lmagani sabab odatda UNIONdan tezroq.
Agar business talabi duplicate’ni olib tashlashni talab qilmasa UNION ALL aniqroq.
Column soni
Har branch bir xil sonli expression qaytarishi kerak.
Noto‘g‘ri:
birinchi query: 3 column
ikkinchi query: 2 column
Column nomlari ko‘pincha birinchi query’dan olinadi.
Keyingi query aliaslari yakuniy metadata’ga ta’sir qilmasligi mumkin.
Data type compatibility
Mos pozitsiyadagi columnlar bir-biriga compatible type’da bo‘lishi kerak.
Masalan:
integer + bigint
text + varchar
date + timestamp
Database common type tanlashi yoki explicit cast talab qilishi mumkin.
Noto‘g‘ri implicit conversion precision va index semantikasiga ta’sir qiladi.
Column pozitsiyasi
Union columnlarni nomi bilan emas, pozitsiyasi bilan birlashtiradi.
Misol:
SELECT name, email FROM users
UNION ALL
SELECT email, name FROM admins;
ikkinchi query tartibi noto‘g‘ri bo‘lsa data ma’nosi aralashadi.
Aliaslar va explicit tartib readabilityni oshiradi.
Duplicate semantikasi
UNION butun row kombinatsiyasi bo‘yicha duplicate’ni aniqlaydi.
Faqat email bir xil, boshqa column boshqa bo‘lsa rowlar alohida qoladi.
Ma’lum key bo‘yicha bittasini tanlash uchun:
- window function;
- grouping;
- distinct onga o‘xshash imkoniyat;
- precedence qoidasi
kerak.
ORDER BY
Yakuniy ORDER BY butun union natijasiga qo‘llanadi.
SELECT ...
UNION ALL
SELECT ...
ORDER BY created_at DESC;
Har branch ichidagi order yakuniy row tartibini kafolatlamaydi.
Branchda LIMIT bilan birga maxsus subquery ishlatilishi mumkin.
LIMIT
Yakuniy LIMIT barcha branchlar birlashgandan keyin qo‘llanadi.
Har source’dan alohida top N olish kerak bo‘lsa branchlar subquery yoki CTEga o‘raladi.
Keyin ularning natijasi union qilinadi.
Source belgisi
Qaysi row qaysi query’dan kelganini saqlash uchun constant column qo‘shiladi.
SELECT id, 'customer' AS source
FROM customers
UNION ALL
SELECT id, 'admin' AS source
FROM admins;
Bu keyingi filter va audit uchun foydali.
Partitioned data
Bir xil schema’ga ega vaqtli tablelar union orqali birlashtirilishi mumkin.
events_2025
events_2026
Lekin database native partitioning bersa optimizer pruning va maintenance’ni yaxshiroq boshqarishi mumkin.
Manual union view table soni oshgani sari murakkablashadi.
Archive va active data
Active va archive table alohida saqlansa query ularni union qilishi mumkin.
SELECT * FROM active_orders
UNION ALL
SELECT * FROM archived_orders;
Bir order ikkala joyda mavjud bo‘lmasligi invariant bilan ta’minlanadi.
Aks holda duplicate paydo bo‘ladi.
Heterogeneous source
Turli tablelar umumiy interface’ga keltiriladi.
Masalan, email, SMS va push notificationlar:
id
channel
recipient
sent_at
status
Common projection analyticsni soddalashtiradi.
Channelga xos fieldlar NULL yoki alohida detail modelida saqlanishi mumkin.
UNION va OR
Ba’zi querylar OR predicate yoki ikki branchli union bilan ifodalanishi mumkin.
WHERE status = 'new' OR priority = 'high'
yoki alohida querylar.
Union branchlari bir rowni ikki marta qaytarishi mumkin; UNION duplicate’ni olib tashlaydi, UNION ALL esa saqlaydi.
Optimizer va index foydalanishi real plan bilan tekshiriladi.
UNION va JOIN
Join columnlarni kengaytiradi:
users + orders → bitta rowda ko‘proq column
Union rowlarni ko‘paytiradi:
customers natijasi + subscribers natijasi
Ikkalasi boshqa relational operation.
INTERSECT
INTERSECT ikkala queryda mavjud rowlarni qaytaradi.
Bu set intersection.
Masalan, ham customer, ham subscriber bo‘lgan email’lar.
Aniq qo‘llab-quvvatlash va duplicate semantikasi database’ga bog‘liq.
EXCEPT
EXCEPT birinchi queryda bor, ikkinchisida yo‘q rowlarni qaytaradi.
Bu set difference.
Masalan, barcha userlardan bloklangan userlarni ayirish.
NOT EXISTS bilan ham ifodalanishi mumkin.
Performance
Union performance’iga:
ta’sir qiladi.
UNIONning duplicate removal bosqichi katta natijada memory yoki disk talab qilishi mumkin.
Branch provenance
Har branchga source nomi va source primary key qo‘shilsa yakuniy natijadagi rowni asl table’ga bog‘lash osonlashadi.
Bu bir xil ID turli table’da mavjud bo‘lganda ayniqsa muhim.
Type kengayishi
Bir branch integer, boshqasi katta decimal qaytarsa common type storage va precisionni o‘zgartirishi mumkin.
Explicit cast yakuniy contractni aniq qiladi.
String uzunligi va collation ham barcha branchlar uchun tekshiriladi.
Bog‘liq tushunchalar
UNION, UNION ALL, Set operation, INTERSECT, EXCEPT, Duplicate elimination, Result set, SQL, Join, Common data type