sum sql nimaga ega. SELECT buyrug'i HAVING bo'limi. SQL HAVING bayonoti bilan so'rovlarni o'zingiz yozing va keyin echimlarni ko'rib chiqing

Uning arsenalida jadvallar ko'rinishida saqlangan ma'lumotlarni manipulyatsiya qilish uchun juda ko'p kuchli vositalar mavjud.

Shubhasiz, ma'lumotlarni ma'lum bir mezon bo'yicha tanlab olishda ularni guruhlash qobiliyati ana shu vositalardan biridir. HAVING, WHERE operatori bilan bir qatorda, qandaydir tarzda guruhlangan ma'lumotlarni tanlash shartlarini aniqlash imkonini beradi.

SQL parametriga ega: tavsif

Avvalo, shuni ta'kidlash kerakki, ushbu parametr ixtiyoriydir va faqat GROUP BY parametri bilan birgalikda ishlatiladi. Esingizda bo'lsa, GROUP BY SELECTda agregat funktsiyalardan foydalanilganda qo'llaniladi va ularning hisob-kitoblari natijalarini ma'lum guruhlar uchun olish kerak bo'ladi. Agar WHERE ma'lumotlarni guruhlashdan oldin tanlash shartlarini o'rnatishga imkon bersa, HAVING to'g'ridan-to'g'ri guruhlardagi ma'lumotlarga tegishli shartlarni o'z ichiga oladi. Yaxshiroq tushunish uchun quyidagi rasmda keltirilgan sxema bilan misolni ko'rib chiqaylik.

Bu HAVING SQL-ga tavsif beradigan ajoyib misol. Jadvalda mahsulot nomlari, ularni ishlab chiqaruvchi kompaniyalar va boshqa ba'zi sohalar ro'yxati keltirilgan. Yuqori o'ng burchakdagi so'rovda biz har bir kompaniya qancha mahsulot ishlab chiqarishi haqida ma'lumot olishga harakat qilmoqdamiz va natijada biz faqat 2 dan ortiq mahsulot ishlab chiqaradigan kompaniyalarni ko'rsatishni xohlaymiz. GROUP BY parametri kompaniya nomlariga mos keladigan uchta guruhni tashkil etdi, ularning har biri uchun mahsulotlar (qatorlar) soni hisoblab chiqilgan. Ammo HAVING parametri o'z sharti bilan olingan namunadan bir guruhni kesib tashladi, chunki u shartni qoniqtirmadi. Natijada biz 5 va 3 ishlab chiqarish miqdori bo'lgan kompaniyalarga mos keladigan ikkita guruhni olamiz.

SQL-da WHERE bo'lsa, nima uchun HAVING dan foydalanish kerak, degan savol tug'ilishi mumkin. Agar biz WHERE dan foydalansak, u guruhlar bo'yicha emas, balki jadvaldagi satrlarning umumiy soniga qaragan bo'lar edi va bu holda shart mantiqiy bo'lmaydi. Biroq, ko'pincha ular bitta so'rovda mukammal tarzda birga yashaydilar.

Yuqoridagi misolda biz ma'lumotlar birinchi navbatda WHERE parametrida ko'rsatilgan xodimlarning ismlari bo'yicha qanday tanlanganligini va keyin GROUP BY guruhida guruhlangan natijadan o'tishini ko'rishimiz mumkin. qo'shimcha tekshirish har bir xodim uchun ish haqi miqdoriga qarab.

SQL HAVING parametri: misollar, sintaksis

Keling, HAVING SQL sintaksisining ba'zi xususiyatlarini ko'rib chiqaylik. Ushbu parametrning tavsifi juda oddiy. Birinchidan, yuqorida aytib o'tilganidek, u faqat GROUP BY parametri bilan birgalikda ishlatiladi va undan keyin darhol va agar so'rovda mavjud bo'lsa, ORDER BY dan oldin ko'rsatiladi. Bu tushunarli, chunki HAVING allaqachon guruhlangan ma'lumotlar uchun shartlarni belgilaydi. Ikkinchidan, ushbu parametr holatida faqat GROUP BY parametrida ko'rsatilgan agregat funktsiyalar va maydonlardan foydalanish mumkin. Barcha sharoitlar ichida bu parametr aynan WHERE holatidagi kabi ko'rsatilgan.

Xulosa

