📋 বিষয়সূচী (Table of Contents)

১৩টি পার্টস্টোরি → কনসেপ্ট → কোড
৫০+ SQL উদাহরণপ্রতিটির আউটপুট সহ
৩০টি ইন্টারভিউ প্রশ্ন+ MCQ + হোমওয়ার্ক
01

কেন HAVING-এর দরকার পড়ল?

⏱ ১৫ মিনিট

আজকের ক্লাস শুরু হবে সিনট্যাক্স দিয়ে না — বরং চারটা বাস্তব সমস্যা দিয়ে। মনোযোগ দিয়ে শোনো, কারণ এই চারটা গল্প বুঝলে HAVING তোমার কাছে একদম সহজ মনে হবে।

Sequence: আগে GROUP BY (Module 34) · এই Module 35 = HAVING · Aggregate deep dive = Module 48।

📚 গল্প ১ — বিশ্ববিদ্যালয়

একটা বিশ্ববিদ্যালয়ে ১,০০,০০০ ছাত্রছাত্রী পড়ে। ভাইস চ্যান্সেলর একদিন বলল:

  • শুধু সেই ডিপার্টমেন্টগুলো দেখাও, যাদের ছাত্রছাত্রীর সংখ্যা ৫০০-এর বেশি
  • যে ডিপার্টমেন্টের গড় CGPA ৩.৫০-এর বেশি, শুধু সেগুলো দেখাও।
  • যে ডিপার্টমেন্টের গড় স্কলারশিপ ৳২০,০০০-এর বেশি, সেগুলো আলাদা করো।
প্রশ্ন: WHERE দিয়ে কি এই কাজটা করা সম্ভব? চিন্তা করো — WHERE কি "গড় CGPA ৩.৫০-এর বেশি" এমন একটা শর্ত বুঝতে পারবে, যেখানে CGPA-টা হাজার হাজার ছাত্রের গড় থেকে তৈরি?

📦 গল্প ২ — Amazon

Amazon-এ প্রতিদিন ২০ লক্ষ অর্ডার আসে। CEO চায়:

  • যে ক্যাটাগরিতে ৫,০০০-এর বেশি অর্ডার হয়েছে, সেগুলো দেখাও।
  • যে ক্যাটাগরির গড় প্রোডাক্ট প্রাইস $৫০০-এর বেশি, সেগুলো আলাদা করো।
  • যে শহরের মোট সেলস $১০ লক্ষ ছাড়িয়েছে, সেগুলো বের করো।
প্রশ্ন: "মোট সেলস" জিনিসটা তো আগে থেকে টেবিলে বসে নেই — এটা যোগ করে বের করতে হয়। তাহলে "যোগফলের উপর" ফিল্টার কীভাবে করব?

🏥 গল্প ৩ — হাসপাতাল

হাসপাতাল পরিচালক চান:

  • যে ডিপার্টমেন্টে ১০০-এর বেশি রোগী চিকিৎসা নিয়েছে।
  • যে ডিপার্টমেন্টের গড় চিকিৎসা খরচ ৳৫০,০০০-এর বেশি
  • যে ডাক্তার ৩০-এর বেশি রোগী দেখেছেন।

🏦 গল্প ৪ — ব্যাংক

ব্যাংক ম্যানেজার চান:

  • যে শাখার গ্রাহক সংখ্যা ১০,০০০-এর বেশি
  • যে শাখার মোট আমানত ৳৫০ কোটি ছাড়িয়েছে
  • যে শাখার গড় অ্যাকাউন্ট ব্যালেন্স ৳৫,০০,০০০-এর বেশি

লক্ষ্য করো — চারটা গল্পেই একটা মিল আছে। প্রতিটা শর্তই "গ্রুপ করার পর" হিসাব করা একটা সংখ্যার উপর বসানো — মোট সংখ্যা, গড়, যোগফল। WHERE এই কাজ করতে পারে না, কারণ WHERE কাজ করে একেকটা সারির (row) উপর, গ্রুপের উপর না।

পুরো প্রসেসটা একনজরে দেখি

