GROUP BY — SQL so‘rovida bir xil kalit qiymatlarga ega satrlarni guruhlarga ajratib, har guruh uchun aggregate hisoblash imkonini beradigan band. U odatda COUNT, SUM, AVG, MIN va MAX funksiyalari bilan hisobot, statistika hamda umumlashtirilgan natija yaratishda ishlatiladi.
Guruhlash mantiqi
Quyidagi so‘rov har bir status bo‘yicha buyurtmalar soni va jami summani hisoblaydi:
SELECT status, COUNT(*) AS order_count, SUM(total) AS amount
FROM orders
GROUP BY status;
Database avval FROM va WHERE shartlariga mos satrlarni aniqlaydi, so‘ng status qiymati bo‘yicha guruhlaydi va aggregate funksiyalarni hisoblaydi. Mantiqiy bajarilish tartibida GROUP BY SELECT ro‘yxatidan oldin keladi. Shu sabab guruhlanmagan oddiy ustunni natijaga chiqarish ko‘pchilik SQL tizimlarida xato yoki noaniq natija hisoblanadi.
Bir nechta ustun ko‘rsatilsa, ularning kombinatsiyasi guruh kaliti bo‘ladi. Masalan, GROUP BY region, status har region ichida har bir status uchun alohida guruh yaratadi. Bu region bo‘yicha jami bilan bir xil emas.
NULL va aggregate funksiyalar
Guruhlashda barcha NULL kalitlar odatda bitta guruhga tushadi. Biroq aggregate funksiyalarning NULLga munosabati farq qiladi. COUNT(*) guruhdagi barcha satrlarni sanaydi, COUNT(column) esa ushbu ustuni NULL bo‘lmagan satrlarni sanaydi. SUM va AVG ham NULL qiymatlarni hisobga olmaydi; guruhda mos qiymat bo‘lmasa natija NULL bo‘lishi mumkin.
Bu farq ma’lumot sifati tahlilida muhim. Yetkazib berish sanasi hali belgilanmagan buyurtmalarni COUNT(shipped_at) bilan sanash barcha buyurtmalar sonini bermaydi.
WHERE va HAVING
WHERE guruhlashdan oldin alohida satrlarni, HAVING esa guruhlashdan keyin aggregate natijalarni filtrlaydi:
SELECT customer_id, SUM(total) AS spent
FROM orders
WHERE created_at >= DATE '2026-01-01'
GROUP BY customer_id
HAVING SUM(total) >= 1000000;
Bu so‘rov avval sana bo‘yicha satrlarni kamaytiradi, keyin mijozlar kesimida hisoblaydi va faqat belgilangan summadan katta guruhlarni qoldiradi. Aggregate bo‘lmagan shartni imkon qadar WHEREga qo‘yish qayta ishlanadigan ma’lumotni kamaytirishi mumkin.
Kengaytirilgan guruhlash
ROLLUP, CUBE va GROUPING SETS bir so‘rovda bir nechta umumlashtirish darajasini beradi. ROLLUP(region, city) shahar, region va umumiy jami qatorlarini yaratishi mumkin. Hosil bo‘lgan jami qatordagi NULLni ma’lumotdagi haqiqiy NULLdan ajratish uchun GROUPING funksiyasi ishlatiladi. Bu imkoniyatlar barcha database mahsulotlarida bir xil sintaksisga ega emas.
Samaradorlik va aniqlik
Database guruhlarni hash jadvalida yig‘ishi yoki kalit bo‘yicha saralashi mumkin. Katta cardinality ko‘p xotira talab qiladi va vaqtinchalik diskka spill bo‘lishi mumkin. WHERE filtri, mos partition, oldindan aggregate qilingan jadval yoki materialized view takroriy hisobotni tezlashtiradi.
Natija tartibi GROUP BY bilan kafolatlanmaydi; ko‘rsatish uchun alohida ORDER BY kerak. Pul summalarida floating-point o‘rniga aniq decimal tip, vaqt bo‘yicha hisobotda esa timezone va interval chegaralari kelishilgan bo‘lishi lozim. Aks holda sintaktik jihatdan to‘g‘ri so‘rov biznes ma’nosi bo‘yicha noto‘g‘ri guruhlar yaratadi.
Functional dependency ayrim database tizimlariga primary key bo‘yicha guruhlanganda shu jadvalning boshqa ustunlarini ham tanlashga ruxsat beradi. Bu qoida mahsulotlar orasida bir xil emas. Portativ queryda tanlangan oddiy ustunlar guruh kalitida aniq ko‘rsatiladi yoki ma’noli aggregate bilan olinadi. Tasodifiy qiymat qaytaradigan yumshoq rejimga tayanish natijani barqaror qilmaydi.
Bog‘liq tushunchalar
SQL, Aggregate function, HAVING, ORDER BY, GROUPING SETS, ROLLUP, Query plan, Materialized view