Ko'rib turganingizdek, hech qanday murakkab narsa yo'q berilgan operator Yo'q. Semantik jihatdan u WHERE kabi ishlatiladi. Barcha tanlangan ma'lumotlarga nisbatan WHERE, HAVING esa faqat GROUP BY parametrida belgilangan guruhlarga nisbatan ishlatilishini tushunish muhimdir. Biz HAVING SQL ning keng qamrovli tavsifini taqdim etdik, bu esa u bilan ishonchli ishlashingiz uchun yetarli.

Muayyan yetkazib beruvchi tomonidan ishlab chiqarilgan shaxsiy kompyuter modellari sonini qanday aniqlash mumkin? Xuddi shunday kompyuterlarning o'rtacha narxini qanday aniqlash mumkin spetsifikatsiyalar? Ushbu va ba'zi statistik ma'lumotlar bilan bog'liq boshqa ko'plab savollarga javob berish mumkin yakuniy (agregat) funktsiyalar. Standart quyidagi umumiy funktsiyalarni ta'minlaydi:

Bu funktsiyalarning barchasi bitta qiymatni qaytaradi. Shu bilan birga, funktsiyalar COUNT, MIN Va MAX har qanday ma'lumotlar turiga nisbatan qo'llaniladi SUM Va AVG faqat raqamli maydonlar uchun ishlatiladi. Funktsiya o'rtasidagi farq COUNT(*) Va COUNT(<имя поля>) ikkinchisi hisoblashda NULL qiymatlarni hisobga olmaydi.

Misol. Shaxsiy kompyuterlarning minimal va maksimal narxini toping:

Misol. Ishlab chiqaruvchi A tomonidan ishlab chiqarilgan kompyuterlarning mavjud sonini toping:

Misol. Agar biz miqdori qiziqtiradigan bo'lsak turli modellar, ishlab chiqaruvchi A tomonidan ishlab chiqarilgan bo'lsa, so'rovni quyidagicha shakllantirish mumkin (Mahsulot jadvalida har bir model bir marta qayd etilganligidan foydalangan holda):

Misol. Ishlab chiqaruvchi A tomonidan ishlab chiqarilgan mavjud turli modellar sonini toping. So'rov avvalgisiga o'xshaydi, unda ishlab chiqaruvchi A tomonidan ishlab chiqarilgan modellarning umumiy sonini aniqlash kerak edi. Bu erda siz turli xil modellar sonini ham topishingiz kerak. kompyuter stoli (ya'ni, sotuvga qo'yilganlar).

Statistik ko'rsatkichlarni olishda faqat noyob qiymatlardan foydalanishni ta'minlash uchun, qachon dalil agregat funktsiyalari foydalanish mumkin DISTINCT parametri. Boshqa ALL parametri sukut bo'lib, ustundagi barcha qaytarilgan qiymatlar hisobga olinadi. Operator,

Agar biz ishlab chiqarilgan shaxsiy kompyuter modellari sonini olishimiz kerak bo'lsa hamma ishlab chiqaruvchi, siz foydalanishingiz kerak bo'ladi GROUP BY bandi, sintaktik ergash WHERE bandlari.

GROUP BY bandi

GROUP BY bandi qo'llanilishi mumkin bo'lgan chiqish liniyalari guruhlarini aniqlash uchun ishlatiladi jamlangan funktsiyalar (COUNT, MIN, MAX, AVG va SUM). Agar ushbu band etishmayotgan bo'lsa va agregat funktsiyalar ishlatilsa, unda nomlari ko'rsatilgan barcha ustunlar TANLASH, tarkibiga kiritilishi kerak agregat funktsiyalari, va bu funksiyalar so'rov predikatini qondiradigan butun qatorlar to'plamiga qo'llaniladi. Aks holda, SELECT ro'yxatining barcha ustunlari kiritilmagan yig'indisida funktsiyalar ko'rsatilishi kerak GROUP BY bandida. Natijada, barcha chiqish so'rovlari qatorlari ushbu ustunlardagi qiymatlarning bir xil kombinatsiyasi bilan tavsiflangan guruhlarga bo'linadi. Shundan so'ng, har bir guruhga agregat funktsiyalar qo'llaniladi. E'tibor bering, GROUP BY uchun barcha NULL qiymatlari teng deb hisoblanadi, ya'ni. NULL qiymatlarni o'z ichiga olgan maydon bo'yicha guruhlanganda, barcha bunday qatorlar bitta guruhga tushadi.
Agar agar GROUP BY bandi mavjud bo'lsa, SELECT bandida agregat funktsiyalari yo'q, keyin so'rov har bir guruhdan bitta qatorni qaytaradi. Ushbu xususiyat DISTINCT kalit so'zi bilan birgalikda natijalar to'plamidagi takroriy qatorlarni yo'q qilish uchun ishlatilishi mumkin.
Keling, oddiy misolni ko'rib chiqaylik:
SELECT model, COUNT(model) AS Qty_model, AVG(narx) AS O'rtacha_narx
KOMPYUTERDAN
GROUP BY model;

