এছাড়াও কিভাবে LEFT JOIN
, RIGHT JOIN
এবং FULL JOIN
মধ্যে মাপসই করা হবে?
এছাড়াও কিভাবে LEFT JOIN
, RIGHT JOIN
এবং FULL JOIN
মধ্যে মাপসই করা হবে?
উত্তর:
ধরে নেওয়া যাক আপনি কোনও ডুপ্লিকেট ছাড়াই কলামগুলিতে যোগদান করছেন, যা একটি খুব সাধারণ ঘটনা:
A এবং B এর অভ্যন্তরীণ জোড় A ছেদ বি এর ফল দেয়, অর্থাৎ ভেন চিত্রের ছেদটির অভ্যন্তরীণ অংশ ।
এ এবং বি এর একটি বাহ্যিক সংযোজন এ ইউনিয়ন বি এর ফলাফল দেয়, অর্থাত্ ভেন ডায়াগ্রাম ইউনিয়নের বাইরের অংশগুলি।
উদাহরণ
ধরুন আপনার কাছে একটি করে কলাম সহ দুটি করে টেবিল রয়েছে এবং নীচের হিসাবে ডেটা রয়েছে:
A B
- -
1 3
2 4
3 5
4 6
দ্রষ্টব্য যে (1,2) A এর পক্ষে অনন্য, (3,4) সাধারণ এবং (5,6) বি এর জন্য স্বতন্ত্র are
ভেতরের যোগ দিতে
উভয় সমতুল্য প্রশ্নের ব্যবহার করে একটি অভ্যন্তরীণ জোড় দুটি টেবিলের ছেদ দেয়, অর্থাত্ তাদের দুটি সারি মিল রয়েছে।
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
বাম বাহ্যিক যোগদান
একটি বাম বাহ্যিক জোড় এ এর সমস্ত সারি দেয়, এবং বি তে কোনও সাধারণ সারি দেয় will
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
ডান বাইরের যোগদান
একটি ডান বাহ্যিক জোড় বি এর সমস্ত সারি দেয়, এবং এ-তে কোনও সাধারণ সারি দেয় will
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
সম্পূর্ণ বাইরের যোগদান
একটি সম্পূর্ণ বাহ্যিক জোড় আপনাকে A এবং B মিলিয়ে দেবে, যেমন A এর সমস্ত সারি এবং B তে সমস্ত সারি A বিপরীতভাবে।
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
ভেন চিত্রগুলি আমার জন্য সত্যই তা করে না।
তারা ক্রস জয়েন এবং একটি অভ্যন্তরীণ যোগদানের মধ্যে কোনও পার্থক্য দেখায় না, উদাহরণস্বরূপ, বা আরও সাধারণভাবে বিভিন্ন প্রকারের প্রিন্টেটের মধ্যে কোনও পার্থক্য দেখায় বা তারা কীভাবে কাজ করবে সে সম্পর্কে যুক্তির জন্য একটি কাঠামো সরবরাহ করে।
লজিকাল প্রসেসিং বোঝার কোনও বিকল্প নেই এবং এটি যেভাবেই বুঝতে পারা তুলনামূলক সহজ for
on
যেখানে মূল্যায়ন করে সেখানে সেগুলি রেখে পদক্ষেপ 1 থেকে সমস্ত সারিগুলির বিরুদ্ধে ধারাটি মূল্যায়ন করুনtrue
(এনবি: অনুশীলনে কোয়েরি অপ্টিমাইজার উপরের খাঁটি যৌক্তিক বর্ণনার চেয়ে ক্যোয়ারি কার্যকর করার আরও কার্যকর উপায়গুলি খুঁজে পেতে পারে তবে চূড়ান্ত ফলাফলটি অবশ্যই একই হতে হবে)
আমি একটি সম্পূর্ণ বাইরের যোগদানের অ্যানিমেটেড সংস্করণ দিয়ে শুরু করব । আরও ব্যাখ্যা নিম্নলিখিত।
উত্স সারণী
প্রথমে একটি CROSS JOIN
(একেএ কার্টেসিয়ান পণ্য) দিয়ে শুরু করুন। এর কোনও ON
ধারা নেই এবং কেবল দুটি টেবিল থেকে সারিগুলির প্রতিটি সমন্বয় ফিরে আসে।
এ। কালার নির্বাচন করুন, একটি ক্রস থেকে যোগ করুন বি
অভ্যন্তরীণ এবং আউটারের সাথে একটি "চালু" ক্লজ প্রিকেট রয়েছে।
এ। কালার, বি। কালার থেকে একটি অভ্যন্তরীণ যোগদান করুন বি এ.ক্লোর = বি। কালার নির্বাচন করুন
উপরেরটি হল ক্লাসিক ইকুই জোড়।
অভ্যন্তরীণ যোগদানের শর্তটি অগত্যা একটি সমতা শর্ত হওয়ার দরকার নেই এবং এটি সারণীর উভয় (বা উভয়ই) কলামের রেফারেন্সের প্রয়োজন নেই। A.Colour NOT IN ('Green','Blue')
ক্রসের প্রতিটি সারিতে মূল্যায়ন করা যোগে ফিরে আসে।
এ। কালার নির্বাচন করুন, বি। কালার থেকে ইনার ইন বি যোগদান করুন 1 = 1 এ
যোগদানের শর্তটি ক্রসের সাথে যুক্ত হওয়ার ফলাফলের সমস্ত সারিটির জন্য সত্য হিসাবে মূল্যায়ন করে তাই এটি ক্রস জোড়ার মতোই। আমি আবার 16 টি সারির ছবিটি পুনরাবৃত্তি করব না।
বহিরাগত যোগদানগুলি অন্তর্ভুক্ত হিসাবে একইভাবে যুক্তিযুক্তভাবে মূল্যায়ন করা হয় কেবল ব্যতীত যদি বাম টেবিলের একটি সারি (বাম জোড়ার জন্য) ডান হাতের টেবিল থেকে কোনও সারিটির সাথে যোগ না দেয় তবে ফলাফলটির জন্য NULL
মান সহ ফলাফলটি সংরক্ষণ করা হয় ডান হাত কলাম।
এটি কেবল আগের ফলাফলগুলিকে কেবল সারিগুলিতে ফিরে আসতে সীমাবদ্ধ করে B.Colour IS NULL
। এই বিশেষ ক্ষেত্রে এটি হ'ল সারিগুলি যেগুলি সংরক্ষণ করা হয়েছিল কারণ ডান হাতের টেবিলের সাথে তাদের কোনও মিল নেই এবং কোয়েরিতে সারণীতে মেলে না এমন একক লাল সারি ফিরে আসে B
। এটি একটি এন্টি সেমি জয়েন্ট হিসাবে পরিচিত।
IS NULL
পরীক্ষার জন্য এমন একটি কলাম নির্বাচন করা গুরুত্বপূর্ণ যা হয় নমনীয় নয় বা যার জন্য যোগদানের শর্তটি নিশ্চিত করে যে NULL
এই প্যাটার্নটি সঠিকভাবে কাজ করার জন্য কোনও মান বাদ থাকবে না এবং কেবল সারিগুলি ফিরিয়ে এড়িয়ে চলবে যার NULL
জন্য এর মান রয়েছে avoid মিল না হওয়া সারিগুলির পাশাপাশি কলাম।
ডান বাইরের সাথে যোগ দেয় বাম বাহ্যিক যোগগুলিতে একইভাবে কাজ করে তবে তারা ডান টেবিল থেকে মিল না থাকা সারিগুলি সংরক্ষণ করে এবং বাম হাতের কলামগুলি নাল করে দেয়।
সম্পূর্ণ বাইরের সাথে যোগ দেয় বাম এবং ডানগুলির আচরণের সাথে মিলিত হয় এবং বাম এবং ডান টেবিল উভয় থেকে মিল না পাওয়া সারিগুলি সংরক্ষণ করে।
ক্রসটিতে কোনও সারি 1=0
প্রিডিটিকের সাথে মিলবে না । উভয় পক্ষের সমস্ত সারি অন্য পাশের টেবিলের কলামগুলিতে NUL সহ সাধারণ বহিরাগত যোগদানের নিয়মগুলি ব্যবহার করে সংরক্ষণ করা হয়।
পূর্ববর্তী কোয়েরিতে একটি ছোটখাটো সংশোধন UNION ALL
করলে দুটি টেবিলের মধ্যে একটি অনুকরণ করতে পারে ।
নোট করুন যে WHERE
ক্লজটি (উপস্থিত থাকলে) যুক্ত হওয়ার পরে যৌক্তিকভাবে চালিত হয়। একটি সাধারণ ত্রুটি হ'ল একটি বাম বাহ্যিক জোড় সম্পাদন করা এবং তারপরে ডান টেবিলের শর্ত সহ একটি WHERE ধারাটি অন্তর্ভুক্ত করা হয় যা মিল না থাকা সারিগুলি বাদ দিয়ে শেষ হয়। উপরের অংশটি বাহ্যিক সংযুক্তি সম্পাদন করে ...
... এবং তারপরে "যেখানে" ক্লজটি চলে। NULL= 'Green'
সত্য হিসাবে মূল্যায়ন করে না তাই বাহ্যিক জোড় দ্বারা সংরক্ষিত সারিটি বাতিল হয়ে যায় (নীল সাথে সাথে) কার্যকরভাবে জোড়টিকে একটি অভ্যন্তরীণ স্থানে রূপান্তর করে।
যদি উদ্দেশ্যটি হ'ল বি থেকে কেবল সারি অন্তর্ভুক্ত করা হয় যেখানে রঙ সবুজ এবং এ থেকে সমস্ত সারি সঠিক বিন্যাসটি নির্বিশেষে হবে
এই উদাহরণগুলি এসকিউএলফিডাল ডট কম এ সরাসরি দেখুন ।
যোগদান দুটি টেবিল থেকে ডেটা একত্রিত করতে ব্যবহৃত হয়, ফলাফলটি একটি নতুন, অস্থায়ী সারণী হয়ে থাকে। প্রিনিকেট নামক কোনও কিছুর উপর ভিত্তি করে যোগদান করা হয়, যা যোগদানের জন্য শর্তটি নির্দিষ্ট করে। একটি অভ্যন্তরীণ যোগদান এবং একটি বাহ্যিক যোগদানের মধ্যে পার্থক্য হ'ল অভ্যন্তরীণ যোগদানটি কেবলমাত্র সারিগুলিতে ফিরে আসবে যা আসলে যোগদানের প্রাকটিকের উপর ভিত্তি করে মেলে। উদাহরণস্বরূপ- আসুন কর্মচারী এবং অবস্থানের টেবিলটি বিবেচনা করুন:
অভ্যন্তরীণ যোগদান: - অন্তর্ভুক্ত যোগদানের পূর্বেকারেরউপর ভিত্তি করেদুটি সারণীর ( কর্মচারী এবং অবস্থান )এর কলাম মানগুলির সমন্বয় করে একটি নতুন ফলাফল সারণীতৈরি করে। যোগদানের প্রস্তাবকে সন্তুষ্ট করে এমন সমস্ত জোড় সারি সন্ধানের জন্য ক্যোয়ারী কর্মচারীর প্রতিটি সারি অবস্থানের প্রতিটি সারিটির সাথেতুলনা করে। যখন যোগদান-প্রিডিটকটি নন-নুল মানগুলির সাথে মিলে সন্তুষ্ট হয়, তখন কর্মচারী এবং অবস্থানের প্রতিটি সারি যুক্ত জোড়ার জোড়গুলির জন্য কলামের মানগুলিফলাফল সারিতে একত্রিত হয়। অভ্যন্তরীণ যোগদানের জন্য এসকিউএল দেখতে কেমন হবে তা এখানে:
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
এখন, এসকিউএল চালানোর ফলাফলটি দেখতে কেমন হবে তা এখানে:
আউটার জয়েন: - একটি বাহ্যিক জোড় দুটি মিলিত টেবিলের প্রতিটি রেকর্ডের সাথে মিলে যাওয়ার রেকর্ডের প্রয়োজন হয় না। যোগদান করা সারণি প্রতিটি রেকর্ড ধরে রাখে other এমনকি অন্য কোনও মিলের রেকর্ড না থাকলেও। বাইরের বাহ্যিক অংশটি আরও বাম বাহিরের সাথে যোগ হয় এবং ডান বাহিরের সাথে যোগ দেয়, তার উপর নির্ভর করে কোন টেবিলের সারিগুলি বামে রাখা হয় (বাম বা ডান)।
বাম বাহ্যিক যোগদান: - সারণী কর্মচারী এবং অবস্থানের জন্য বাম বাহিরের যোগ (বা কেবল বাম যোগদান) এর ফলাফলটিতে সর্বদা "বাম" টেবিলের সমস্ত রেকর্ড থাকে ( কর্মচারী ), এমনকি যোগদানের শর্তটিতে কোনও মিলে যাওয়ার রেকর্ড না পাওয়া সত্ত্বেও "ডান" টেবিল ( অবস্থান )। উপরের সারণীগুলি ব্যবহার করে বাম বাহিরের যোগদানের জন্য এসকিউএল দেখতে কেমন হবে তা এখানে:
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
এখন, এই এসকিউএল চালানোর ফলাফলটি দেখতে কেমন হবে তা এখানে:
ডান আউটার জয়েন: - বিপরীত সারণীর চিকিত্সা বাদে ডান বাহিরের জোড় (বা ডান জোড়) বাম বাহিরের জোড়ার সাথে সাদৃশ্যপূর্ণ। "ডান" সারণী ( অবস্থান )থেকে প্রতিটি সারিঅন্তত একবার যোগদান করা টেবিলটিতে উপস্থিত হবে। আপনার সাথে মেলে এমন সারি "left" সারণী (থেকে যদি কর্মচারী ) বিদ্যমান, শূন্য থেকে কলাম উপস্থিত হবে কর্মচারী সেই রেকর্ডে কোনো মিল আছে জন্য অবস্থান । এসকিউএল এর মতো দেখতে:
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
উপরের সারণীগুলি ব্যবহার করে, আমরা ডান বাহিরের যোগদানের ফলাফল সেটটি দেখতে কেমন তা প্রদর্শন করতে পারি:
সম্পূর্ণ আউটার যোগ দেয় : - সম্পূর্ণ আউটার জয়েন বা ফুল জয়েন হ'ল একটি জোড়ার ফলাফলগুলিতে ননম্যাচিং সারিগুলি অন্তর্ভুক্ত করে একটি সম্পূর্ণ বাহ্যিক যোগদান ব্যবহার করে নন ম্যাচিং তথ্য বজায় রাখা। এটিতে উভয় সারণীর সমস্ত সারি অন্তর্ভুক্ত রয়েছে, অন্য সারণির মিল রয়েছে কি না তা নির্বিশেষে।
মেলে থাকা সারিগুলি কেবল পুনরুদ্ধার করুন, এটি A intersect B
।
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
প্রথম টেবিল থেকে সমস্ত রেকর্ড এবং দ্বিতীয় টেবিলে যে কোনও রেকর্ড যা যুক্ত কীগুলির সাথে মেলে তা নির্বাচন করুন।
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
দ্বিতীয় সারণী থেকে সমস্ত রেকর্ড এবং প্রথম টেবিলে যে কোনও রেকর্ড যা যুক্ত কীগুলির সাথে মেলে তা নির্বাচন করুন।
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
সহজ কথায়:
একটি ভেতরের যোগদানের মিলেছে সারি শুধুমাত্র পুনরুদ্ধার।
যখন কোনও বাহ্যিক যোগসূত্র এক সারণী থেকে সারণী সারণী এবং অন্য সারণীতে সমস্ত সারি পুনরুদ্ধার করে .... ফলাফলটি আপনি কোনটি ব্যবহার করছেন তার উপর নির্ভর করে:
বাম : ডান টেবিলের সারি এবং বাম টেবিলের সমস্ত সারি মিলছে
ডান : বাম টেবিলের সারি এবং ডান টেবিলের সমস্ত সারি মিলছে বা
পূর্ণ : সমস্ত সারণীতে সমস্ত সারি। ম্যাচ আছে কিনা তা কিছু যায় আসে না
অভ্যন্তরীণ যোগদানটি কেবলমাত্র সারিগুলি দেখায় যদি যোগটির অন্য (ডানদিকে) সাথে কোনও মিলের রেকর্ড থাকে।
একটি (বাম) বাহ্যিক জোড় জোড়ের অন্য (ডান) পাশে কোনও সাদৃশ্য সারি না থাকলেও বাম হাতের প্রতিটি রেকর্ডের জন্য সারি দেখায়। যদি কোনও মিলের সারি না থাকে, অন্য (ডানদিকে) কলামগুলি NULL দেখায়।
অভ্যন্তরীণ যোগদানের সাথে আবশ্যক যে কোনও যুক্ত আইডি সহ একটি রেকর্ড বিদ্যমান টেবিলে উপস্থিত থাকে।
বাইরের যোগদানকারীরা ডান পাশের জন্য কিছু না থাকলেও বাম দিকের জন্য রেকর্ডগুলি ফিরিয়ে দেবে।
উদাহরণস্বরূপ, আপনার একটি অর্ডার এবং একটি অর্ডার বিবরণ টেবিল রয়েছে। তারা একটি "অর্ডারআইডি" দ্বারা সম্পর্কিত।
অর্ডার
আদেশ বিবরণী
অনুরোধ
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
অর্ডার বিবরণী টেবিলের মধ্যে কিছু রয়েছে এমন অর্ডারগুলি কেবল ফেরত দেবে।
আপনি যদি এটি আউটর বাম যোগে পরিবর্তন করেন
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
তাহলে এটি অর্ডার টেবিল থেকে রেকর্ডগুলি ফিরিয়ে আনবে এমনকি যদি তাদের কোনও অর্ডারডেটেল রেকর্ড না থাকে।
আপনি এই আদেশগুলি সন্ধান করতে এটি ব্যবহার করতে পারেন যেখানে কোনও অর্ডারডেটেল নেই যেখানে সম্ভাব্য অনাথ আদেশের নির্দেশ দেয় যেখানে একটি দফা পছন্দ রয়েছে WHERE OrderDetails.OrderID IS NULL
।
SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
করার SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC
সাফল্যের সঙ্গে (মাইএসকিউএল)। আমি অতিরিক্ত শর্তাদি সম্পর্কে নিশ্চিত ছিলাম না, তারা ভালভাবে মিশ্রিত হয়েছে ...
সহজ কথায়:
অভ্যন্তরীণ যোগ দিন -> পিতামাতা এবং সন্তানের টেবিল থেকে কেবলমাত্র সাধারণ রেকর্ড নিন যেখানে পিতামাতার সারণীর প্রাথমিক কী শিশু টেবিলে বিদেশী কীটির সাথে মেলে।
বাম যোগদান ->
সুডোকোড
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
ডান যোগদান : বাম জোড়ার বিপরীতে। ডান দিকে জোড়ে ডানদিকে বাম জোনে টেবিলের নাম রাখুন, আপনি বাম যোগ হিসাবে একই আউটপুট পাবেন।
বহিরাগত যোগদান : উভয় সারণীতে সমস্ত রেকর্ড দেখান No matter what
। বাম সারণিতে রেকর্ডগুলি প্রাইমারি, ফোরইগিন কী-এর ভিত্তিতে ডান টেবিলের সাথে মেলে না, যোগদানের ফলে নুল মানটি ব্যবহার করুন।
উদাহরণ:
2 টেবিলের জন্য এখন ধরে নেওয়া যাক
1.employees , 2.phone_numbers_employees
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
এখানে, কর্মচারীদের সারণি হ'ল মাস্টার টেবিল, ফোন_ নাম্বার_ইম্প্লোইগুলি চাইল্ড টেবিল (এতে emp_id
বিদেশী কী রয়েছে যা employee.id
এটির চাইল্ড টেবিলটিকে সংযুক্ত করে ))
অভ্যন্তরীণ যোগ দেয়
কেবলমাত্র 2 টি টেবিলের রেকর্ড নিন যদি কর্মীদের টেবিলের প্রাথমিক কী (এর আইডি) শিশু টেবিলের বিদেশী কীটির সাথে মেলে ফোন_ নাম্বার_ম্যাপলয়েস (এমপি_আইডি) ।
সুতরাং ক্যোয়ারীটি হ'ল:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
এখানে উপরে বর্ণিত হিসাবে কেবল প্রাথমিক কী = বিদেশী কীতে মিল রয়েছে সারিগুলি নিন primary এখানে মূল কী = বিদেশী কীতে মিল নেই এমন সারিগুলি যোগদানের ফলস্বরূপ এড়িয়ে চলেছে।
বাম যোগ দেয় :
ডান টেবিলের সাথে মেলে এমন একটি সারি রয়েছে কিনা তা বিবেচনা না করেই বাম টেবিলে বাম টেবিলের সমস্ত সারি ধরে রাখে।
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
বাইরের সাথে যোগ দেয় :
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
ডায়াগ্রাম্যালি এটি দেখতে দেখতে:
INNER JOIN
যেখানে দুটি ম্যাচ আছে সেখানে দুটি সারণী থেকে আপনি সমস্ত সারি ফেরত দিতে ব্যবহার করুন । যেমন ফলাফল সারণীতে সমস্ত সারি এবং কলামের মান থাকবে।
ইন OUTER JOIN
ফলে টেবিল খালি কলাম থাকতে পারে। বাইরের জোড় হয় LEFT
বা হতে পারে RIGHT
।
LEFT OUTER JOIN
দ্বিতীয় সারণীতে কোনও মিল না থাকলেও প্রথম সারণী থেকে সমস্ত সারি ফেরত দেয়।
RIGHT OUTER JOIN
প্রথম টেবিলের সাথে ম্যাচ না থাকলেও দ্বিতীয় সারণী থেকে সমস্ত সারি ফিরিয়ে দেয়।
এটি সমস্ত ধরণের যোগদানের জন্য একটি ভাল চিত্রের ব্যাখ্যা
উত্স: http://ssiddique.info/ বোঝার জন্য-sql-joins-in-easy-way.html
INNER JOIN
দুটি টেবিলের তুলনায় কমপক্ষে একটি ম্যাচ প্রয়োজন। উদাহরণস্বরূপ, টেবিল A এবং টেবিল বি যা A ٨ B (একটি ছেদ বি) বোঝায়।
LEFT OUTER JOIN
এবং LEFT JOIN
একই। এটি উভয় সারণীতে এবং বাম টেবিলের সমস্ত সম্ভাবনার সাথে মিলে সমস্ত রেকর্ড দেয়।
একইভাবে, RIGHT OUTER JOIN
এবং RIGHT JOIN
একই। এটি উভয় টেবিলের সাথে মিলিয়ে সমস্ত রেকর্ড দেয় এবং ডান টেবিলের সমস্ত সম্ভাবনা।
FULL JOIN
সদৃশ LEFT OUTER JOIN
এবং RIGHT OUTER JOIN
বিনা সংমিশ্রণ ।
উত্তর প্রতিটি একের অর্থ, তাই ফলাফল।
দ্রষ্টব্য:
মধ্যেSQLite
নেইRIGHT OUTER JOIN
বা হয়FULL OUTER JOIN
।
এবং এছাড়াওMySQL
নেইFULL OUTER JOIN
।
আমার উত্তর উপরের নোট উপর ভিত্তি করে ।
যখন আপনার দুটি টেবিল থাকে:
--[table1] --[table2]
id | name id | name
---+------- ---+-------
1 | a1 1 | a2
2 | b1 3 | b2
ক্রস যোগ / আউটয়ার জয়েন:
আপনার সাথে এই জাতীয় টেবিলের সমস্ত ডেটা থাকতে পারে CROSS JOIN
বা ঠিক এর সাথে ,
:
SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
1 | a1 | 3 | b2
2 | b1 | 1 | a2
2 | b1 | 3 | b2
অন্তর্ভুক্ত যোগদান:
আপনি যখন table1.id = table2.id
ব্যবহার করতে পারেন এমন কোনও সম্পর্কের ভিত্তিতে উপরের ফলাফলগুলিতে একটি ফিল্টার যুক্ত করতে চান INNER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+----+------
1 | a1 | 1 | a2
বাম [আউটর] যোগ দিন:
যখন আপনি উপরের ফলাফলের টেবিলগুলির সমস্ত সারি-একই সম্পর্কের সাথে রাখতে চান - তবে আপনি এটি ব্যবহার করতে পারেন LEFT JOIN
:
( ডান জোনের জন্য কেবল সারণীর স্থান পরিবর্তন করুন)
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
--[Results:]
id | name | id | name
---+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
সম্পূর্ণ আউট জয়েন:
আপনি যখন নিজের ফলাফলগুলিতে অন্য সারণির সমস্ত সারি রাখতে চান আপনি ব্যবহার করতে পারেন FULL OUTER JOIN
:
SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id
--[Results:]
id | name | id | name
-----+------+------+------
1 | a1 | 1 | a2
2 | b1 | Null | Null
Null | Null | 3 | b2
ঠিক আছে, আপনার প্রয়োজন হিসাবে আপনি প্রত্যেকটি চয়ন করেন যা আপনার প্রয়োজনকে কভার করে;)।
full outer join
মাইএসকিউএল-তে কোনও নেই।
ভেতরের যোগ দিতে.
একটি জোড় দুটি সারণী থেকে সারি একত্রিত করা হয়। একটি অভ্যন্তরীণ যোগদান আপনি ক্যোয়ারীতে নির্দিষ্ট করেছেন সেই মানদণ্ডের উপর ভিত্তি করে দুটি টেবিলের সাথে মেলে যাবার চেষ্টা করে এবং কেবল যে সারিগুলি মেলে সেগুলিই ফিরিয়ে দেয়। যোগদানের প্রথম টেবিলের কোনও সারি যদি দ্বিতীয় সারণীতে দুটি সারি মেলে, তবে ফলাফলগুলিতে দুটি সারি ফিরে আসবে। প্রথম টেবিলের মধ্যে যদি একটি সারি থাকে যা দ্বিতীয়টিতে একটি সারির সাথে মেলে না, তবে এটি ফিরে আসেনি; একইভাবে, দ্বিতীয় টেবিলে যদি একটি সারি থাকে যা প্রথম সারির সাথে একটি সারি মেলে না, তবে এটি ফিরে আসেনি।
বাইরের যোগদান।
একজন যোগদানের বাম দ্বিতীয় সারণিতে সারি প্রথম টেবিল থেকে সারি মেলে খোঁজার চেষ্টা করে। যদি এটি কোনও মিল খুঁজে না পায় তবে এটি প্রথম টেবিল থেকে কলামগুলি ফিরিয়ে দেবে এবং দ্বিতীয় টেবিল থেকে কলামগুলি ফাঁকা (নাল) ছেড়ে দেবে।
INNER JOIN
দুটি বা ততোধিক টেবিলের জন্য সর্বাধিক সাধারণ যোগদান। এটি প্রাইমারি এবং ফোরইনকি সম্পর্ক উভয় টেবিলে ডেটা ম্যাচ ফেরায়।OUTER JOIN
এর মতোই INNER JOIN
তবে এটিতে NULL
রেজাল্টসেটের ডেটাও অন্তর্ভুক্ত ।
LEFT JOIN
= INNER JOIN
+ ডান টেবিলের সাথে Null
মেলে বাম টেবিলের সাথে মেলে না।RIGHT JOIN
= INNER JOIN
+ বাম টেবিলের সাথে ম্যাচের সাথে ডান টেবিলের তুলনাহীন ডেটা Null
।FULL JOIN
= INNER JOIN
+ উভয়Null
ম্যাচগুলির সাথে ডান এবং বাম টেবিলের সাথে মেলে না।INNER JOIN
এবং OUTER JOIN
আমরা স্ব-যোগদানের ক্যোয়ারী লিখতে পারি।উদাহরণ স্বরূপ:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
অন্যান্য উত্তরে আমি পারফরম্যান্স এবং অপ্টিমাইজার সম্পর্কে খুব বেশি বিশদ দেখতে পাচ্ছি না।
কখনও কখনও এটি জেনে রাখা ভাল যে কেবলমাত্র INNER JOIN
সাহচর্যমূলক যার অর্থ অপ্টিমাইজারের সাথে এটি খেলতে সর্বাধিক বিকল্প রয়েছে। এটি একই ফলাফল রেখে দ্রুত তা করার জন্য যোগদানের ক্রমটিকে পুনরায় অর্ডার করতে পারে। অপ্টিমাইজার সর্বাধিক যোগদানের মোডগুলি ব্যবহার করতে পারে।
সাধারণত INNER JOIN
বিভিন্ন ধরণের যোগদানের পরিবর্তে ব্যবহার করার চেষ্টা করা ভাল অভ্যাস । (অবশ্যই যদি এটি প্রত্যাশিত ফলাফল সেট বিবেচনা করা সম্ভব হয়।)
এই অদ্ভুত সহযোগী আচরণ সম্পর্কে এখানে বেশ কয়েকটি ভাল উদাহরণ এবং ব্যাখ্যা রয়েছে:
INNER JOIN
তুলনায় ধীর হয় LEFT JOIN
সময়ের সবচেয়ে, এবং মানুষ ব্যবহার করতে পারেন LEFT JOIN
পরিবর্তে INNER JOIN
একটি যোগ করে WHERE
অপ্রত্যাশিত সরানোর জন্য NULL
ফলাফল;)।
INNER
ধীর বলে মনে করেন ?
লাল-ছায়াযুক্ত ভেন চিত্রের সমালোচনা করে, আমি নিজের চেষ্টাটি পোস্ট করা ঠিক মনে করি।
যদিও @ মার্টিন স্মিথের উত্তরটি এই গোছাটির মধ্যে সবচেয়ে ভাল, তবে প্রতিটি টেবিল থেকে তার একমাত্র মূল কলামটি দেখানো হয়েছে, যেখানে আমি মনে করি আদর্শভাবে নন-কী কলামগুলিও দেখানো উচিত।
অনুমোদিত অর্ধ ঘন্টা আমি যেটা করতে পারলাম সেরা, আমি এখনও মনে করি না যে এটি যথাযথভাবে দেখায় যে নালগুলি মূল মানগুলির অনুপস্থিতির কারণে রয়েছে TableB
বা এটি OUTER JOIN
আসলে যোগদানের পরিবর্তে একটি ইউনিয়ন:
TableA a LEFT OUTER JOIN TableB b
TableB B RIGHT OUTER JOIN TableA a
জন্য সুনির্দিষ্ট অ্যালগরিদম INNER JOIN
, LEFT/RIGHT OUTER JOIN
নিম্নলিখিত হল:
a
(a, b[i])
ON ...
প্রতিটি জুটির বিরুদ্ধে ধারাটি মূল্যায়ন করুন :ON( a, b[i] ) = true/false?
true
, সেই সম্মিলিত সারিতে ফিরে আসুন (a, b[i])
।Outer Join
একটি (ভার্চুয়াল) জুটি ফিরে Null
আসে: (a, Null)
বাম বাহ্যিক জোড়ার জন্য বা ডানদিকে বাহ্যিক জোড়ার (Null, b)
জন্য। এটি চূড়ান্ত ফলাফলগুলিতে প্রথম সারণীর সমস্ত সারি বিদ্যমান তা নিশ্চিত করা।দ্রষ্টব্য: ধারাটিতে বর্ণিত শর্তটি ON
যে কোনও কিছু হতে পারে, প্রাথমিক কীগুলি ব্যবহার করার প্রয়োজন নেই (এবং আপনাকে সর্বদা উভয় টেবিলের কলামগুলি উল্লেখ করতে হবে না)! উদাহরণ স্বরূপ:
... ON T1.title = T2.title AND T1.version < T2.version
(=> এই পোস্টটিকে একটি নমুনা ব্যবহার হিসাবে দেখুন: একটি কলামে সর্বাধিক মান সহ কেবল সারি নির্বাচন করুন )... ON T1.y IS NULL
... ON 1 = 0
(ঠিক নমুনা হিসাবে)দ্রষ্টব্য: বাম যোগদান = বাম বাহ্যিক যোগদান, ডান যোগ = ডান বহিরাগত যোগদান
সহজ সংজ্ঞা
অভ্যন্তরীণ যোগদান: উভয় সারণী থেকে রেকর্ড ম্যাচ।
ফুল বাইরের যোগদান করুন: রিটার্নস সঙ্গে মানানসই এবং অপ্রতিম রেকর্ড থেকে অপ্রতিম রেকর্ডের জন্য নাল সঙ্গে উভয় টেবিল থেকে উভয় টেবিল ।
বাম বাইরের যোগদান করুন: রিটার্নস সঙ্গে মানানসই এবং অপ্রতিম রেকর্ড শুধুমাত্র টেবিল থেকে বাম দিকে ।
ডান আউটার জয়েন: কেবল ডানদিকে টেবিল থেকে ম্যাচ এবং মিল নেই রেকর্ডস ।
সংক্ষেপে
মিলছে + বাম মিলহীন + ডান মিলহীন = সম্পূর্ণ বহিরাগত যোগদান
মেলে + বাম মিলহীন = বাম বাহ্যিক যোগদান
মিলছে + ডান মিল নেই = ডান বহিরাগত যোগদান
মিলছে = অভ্যন্তরীণ যোগ দিন
সহজ অর্থে,
1. অন্তর্ভুক্ত যোগ বা EQUI যোগদান: ফলাফল উভয় টেবিলের মধ্যে শুধুমাত্র শর্তের সাথে মেলে ফলাফল।
২. আউটার জয়েন : শর্ত মেলে কি না থাকলেও উভয় টেবিল থেকে সমস্ত মানের ফলাফল নির্ধারণ করে Return
3. বাম যোগদান: বাম টেবিল থেকে সমস্ত মানগুলির ফলাফলসেট এবং ডান টেবিলের শর্তের সাথে মেলে কেবল সারিগুলি সরিয়ে দেয়।
৪. সঠিক যোগদান: ডান টেবিল থেকে সমস্ত মানগুলির ফলাফলসেট এবং কেবল বাম টেবিলের শর্তের সাথে মেলে এমন সারিগুলি প্রদান করে।
৫. সম্পূর্ণ যোগদান: সম্পূর্ণ যোগদান এবং সম্পূর্ণ বাহ্যিক যোগদান একই।
উদাহরণ
ধরুন আপনার কাছে একটি করে কলাম সহ দুটি করে টেবিল রয়েছে এবং নীচের হিসাবে ডেটা রয়েছে:
A B
- -
1 3
2 4
3 5
4 6
7
8
দ্রষ্টব্য যে (1,2,7,8) এ এর জন্য স্বতন্ত্র, (3,4) সাধারণ এবং (5,6) বি এর থেকে স্বতন্ত্র are
অন্তর্ভুক্ত যোগ কীওয়ার্ড শর্তটি ততক্ষণ ততক্ষণ উভয় সারণী থেকে সমস্ত সারি নির্বাচন করে। এই কীওয়ার্ডটি উভয় সারণী থেকে সমস্ত সারি একত্রিত করে ফলাফল-সেট তৈরি করবে যেখানে শর্তটি সন্তুষ্ট অর্থাৎ সাধারণ ক্ষেত্রের মান একই হবে।
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
ফলাফল:
a | b
--+--
3 | 3
4 | 4
এই যোগদানটি জোড়ার বাম দিকে টেবিলের সমস্ত সারি এবং জোড়ার ডানদিকে টেবিলের জন্য সারণীগুলির সাথে মিলছে returns যে সারিগুলির জন্য ডানদিকে কোনও সাদৃশ্য সারি নেই, ফলাফল-সেটটিতে নাল থাকবে। বাম জোয়ান হিসাবে পরিচিত LEFT OUTER JOIN
।
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
ফলাফল:
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
7 | null
8 | null
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
ফলাফল:
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
সম্পূর্ণ (বাহ্যিক) যোগদান :
বাম জয়েন্ট এবং রাইট জয়েন্ট দু'এর ফলাফলকে একত্রিত করে সম্পূর্ণ যোগদান ফলাফল-সেট তৈরি করে। ফলাফল-সেটটিতে উভয় সারণী থেকে সমস্ত সারি থাকবে। যে সারিগুলির জন্য কোনও মিল নেই, ফলাফল-সেটটিতে নুল মান থাকবে।
select * from a FULL OUTER JOIN b on a.a = b.b;
ফলাফল:
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
7 | null
8 | null
অভ্যন্তরীণ যোগদান - সমতুল্য প্রশ্নের দুটি ব্যবহার করে একটি অভ্যন্তরীণ জোড় দুটি টেবিলের ছেদ দেয় , অর্থাত্ তাদের দুটি সারি মিল রয়েছে।
বাম বাহ্যিক জোড় - একটি বাম বাহ্যিক জোড় এ এর সমস্ত সারি দেয়, এবং বি তে কোনও সাধারণ সারি দেবে
সম্পূর্ণ বাহ্যিক জোড় - সম্পূর্ণ বাইরের জোড় আপনাকে A এবং B মিলিয়ে দেবে, অর্থাৎ A এর সমস্ত সারি এবং B- এর সমস্ত সারি, যদি A এর কোনও কিছুর সাথে B তে একই ডেটাম না থাকে তবে B অংশটি নাল, এবং তদ্বিপরীত
Join is not an intersection unless the tables have the same columns
আপনি যে কোনও কলামে আপনি চান তাতে যোগ দিতে পারেন এবং মানটি মিলে গেলে তারা একসাথে যোগ দেবে।
1. অভ্যন্তরীণ যোগদান: যোগ হিসাবেও ডাকা হয়। এটি উভয় বাম টেবিলের উপস্থিত সারিগুলি এবং ডান টেবিল কেবল যদি কোনও মিল থাকে তবে ফিরিয়ে দেয় । অন্যথায়, এটি শূন্য রেকর্ড দেয়।
উদাহরণ:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
২. সম্পূর্ণ আউটার জয়েন: একে সম্পূর্ণ যোগদান হিসাবেও ডাকা হয়। এটি বাম টেবিল এবং ডান টেবিল উভয় উপস্থিত সমস্ত সারি ফিরিয়ে দেয় ।
উদাহরণ:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
৩. বাম বহিরাগত যোগদান: বা কেবল বাম যোগদান হিসাবে পরিচিত। এটি বাম টেবিলের উপস্থিত সমস্ত সারি এবং ডান টেবিলের সাথে মিলিত সারিগুলি (যদি থাকে) প্রদান করে।
৪. রাইট আউটার জয়েন: একে ডান যোগ হিসাবেও ডাকা হয়। এটি বাম টেবিল (যদি থাকে তবে) এবং ডান টেবিলের সমস্ত সারি উপস্থিত থেকে মিলছে সারিগুলি প্রদান করে।
যোগদানের সুবিধা
2 টি সারণির নীচে বিবেচনা করুন:
ইএমপি
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
বিভাগ
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
বেশিরভাগই বর্গ কোয়েরিতে কেবল যোগ হিসাবে লেখা । এটি টেবিলগুলির মধ্যে কেবল মিলের রেকর্ডগুলি দেয় returns
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
আপনি উপরে Jose
যেমন দেখতে পান, EMP থেকে আউটপুটে মুদ্রিত হয় না কারণ এটি ডিপ্ট_আইডি 6
বিভাগের টেবিলে কোনও মিল খুঁজে পায় না। একইভাবে, HR
এবং সারণী বিভাগের টেবিল R&D
থেকে সারিগুলি মুদ্রণ করা হয় না কারণ এম্প টেবিলে তারা কোনও মিল খুঁজে পায় না।
সুতরাং, অভ্যন্তরীণ যোগদান করুন বা কেবল যোগদান করুন, কেবল মিলিত সারিগুলি প্রদান করে।
এটি বাম টেবিল থেকে সমস্ত রেকর্ড এবং কেবলমাত্র রাইট টেবিলের সাথে মিলছে records
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
সুতরাং, আপনি যদি উপরের আউটপুটটি পর্যবেক্ষণ করেন, তবে বাম টেবিলের সমস্ত ইমাম (এমপ) রাইট টেবিলের সাথে কেবল মিলে যাওয়া রেকর্ডগুলির সাথে মুদ্রিত হবে।
HR
এবং ডিপ্টি_ডে এম্প টেবিলে কোনও মিল খুঁজে পাওয়া যায় নি বলে বিভাগের টেবিল R&D
থেকে সারিগুলি মুদ্রণ করা হয় না ।
সুতরাং, বাম যোগদান করুন বাম টেবিল থেকে সমস্ত সারি এবং কেবলমাত্র ডান টেবিলের সাথে সারণী মিলে returns
এখানে ডেমোও পরীক্ষা করতে পারে ।
দয়া করে দেখুন উত্তর দ্বারা মার্টিন স্মিথ বিভিন্ন, যোগদান করে সহ এবং বিশেষ করে মধ্যে পার্থক্য একটি উন্নততর illustations এবং ব্যাখ্যার জন্য FULL OUTER JOIN
, RIGHT OUTER JOIN
এবং LEFT OUTER JOIN
।
এই দুটি সারণী JOIN
নীচের গুলিগুলির প্রতিনিধিত্বের জন্য একটি ভিত্তি গঠন করে:
SELECT *
FROM citizen
CROSS JOIN postalcode
ফলাফলটি সমস্ত সংমিশ্রনের কার্টেসিয়ান পণ্য হবে। কোনও JOIN
শর্তের প্রয়োজন নেই:
INNER JOIN
সহজ হিসাবে একই: JOIN
SELECT *
FROM citizen c
JOIN postalcode p ON c.postal = p.postal
ফলাফলটি এমন সংমিশ্রণগুলি হবে যা প্রয়োজনীয় JOIN
শর্তটি পূরণ করে :
LEFT OUTER JOIN
হিসাবে একই LEFT JOIN
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
citizen
কোনও ম্যাচ না থাকলেও ফলাফলটি সমস্ত কিছুই থেকে যাবে postalcode
। আবার একটি JOIN
শর্ত প্রয়োজন:
সমস্ত উদাহরণ একটি ওরাকল 18c তে চালানো হয়েছে। এগুলি dbfiddle.uk এ উপলব্ধ যা টেবিলগুলির স্ক্রিনশটগুলি এসেছে।
CREATE TABLE citizen (id NUMBER,
name VARCHAR2(20),
postal NUMBER, -- <-- could do with a redesign to postalcode.id instead.
leader NUMBER);
CREATE TABLE postalcode (id NUMBER,
postal NUMBER,
city VARCHAR2(20),
area VARCHAR2(20));
INSERT INTO citizen (id, name, postal, leader)
SELECT 1, 'Smith', 2200, null FROM DUAL
UNION SELECT 2, 'Green', 31006, 1 FROM DUAL
UNION SELECT 3, 'Jensen', 623, 1 FROM DUAL;
INSERT INTO postalcode (id, postal, city, area)
SELECT 1, 2200, 'BigCity', 'Geancy' FROM DUAL
UNION SELECT 2, 31006, 'SmallTown', 'Snizkim' FROM DUAL
UNION SELECT 3, 31006, 'Settlement', 'Moon' FROM DUAL -- <-- Uuh-uhh.
UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space' FROM DUAL;
JOIN
এবংWHERE
CROSS JOIN
জেনারেল আইডিয়া হিসাবে সারিগুলির ফলাফল INNER JOIN
: /
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows
CROSS JOIN
কোনও ফলাফলের জন্য ব্যবহার করতে LEFT OUTER JOIN
একটি NULL
সারি যুক্ত করার মতো কৌশল প্রয়োজন । এটি বাদ দেওয়া হয়েছে।
INNER JOIN
একটি cartesian পণ্য হয়ে ওঠে। এটি জেনারেল আইডিয়া / CROSS JOIN
:
SELECT *
FROM citizen c
JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
এখানেই অভ্যন্তরীণ যোগদানটি শর্তটি মিলে না গিয়ে ফলাফলের সাথে ক্রস জয়েন হিসাবে দেখা যেতে পারে। এখানে ফলাফলের সারিগুলির কোনওটি সরানো হয়নি removed
ব্যবহার INNER JOIN
ফলাফলের পেতে একটি LEFT OUTER JOIN
এছাড়াও ঠাট প্রয়োজন। এটি বাদ দেওয়া হয়েছে।
LEFT JOIN
সাধারণ আইডিয়া হিসাবে সারিগুলিতে ফলাফল CROSS JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN
LEFT JOIN
সাধারণ আইডিয়া হিসাবে সারিগুলিতে ফলাফল INNER JOIN
:
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode
"স্কয়ারের অভ্যন্তরের অভ্যন্তরের বাইরের অংশে" স্কোলে একটি ইন্টারনেট অনুসন্ধান ভেন চিত্রের একটি ভিড় দেখায়। আমার ডেস্কে একটির একটি মুদ্রিত অনুলিপি থাকত। তবে প্রতিনিধিত্ব নিয়ে সমস্যা রয়েছে।
ভেন ডায়াগ্রাম সেট তত্ত্বের জন্য দুর্দান্ত, যেখানে কোনও উপাদান এক বা উভয় সেটে থাকতে পারে। তবে ডাটাবেসের জন্য, একটি "সেট" এর একটি উপাদান আমার কাছে মনে হয়, একটি টেবিলের সারি হতে পারে, এবং অন্য কোনও টেবিলে উপস্থিতও হয় না not একাধিক সারণীতে একটি সারি উপস্থিত থাকার মতো কোনও জিনিস নেই। একটি সারি টেবিলে অনন্য।
স্বতঃ যোগ হয় এমন এক কোণার ক্ষেত্রে যেখানে প্রতিটি উপাদান বাস্তবে উভয় সেটে একই থাকে। তবে এটি নীচের যে কোনও সমস্যা থেকে মুক্ত নয়।
সেটটি A
বামে ( citizen
টেবিল) সেটটি উপস্থাপন করে এবং নীচের আলোচনায় B
সেটটি ডানদিকে ( postalcode
টেবিল) সেট ।
উভয় সেট প্রতিটি উপাদান অন্যান্য সেট প্রতিটি উপাদান সঙ্গে মেলানো হয়, যার অর্থ আমরা প্রয়োজন A
যে পরিমাণ B
উপাদান এবং B
প্রত্যেক পরিমাণ A
উপাদান সঠিকভাবে এই কার্টিজিয়ান পণ্য প্রতিনিধিত্ব করতে। সেট তত্ত্বটি কোনও সেটে একাধিক অভিন্ন উপাদানগুলির জন্য তৈরি করা হয় না, তাই আমি ভেন চিত্রটি এটিকে অবৈধ / অসম্ভবকে সঠিকভাবে উপস্থাপন করতে পাই find এটি মোটেও মানায় না বলে মনে UNION
হয়।
সারি স্বতন্ত্র। UNION
মোট 7 সারি হয়। তবে তারা একটি সাধারণ SQL
ফলাফলের সেটের জন্য বেমানান । এবং এটি CROSS JOIN
কোনওভাবেই কাজ করে না:
এটি এর মতো উপস্থাপন করার চেষ্টা করছে:
.. তবে এখন এটি দেখতে কেবল একটির মতো INTERSECTION
, যা এটি অবশ্যই নেই । তদুপরি এর কোনও উপাদান নেই INTERSECTION
যা আসলে দুটি স্বতন্ত্র সেটের কোনওটিতেই রয়েছে। তবে এটি দেখতে অনেকটা এর মতো সন্ধানযোগ্য ফলাফলের মতো দেখাচ্ছে:
রেফারেন্সের জন্য টিগুলির জন্য একটি অনুসন্ধানযোগ্য ফলাফল টিউটোরিয়ালগেটওয়েতেCROSS JOIN
দেখা যায় । এই , ঠিক এই মত, খালি।INTERSECTION
কোনও উপাদানের মান JOIN
শর্তের উপর নির্ভর করে । প্রতিটি সারি যে শর্তটি অনন্য হয়ে যায় সেই শর্তে এটির প্রতিনিধিত্ব করা সম্ভব। অর্থ id=x
কেবল এক সারির জন্য সত্য । একবার টেবিলের একটি সারিতে A
( citizen
) টেবিলে একাধিক সারি মিলে যায় B
( postalcode
অধীন) JOIN
অবস্থা, ফলে একই সমস্যা রয়েছে CROSS JOIN
: সারি একাধিক বার প্রতিনিধিত্ব করা প্রয়োজন, এবং সেট তত্ত্ব সত্যিই যে জন্য তৈরি করা হয় না। স্বতন্ত্রতার শর্তে ডায়াগ্রামটি যদিও কাজ করতে পারে তবে মনে রাখবেন যে JOIN
শর্তটি চিত্রের মধ্যে কোনও উপাদানটির অবস্থান নির্ধারণ করে। JOIN
কেবল সওয়ারের জন্য বাকি সারির সাথে শর্তের মানগুলি দেখছি:
যখন একটি ব্যবহার করে এই উপস্থাপনা সম্পূর্ণরূপে পৃথক্ বৃক্ষের পতন INNER JOIN
একটি সঙ্গে ON 1 = 1
শর্ত একটি সেটিকে উপার্জন CROSS JOIN
।
একটি স্ব-সাথে JOIN
, সারিগুলি উভয় সারণিতে প্রকৃতপক্ষে সনাক্তকারী উপাদান, তবে টেবিলগুলি উভয় হিসাবে উপস্থাপন করে A
এবং B
খুব উপযুক্ত নয়। উদাহরণস্বরূপ একটি সাধারণ স্ব JOIN
শর্তে যে মধ্যে একটি উপাদান তোলে A
একটি মানানসই করা বিভিন্ন বি উপাদান হয় ON A.parent = B.child
, থেকে ঘটকালি A
করতে B
পৃথক উপাদানে। উদাহরণস্বরূপ যে এটির SQL
মতো হবে :
SELECT *
FROM citizen c1
JOIN citizen c2 ON c1.id = c2.leader
মানে স্মিথ সবুজ এবং জেনসেন উভয়েরই নেতা।
আবার সমস্যাগুলি শুরু হয় যখন এক সারিটিতে অন্য সারণীতে একাধিক সারি সারি থাকে। এটি আরও জটিল কারণ OUTER JOIN
খালি সেটটি মেলাতে পারে। তবে সেট থিয়োরিতে কোনও সেট C
এবং একটি খালি সেট এর মিলন সর্বদা ন্যায়সঙ্গত C
। খালি সেট কিছুই যোগ করে না। এর প্রতিনিধিত্বটি LEFT OUTER JOIN
সাধারণত দেখানোর জন্য সমস্ত কিছু A
দেখায় যে সারিগুলি সারি A
নির্বাচন করা হয়েছে কিনা তা নির্বিশেষে ম্যাচ আছে কিনা তা নির্ধারণ করে B
। "মিলে যাওয়া উপাদানগুলি" তবে উপরের চিত্রের মতো একই সমস্যা রয়েছে। তারা অবস্থার উপর নির্ভর করে। এবং খালি সেটটি এখানে ঘুরে গেছে বলে মনে হচ্ছে A
:
CROSS JOIN
চাঁদে স্মিথ এবং পোস্টকোড সহ একটি থেকে সমস্ত সারি সন্ধান করা :
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
AND p.area = 'Moon';
এখন ভেন চিত্রটি প্রতিফলিত করতে ব্যবহৃত হয় না JOIN
। এটি কেবলWHERE
দফার জন্য ব্যবহার করা হয়েছে :
.. এবং যে বোধগম্য।
হিসাবে ব্যাখ্যা একটি INNER JOIN
আসলে একটি নয় INTERSECT
। তবে INTERSECT
এস পৃথক প্রশ্নের ফলাফলগুলিতে ব্যবহার করা যেতে পারে। এখানে একটি ভেন ডায়াগ্রামটি বোঝা যায়, কারণ পৃথক প্রশ্নগুলির উপাদানগুলি সত্যই সারি হয় যা হয় ফলাফলগুলির মধ্যে একটি বা উভয়েরই অন্তর্ভুক্ত। ইন্টারসেক্ট স্পষ্টতই কেবল ফলাফলগুলি প্রত্যাবর্তন করবে যেখানে সারি উভয় প্রশ্নের মধ্যে উপস্থিত রয়েছে। এর SQL
ফলে উপরেরটির মতো একই সারিতে ফলাফল আসবে WHERE
এবং ভেন চিত্রটিও একই হবে:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
INTERSECT
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
আন OUTER JOIN
একটি না UNION
। তবে UNION
একই পরিস্থিতিতে কাজ করুন INTERSECT
, ফলস্বরূপ উভয় SELECT
এর সমন্বয়ে সমস্ত ফলাফলের ফলাফল :
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
UNION
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE p.area = 'Moon';
যা এর সমান:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
OR p.area = 'Moon';
.. এবং ফলাফল দেয়:
এছাড়াও এখানে একটি ভেন চিত্রটি বোঝায়:
একটি গুরুত্বপূর্ণ দ্রষ্টব্য হ'ল এগুলি কেবল তখনই কাজ করে যখন দুটি নির্বাচনী ফলাফলের ফলাফলের কাঠামো একই হয়, একটি তুলনা বা ইউনিয়ন সক্ষম করে। এই দুটির ফলাফল এটি সক্ষম করবে না:
SELECT *
FROM citizen
WHERE name = 'Smith'
SELECT *
FROM postalcode
WHERE area = 'Moon';
.. ফলাফলের সাথে একত্রিত করার চেষ্টা করে UNION
একটি
ORA-01790: expression must have same datatype as corresponding expression
জন্য আরও সুদ পড়া ভেন চিত্র থেকে বলো না যখন ব্যাখ্যা যোগদান করে এবং SQL ভেন ডায়াগ্রাম হিসাবে যোগদান করে । দুটোই coverেকে দেয় EXCEPT
।
খুব নির্ভুল সম্পর্কের বীজগণিত উদাহরণ সহ এখানে অনেক ভাল উত্তর রয়েছে is এখানে একটি খুব সরলিকৃত উত্তর যা এসকিউএল কোডিং দ্বন্দ্ব সহ শৌখিন বা নবাগত কোডারদের জন্য সহায়ক হতে পারে।
মূলত, প্রায়শই নয়, প্রশ্নগুলি JOIN
দুটি ক্ষেত্রে ফোটে:
SELECT
ডেটা একটি উপসেট জন্য A
:
INNER JOIN
যখন সম্পর্কিত ডেটা B
আপনি খুঁজছেন আবশ্যক ডাটাবেস নকশা প্রতি বিদ্যমান;LEFT JOIN
যখন সম্পর্কিত ডেটা B
আপনি খুঁজছেন পারে বা নাও করতে পারে ডাটাবেস নকশা প্রতি বিদ্যমান।মধ্যে পার্থক্য inner join
এবং outer join
অনুসরণ নিম্নলিখিত :
Inner join
মিলে যাওয়া টিপলগুলির উপর ভিত্তি করে সম্মিলিত টেবিলগুলি এমন একটি যুক্ত হওয়া, যেখানে outer join
মিলিত এবং মেলে না এমন উভয় টুপলের উপর ভিত্তি করে সম্মিলিত টেবিল joinInner join
দুটি টেবিলের সাথে মিলিত সারিটি মিলিত করে যেখানে মিল নেই সারি বাদ দেওয়া হয়েছে, যেখানে outer join
দুটি টেবিল থেকে সারিগুলি একত্রিত করা হয় এবং তুলনামূলক সারিগুলি নাল মান দিয়ে পূরণ করে।Inner join
একটি ছেদ অপারেশন মত, অন্যদিকে outer join
ইউনিয়ন অপারেশন মত।Inner join
দুটি প্রকারের, যেখানে outer join
তিন প্রকারের।outer join
তুলনায় দ্রুত inner join
।