having

পাঠ ১০ · HAVING

HAVING কী?

GROUP BY দিয়ে দল তৈরির পরে কিছু দল বাদ দিতে HAVING ব্যবহার করি। WHERE সারি বাছাই করে, HAVING দল বাছাই করে।

সিনট্যাক্স

SQL Syntax Rule
SELECT [কলামের নাম], [ফাংশন]([কলামের নাম])
FROM [টেবিলের নাম]
GROUP BY [কলামের নাম]
HAVING [দলের উপর শর্ত];

উদাহরণ ১: মোট নম্বর ২০০ এর বেশি

প্রথমে প্রতিটি roll এর মোট নম্বর বের করি। তারপর যাদের মোট ২০০ এর বেশি শুধু তাদের রাখি।

SELECT roll, SUM(marks) AS total_marks
FROM result
GROUP BY roll
HAVING SUM(marks) > 200;

ব্যাখ্যা

  • GROUP BY roll→প্রতিটি roll এক দল
  • SUM(marks)→প্রতিটি দলের মোট নম্বর
  • HAVING SUM(marks) > 200→যে দলের মোট ২০০ এর বেশি শুধু সেটি থাকবে
GROUP BY এর পরে (সব দল)৫টি সারি
rolltotal_marks
1246
2225
3154
4191
5229
↓ HAVING SUM(marks) > 200
ফলাফল৩টি সারি
rolltotal_marks
1246
2225
5229

roll 3 (154) ও roll 4 (191) বাদ গেছে।

উদাহরণ ২: অন্তত ২ জনের গ্রুপ

SELECT group_name, COUNT(*) AS total
FROM student
GROUP BY group_name
HAVING COUNT(*) >= 2;
ফলাফল২টি সারি
group_nametotal
Commerce2
Science2

WHERE বনাম HAVING

WHERE বনাম HAVING
WHEREHAVING
কিসের উপর শর্তপ্রতিটি সারির উপরপ্রতিটি দলের উপর
কখন কাজ করেদল তৈরির আগেদল তৈরির পরে
Aggregate ফাংশন (COUNT, SUM…)লেখা যায় নালেখা যায়
কোথায় বসেFROM এর পরেGROUP BY এর পরে

আরও একটি উদাহরণ: WHERE ও HAVING একসাথে

ICT বাদে বাকি বিষয়গুলোর গড় যাদের ৭৫ বা বেশি, তাদের খুঁজি। ICT বাদ দেওয়া সারির কাজ, তাই WHERE। গড়ের শর্ত দলের কাজ, তাই HAVING।

SELECT roll, ROUND(AVG(marks), 2) AS avg_marks
FROM result
WHERE subject_code != 275
GROUP BY roll
HAVING AVG(marks) >= 75;
  • WHERE subject_code != 275→আগে ICT এর সারিগুলো বাদ
  • GROUP BY roll→বাকি সারি দিয়ে roll অনুযায়ী দল
  • HAVING AVG(marks) >= 75→যে দলের গড় ৭৫ বা বেশি শুধু সেটি
ফলাফল৩টি সারি
rollavg_marks
179.0
480.0
582.0
একটি Query তে অংশগুলো লেখার ক্রম
ক্রমঅংশকাজ
১SELECTকোন কলাম দেখাবে
২FROMকোন টেবিল
৩WHEREসারি বাছাই
৪GROUP BYদল তৈরি
৫HAVINGদল বাছাই
৬ORDER BYসাজানো
৭LIMITকয়টি সারি
মনে রাখো
  • WHERE এ Aggregate ফাংশন লেখা যায় না। WHERE SUM(marks) > 200 লিখলে Error আসবে।
  • HAVING এ alias এর বদলে পুরো ফাংশন লেখো, যেমন HAVING SUM(marks) > 200। এভাবে সব DBMS এ চলে।

অনুশীলন

প্রতিটি প্রশ্নের Query নিজে লেখো। চাইলে SQL Playground এ টেবিল তৈরি করে চালিয়ে দেখো। তারপর উত্তর মিলিয়ে নাও।

১

যেসব বিষয়ের (subject_code) গড় নম্বর ৭০ এর বেশি, সেগুলো দেখাও।

উত্তর দেখো
SELECT subject_code, ROUND(AVG(marks), 2) AS avg_marks
FROM result
GROUP BY subject_code
HAVING AVG(marks) > 70;
ফলাফল৩টি সারি
subject_codeavg_marks
10976.0
17486.0
25379.5
২

যেসব roll কোনো বিষয়ে ৩৩ এর কম পেয়েছে, তাদের roll ও সর্বনিম্ন নম্বর দেখাও।

উত্তর দেখো
SELECT roll, MIN(marks) AS lowest
FROM result
GROUP BY roll
HAVING MIN(marks) < 33;
ফলাফল২টি সারি
rolllowest
329
431
৩

যেসব class এ ২ জনের বেশি শিক্ষার্থী, সেগুলো দেখাও।

উত্তর দেখো
SELECT class, COUNT(*) AS total
FROM student
GROUP BY class
HAVING COUNT(*) > 2;
ফলাফল১টি সারি
classtotal
113
৪

যাদের মোট নম্বর ২২৫ বা বেশি, তাদের roll ও মোট নম্বর বেশি থেকে কম সাজিয়ে দেখাও।

উত্তর দেখো
SELECT roll, SUM(marks) AS total_marks
FROM result
GROUP BY roll
HAVING SUM(marks) >= 225
ORDER BY total_marks DESC;
ফলাফল৩টি সারি
rolltotal_marks
1246
5229
2225