Ushbu so'rovda har bir shaxsiy kompyuter modeli uchun ularning soni va o'rtacha narxi aniqlanadi. Bir xil model qiymatiga ega bo'lgan barcha qatorlar guruhni tashkil qiladi va SELECT natijasi har bir guruh uchun qiymatlar sonini va o'rtacha narx qiymatlarini hisoblab chiqadi. So'rov natijasi quyidagi jadval bo'ladi:
model Miqdor_model Oʻrtacha_narx
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Agar SELECTda sana ustuni bo'lsa, unda har bir aniq sana uchun ushbu ko'rsatkichlarni hisoblash mumkin bo'ladi. Buni amalga oshirish uchun siz sanani guruhlash ustuni sifatida qo'shishingiz kerak, so'ngra har bir qiymat kombinatsiyasi (model-sana) uchun jamlangan funktsiyalar hisoblab chiqiladi.

Bir nechta o'ziga xos xususiyatlar mavjud agregat funktsiyalarni bajarish qoidalari:

  • Agar so'rov natijasida qatorlar olinmadi(yoki ma'lum bir guruh uchun bir nechta satr), unda jami funktsiyalardan birini hisoblash uchun manba ma'lumotlari mavjud emas. Bunday holda, COUNT funktsiyalarning natijasi nolga teng bo'ladi va boshqa barcha funktsiyalarning natijasi NULL bo'ladi.
  • Dalil agregat funktsiyasi o'zida agregat funktsiyalarni o'z ichiga olmaydi(funktsiyadan funktsiya). Bular. bitta so'rovda, aytaylik, o'rtacha qiymatlarning maksimalini olish mumkin emas.
  • COUNT funktsiyasini bajarish natijasi butun son(INTEGER). Boshqa agregat funktsiyalar ular qayta ishlanadigan qiymatlarning ma'lumotlar turlarini meros qilib oladi.
  • Agar SUM funktsiyasi ishlatilgan ma'lumotlar turining maksimal qiymatidan kattaroq natijani keltirsa, xato.

Shunday qilib, agar so'rovda bo'lmasa GROUP BY bandlari, Bu agregat funktsiyalari kiritilgan SELECT bandi, barcha olingan so'rovlar qatorlarida bajariladi. Agar so'rovda GROUP BY bandi, da ko'rsatilgan ustun yoki ustunlar guruhining bir xil qiymatlariga ega bo'lgan har bir qatorlar to'plami GROUP BY bandi, guruhni tashkil qiladi va agregat funktsiyalari har bir guruh uchun alohida bajariladi.

Taklifga ega

Agar WHERE bandi satrlarni filtrlash uchun predikatni belgilaydi, keyin Taklifga ega amal qiladi guruhlashdan keyin guruhlarni qiymatlar bo'yicha filtrlaydigan o'xshash predikatni aniqlash agregat funktsiyalari. Ushbu band yordamida olingan qiymatlarni tasdiqlash uchun kerak agregat funktsiyasi da belgilangan yozuv manbasining alohida qatorlaridan emas FROM bandi, va dan bunday chiziqlar guruhlari. Shuning uchun bunday chekni o'z ichiga olmaydi WHERE bandi.

HAVING bandi GROUP BY bandi bilan birgalikda ishlatiladi. U SELECT iborasida GROUP BY bandi tomonidan qaytarilgan yozuvlarni filtrlash uchun ishlatilishi mumkin.

HAVING gap sintaksisi

agregat_funksiya SUM, COUNT, MIN yoki MAX kabi funksiya bo'lishi mumkin.