সব সারি (Rows)
↓ WHERE (আলাদা আলাদা সারি ফিল্টার)
GROUP BY (গ্রুপ তৈরি)
↓ Aggregate Function (COUNT, SUM, AVG...)
HAVING (গ্রুপ ফিল্টার)
চূড়ান্ত রিপোর্ট
মূল কথা: WHERE ফিল্টার করে "একটা একটা সারি"। HAVING ফিল্টার করে "গ্রুপ করা সামারি রিপোর্ট"। এই একটা লাইন যদি আজকে মাথায় গেঁথে যায়, তাহলে পুরো ক্লাসটা তোমার জন্য অনেক সহজ হয়ে যাবে।

HAVING ছাড়া বনাম HAVING থাকলে

গ্রুপ করা রেজাল্ট
সামারি ফিল্টার করা যায় না
এক্সট্রা ম্যানুয়াল কাজ 😩
গ্রুপ করা রেজাল্ট
HAVING দিয়ে ফিল্টার
সহজ বিজনেস ইনসাইট ✅
02

HAVING আসলে কী?

⏱ ১৫ মিনিট

HAVING হলো SQL-এর এমন একটা ক্লজ, যেটা GROUP BY দিয়ে তৈরি করা গ্রুপগুলোর উপর শর্ত বসায়। সহজ বাংলায় — GROUP BY আগে গ্রুপ বানায়, তারপর HAVING বলে দেয় "কোন কোন গ্রুপ রিপোর্টে থাকবে, কোনগুলো বাদ যাবে"।

WHERE বনাম HAVING — সবচেয়ে গুরুত্বপূর্ণ পার্থক্য

বিষয়WHEREHAVING
কাজ করে কার উপরপ্রতিটা আলাদা সারি (row)GROUP BY দিয়ে তৈরি হওয়া গ্রুপ
কখন চলেগ্রুপ তৈরি হওয়ার আগেগ্রুপ তৈরি ও Aggregate হিসাবের পরে
Aggregate Function ব্যবহারসরাসরি ব্যবহার করা যায় নাCOUNT, SUM, AVG সরাসরি ব্যবহার হয়
GROUP BY ছাড়া ব্যবহারকরা যায়সাধারণত GROUP BY-এর সাথেই ব্যবহার হয়
উদাহরণWHERE Department = 'IT'HAVING COUNT(*) > 10

দৃশ্যত প্রবাহ

Raw Data (কাঁচা ডেটা)
WHERE
GROUP BY
Aggregate
HAVING
Final Report
💬 ক্লাস ডিসকাশন: নিচের কোনটা WHERE দিয়ে সম্ভব, কোনটা HAVING লাগবে? — "IT ডিপার্টমেন্টের কর্মীদের বেতন ৫০,০০০-এর বেশি"
✅ ঠিক! কারণ এটা প্রতিটা কর্মীর নিজের বেতনের উপর শর্ত — কোনো গ্রুপের গড় বা যোগফলের উপর না। তাই এখানে WHERE Salary > 50000 লিখলেই হবে।
03

Aggregates — reminder only

⏱ ৩ মিনিট

HAVING সাধারণত aggregate-এর উপর ফিল্টার করে (COUNT / SUM / AVG / MAX / MIN)। এখানে সেগুলো ঝালিয়ে শেখানো হচ্ছে না

Use in HAVINGExample idea
COUNT(*)গ্রুপে কতজন / কত অর্ডার
SUM(...)মোট সেলস / বেতন
AVG(...)গড় CGPA / প্রাইস
Deep dive: Aggregate masterclass = Module 48 · sql_aggregate_functions_bangla.html। এই module-এর focus = HAVING vs WHERE ও group filter।
04

Basic HAVING Clause

⏱ ১৫ মিনিট

এখন আমরা আসল জিনিসে আসি। নিচের কোয়েরিটা দেখো:

SELECT Department, COUNT(*) AS TotalEmployees FROM Employees GROUP BY Department HAVING COUNT(*) > 10;
SELECT Department, COUNT(*)আমরা ডিপার্টমেন্টের নাম আর প্রতিটাতে কতজন কর্মী আছে সেটা দেখতে চাই।
FROM EmployeesEmployees টেবিল থেকে ডেটা আনছি।
GROUP BY Departmentসব কর্মীকে তাদের ডিপার্টমেন্ট অনুযায়ী দলে ভাগ করছি।
HAVING COUNT(*) > 10যে দলে ১০ জনের বেশি কর্মী আছে, শুধু সেই দলগুলোই রেজাল্টে দেখাবে।
DepartmentTotalEmployees
IT45
Sales30
লক্ষ্য করো: HR ডিপার্টমেন্টে ১২ জন থাকলেও (আগের টেবিলে ছিল), ধরো এখানে HR-এ মাত্র ৮ জন — তাই HR বাদ পড়ে গেছে, কারণ ৮ ≤ ১০।

এবার দেখি পাইপলাইনে সারিগুলো কীভাবে বাছাই হয়

-- লাইভ ভিজুয়ালাইজেশন: HAVING কীভাবে গ্রুপ বাদ দেয় --
সব সারি
GROUP BY Department
HAVING COUNT(*) > 3
Final Report
05

বিভিন্ন Aggregate Function-এর সাথে HAVING

⏱ ২০ মিনিট

HAVING COUNT(*) > 100 — বিজনেস: জনপ্রিয় প্রোডাক্ট ক্যাটাগরি বের করা

SELECT Category, COUNT(*) AS TotalOrders FROM Orders GROUP BY Category HAVING COUNT(*) > 100;

HAVING SUM(Salary) > 1000000 — বিজনেস: বড় বাজেটের ডিপার্টমেন্ট খোঁজা

SELECT Department, SUM(Salary) AS TotalPayroll FROM Employees GROUP BY Department HAVING SUM(Salary) > 1000000;

HAVING AVG(Salary) > 60000 — বিজনেস: বেশি বেতনের ডিপার্টমেন্ট

SELECT Department, AVG(Salary) AS AvgSalary FROM Employees GROUP BY Department HAVING AVG(Salary) > 60000;

HAVING MAX(Salary) > 150000 — বিজনেস: টপ পারফর্মার আছে এমন টিম

SELECT Department, MAX(Salary) AS TopSalary FROM Employees GROUP BY Department HAVING MAX(Salary) > 150000;

HAVING MIN(Salary) > 30000 — বিজনেস: যেখানে সর্বনিম্ন বেতনও সম্মানজনক

SELECT Department, MIN(Salary) AS LowestSalary FROM Employees GROUP BY Department HAVING MIN(Salary) > 30000;
প্যাটার্ন লক্ষ্য করো: HAVING-এর পরে সবসময় একটা Aggregate Function বসে (COUNT, SUM, AVG, MAX, MIN), আর তার সাথে একটা তুলনা (>, <, =, >=)। এই প্যাটার্নটা মনে রাখলে HAVING লেখা কখনো কঠিন লাগবে না।
06

WHERE + GROUP BY + HAVING — একসাথে ব্যবহার

⏱ ২০ মিনিট

বাস্তব জীবনে প্রায়ই তিনটাই একসাথে লাগে। প্রথমে SQL কোন অর্ডারে কাজগুলো করে সেটা বুঝি।

SQL Execution Order (এক্সিকিউশনের ক্রম)

FROM
WHERE
GROUP BY
Aggregate Functions
HAVING
SELECT
ORDER BY
LIMIT
কেন এই ক্রম? HAVING-এর গ্রুপ ফিল্টার করতে হলে আগে গ্রুপ থাকতে হবে (GROUP BY), আর গ্রুপের সংখ্যা বের করতে Aggregate লাগবে। তাই HAVING সবসময় GROUP BY আর Aggregate-এর পরে চলে — কিন্তু SELECT-এ কলামগুলো আসলে দেখানোর আগেই।

উদাহরণ: শুধু IT ডিপার্টমেন্টের মধ্যে যাদের কর্মী ২০-এর বেশি

