Oldingi darslarda GROUP BY yordamida qatorlarni guruhlarga bo'lishni va har bir guruh uchun COUNT kabi agregat funksiyalarni hisoblashni o'rgandik. Masalan, har bir kategoriyada nechta mahsulot borligini sanab chiqaramiz:
SELECT kategoriya, COUNT(*) FROM mahsulotlar GROUP BY kategoriya;Natija quyidagicha bo'ladi:
Elektronika|3
Kanstovar|2
Kitoblar|1
Mebel|2Endi yangi savol tug'iladi: agar bizga faqat ko'p mahsulotli kategoriyalar kerak bo'lsa-chi? Masalan, tarkibida kamida 2 ta mahsulot bor kategoriyalarni ko'rmoqchimiz. Bunda Kitoblar (atigi 1 ta mahsulot) ro'yxatdan tushib qolishi kerak.
Bu yerda WHERE ishlatish mantiqiy tuyuladi. Lekin WHERE COUNT(*) >= 2 deb yozsak, xatolik chiqadi. Nega? Chunki WHERE guruhlardan oldin ishlaydi — u alohida qatorlarni filtrlaydi, agregat natijalarni emas. Guruhlar hosil bo'lgandan keyin ularni filtrlash uchun bizga boshqa vosita — HAVING kerak.
HAVING — bu GROUP BY bilan hosil qilingan guruhlarni filtrlaydigan shart. U WHERE ga juda o'xshaydi, lekin alohida qatorlarni emas, balki butun guruhlarni tekshiradi. Shu sababli HAVING ichida COUNT(*) kabi agregat funksiyalarni ishlatish mumkin.
HAVING har doim GROUP BY dan keyin yoziladi:
SELECT kategoriya, COUNT(*) FROM mahsulotlar GROUP BY kategoriya HAVING COUNT(*) >= 2;Bu so'rov avval kategoriyalar bo'yicha guruhlaydi, har bir guruhdagi mahsulotlarni sanaydi, so'ngra faqat soni 2 yoki undan ko'p bo'lgan guruhlarni qoldiradi:
Elektronika|3
Kanstovar|2
Mebel|2Ko'rib turganingizdek, atigi 1 ta mahsuloti bor Kitoblar kategoriyasi natijaga kirmadi — chunki uning soni >= 2 shartiga mos kelmadi.
Bu ikki so'z bir-biriga o'xshaydi, lekin butunlay boshqa bosqichda ishlaydi. Farqni eslab qolish oson:
GROUP BY dan oldin ishlaydi, shuning uchun agregat funksiyani (COUNT, SUM) ishlata olmaydi.GROUP BY dan keyin ishlaydi va agregat funksiyalarni ishlata oladi.SQL so'rovi quyidagi tartibda bajariladi:
1. FROM — jadvalni oladi
2. WHERE — qatorlarni filtrlaydi
3. GROUP BY — qolgan qatorlarni guruhlaydi
4. HAVING — guruhlarni filtrlaydi
5. SELECT — natijani chiqaradi
6. ORDER BY — natijani tartiblaydiMuhim: Qatorlar uchun shart
WHEREga, guruhlar (agregat) uchun shart esaHAVINGga yoziladi.COUNT(*) >= 2kabi shart faqatHAVINGda ishlaydi.
WHERE va HAVING ni birgalikda ham ishlatish mumkin. Masalan, avval omborida 10 dan ko'p mahsulot bor qatorlarni qoldiramiz, keyin guruhlaymiz va faqat 2 dan ko'p guruhlarni olamiz:
SELECT kategoriya, COUNT(*)
FROM mahsulotlar
WHERE ombor > 10
GROUP BY kategoriya
HAVING COUNT(*) >= 2;Natija bir nechta qator qaytarishi mumkin, shuning uchun aniq tartib uchun oxirida ORDER BY qo'shamiz. Eslang: ORDER BY har doim so'rovning eng oxirida keladi:
SELECT kategoriya, COUNT(*) FROM mahsulotlar GROUP BY kategoriya HAVING COUNT(*) >= 2 ORDER BY kategoriya;Natija endi alifbo tartibida chiqadi:
Elektronika|3
Kanstovar|2
Mebel|2Eslatma: So'rovdagi qismlar tartibi qat'iy:
WHERE→GROUP BY→HAVING→ORDER BY. Bu tartibni buzsangiz, SQL xatolik beradi.
Onlayn do'konda tarkibida kamida 2 ta mahsulot bor kategoriyalarni topmoqchimiz. mahsulotlar jadvalini kategoriya bo'yicha guruhlab, har bir guruhdagi mahsulotlar sonini hisoblang, so'ngra HAVING yordamida faqat soni 2 yoki undan ko'p bo'lgan kategoriyalarni qoldiring. Natijani alifbo tartibida (kategoriya va son) chiqaring.