Oldingi darslarda biz agregat funksiyalar (COUNT, SUM, AVG, ...) bilan tanishdik. Ular butun jadval bo'yicha bitta natija qaytaradi. Masalan, jadvalda nechta mahsulot borligini sanaymiz:
SELECT COUNT(*) FROM mahsulotlar;Natija — bitta son:
8Lekin ko'pincha bizga umumiy son emas, balki har bir guruh bo'yicha alohida natija kerak bo'ladi. Masalan: "Elektronika kategoriyasida nechta mahsulot bor? Mebelda-chi? Kitoblarda-chi?". Mana shu yerda GROUP BY yordam beradi.
Bu darsda quyidagi mahsulotlar jadvalidan foydalanamiz:
| id | nomi | kategoriya | narx | ombor |
|---|---|---|---|---|
| 1 | Telefon | Elektronika | 5000000 | 10 |
| 2 | Noutbuk | Elektronika | 12000000 | 5 |
| 3 | Quloqchin | Elektronika | 300000 | 50 |
| 4 | Kitob | Kitoblar | 50000 | 100 |
| 5 | Daftar | Kanstovar | 8000 | 200 |
| 6 | Ruchka | Kanstovar | 3000 | 500 |
| 7 | Stol | Mebel | 800000 | 15 |
| 8 | Stul | Mebel | 250000 | 40 |
GROUP BY bir xil qiymatga ega bo'lgan qatorlarni bitta guruhga birlashtiradi. Keyin agregat funksiya har bir guruh uchun alohida hisoblanadi.
kategoriya ustuni bo'yicha guruhlasak, jadvaldagi 8 qator 4 ta guruhga bo'linadi:
Endi har bir guruhda nechta mahsulot borligini sanaymiz:
SELECT kategoriya, COUNT(*) FROM mahsulotlar GROUP BY kategoriya;Natija — har bir kategoriya uchun bitta qator:
Elektronika|3
Kanstovar|2
Kitoblar|1
Mebel|2E'tibor bering: SELECT da ikkita narsa yozdik — qaysi ustun bo'yicha guruhlaganimiz (kategoriya) va shu guruh uchun agregat (COUNT(*)). Shu tariqa har bir natija qatori "qaysi guruh va uning soni" degan ma'noni bildiradi.
Muhim:
GROUP BYdan keyin yozilgan ustun (kategoriya) odatdaSELECTda ham bo'ladi — aks holda natijadagi sonlar qaysi guruhga tegishli ekanini bilib bo'lmaydi.
GROUP BY faqat COUNT bilan emas, har qanday agregat bilan ishlaydi. Masalan, har bir kategoriyadagi mahsulotlarning umumiy ombor zaxirasini (SUM) hisoblaymiz:
SELECT kategoriya, SUM(ombor) FROM mahsulotlar GROUP BY kategoriya;Natija:
Elektronika|65
Kanstovar|700
Kitoblar|100
Mebel|55Bu yerda SUM(ombor) har bir guruh ichidagi ombor qiymatlarini alohida-alohida qo'shadi. Masalan, Elektronika uchun: 10 + 5 + 50 = 65.
GROUP BY natijasidagi qatorlar tartibi kafolatlanmaydi. Shuning uchun natijani aniq tartibda chiqarish uchun ORDER BY qo'shamiz. U so'rovning oxirida yoziladi:
SELECT kategoriya, COUNT(*) FROM mahsulotlar GROUP BY kategoriya ORDER BY kategoriya;Natija kategoriya nomi bo'yicha alifbo tartibida chiqadi:
Elektronika|3
Kanstovar|2
Kitoblar|1
Mebel|2So'rovning tartibini eslab qolish oson: avval GROUP BY qatorlarni guruhlarga bo'ladi, so'ng ORDER BY tayyor guruhlarni tartiblaydi.
Eslatma:
GROUP BYbir nechta qator qaytaradi, shuning uchun natija aniq bo'lishi uchun deyarli har doim oxirigaORDER BYqo'shing.
Pastdagi kod oynasida mahsulotlar jadvali allaqachon yaratilgan va to'ldirilgan (ustunlar: id, nomi, kategoriya, narx, ombor). Sizning vazifangiz — har bir kategoriya bo'yicha mahsulotlar sonini hisoblab, kategoriya va sonini alifbo tartibida chiqaruvchi SELECT so'rovini yozish.