SUM funksiyasidan foydalanishga misol
Misol uchun, siz SUM funksiyasidan bo'lim nomini va savdo summasini (tegishli bo'limlar uchun) qidirishingiz mumkin. HAVING taklifi faqat savdosi $1000 dan ortiq bo'lgan bo'limlarni tanlashi mumkin.

Bo'limni TANLASH, SUM(sotish) "Jami savdo" ASQA order_details SUM(sotish) ga ega bo'lgan bo'limlar bo'yicha GURUH > 1000 ;

COUNT funksiyasidan foydalanishga misol
Misol uchun, siz bo'lim nomini va yiliga 25 000 dollardan ortiq daromad olgan xodimlar sonini (tegishli bo'limda) olish uchun COUNT funksiyasidan foydalanishingiz mumkin. HAVING taklifi faqat 10 dan ortiq xodimlar bo'lgan bo'limlarni tanlaydi.

MIN funksiyasidan foydalanishga misol
Masalan, siz bo'lim nomini va shu bo'lim uchun minimal daromadni qaytarish uchun MIN funksiyasidan foydalanishingiz mumkin. HAVING taklifi faqat daromadi 35 000 dollardan boshlanadigan bo'limlarni qaytaradi.

TANLASH bo'limi, MIN(ish haqi) AS "Eng past ish haqi" BO'LGAN GURUH BO'LIM BO'LGAN xodimlardan MIN(ish haqi) = 35000 ;

MAX funksiyasidan foydalanishga misol
Masalan, bo'lim nomi va bo'limning maksimal daromadini olish uchun funksiyadan ham foydalanishingiz mumkin. HAVING taklifi faqat maksimal daromadi 50 000 dollardan kam bo'lgan bo'limlarni qaytaradi.

TANLASH bo'limi, MAX(ish haqi) "Eng yuqori ish haqi" ASKI MAX(ish haqi) BO'LGAN bo'lim bo'yicha GURUH BO'YICHA xodimlardan< 50000 ;

Oxirgi yangilanish: 19.07.2017

T-SQL quyidagi rasmiy sintaksisdan foydalangan holda ma'lumotlarni guruhlash uchun GROUP BY va HAVING iboralaridan foydalanadi:

Jadvaldan ustunlarni tanlang

GURUH BO'YICHA

GROUP BY bandi qatorlar qanday guruhlanishini belgilaydi.

Masalan, mahsulotlarni ishlab chiqaruvchiga qarab guruhlaymiz

Ishlab chiqaruvchini TANLASH, COUNT(*) SOQIYAT (*) SOZI SOTIB SOTIB (*) Ishlab chiqaruvchi boʻyicha mahsulotlar guruhi

SELECT bayonotidagi birinchi ustun - Ishlab chiqaruvchi guruh nomini, ikkinchi ustun - ModelsCount esa guruhdagi qatorlar sonini hisoblaydigan Count funktsiyasining natijasini ko'rsatadi.

Shuni hisobga olish kerakki, SELECT iborasida ishlatiladigan har qanday ustun (jamlangan funktsiyalar natijasini saqlaydigan ustunlarni hisobga olmaganda) GROUP BY bandidan keyin ko'rsatilishi kerak. Shunday qilib, masalan, yuqoridagi holatda, Ishlab chiqaruvchi ustuni SELECT va GROUP BY bandlarida ko'rsatilgan.

Va agar SELECT iborasi bir yoki bir nechta ustunlar bo'yicha tanlansa va agregat funktsiyalardan foydalansa, siz GROUP BY bandidan foydalanishingiz kerak. Shunday qilib, quyidagi misol ishlamaydi, chunki unda guruhlash ifodasi mavjud emas:

Ishlab chiqaruvchini tanlang, COUNT(*) AS Modellar Mahsulotlar soni

Yana bir misol, mahsulotlar soni bo'yicha guruhlash qo'shamiz:

Ishlab chiqaruvchi, Mahsulotlar soni, SOQI(*) SOQIYOT SOZI TANGLASH. Mahsulotlar GURUHIDAN ISHLAB CHIQARISH, Mahsulotlar soni

GROUP BY bandi bir nechta ustunlarda guruhlanishi mumkin.

Agar siz guruhlayotgan ustun NULL qiymatiga ega bo'lsa, NULL qiymati bo'lgan qatorlar alohida guruhni tashkil qiladi.

