পাঠ ১০ · 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 এর পরে (সব দল)৫টি সারি
| roll | total_marks |
|---|---|
| 1 | 246 |
| 2 | 225 |
| 3 | 154 |
| 4 | 191 |
| 5 | 229 |
↓ HAVING SUM(marks) > 200
ফলাফল৩টি সারি
| roll | total_marks |
|---|---|
| 1 | 246 |
| 2 | 225 |
| 5 | 229 |
roll 3 (154) ও roll 4 (191) বাদ গেছে।
উদাহরণ ২: অন্তত ২ জনের গ্রুপ
SELECT group_name, COUNT(*) AS total
FROM student
GROUP BY group_name
HAVING COUNT(*) >= 2;ফলাফল২টি সারি
| group_name | total |
|---|---|
| Commerce | 2 |
| Science | 2 |
WHERE বনাম HAVING
WHERE বনাম HAVING
| WHERE | HAVING | |
|---|---|---|
| কিসের উপর শর্ত | প্রতিটি সারির উপর | প্রতিটি দলের উপর |
| কখন কাজ করে | দল তৈরির আগে | দল তৈরির পরে |
| 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→যে দলের গড় ৭৫ বা বেশি শুধু সেটি
ফলাফল৩টি সারি
| roll | avg_marks |
|---|---|
| 1 | 79.0 |
| 4 | 80.0 |
| 5 | 82.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_code | avg_marks |
|---|---|
| 109 | 76.0 |
| 174 | 86.0 |
| 253 | 79.5 |
২
যেসব roll কোনো বিষয়ে ৩৩ এর কম পেয়েছে, তাদের roll ও সর্বনিম্ন নম্বর দেখাও।
উত্তর দেখো
SELECT roll, MIN(marks) AS lowest
FROM result
GROUP BY roll
HAVING MIN(marks) < 33;ফলাফল২টি সারি
| roll | lowest |
|---|---|
| 3 | 29 |
| 4 | 31 |
৩
যেসব class এ ২ জনের বেশি শিক্ষার্থী, সেগুলো দেখাও।
উত্তর দেখো
SELECT class, COUNT(*) AS total
FROM student
GROUP BY class
HAVING COUNT(*) > 2;ফলাফল১টি সারি
| class | total |
|---|---|
| 11 | 3 |
৪
যাদের মোট নম্বর ২২৫ বা বেশি, তাদের roll ও মোট নম্বর বেশি থেকে কম সাজিয়ে দেখাও।
উত্তর দেখো
SELECT roll, SUM(marks) AS total_marks
FROM result
GROUP BY roll
HAVING SUM(marks) >= 225
ORDER BY total_marks DESC;ফলাফল৩টি সারি
| roll | total_marks |
|---|---|
| 1 | 246 |
| 5 | 229 |
| 2 | 225 |