SELECT Department, COUNT(*) AS TotalEmployees FROM Employees WHERE Department = 'IT' GROUP BY Department HAVING COUNT(*) > 20;
WHERE Department = 'IT'প্রথমেই শুধু IT ডিপার্টমেন্টের সারিগুলো বাছাই করলাম (row-level ফিল্টার)।
GROUP BY Departmentবাকি থাকা সারিগুলোকে গ্রুপ করলাম (এখানে শুধু IT থাকবে)।
HAVING COUNT(*) > 20সেই গ্রুপে যদি ২০ জনের বেশি কর্মী থাকে, তবেই দেখাবে।

WHERE বনাম HAVING — একসাথে দেখলে

ধাপকাজ
১. WHEREকাঁচা ডেটা থেকে অপ্রয়োজনীয় সারি বাদ দেয়
২. GROUP BYবাকি সারিগুলোকে দলে ভাগ করে
৩. Aggregateপ্রতিটা দলের জন্য COUNT/SUM/AVG হিসাব করে
৪. HAVINGহিসাব করা দলগুলোর মধ্যে থেকে শর্ত না মেলা দলগুলো বাদ দেয়
07

HAVING-এ একাধিক শর্ত (AND / OR)

⏱ ১৫ মিনিট

বিজনেস উদাহরণ ১: যে ক্যাটাগরিতে ১০০-এর বেশি প্রোডাক্ট আছে এবং গড় দাম $৫০০-এর বেশি।

SELECT Category, COUNT(*) AS TotalProducts, AVG(Price) AS AvgPrice FROM Products GROUP BY Category HAVING COUNT(*) > 100 AND AVG(Price) > 500;

বিজনেস উদাহরণ ২: যে শহরের সেলস $১০ লাখের বেশি অথবা গ্রাহক সংখ্যা ৫,০০০-এর বেশি।

SELECT City, SUM(SalesAmount) AS TotalSales, COUNT(DISTINCT CustomerId) AS TotalCustomers FROM Orders GROUP BY City HAVING SUM(SalesAmount) > 1000000 OR COUNT(DISTINCT CustomerId) > 5000;
AND বনাম OR মনে রাখার সহজ উপায়: AND মানে "দুটো শর্তই সত্যি হতে হবে" (কড়া শর্ত)। OR মানে "যেকোনো একটা সত্যি হলেই চলবে" (নরম শর্ত)।

Single Condition বনাম Multiple Condition HAVING

বিষয়Single ConditionMultiple Condition
উদাহরণHAVING COUNT(*) > 10HAVING COUNT(*) > 10 AND AVG(Price) > 500
ব্যবহারএকটামাত্র বিজনেস প্রশ্নের উত্তরেজটিল, বাস্তবঘেঁষা রিপোর্টে
জটিলতাকমবেশি, তবে বাস্তব প্রয়োজনের কাছাকাছি
08

বিজনেস কেস স্টাডি — ShopKori E-commerce Sales Analytics

⏱ ২০ মিনিট

আমরা একটা কাল্পনিক বাংলাদেশি ই-কমার্স প্ল্যাটফর্ম ShopKori-এর ডেটাবেজ নিয়ে কাজ করব। ধরো ShopKori-এর তিনটা টেবিল আছে: Products, Orders, Employees

টাস্ক ১: ৫০-এর বেশি প্রোডাক্ট আছে এমন ক্যাটাগরি

SELECT Category, COUNT(*) AS TotalProducts FROM Products GROUP BY Category HAVING COUNT(*) > 50;

টাস্ক ২: যে ব্র্যান্ডের গড় দাম ৳৫০০-এর বেশি

SELECT Brand, AVG(Price) AS AvgPrice FROM Products GROUP BY Brand HAVING AVG(Price) > 500;

টাস্ক ৩: যে শহরের সেলস ৳১ কোটি ছাড়িয়েছে

SELECT City, SUM(TotalAmount) AS CitySales FROM Orders GROUP BY City HAVING SUM(TotalAmount) > 10000000;
CityCitySales
Dhaka৳২,৪০,০০,০০০
Chattogram৳১,১৫,০০,০০০

টাস্ক ৪: ১০০-এর বেশি কর্মী আছে এমন ডিপার্টমেন্ট

SELECT Department, COUNT(*) AS EmpCount FROM Employees GROUP BY Department HAVING COUNT(*) > 100;

টাস্ক ৫: টার্গেটের চেয়ে বেশি রেভিনিউ করা মাস

SELECT MonthName, SUM(TotalAmount) AS MonthlyRevenue FROM Orders GROUP BY MonthName HAVING SUM(TotalAmount) > 5000000;
09

MySQL Workbench / Google Colab-এ হাতে-কলমে অনুশীলন

⏱ প্র্যাকটিক্যাল সেশন

এখন সবাই নিজের কম্পিউটারে MySQL Workbench (বা Colab-এ %%sql ম্যাজিক) খুলে আমার সাথে সাথে টাইপ করবে।

ধাপ ১Database তৈরি: CREATE DATABASE shopkori_db;
ধাপ ২Table তৈরি: CREATE TABLE Employees (...);
ধাপ ৩Record ইনসার্ট: INSERT INTO Employees VALUES (...);
ধাপ ৪GROUP BY দিয়ে দল বানানো
ধাপ ৫COUNT() দিয়ে সংখ্যা বের করা
ধাপ ৬SUM() দিয়ে যোগফল বের করা
ধাপ ৭AVG() দিয়ে গড় বের করা
ধাপ ৮MAX() ও MIN() প্রয়োগ
ধাপ ৯HAVING দিয়ে গ্রুপ ফিল্টার
ধাপ ১০WHERE + GROUP BY + HAVING একসাথে
ধাপ ১১সম্পূর্ণ বিজনেস রিপোর্ট বানানো
ধাপ ১২রেজাল্ট ORDER BY দিয়ে সাজানো

সম্পূর্ণ Setup কোড

-- ধাপ ১ ও ২: Database এবং Table তৈরি CREATE DATABASE shopkori_db; USE shopkori_db; CREATE TABLE Employees ( EmpId INT PRIMARY KEY, EmpName VARCHAR(100), Department VARCHAR(50), Salary DECIMAL(10,2) ); -- ধাপ ৩: ডেটা ইনসার্ট INSERT INTO Employees VALUES (1, 'Karim', 'IT', 55000), (2, 'Rahim', 'IT', 62000), (3, 'Salma', 'Sales', 40000);
⚠️ সাধারণ বিগিনার ভুল: HAVING Salary > 50000 (ভুল — কারণ Salary এখানে aggregate করা হয়নি)
✅ সঠিক: HAVING AVG(Salary) > 50000

Best Practices

10

বিগিনাররা যেসব ভুল সবচেয়ে বেশি করে

⏱ সাধারণ ভুল
ভুল ১ — GROUP BY না বুঝেই HAVING ব্যবহার করা

অনেকে ভাবে HAVING একটা আলাদা টুল, GROUP BY-এর সাথে সম্পর্ক নেই। আসলে HAVING সবসময় GROUP BY-এর ফলাফলের উপর কাজ করে — কেন এই ভুল হয়? কারণ WHERE-এর অভ্যাস থেকে সরাসরি HAVING-এ চলে আসে, GROUP BY-এর ধাপটা মাথায় রাখে না।

ভুল ২ — WHERE আর HAVING গুলিয়ে ফেলা WHERE COUNT(*) > 10 (ভুল — WHERE-এ Aggregate Function চলে না)
HAVING COUNT(*) > 10 (সঠিক)
ভুল ৩ — WHERE-এর ভেতরে Aggregate Function বসানো WHERE AVG(Salary) > 50000
GROUP BY Department HAVING AVG(Salary) > 50000
ভুল ৪ — GROUP BY ভুলে যাওয়া

HAVING লিখলেই GROUP BY লাগবে, না হলে ডেটাবেজ এরর দিবে বা ভুল রেজাল্ট দিবে।

ভুল ৫ — ভুল Aggregate Function বেছে নেওয়া

"গড় বেতর কত" জিজ্ঞেস করলে অনেকে SUM() ব্যবহার করে ফেলে, AVG() এর বদলে — ফলে সংখ্যাটা ভুল হয়ে যায়।

ভুল ৬ — ভুল Logical Condition (AND/OR এলোমেলো করা)

AND আর OR এর অর্থ উল্টে গেলে পুরো রিপোর্টের রেজাল্ট বদলে যায়। লেখার আগে বাক্যে করে ভাবো: "এবং" নাকি "অথবা"।

11

প্রফেশনালরা কীভাবে HAVING ব্যবহার করে

⏱ ইন্ডাস্ট্রি বেস্ট প্র্যাকটিস
Data Analyst→ সেলস রিপোর্ট বানায়
Finance Team→ রেভিনিউ অ্যানালাইসিস করে
Marketing Team→ কাস্টমার সেগমেন্টেশন করে
HR Team→ ডিপার্টমেন্ট স্ট্যাটিস্টিক্স তৈরি করে
BI Engineer→ এক্সিকিউটিভ ড্যাশবোর্ড বানায়
Operations Team→ পারফরম্যান্স মনিটরিং করে

Performance Tips (পারফরম্যান্স টিপস)

12

ক্লাসরুম অ্যাক্টিভিটি

⏱ ইন্টারঅ্যাক্টিভ অ্যাক্টিভিটি
অ্যাক্টিভিটি ১: নিচের কোয়েরির আউটপুট কী হবে অনুমান করো — HAVING COUNT(*) > 5, যেখানে IT-তে ৩ জন, Sales-এ ৮ জন কর্মী।
✅ ঠিক! কারণ Sales-এ ৮ জন যা ৫-এর বেশি, কিন্তু IT-তে মাত্র ৩ জন যা ৫-এর কম।
অ্যাক্টিভিটি ২: "যে শহরে ১০০-এর বেশি অর্ডার হয়েছে" — এখানে WHERE লাগবে নাকি HAVING?
✅ ঠিক! "১০০-এর বেশি অর্ডার" মানে গ্রুপ করে গোনা একটা সংখ্যা — তাই HAVING লাগবে।

অ্যাক্টিভিটি ৩ (দলগত): নিচের ভুল কোয়েরিতে দোষ খুঁজে বের করো — SELECT Department, Salary FROM Employees GROUP BY Department HAVING Salary > 50000;

অ্যাক্টিভিটি ৪: GROUP BY-এর ফলাফল আগে দেখাও, তারপর HAVING বসানোর পর কোন কোন গ্রুপ বাদ পড়ল সেটা তুলনা করো।

13

কুইক রিভিশন — চিট শিট

⏱ রিভিশন
HAVING কী ফিল্টার করেGROUP BY দিয়ে তৈরি হওয়া গ্রুপ
WHERE কী ফিল্টার করেপ্রতিটা আলাদা সারি
এক্সিকিউশন অর্ডারFROM → WHERE → GROUP BY → Aggregate → HAVING → SELECT → ORDER BY → LIMIT
HAVING-এ কী বসেসবসময় একটা Aggregate Function (COUNT/SUM/AVG/MAX/MIN)
ANDদুটো শর্তই সত্যি হতে হবে
ORযেকোনো একটা শর্ত সত্যি হলেই চলবে
সবচেয়ে সাধারণ ভুলWHERE-এর ভেতরে Aggregate Function বসানো
14

২০টি MCQ (উত্তরসহ)

⏱ MCQ
15

Top 30 SQL HAVING ইন্টারভিউ প্রশ্ন

⏱ ইন্টারভিউ প্রস্তুতি
16

বাসার কাজ

⏱ হোমওয়ার্ক
  1. ShopKori Products টেবিল ব্যবহার করে যে ব্র্যান্ডের ৩০-এর বেশি প্রোডাক্ট আছে, সেগুলো বের করো।
  2. Orders টেবিলে যে শহরের গড় অর্ডার ভ্যালু ৳২,০০০-এর বেশি, সেগুলো খুঁজে বের করো।
  3. Employees টেবিলে ৫-এর বেশি কর্মী এবং গড় বেতন ৳৪০,০০০-এর বেশি — এমন ডিপার্টমেন্ট বের করো (AND শর্ত দিয়ে)।
  4. একটা কোয়েরি লেখো যেখানে WHERE, GROUP BY, HAVING, ORDER BY এবং LIMIT — সবগুলোই ব্যবহার হবে।
  5. নিজের ভাষায় লিখো: WHERE আর HAVING-এর মধ্যে পার্থক্য কী, উদাহরণসহ।