JOIN কী?
একজন শিক্ষার্থীর নাম আছে student টেবিলে, ঠিকানা আছে contact টেবিলে। দুটো তথ্য একসাথে দেখতে হলে দুই টেবিল জোড়া লাগাতে হয়। এই কাজটি করে JOIN।
দুই টেবিলে একই কলাম থাকে যা দিয়ে সম্পর্ক তৈরি হয়। student এর roll হলো প্রাইমারি কী। contact এর roll হলো ফরেন কী। এই সম্পর্কটি আমরা One to One রিলেশন পাঠে দেখেছি। JOIN এই roll মিলিয়ে সারি জোড়া লাগায়।
সিনট্যাক্স
SELECT [কলামের নাম] FROM [টেবিল ১] JOIN [টেবিল ২] ON [টেবিল ১].[কলাম] = [টেবিল ২].[কলাম];
উদাহরণ ১: নাম ও ঠিকানা একসাথে
নিচের দুই টেবিলে একই roll এর সারি একই রঙে। JOIN একই রঙের সারি দুটোকে পাশাপাশি বসিয়ে একটি সারি বানায়।
| roll | name |
|---|---|
| 1 | Rudra |
| 2 | Habib |
| 3 | Pappu |
| 4 | Anik |
| 5 | Priya |
| contact_id | roll | address | mobile_no |
|---|---|---|---|
| 101 | 1 | Gopalganj | 01711111111 |
| 102 | 2 | Narayanganj | 01822222222 |
| 103 | 3 | Barisal | 01933333333 |
| 104 | 4 | Dhaka | 01644444444 |
| 105 | 5 | Khulna | 01555555555 |
SELECT student.name, contact.address, contact.mobile_no
FROM student
JOIN contact ON student.roll = contact.roll;ব্যাখ্যা
FROM student JOIN contact→student ও contact টেবিল জোড়া লাগাবেON student.roll = contact.roll→যেখানে দুই টেবিলের roll সমান, সেই সারিগুলো জোড়া লাগবেstudent.name→student টেবিলের name কলাম (টেবিল.কলাম)
ফলাফল
| name | address | mobile_no |
|---|---|---|
| Rudra | Gopalganj | 01711111111 |
| Habib | Narayanganj | 01822222222 |
| Pappu | Barisal | 01933333333 |
| Anik | Dhaka | 01644444444 |
| Priya | Khulna | 01555555555 |
উদাহরণ ২: টেবিলের ছোট নাম (alias)
প্রতিবার student.roll, contact.roll লেখা ঝামেলা। AS দিয়ে টেবিলকে ছোট নাম দিই: student কে s, contact কে c।
SELECT s.roll, s.name, c.address
FROM student AS s
JOIN contact AS c ON s.roll = c.roll;| roll | name | address |
|---|---|---|
| 1 | Rudra | Gopalganj |
| 2 | Habib | Narayanganj |
| 3 | Pappu | Barisal |
| 4 | Anik | Dhaka |
| 5 | Priya | Khulna |
একই নামের কলাম থাকলে
roll কলাম দুই টেবিলেই আছে। শুধু roll লিখলে SQL বুঝতে পারে না কোন টেবিলের roll চাইছি।
SELECT roll, name, address
FROM student
JOIN contact ON student.roll = contact.roll;আরও একটি উদাহরণ: One to Many
result টেবিলে বিষয়ের শুধু কোড আছে, নাম নেই। নাম আছে subject টেবিলে। একটি বিষয়ের অনেকগুলো রেজাল্ট থাকে, তাই এটি One to Many রিলেশন। roll 1 এর রেজাল্ট বিষয়ের নামসহ দেখি।
| subject_code | subject_name | group_name |
|---|---|---|
| 101 | Bangla | Common |
| 275 | ICT | Common |
| 174 | Physics | Science |
| 253 | Accounting | Commerce |
| 109 | Economics | Commerce |
| 304 | History | Arts |
| roll | subject_code | marks |
|---|---|---|
| 1 | 101 | 76 |
| 1 | 174 | 82 |
| 1 | 275 | 88 |
SELECT r.roll, sub.subject_name, r.marks
FROM result AS r
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE r.roll = 1;result AS r→result টেবিলের ছোট নাম rsubject AS sub→subject টেবিলের ছোট নাম subON r.subject_code = sub.subject_code→বিষয়ের কোড মিলিয়ে জোড়াWHERE r.roll = 1→জোড়া লাগানোর পরে শুধু roll 1
| roll | subject_name | marks |
|---|---|---|
| 1 | Bangla | 76 |
| 1 | Physics | 82 |
| 1 | ICT | 88 |
- JOIN আর INNER JOIN একই। দুই টেবিলে মিল পাওয়া সারিগুলোই শুধু ফলাফলে আসে।
- ON এ সাধারণত এক টেবিলের প্রাইমারি কী আর অন্য টেবিলের ফরেন কী মেলানো হয়।
- একই নামের কলাম দুই টেবিলে থাকলে টেবিলের নাম বা alias সহ লিখতে হবে।
অনুশীলন
প্রতিটি প্রশ্নের Query নিজে লেখো। চাইলে SQL Playground এ টেবিল তৈরি করে চালিয়ে দেখো। তারপর উত্তর মিলিয়ে নাও।
প্রতিটি শিক্ষার্থীর name ও mobile_no দেখাও।
উত্তর দেখো
SELECT s.name, c.mobile_no
FROM student AS s
JOIN contact AS c ON s.roll = c.roll;| name | mobile_no |
|---|---|
| Rudra | 01711111111 |
| Habib | 01822222222 |
| Pappu | 01933333333 |
| Anik | 01644444444 |
| Priya | 01555555555 |
Dhaka তে যে থাকে, তার name ও class দেখাও।
উত্তর দেখো
SELECT s.name, s.class
FROM student AS s
JOIN contact AS c ON s.roll = c.roll
WHERE c.address = 'Dhaka';| name | class |
|---|---|
| Anik | 12 |
Commerce গ্রুপের বিষয়গুলোর সব রেজাল্ট roll, subject_name ও marks সহ দেখাও।
উত্তর দেখো
SELECT r.roll, sub.subject_name, r.marks
FROM result AS r
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE sub.group_name = 'Commerce';| roll | subject_name | marks |
|---|---|---|
| 2 | Accounting | 75 |
| 2 | Economics | 72 |
| 5 | Accounting | 84 |
| 5 | Economics | 80 |
যেসব রেজাল্টে নম্বর ৮০ বা বেশি, সেগুলো বিষয়ের নামসহ দেখাও।
উত্তর দেখো
SELECT r.roll, sub.subject_name, r.marks
FROM result AS r
JOIN subject AS sub ON r.subject_code = sub.subject_code
WHERE r.marks >= 80;| roll | subject_name | marks |
|---|---|---|
| 1 | ICT | 88 |
| 1 | Physics | 82 |
| 4 | Physics | 90 |
| 5 | Accounting | 84 |
| 5 | Economics | 80 |
