join-group-by

পাঠ ১৩ · JOIN ও GROUP BY

JOIN আর GROUP BY একসাথে কেন?

পাঠ ৯ এ প্রতিটি roll এর মোট নম্বর বের করেছিলাম। কিন্তু ফলাফলে শুধু roll ছিল, নাম ছিল না। নাম আছে student টেবিলে। তাই আগে JOIN দিয়ে নাম আনি, তারপর GROUP BY দিয়ে হিসাব করি।

সিনট্যাক্স

SQL Syntax Rule
SELECT [কলাম], [ফাংশন]([কলাম])
FROM [টেবিল ১] JOIN [টেবিল ২] ON [মিল]
GROUP BY [কলাম];

উদাহরণ ১: নামসহ মোট নম্বর

SELECT s.name, SUM(r.marks) AS total_marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
GROUP BY s.roll, s.name;

ব্যাখ্যা

  • JOIN result AS r ON s.roll = r.roll→প্রতিটি রেজাল্টের পাশে শিক্ষার্থীর নাম আসে
  • GROUP BY s.roll, s.name→প্রতিটি শিক্ষার্থী এক দল
  • SUM(r.marks)→প্রতিটি দলের মোট নম্বর
ফলাফল৫টি সারি
nametotal_marks
Rudra246
Habib225
Pappu154
Anik191
Priya229

GROUP BY তে শুধু name না দিয়ে roll ও name দুটোই দিয়েছি। বাস্তবে দুজন শিক্ষার্থীর নাম একই হতে পারে। roll কখনো একই হয় না, তাই roll দিলে দুজন আলাদা দলে থাকবে।

উদাহরণ ২: মেধা তালিকা

একই Query এর শেষে ORDER BY দিলেই মোট নম্বর অনুযায়ী মেধা তালিকা।

SELECT s.name, SUM(r.marks) AS total_marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
GROUP BY s.roll, s.name
ORDER BY total_marks DESC;
ফলাফল৫টি সারি
nametotal_marks
Rudra246
Priya229
Habib225
Anik191
Pappu154

উদাহরণ ৩: বিষয়ের নামসহ গড়

SELECT sub.subject_name, ROUND(AVG(r.marks), 2) AS avg_marks
FROM subject AS sub
JOIN result AS r ON sub.subject_code = r.subject_code
GROUP BY sub.subject_code, sub.subject_name
ORDER BY avg_marks DESC;
ফলাফল৬টি সারি
subject_nameavg_marks
Physics86.0
Accounting79.5
Economics76.0
Bangla68.67
History65.0
ICT58.2

Physics এর গড় সবচেয়ে বেশি, ICT এর গড় সবচেয়ে কম।

আরও একটি উদাহরণ: গ্রুপ অনুযায়ী গড়

কোন গ্রুপের শিক্ষার্থীদের গড় নম্বর কত? এখানে s.group_name, অর্থাৎ শিক্ষার্থীর গ্রুপ।

SELECT s.group_name, ROUND(AVG(r.marks), 2) AS avg_marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
GROUP BY s.group_name;
ফলাফল৩টি সারি
group_nameavg_marks
Arts51.33
Commerce75.67
Science72.83
মনে রাখো
  • লেখার ক্রম: SELECT → FROM → JOIN → ON → WHERE → GROUP BY → HAVING → ORDER BY।
  • নাম দিয়ে দল করলে roll বা অন্য কোনো ইউনিক কলামও GROUP BY তে রাখো।

অনুশীলন

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

১

প্রত্যেক শিক্ষার্থী কয়টি বিষয়ে পাস করেছে (৩৩ বা বেশি)? নামসহ দেখাও।

উত্তর দেখো
SELECT s.name, COUNT(*) AS passed
FROM student AS s
JOIN result AS r ON s.roll = r.roll
WHERE r.marks >= 33
GROUP BY s.roll, s.name;
ফলাফল৫টি সারি
namepassed
Rudra3
Habib3
Pappu2
Anik2
Priya3
২

প্রতিটি বিষয়ের নাম ও সর্বোচ্চ নম্বর দেখাও।

উত্তর দেখো
SELECT sub.subject_name, MAX(r.marks) AS highest
FROM subject AS sub
JOIN result AS r ON sub.subject_code = r.subject_code
GROUP BY sub.subject_code, sub.subject_name;
ফলাফল৬টি সারি
subject_namehighest
Bangla76
Economics80
Physics90
Accounting84
ICT88
History65
৩

যাদের গড় নম্বর ৭৫ এর বেশি, তাদের নাম ও গড় দেখাও।

উত্তর দেখো
SELECT s.name, ROUND(AVG(r.marks), 2) AS avg_marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
GROUP BY s.roll, s.name
HAVING AVG(r.marks) > 75;
ফলাফল২টি সারি
nameavg_marks
Rudra82.0
Priya76.33