Pedagogika instituti informatika kafedrasi


Группалар бўйича фильтрлаш. HAVING конструкцияси


Download 5.74 Mb.
bet10/17
Sana19.08.2023
Hajmi5.74 Mb.
#1668491
1   ...   6   7   8   9   10   11   12   13   ...   17
Bog'liq
Majmua 2021

Группалар бўйича фильтрлаш. HAVING конструкцияси
Биз юқорида WHERE конструкцияси ёрдамида сатрларни фильтрлаш билан танишдик, энди группалар бўйича фильтрлаш қандай амалга оширилишини кўрайлик.
SQL тили GROUP BY конструкцияси ёрдамида нафақат
маълумотларни группалаш, балки уларни фильтрлаш имконини ҳам беради, яъни қайси группалар сўров натижасига киритилиши керак, қайсилари киритилмаслиги кераклигини кўрсатиб беради.Масалан, бизга камида иккита буюртма берган мижозлар рўйҳати керак бўлсин. Бундай маълумотларни олиш учун сатрларни эмас, балки группани фильтрлаш зарур бўлади.
Бу ҳолда WHERE калит сўзидан фойдаланиб бўлмайди, чунки WHERE танлаш шарти группаларга эмас, балки сатрларга тегишли, яъни сатрларни фильтрлайди. Қисқа қилиб айтганда, WHERE конструкцияси группа нималигини “билмайди”. Бундай ҳолларда HAVING калит сўзидан фойдаланилади. Уларнинг фарқи шундаки,
WHERE сатрларни фильтрласа, HAVING группаларни фильтрлайди. Синтаксиси жиҳатдан улар бир-бирига ўхшаш, HAVING конструкцияси WHERE конструкциясидаги барча операторларни қўллаб-қувватлайди.
Группаларни фильтрлашга доир мисол кўрайлик. Масалан, бизга икки ва ундан ортиқ буюртма берган мижозлар рўйҳати керак бўлсин. Бундай сўров қуйидагича амалга оширилади:
SELECT cust_id, COUNT (*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT (*)>=2;
Натижа қуйидагича бўлади:
cust_id orders
---------------- ---------------
1000000001 2
Мисолдан кўриниб турибдики, бунда WHERE конструкцияси ишламайди, чунки фильтрлаш танлаган сатрлар эмас, балки гуруҳлардаги якуний қийматларга асосланган.
Изоҳ сифатида шуни айтиб ўтиш мумкинки, WHERE
конструкцияси маълумотлар группага ажратилмасдан аввал сатрларни фильтрлайди, HAVING эса группалаш амалга оширилгандан кейин группаларни фильтрлайди.
Энди савол туғилиши мумкин: SELECT инструкциясида бир вақтнинг ўзида WHERE ва HAVING конструкцияларидан фойдаланишга эҳтиёж туғиладими? Албатта туғилади. Фараз қилайлик, юқоридаги инструкциядаги фильтрлашни такомиллаштириб, охирги 12 ойда иккита ва ундан ортиқ буюртма берган мижозлар рўйҳатини аниқлаш керак бўлсин.
Бундай сўров қуйидагича амалга оширилади:
SELECT cust_id, COUNT (*) AS orders
FROM Orders
WHERE YEAR(order_date)=2012
GROUP BY cust_id
HAVING COUNT (*)>=2;
Натижа қуйидагича бўлади:
cust_id orders
---------------- ---------------
1000000001 2
Бу сўров ва унинг натижаси қуйидаги расмда келтирилган:

Яна бир мисол кўрайлик. Нархи 1 доллардан кам бўлмаган, иккита ва ундан ортиқ маҳсулот етказиб берадиган таъминотчилар
рўйҳатини аниқлаш керак бўлсин.
Бундай сўров қуйидагича амалга оширилади:
SELECT vend_id, COUNT (*) AS num_prods
FROM Products
WHERE prod_price >=1
GROUP BY vend_id
HAVING COUNT (*)>=2;
Натижа қуйидагича бўлади:
vend_id num_prods
---------------- ---------------
BBRS01 2
Бу сўровда WHERE танлаш шарти prod_price устунидаги 1 дан кам бўлмаган қийматга эга бўлган сатрларни фильтрлайди. Сўнгра маълумотлар vend_id устуни бўйича группаланади. Шундан сўнг HAVING конструкцияси иккитадан кам бўлмаган маҳсулот етказиб берадиган таъминотчилар группасини фильтрлайди.
Бу сўров ва унинг натижаси қуйидаги расмда келтирилган:


Download 5.74 Mb.

Do'stlaringiz bilan baham:
1   ...   6   7   8   9   10   11   12   13   ...   17




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling