তিন টেবিলের JOIN কেন?
একজন শিক্ষার্থী অনেক বিষয় পড়ে। একটি বিষয় অনেক শিক্ষার্থী পড়ে। এটি Many to Many রিলেশন। student আর subject টেবিলের মধ্যে সরাসরি কোনো কলাম মেলে না। মাঝখানে result টেবিল দুটোকে যুক্ত করে: result এর roll যায় student এ, result এর subject_code যায় subject এ।
তাই শিক্ষার্থীর নাম, বিষয়ের নাম ও নম্বর একসাথে দেখতে তিনটি টেবিল জোড়া লাগাতে হবে।
সিনট্যাক্স
SELECT [কলামের নাম] FROM [টেবিল ১] JOIN [টেবিল ২] ON [টেবিল ১ ও ২ এর মিল] JOIN [টেবিল ৩] ON [টেবিল ২ ও ৩ এর মিল];
উদাহরণ ১: নাম, বিষয় ও নম্বর
SELECT s.name, sub.subject_name, r.marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code;ধাপে ধাপে ব্যাখ্যা
ধাপ ১: student ও result জোড়া লাগে roll দিয়ে। এতে নাম আসে, কিন্তু বিষয়ের শুধু কোড থাকে।
| name | subject_code | marks |
|---|---|---|
| Rudra | 275 | 88 |
| Rudra | 174 | 82 |
| Rudra | 101 | 76 |
| Habib | 275 | 78 |
| Habib | 253 | 75 |
| Habib | 109 | 72 |
| Pappu | 275 | 29 |
| Pappu | 304 | 65 |
| Pappu | 101 | 60 |
| Anik | 275 | 31 |
| Anik | 174 | 90 |
| Anik | 101 | 70 |
| Priya | 275 | 65 |
| Priya | 253 | 84 |
| Priya | 109 | 80 |
ধাপ ২: এই ফলাফলের সাথে subject জোড়া লাগে subject_code দিয়ে। কোডের জায়গায় বিষয়ের নাম আসে।
JOIN result AS r ON s.roll = r.roll→ধাপ ১: roll মিলিয়ে student ও resultJOIN subject AS sub ON r.subject_code = sub.subject_code→ধাপ ২: কোড মিলিয়ে subject
| name | subject_name | marks |
|---|---|---|
| Rudra | ICT | 88 |
| Rudra | Physics | 82 |
| Rudra | Bangla | 76 |
| Habib | ICT | 78 |
| Habib | Accounting | 75 |
| Habib | Economics | 72 |
| Pappu | ICT | 29 |
| Pappu | History | 65 |
| Pappu | Bangla | 60 |
| Anik | ICT | 31 |
| Anik | Physics | 90 |
| Anik | Bangla | 70 |
| Priya | ICT | 65 |
| Priya | Accounting | 84 |
| Priya | Economics | 80 |
উদাহরণ ২: ICT তে কারা ফেল করেছে
জোড়া লাগানোর পরে WHERE দিয়ে শর্ত দিই। বিষয়ের কোড মনে রাখতে হচ্ছে না, নাম দিয়েই খুঁজছি।
SELECT s.name, sub.subject_name, r.marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE sub.subject_name = 'ICT'
AND r.marks < 33;| name | subject_name | marks |
|---|---|---|
| Pappu | ICT | 29 |
| Anik | ICT | 31 |
আরও একটি উদাহরণ: সাজিয়ে দেখা
Physics বিষয়ে কে কত পেয়েছে, বেশি নম্বর আগে।
SELECT s.name, sub.subject_name, r.marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE sub.subject_name = 'Physics'
ORDER BY r.marks DESC;| name | subject_name | marks |
|---|---|---|
| Anik | Physics | 90 |
| Rudra | Physics | 82 |
- প্রতিটি JOIN এর সাথে নিজের ON থাকবে। তিন টেবিলে দুইটি JOIN, দুইটি ON।
- student ও subject দুই টেবিলেই group_name কলাম আছে। শিক্ষার্থীর গ্রুপ চাইলে
s.group_name, বিষয়ের গ্রুপ চাইলেsub.group_nameলিখতে হবে। - একইভাবে চার টেবিলও জোড়া লাগানো যায়। শুধু আরেকটি JOIN ও ON যোগ করতে হয়।
অনুশীলন
প্রতিটি প্রশ্নের Query নিজে লেখো। চাইলে SQL Playground এ টেবিল তৈরি করে চালিয়ে দেখো। তারপর উত্তর মিলিয়ে নাও।
Priya কোন কোন বিষয়ে কত নম্বর পেয়েছে?
উত্তর দেখো
SELECT s.name, sub.subject_name, r.marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE s.name = 'Priya';| name | subject_name | marks |
|---|---|---|
| Priya | ICT | 65 |
| Priya | Accounting | 84 |
| Priya | Economics | 80 |
Bangla বিষয়ে কে কত নম্বর পেয়েছে?
উত্তর দেখো
SELECT s.name, sub.subject_name, r.marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE sub.subject_name = 'Bangla';| name | subject_name | marks |
|---|---|---|
| Rudra | Bangla | 76 |
| Pappu | Bangla | 60 |
| Anik | Bangla | 70 |
Science গ্রুপের শিক্ষার্থীদের নাম, বিষয় ও নম্বর দেখাও।
উত্তর দেখো
SELECT s.name, sub.subject_name, r.marks
FROM student AS s
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE s.group_name = 'Science';| name | subject_name | marks |
|---|---|---|
| Rudra | ICT | 88 |
| Rudra | Physics | 82 |
| Rudra | Bangla | 76 |
| Anik | ICT | 31 |
| Anik | Physics | 90 |
| Anik | Bangla | 70 |
চার টেবিল: Khulna তে থাকে এমন শিক্ষার্থীর নাম, ঠিকানা, বিষয় ও নম্বর দেখাও।
উত্তর দেখো
SELECT s.name, c.address, sub.subject_name, r.marks
FROM student AS s
JOIN contact AS c ON s.roll = c.roll
JOIN result AS r ON s.roll = r.roll
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE c.address = 'Khulna';| name | address | subject_name | marks |
|---|---|---|---|
| Priya | Khulna | Economics | 80 |
| Priya | Khulna | Accounting | 84 |
| Priya | Khulna | ICT | 65 |
