join

পাঠ ১১ · JOIN

JOIN কী?

একজন শিক্ষার্থীর নাম আছে student টেবিলে, ঠিকানা আছে contact টেবিলে। দুটো তথ্য একসাথে দেখতে হলে দুই টেবিল জোড়া লাগাতে হয়। এই কাজটি করে JOIN।

দুই টেবিলে একই কলাম থাকে যা দিয়ে সম্পর্ক তৈরি হয়। student এর roll হলো প্রাইমারি কী। contact এর roll হলো ফরেন কী। এই সম্পর্কটি আমরা One to One রিলেশন পাঠে দেখেছি। JOIN এই roll মিলিয়ে সারি জোড়া লাগায়।

সিনট্যাক্স

SQL Syntax Rule
SELECT [কলামের নাম]
FROM [টেবিল ১]
JOIN [টেবিল ২]
ON [টেবিল ১].[কলাম] = [টেবিল ২].[কলাম];

উদাহরণ ১: নাম ও ঠিকানা একসাথে

নিচের দুই টেবিলে একই roll এর সারি একই রঙে। JOIN একই রঙের সারি দুটোকে পাশাপাশি বসিয়ে একটি সারি বানায়।

student৫টি সারি
rollname
1Rudra
2Habib
3Pappu
4Anik
5Priya
contact৫টি সারি
contact_idrolladdressmobile_no
1011Gopalganj01711111111
1022Narayanganj01822222222
1033Barisal01933333333
1044Dhaka01644444444
1055Khulna01555555555
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 কলাম (টেবিল.কলাম)

ফলাফল

ফলাফল৫টি সারি
nameaddressmobile_no
RudraGopalganj01711111111
HabibNarayanganj01822222222
PappuBarisal01933333333
AnikDhaka01644444444
PriyaKhulna01555555555

উদাহরণ ২: টেবিলের ছোট নাম (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;
ফলাফল৫টি সারি
rollnameaddress
1RudraGopalganj
2HabibNarayanganj
3PappuBarisal
4AnikDhaka
5PriyaKhulna

একই নামের কলাম থাকলে

roll কলাম দুই টেবিলেই আছে। শুধু roll লিখলে SQL বুঝতে পারে না কোন টেবিলের roll চাইছি।

SELECT roll, name, address
FROM student
JOIN contact ON student.roll = contact.roll;
Error
ambiguous column name: roll
দুই টেবিলেই roll আছে, তাই SQL বিভ্রান্ত হয়েছে (ambiguous)। s.roll বা student.roll লিখে টেবিল বলে দিতে হবে। name ও address একটি করে টেবিলে আছে, তাই সেগুলোতে সমস্যা নেই।

আরও একটি উদাহরণ: One to Many

result টেবিলে বিষয়ের শুধু কোড আছে, নাম নেই। নাম আছে subject টেবিলে। একটি বিষয়ের অনেকগুলো রেজাল্ট থাকে, তাই এটি One to Many রিলেশন। roll 1 এর রেজাল্ট বিষয়ের নামসহ দেখি।

subject৬টি সারি
subject_codesubject_namegroup_name
101BanglaCommon
275ICTCommon
174PhysicsScience
253AccountingCommerce
109EconomicsCommerce
304HistoryArts
result (roll 1)৩টি সারি
rollsubject_codemarks
110176
117482
127588
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 টেবিলের ছোট নাম r
  • subject AS sub→subject টেবিলের ছোট নাম sub
  • ON r.subject_code = sub.subject_code→বিষয়ের কোড মিলিয়ে জোড়া
  • WHERE r.roll = 1→জোড়া লাগানোর পরে শুধু roll 1
ফলাফল৩টি সারি
rollsubject_namemarks
1Bangla76
1Physics82
1ICT88
মনে রাখো
  • 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;
ফলাফল৫টি সারি
namemobile_no
Rudra01711111111
Habib01822222222
Pappu01933333333
Anik01644444444
Priya01555555555
২

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';
ফলাফল১টি সারি
nameclass
Anik12
৩

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';
ফলাফল৪টি সারি
rollsubject_namemarks
2Accounting75
2Economics72
5Accounting84
5Economics80
৪

যেসব রেজাল্টে নম্বর ৮০ বা বেশি, সেগুলো বিষয়ের নামসহ দেখাও।

উত্তর দেখো
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;
ফলাফল৫টি সারি
rollsubject_namemarks
1ICT88
1Physics82
4Physics90
5Accounting84
5Economics80