E'tibor bering, GROUP BY bandi WHERE bandidan keyin, lekin ORDER BY bandidan oldin kelishi kerak:

Ishlab chiqaruvchini tanlang, SOQI(*) SOQIB (*) QAYERDAGI mahsulotlardan Narxi > 30000 GRUP ISHLAB CHIQARISH BO'YICHA BUYURTDI Modellar Count DESC

Guruh filtrlash. EGA

Operator EGA chiqish natijasiga qaysi guruhlar kiritilishini aniqlaydi, ya’ni guruhlarni filtrlaydi.

HAVING dan foydalanish ko'p jihatdan WHERE dan foydalanishga o'xshaydi. Qatorlarni filtrlash uchun faqat WHERE, guruhlarni filtrlash uchun esa HAVING ishlatiladi.

Misol uchun, ishlab chiqaruvchi bo'yicha 1 dan ortiq model belgilangan barcha mahsulot guruhlarini topamiz:

Ishlab chiqaruvchini tanlang, COUNT(*) SOQIB (*) SOSIY (*) >1

Bu holda bitta buyruqda WHERE va HAVING ifodalaridan foydalanishimiz mumkin:

Ishlab chiqaruvchini TANLASH, COUNT(*) SOQIB (*) QAYERDAGI mahsulotlar.

Ya'ni, bu holda, qatorlar birinchi navbatda filtrlanadi: umumiy qiymati 80 000 dan ortiq bo'lgan mahsulotlar tanlanadi.So'ngra tanlangan mahsulotlar ishlab chiqaruvchi bo'yicha guruhlanadi. Va keyin guruhlarning o'zlari filtrlanadi - 1 dan ortiq modelni o'z ichiga olgan guruhlar tanlanadi.

Agar tartiblash zarur bo'lsa, HAVING ifodasidan keyin ORDER BY ifodasi keladi:

Ishlab chiqaruvchini tanlang, COUNT(*) Modellar AS, SUM(Mahsulot soni) QAYERDAGI mahsulotlardan birliklar Narxi * Mahsulotlar soni > 80000 SOMUMI (Mahsulot soni) > 2 ta BUYURTIB BIRLIKLAR BOʻYICHA TASHLASH

Bunday holda, guruhlash ishlab chiqaruvchi bo'yicha amalga oshiriladi va har bir ishlab chiqaruvchi uchun modellar soni (Modellar) va ushbu barcha modellar uchun barcha mahsulotlarning umumiy soni (Birliklar) ham tanlanadi. Oxirida guruhlar mahsulotlar soni bo'yicha kamayish tartibida saralanadi.

Oldingi maqolada biz ko'rib chiqdik. U erda men ushbu konstruktsiya alohida guruhlarni tanlashga imkon beradi va har bir guruh uchun keyin ko'rsatilgan funktsiyalarni hisoblashni yozdim TANLASH. A EGA funktsiyalarni bajarish natijalariga ko'ra guruhlardan keraksiz qatorlarni filtrlash imkonini beradi. Keling, buni batafsil ko'rib chiqaylik.

Oldingi muammoimizni eslaylik, u erda biz ma'lum bir supermarket tarmog'i uchun sutning o'rtacha narxini hisoblab chiqdik. Keling, nafaqat o'rtacha narxni ko'rib chiqaylik, balki faqat qaerda joylashgan supermarket tarmoqlarini sanab o'tamiz o'rtacha narx 38 dan past.

Agregat funktsiyasini bajarish natijalariga ko'ra filtrlash uchun biz foydalanamiz SQL buyrug'ida HAVING:

`do`kon_identifikatori`, AVG(`narx`) ni `jadval` GURUHIDAN `do`kon_id` BO`YICHA AVG(`narx`) NI TANLASH< 38

Natijada, o'rniga 4 bizda faqat chiziqlar bo'ladi 3 :

shop_id AVG(`narx`)
1 37.5
2 36.0
3 37.0

Dizaynlar bo'lsa GURUH BO'YICHA unda bo'lmaydi EGA muayyan guruhga emas, balki butun namunaga taalluqlidir. Bu shuni anglatadiki, agar shart EGA bajariladi, hech qanday ta'sir ko'rsatmaydi. Va agar u bajarilmasa, natijada bitta qator bo'lmaydi.