Mundarija (29)
- Bu darsda
- 1. Nega bu kerak?
- 2. UNION va UNION ALL
- 2.1 Takrorsiz birlashma
- 2.2 Takrorlari bilan
- 3. INTERSECT va EXCEPT
- 3.1 Kesishma va farq
- 3.2 JOIN bilan yozsa-chi?
- 4. Qoidalar: ustunlar, tartib va ustuvorlik
- 4.1 Ustunlar soni va turi
- 4.2 Nomlar va ORDER BY
- 4.3 Qavslar va har qismga LIMIT
- 4.4 Ustuvorlik: INTERSECT birinchi
- 5. Hodisalar lentasi
- 6. Ikki tomonlama EXCEPT: ma'lumot mosligini tekshirish
- 7. Ko'p uchraydigan xatolar
- 7.1 each UNION query must have the same number of columns
- 7.2 UNION types bigint and text cannot be matched
- 7.3 invalid UNION/INTERSECT/EXCEPT ORDER BY clause
- 7.4 syntax error at or near "UNION"
- 7.5 Natija kutilganidan kam
- 8. Mashqlar
- 1-mashq (oson): umumiy teglar
- 2-mashq (o'rta): Dilnozaning lentasi
- 3-mashq (qiyin): faqat Sardorda bor teg
- 4-mashq: SQL qadami — statistika "kartochkalari"
- 9. Real ishda
- Xulosa
- Manbalar
SQL UNION, INTERSECT va EXCEPT: to'plam amallari PostgreSQL'da
Qisqacha: To'plam amallari ikki
SELECTnatijasini ustma-ust birlashtiradi:UNION— ikkalasidagi hamma qatorlar takrorsiz,UNION ALL— takrorlari bilan (tezroq),INTERSECT— ikkalasida bor qatorlar,EXCEPT— birinchisida bor, ikkinchisida yo'q qatorlar. Shart: ikkala so'rovda ustunlar soni bir xil va turlari mos bo'lsin. Ustun nomlari birinchiSELECTdan olinadi,ORDER BYvaLIMITesa butun natijaga qo'llanadi. JOIN qatorlarni yonma-yon qo'shadi, to'plam amallari — ustma-ust.
Bu darsda
UNIONvaUNION ALLfarqini va qachon qaysi biri kerakligini bilasiz.INTERSECTvaEXCEPTbilan umumiy va farqli qatorlarni topasiz.- Ustunlar soni va turi xatolarini o'qib, tuzatasiz.
ORDER BY,LIMITva qavslar bilan to'plam amallari ustuvorligini boshqarasiz.- Vazifa hodisalarining bitta lentasini va API statistikasini yig'asiz.
Oldin bilishingiz kerak: SELECT va WHERE, ORDER BY, LIMIT va OFFSET, NULL mantiqi.
1. Nega bu kerak?
Window funksiyalar 2 darsida bitta jadval ichida qo'shni qatorlarni solishtirdik. Endi boshqa turdagi savollar:
- "Aziz va Dilnozada qanday teglar bor — ikkalasinikini bitta ro'yxatda?"
- "Qaysi teglar ikkalasida ham bor?"
- "Azizda bor, Dilnozada yo'q teglar qaysi?"
- "Vazifa yaratildi" va "vazifa bajarildi" hodisalarini bitta lentada, vaqt bo'yicha ko'rsat.
Bu savollarning hammasida ikkita alohida natija bor va ular ustma-ust qo'yilishi kerak. JOIN'lar jadvallarni yonma-yon qo'yardi (ustunlar ko'payadi). To'plam amallari esa qatorlarni ustma-ust qo'yadi (ustunlar o'sha, qatorlar ko'payadi yoki kamayadi).
O'xshatish: ikki sinfning o'quvchilari ro'yxati. "Ikkala sinfdagi hamma o'quvchilar" — birlashma. "Ikkala sinfga qatnaydiganlar" (to'garak a'zolari) — kesishma. "Faqat birinchi sinfdagilar" — farq. Maktab matematikasidagi to'plamlar — xuddi o'sha.
flowchart LR
A["Aziz teglari<br/>8 ta"] --> U["UNION<br/>10 ta"]
B["Dilnoza teglari<br/>6 ta"] --> U
A --> I["INTERSECT<br/>4 ta"]
B --> I
A --> E["EXCEPT<br/>4 ta"]
B -.-> EDiagrammadagi raqamlar — quyidagi haqiqiy so'rovlar natijasi. EXCEPT ga Dilnozadan nuqtali chiziq: uning teglari natijaga kirmaydi, faqat "olib tashlash" uchun ishlatiladi.
2. UNION va UNION ALL
2.1 Takrorsiz birlashma
Azizning (1) va Dilnozaning (2) teglari bitta ro'yxatda. Kanon tajribasi (PostgreSQL 18.6, vazifalar holat 23):
SELECT nom FROM teglar WHERE egasi_id = 1
UNION
SELECT nom FROM teglar WHERE egasi_id = 2
ORDER BY 1; nom
------------
#bozor
#docker
#ingliz
#ish
#oila
#o'qish
#portfolio
#ta'mir
#to'lov
#uy
(10 rows)Azizda 8 ta, Dilnozada 6 ta teg — jami 14 ta. Natijada 10 ta: ikkalasida bor 4 ta teg (#bozor, #oila, #o'qish, #to'lov) bir martadan qoldi. UNION takrorlarni olib tashlaydi — xuddi SELECT DISTINCT kabi.
#oila nega #o'qish dan oldin? Kanon bazasining tartiblash qoidasi (collation) — en_US.utf8 — birinchi bosqichda # va apostrof kabi belgilarni e'tiborsiz qoldiradi: oila va oqish solishtiriladi, i < q. Boshqa collation'da tartib boshqacha bo'lishi mumkin: biz C collation'li bazada sinab ko'rdik (PostgreSQL 17.6) — u yerda #o'qish oldin chiqdi, chunki C belgilarni kodi bo'yicha solishtiradi va apostrof kodi harflarnikidan kichik. Bu ORDER BY, LIMIT va OFFSET darsidagi o'zbek alifbosi mavzusining davomi.
2.2 Takrorlari bilan
SELECT count(*) AS union_all FROM (
SELECT nom FROM teglar WHERE egasi_id = 1
UNION ALL
SELECT nom FROM teglar WHERE egasi_id = 2
) s; union_all
-----------
14
(1 row)UNION ALL hech narsani olib tashlamaydi: 8 + 6 = 14. U tezroq: takrorni topish uchun Postgres natijani saralashi yoki hash jadval qurishi kerak. UNION ALL esa ikkinchi natijani birinchisining oxiriga shunchaki qo'shadi.
| Amal | Takrorlar | Tezlik |
|---|---|---|
UNION |
olib tashlanadi | sekinroq (saralash yoki hash) |
UNION ALL |
qoladi | tez |
Qoida: takror bo'lishi mumkin emasligini bilsangiz yoki takror kerak bo'lsa — UNION ALL. "Takrorlar bo'lmasin" aniq kerak bo'lsagina — UNION. Ko'p dasturchilar odatdan UNION yozadi va katta jadvalda keraksiz saralash uchun pul to'laydi.
- UNION ALL8 + 614 qator
- UNIONtakrorsiz10 qator
- INTERSECTikkalasida4 qator
- EXCEPTfaqat Azizda4 qator
Manba: vazifalar namuna bazasi (holat 23), kanon so'rovlari, PostgreSQL 18.6
Grafikdagi to'rt ustun bitta tenglikni ko'rsatadi: UNION (10) = INTERSECT (4) + Aziz EXCEPT Dilnoza (4) + Dilnoza EXCEPT Aziz (2).
Tekshirib ko'ring:
SELECT 1 UNION SELECT 1 UNION ALL SELECT 1necha qator qaytaradi?
Javob
2 qator. Amallar chapdan o'ngga bajariladi: SELECT 1 UNION SELECT 1 — takror olib tashlanadi, 1 qator. Keyin UNION ALL SELECT 1 — yana bitta qo'shiladi, takror olib tashlanmaydi: 2 qator.
3. INTERSECT va EXCEPT
3.1 Kesishma va farq
SELECT nom FROM teglar WHERE egasi_id = 1
INTERSECT
SELECT nom FROM teglar WHERE egasi_id = 2
ORDER BY 1; nom
---------
#bozor
#oila
#o'qish
#to'lov
(4 rows)SELECT nom FROM teglar WHERE egasi_id = 1
EXCEPT
SELECT nom FROM teglar WHERE egasi_id = 2
ORDER BY 1; nom
------------
#docker
#portfolio
#ta'mir
#uy
(4 rows)INTERSECT (kesishma) — ikkala natijada bor qatorlar. EXCEPT (farq; boshqa bazalarda MINUS) — birinchisida bor, ikkinchisida yo'q. EXCEPT da tartib muhim: A EXCEPT B va B EXCEPT A — boshqa-boshqa natija. Dilnoza EXCEPT Aziz — #ingliz, #ish.
Ikkalasi ham sukut bo'yicha takrorsiz. INTERSECT ALL va EXCEPT ALL takrorlarni sanaydi: masalan A da bir qator 3 marta, B da 1 marta bo'lsa, EXCEPT ALL uni 2 marta qoldiradi. Bizning teglarda bir foydalanuvchida takror nom yo'q (UNIQUE (egasi_id, nom)), shuning uchun natija bir xil.
3.2 JOIN bilan yozsa-chi?
INTERSECT ni JOIN yoki EXISTS bilan, EXCEPT ni NOT EXISTS bilan ham yozish mumkin (Subquery va LATERAL). Farqi — NULL da. To'plam amallari ikki NULL ni teng deb hisoblaydi (biz ishga tushirdik, PG 17.6):
SELECT NULL::int AS x UNION SELECT NULL::int; x
---
(1 row)Ikki NULL bitta qatorga birlashdi — demak UNION ularni takror deb ko'rdi. = esa NULL mantiqi bo'yicha NULL = NULL ni NULL (rost emas) deydi va JOIN bunday qatorlarni juftlamaydi. Ko'p ustunli solishtirishda, NULLli ustunlar bo'lsa, INTERSECT/EXCEPT qisqaroq va to'g'riroq bo'lishi mumkin.
Tekshirib ko'ring: "Azizda ham, Dilnozada ham yo'q, lekin Madinada bor teglar" — qanday yoziladi?
Javob
Madina teglaridan ikkalasining birlashmasini ayiramiz: SELECT nom FROM teglar WHERE egasi_id = 4 EXCEPT (SELECT nom FROM teglar WHERE egasi_id = 1 UNION SELECT nom FROM teglar WHERE egasi_id = 2). Qavs muhim — keyingi bo'limda nega ekanini ko'ramiz.
4. Qoidalar: ustunlar, tartib va ustuvorlik
4.1 Ustunlar soni va turi
Ikkala SELECT ning ustunlari "ustma-ust" tushishi kerak:
SELECT id, matn FROM vazifalar UNION SELECT id FROM foydalanuvchilar;ERROR: each UNION query must have the same number of columns
LINE 1: SELECT id, matn FROM vazifalar UNION SELECT id FROM foydalan...
^Tarjimasi: "har bir UNION so'rovida ustunlar soni bir xil bo'lishi kerak". Birinchisida 2 ta, ikkinchisida 1 ta.
SELECT id FROM vazifalar UNION SELECT email FROM foydalanuvchilar;ERROR: UNION types bigint and text cannot be matched
LINE 1: SELECT id FROM vazifalar UNION SELECT email FROM foydalanuvc...
^Tarjimasi: "UNION turlari bigint va text mos kelmaydi". Ustunlar o'rni bo'yicha juftlanadi, nomi bo'yicha emas: 1-ustun 1-ustun bilan. Kerak bo'lsa turini o'zingiz moslang: id::text. Bir tomonda qiymat yo'q bo'lsa — NULL yoki o'zgarmas qiymat qo'ying (SELECT 99, NULL).
4.2 Nomlar va ORDER BY
Natija ustunlarining nomlari birinchi SELECT dan olinadi. ORDER BY butun natijaga tegishli va oxirida bir marta yoziladi. Unda faqat natija ustunining nomi yoki raqami ishlaydi (biz ishga tushirdik, PG 17.6):
SELECT nom FROM teglar WHERE egasi_id = 1
UNION
SELECT nom FROM teglar WHERE egasi_id = 2
ORDER BY lower(nom);ERROR: invalid UNION/INTERSECT/EXCEPT ORDER BY clause
LINE 4: ORDER BY lower(nom);
^
DETAIL: Only result column names can be used, not expressions or functions.
HINT: Add the expression/function to every SELECT, or move the UNION into a FROM clause.Tarjimasi: "noto'g'ri ORDER BY. Tafsilot: faqat natija ustunlari nomlari ishlatiladi, ifoda yoki funksiya emas. Maslahat: ifodani har bir SELECT ga qo'shing yoki UNION ni FROM ichiga oling". Ikkinchi yo'l: SELECT * FROM (... UNION ...) s ORDER BY lower(nom).
ORDER BY siz UNION natijasi tartibi kafolatlanmagan — Postgres hash ishlatsa, qatorlar aralash chiqadi.
4.3 Qavslar va har qismga LIMIT
Har qismga alohida ORDER BY ... LIMIT kerak bo'lsa (masalan har foydalanuvchining eng yangi vazifasi), qismni qavsga oling:
(SELECT matn FROM vazifalar WHERE egasi_id = 1
ORDER BY yaratilgan_vaqt DESC LIMIT 1)
UNION ALL
(SELECT matn FROM vazifalar WHERE egasi_id = 2
ORDER BY yaratilgan_vaqt DESC LIMIT 1); matn
-----------------------------
Velosiped zanjirini moylash
Rezyume yangilash #ish
(2 rows)Qavssiz yozsangiz, Postgres birinchi ORDER BY ... LIMIT dan keyin UNION ALL ni kutmaydi: syntax error at or near "UNION".
4.4 Ustuvorlik: INTERSECT birinchi
Arifmetikada ko'paytirish qo'shishdan oldin bajariladi. To'plam amallarida ham shunday: INTERSECT — UNION va EXCEPT dan oldin. Sardor (3), Madina (4) va Javohir (5) teglari (biz ishga tushirdik, PG 17.6):
SELECT nom FROM teglar WHERE egasi_id = 3
UNION
SELECT nom FROM teglar WHERE egasi_id = 4
INTERSECT
SELECT nom FROM teglar WHERE egasi_id = 5
ORDER BY 1; nom
----------
#ish
#mashina
#sport
#to'lov
#uy
(5 rows)(SELECT nom FROM teglar WHERE egasi_id = 3
UNION
SELECT nom FROM teglar WHERE egasi_id = 4)
INTERSECT
SELECT nom FROM teglar WHERE egasi_id = 5
ORDER BY 1; nom
--------
#ish
#sport
(2 rows)Birinchisi — 3 UNION (4 INTERSECT 5). Madina (#oila, #o'qish, #to'lov) va Javohirning (#ish, #server, #sport) umumiy tegi yo'q, natija — Sardorning 5 tegi. Ikkinchisi — qavs bilan "Sardor yoki Madinada bor, Javohirda ham bor". Bir xil so'zlar, butunlay boshqa javob. Qoida: bir nechta turli amal bo'lsa — doim qavs qo'ying.
5. Hodisalar lentasi
To'plam amallarining eng amaliy ishlatilishi — har xil manbalardan bitta lenta. Azizning vazifalari bo'yicha "yaratildi" va "bajarildi" hodisalari bitta ro'yxatda (kanon tajribasi):
SELECT 'vazifa' AS tur, matn AS matn, yaratilgan_vaqt AS vaqt
FROM vazifalar WHERE egasi_id = 1 AND ota_id IS NULL
UNION ALL
SELECT 'bajarildi', matn, bajarilgan_vaqt
FROM vazifalar WHERE egasi_id = 1 AND bajarildi AND ota_id IS NULL
ORDER BY vaqt DESC LIMIT 6; tur | matn | vaqt
-----------+------------------------------------------------+------------------------
vazifa | Velosiped zanjirini moylash | 2026-10-18 12:20:00+00
vazifa | SQL JOIN mashqlarini yechish #o'qish | 2026-10-14 14:30:00+00
bajarildi | Elektr to'lovini Click orqali qilish #to'lov | 2026-10-10 07:05:00+00
vazifa | Elektr to'lovini Click orqali qilish #to'lov | 2026-10-10 07:00:00+00
vazifa | Oshxonadagi jo'mrakni almashtirish #ta'mir #uy | 2026-10-07 05:15:00+00
vazifa | Portfolio saytiga blog yozish #portfolio | 2026-10-05 16:00:00+00
(6 rows)Uch narsaga e'tibor bering:
turustuni — o'zgarmas matn, qator qaysi manbadan kelganini ko'rsatadi. Ustun nomi faqat birinchiSELECTda beriladi.UNION ALL— "yaratildi" va "bajarildi" hech qachon bir xil qator emas (tur farqli), takror tekshiruvi behuda.ORDER BY vaqt DESC LIMIT 6— butun lentaga. Elektr to'lovi 7:00 da yaratilib, 7:05 da bajarilgan — ikkala hodisa lentada yonma-yon.
Kelajakda izohlar jadvali qo'shilganda (Bog'lanishlar), lentaga uchinchi UNION ALL bo'lagi — "izoh yozildi" — qo'shiladi.
6. Ikki tomonlama EXCEPT: ma'lumot mosligini tekshirish
UPSERT va MERGE darsida teglar jadvalini vazifa matnlaridan bir marta to'ldirdik. Endi savol: jadval matnlarga hali ham to'liq mosmi? Ortiqcha teg yo'qmi, unutilgan teg yo'qmi? Bu — ikki to'plamni solishtirish, ya'ni EXCEPT ning ishi. Ikki yo'nalishda tekshiramiz va natijani UNION ALL bilan bitta jadvalga yig'amiz (biz ishga tushirdik, PG 17.6):
SELECT 'faqat jadvalda' AS qayerda, count(*) FROM (
SELECT egasi_id, nom FROM teglar
EXCEPT
SELECT v.egasi_id, t.nom
FROM vazifalar v CROSS JOIN LATERAL teglarni_ajrat(v.matn) t(nom)
) a
UNION ALL
SELECT 'faqat matnda', count(*) FROM (
SELECT v.egasi_id, t.nom
FROM vazifalar v CROSS JOIN LATERAL teglarni_ajrat(v.matn) t(nom)
EXCEPT
SELECT egasi_id, nom FROM teglar
) b; qayerda | count
----------------+-------
faqat jadvalda | 0
faqat matnda | 0
(2 rows)Ikkala yo'nalishda 0 — teglar jadvali va matnlardagi teglar to'plami aynan bir xil. Bitta yo'nalishni tekshirish yetmaydi. A EXCEPT B bo'sh bo'lsa, faqat "A ning hammasi B da bor" degani — B da ortiqcha qatorlar qolishi mumkin. Ikki tomon ham bo'sh bo'lsagina to'plamlar teng.
Bu yerda ikki ustun (egasi_id, nom) birga solishtirildi: to'plam amallari butun qatorni taqqoslaydi. JOIN bilan yozsangiz, har ustun uchun alohida shart va NULL ehtiyoti kerak bo'lardi. Shu so'rovni fon vazifasi sifatida har kecha ishga tushirib, 0 bo'lmasa ogohlantirish yuborish — "ma'lumot sog'lig'i" tekshiruvlarining odatiy shakli. Bunday mos kelmaslik qanday paydo bo'lishini va trigger uni qanday oldini olishini Denormalizatsiya va hisoblangan maydonlar darsida ko'ramiz.
7. Ko'p uchraydigan xatolar
7.1 each UNION query must have the same number of columns
Ustunlar soni teng emas. Yetishmagan joyga NULL yoki o'zgarmas qiymat qo'ying.
7.2 UNION types bigint and text cannot be matched
Bir o'rindagi ustunlar turi mos emas — ustunlar tartibini tekshiring yoki ::text bilan moslang.
7.3 invalid UNION/INTERSECT/EXCEPT ORDER BY clause
ORDER BY da ifoda. Natija ustuni nomini ishlating yoki butun so'rovni FROM (...) ga o'rang.
7.4 syntax error at or near "UNION"
Birinchi qismda ORDER BY/LIMIT bor, lekin qavs yo'q. Har qismni qavsga oling.
7.5 Natija kutilganidan kam
UNION takrorlarni "yedi". Takrorlar kerak bo'lsa — UNION ALL.
8. Mashqlar
Mashq fayllari kurs/mashqlar/26/30-toplam/ da. Hammasi vazifalar holat 23 da.
1-mashq (oson): umumiy teglar
Aziz (1) va Madinaning (4) umumiy teglari, alifbo bo'yicha. Yordam: INTERSECT va oxirida ORDER BY 1.
Yechim
SELECT nom FROM teglar WHERE egasi_id = 1
INTERSECT
SELECT nom FROM teglar WHERE egasi_id = 4
ORDER BY 1; nom
---------
#oila
#o'qish
#to'lov
(3 rows)Madinaning hamma uch tegi Azizda ham bor.
2-mashq (o'rta): Dilnozaning lentasi
Dilnozaning (2) "yaratildi" va "bajarildi" hodisalari: tur, id, vaqt; eng yangi 4 tasi. Yordam: «Hodisalar lentasi» bo'limidagi so'rov, matn o'rniga id.
Yechim
SELECT 'yaratildi' AS tur, id, yaratilgan_vaqt AS vaqt
FROM vazifalar WHERE egasi_id = 2
UNION ALL
SELECT 'bajarildi', id, bajarilgan_vaqt
FROM vazifalar WHERE egasi_id = 2 AND bajarildi
ORDER BY vaqt DESC LIMIT 4; tur | id | vaqt
-----------+----+------------------------
yaratildi | 36 | 2026-10-16 17:00:00+00
bajarildi | 29 | 2026-10-13 04:30:00+00
yaratildi | 29 | 2026-10-11 04:30:00+00
yaratildi | 26 | 2026-10-09 08:00:00+00
(4 rows)29-vazifa (gaz to'lovi) ikki marta keldi: yaratilgan va ikki kundan keyin bajarilgan. UNION yozilsa ham bu qatorlar qolardi (tur farqli), lekin keraksiz takror tekshiruvi bajarilardi.
3-mashq (qiyin): faqat Sardorda bor teg
Sardorda (3) bor, lekin boshqa hech bir foydalanuvchida yo'q teg nomlari. Yordam: EXCEPT ning ikkinchi qismi — boshqa hamma foydalanuvchilarning teglari (egasi_id <> 3).
Yechim
SELECT nom FROM teglar WHERE egasi_id = 3
EXCEPT
SELECT nom FROM teglar WHERE egasi_id <> 3
ORDER BY 1; nom
----------
#mashina
(1 row)Sardorning 5 tegidan 4 tasi (#ish, #sport, #to'lov, #uy) boshqalarda ham bor. #mashina — faqat unda. Bitta EXCEPT "hamma boshqalar" ga qarshi — uchta EXCEPT zanjiridan sodda.
4-mashq: SQL qadami — statistika "kartochkalari"
Tasavvur qiling: ilovaga statistika sahifasi qo'shmoqchimiz (25-qism API'sida hozircha yo'q). U uch raqamni ro'yxat sifatida ko'rsatadi: jami vazifalar, bajarilganlar, teglar. Azizga (1) bitta so'rov bilan korsatkich, soni qatorlari. Sxema o'zgarmaydi — commit yo'q. Yordam: uchta SELECT 'nom', count(*) ... ni UNION ALL bilan.
Yechim
SELECT 'jami' AS korsatkich, count(*) AS soni
FROM vazifalar WHERE egasi_id = 1
UNION ALL
SELECT 'bajarilgan', count(*)
FROM vazifalar WHERE egasi_id = 1 AND bajarildi
UNION ALL
SELECT 'teglar', count(*) FROM teglar WHERE egasi_id = 1; korsatkich | soni
------------+------
jami | 12
bajarilgan | 5
teglar | 8
(3 rows)Halol solishtirish: bir jadvaldan olinadigan ikki raqamni bitta qatorda olish arzonroq — count(*) va count(*) FILTER (WHERE bajarildi) (Agregatlar), jadval bir marta o'qiladi. UNION ALL turli jadvallar (vazifalar, teglar) aralashganda o'zini oqlaydi. API JSON'i uchun qator shakli ham, ustun shakli ham ishlaydi — frontend qaysi biri qulay bo'lsa.
9. Real ishda
- Lentalar va faollik tarixi: "buyurtma berildi", "to'landi", "yetkazildi" — turli jadvallardan
UNION ALL+ORDER BY vaqt. - Ma'lumot ko'chirishni tekshirish: eski va yangi jadvalni
EXCEPTbilan ikki tomondan solishtirish — ikkalasi bo'sh bo'lsa, ko'chirish to'g'ri. - Bo'lingan jadvallarni birlashtirish:
buyurtmalar_2025vabuyurtmalar_2026—UNION ALL(Postgres'ning bo'lib saqlash mexanizmi buni o'zi qiladi — Partitioning darsida). - Tezlik:
UNIONdagi keraksiz takror tekshiruvi katta jadvallarda sezilarli — review'da "buUNION ALLbo'lishi mumkinmi?" degan savol odatiy. - Intervyu: "
UNIONvaUNION ALLfarqi" — boshlang'ich SQL intervyusining klassik savoli.
Xulosa
UNION— birlashma takrorsiz,UNION ALL— takrorlari bilan va tezroq.INTERSECT— ikkalasida bor,EXCEPT— birinchisida bor, ikkinchisida yo'q;ALLvariantlari takrorlarni sanaydi.- Ustunlar soni teng, turlari mos; juftlash o'rni bo'yicha, nomlar birinchi
SELECTdan. ORDER BY/LIMIT— butun natijaga; qismga kerak bo'lsa — qavs;INTERSECTboshqalardan oldin bajariladi.- To'plam amallari
NULLniNULLga teng deb oladi (JOIN'dan farqli).
Keyingi dars: Tahliliy SQL naqshlari — ROLLUP, CUBE, bo'sh kunlarni to'ldirish, pivot va "gaps and islands".
Manbalar
- PostgreSQL 18 hujjati — Combining Queries (UNION, INTERSECT, EXCEPT): https://www.postgresql.org/docs/18/queries-union.html
- PostgreSQL 18 hujjati — SELECT, UNION Clause (ustuvorlik): https://www.postgresql.org/docs/18/sql-select.html#SQL-UNION
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!