JOIN আর GROUP BY একসাথে কেন?
পাঠ ৯ এ প্রতিটি roll এর মোট নম্বর বের করেছিলাম। কিন্তু ফলাফলে শুধু roll ছিল, নাম ছিল না। নাম আছে student টেবিলে। তাই আগে JOIN দিয়ে নাম আনি, তারপর GROUP BY দিয়ে হিসাব করি।
সিনট্যাক্স
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)→প্রতিটি দলের মোট নম্বর
| name | total_marks |
|---|---|
| Rudra | 246 |
| Habib | 225 |
| Pappu | 154 |
| Anik | 191 |
| Priya | 229 |
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;| name | total_marks |
|---|---|
| Rudra | 246 |
| Priya | 229 |
| Habib | 225 |
| Anik | 191 |
| Pappu | 154 |
উদাহরণ ৩: বিষয়ের নামসহ গড়
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_name | avg_marks |
|---|---|
| Physics | 86.0 |
| Accounting | 79.5 |
| Economics | 76.0 |
| Bangla | 68.67 |
| History | 65.0 |
| ICT | 58.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_name | avg_marks |
|---|---|
| Arts | 51.33 |
| Commerce | 75.67 |
| Science | 72.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;| name | passed |
|---|---|
| Rudra | 3 |
| Habib | 3 |
| Pappu | 2 |
| Anik | 2 |
| Priya | 3 |
প্রতিটি বিষয়ের নাম ও সর্বোচ্চ নম্বর দেখাও।
উত্তর দেখো
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_name | highest |
|---|---|
| Bangla | 76 |
| Economics | 80 |
| Physics | 90 |
| Accounting | 84 |
| ICT | 88 |
| History | 65 |
যাদের গড় নম্বর ৭৫ এর বেশি, তাদের নাম ও গড় দেখাও।
উত্তর দেখো
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;| name | avg_marks |
|---|---|
| Rudra | 82.0 |
| Priya | 76.33 |
