"অন্তর্ভুক্ত" এবং "আউট জয়েন" এর মধ্যে পার্থক্য কী?


4669

এছাড়াও কিভাবে LEFT JOIN, RIGHT JOINএবং FULL JOINমধ্যে মাপসই করা হবে?


63
উত্তর এবং মতামত এবং তাদের নীচের উল্লেখগুলির নীচে কেবলমাত্র একটি ব্যাখ্যা করে যে ভেন ডায়াগ্রামগুলি অপারেটরগুলিকে কীভাবে প্রতিনিধিত্ব করে: বৃত্ত ছেদ অঞ্চলটি একটি জো বি বিতে সারিগুলির প্রতিনিধিত্ব করে each প্রতিটি বৃত্তের অনন্য অঞ্চলটি আপনি পেয়েছেন সারিগুলির সেট উপস্থাপন করেছেন টেবিলের সারিগুলি যা A J বি তে অংশ নেয় না এবং কলামগুলি অন্য টেবিলের সাথে অনন্য করে সমস্ত নূলে সেট হয়। (এবং বেশিরভাগ এ এবং বি এর সাথে চেনাশোনাগুলির একটি অস্পষ্ট মিথ্যা চিঠিপত্র দেয়)
ফিলিপ্সি

1
নীচে তত্ত্ব ভিত্তিক উত্তরগুলি থেকে একটি বাস্তব বিশ্বের অ্যাপ্লিকেশনটিতে ঝাঁপ দাও: আমি প্রায়শই পরীক্ষার ডেটা নিয়ে, প্রসেসরের ডিজাইনে বেঞ্চমার্ক চালিয়ে কাজ করি। প্রায়শই আমি ফলাফলগুলি 2 বা ততোধিক হার্ডওয়্যার বিকল্পের মধ্যে তুলনা করতে চাই। অন্তর্ভুক্ত হওয়া মানে আমি কেবলমাত্র সেই সমস্ত মানদণ্ডই দেখতে পাই যা সমস্ত পরীক্ষায় সফলভাবে চলে; আউট জয়েনের অর্থ হল যে আমি সমস্ত কনফিগারেশন চালাতে ব্যর্থ হয়েছিল সেগুলি সহ সমস্ত পরীক্ষা-নিরীক্ষা দেখতে পাচ্ছি। এই জাতীয় পরীক্ষাগুলিতে ব্যর্থতা, পাশাপাশি সাফল্যগুলি দেখা গুরুত্বপূর্ণ। আউট জয়েন পেতে পার্ল এসকিউএল লিখেছি যে যথেষ্ট গুরুত্বপূর্ণ, যখন অনেক আরডিবিএমএস এর অভাব ছিল,
ক্রেজি গ্লিউ

4
ইতিমধ্যে প্রচুর উত্তর সরবরাহ করা হয়েছে তবে আমি এই টিউটোরিয়ালটি উল্লেখ করে দেখিনি। আপনি যদি ভেন ডায়াগ্রামগুলি জানেন তবে এটি একটি দুর্দান্ত টিউটোরিয়াল: blog.codinghorror.com/a- ভিজ্যুয়াল- এক্সপ্ল্যানেশন- for- sql-joins আমার জন্য, এটি দ্রুত পঠন করার পক্ষে যথেষ্ট সংক্ষিপ্ত কিন্তু এখনও সম্পূর্ণ ধারণাটি ধরে ফেলে এবং সমস্ত কাজ করে কেস খুব ভাল। ভেন ডায়াগ্রামগুলি কী কী তা আপনি যদি না জানেন - সেগুলি শিখুন 5 এটি করতে 5-10 মিনিট সময় নেয় এবং যখনই আপনাকে সেটের সাথে কাজ করার এবং সেটগুলিতে অপারেশন পরিচালনা করার প্রয়োজন হবে তখনই সহায়তা করবে।
দান্তেস্মিত

14
@ ড্যান্ট দ্য স্মিথ নং, যা এখানে চিত্রগুলির মতো একই সমস্যায় ভুগছে। আমার মন্তব্য উপরে প্রশ্নটি দেখুন এবং নীচে খুব ব্লগ পোস্টটি দেখুন: "জেফ মন্তব্যগুলিতে কয়েক পৃষ্ঠার নীচে তার ব্লগটি পুনর্বার করেছেন"। ভেন ডায়াগ্রাম সেটগুলিতে উপাদান দেখায়। এই চিত্রগুলিতে সেটগুলি কী এবং উপাদানগুলি কী তা ঠিক চিহ্নিত করার চেষ্টা করুন। সেট নয় সারণি এবং উপাদান নয় তাদের সারি। এছাড়াও যে কোনও দুটি টেবিল যোগ দেওয়া যেতে পারে, তাই পিকে এবং এফকে অবিচ্ছিন্ন। সব বোগাস। আপনি অন্য হাজার হাজার লোক যা করেছেন ঠিক তেমনই করছেন - আপনি (ভুলভাবে) ধরে নিলেন এমন একটি অস্পষ্ট ধারণা পাওয়া গেল ।
ফিলিপ্সি

3
ক্রিস আমি আপনাকে এই নিবন্ধটি পড়ার পরামর্শ দিচ্ছি: ডেটাসটায়েন্স . com/ … ... এবং ভেন ডায়াগ্রামগুলি ব্যবহার না করে এমন কোনও উত্তরের (সম্ভবত অনুগ্রহের সাথে একটিতে) আপনার পছন্দমত গৃহীত উত্তর পরিবর্তন করার বিষয়ে বিবেচনা করুন। বর্তমানে গৃহীত উত্তরটি অনেক লোককে বিভ্রান্ত করছে। আমি আপনাকে আমাদের সম্প্রদায়ের মঙ্গল এবং আমাদের জ্ঞানের ভিত্তির মানের জন্য এটি করার জন্য অনুরোধ করছি।
কলম ভান্ডাল

উত্তর:


6110

ধরে নেওয়া যাক আপনি কোনও ডুপ্লিকেট ছাড়াই কলামগুলিতে যোগদান করছেন, যা একটি খুব সাধারণ ঘটনা:

  • 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

41
মান 4 দিয়ে সারণি বিতে আরও একটি সারি যুক্ত করে উদাহরণটিকে বাড়িয়ে তোলা ভাল হবে। এটি দেখায় যে অভ্যন্তরীণ যোগগুলিকে সারির সমান সংখ্যক হওয়া উচিত নয়।
সফটভেদ

472
একটি দুর্দান্ত ব্যাখ্যা, তবে এই বিবৃতি: A এবং B এর একটি বাহ্যিক সংযুক্তি A ইউনিয়ন বি এর ফলাফল দেয়, অর্থাৎ ভেন্য ডায়াগ্রাম ইউনিয়নের বাইরের অংশগুলি। সঠিকভাবে শব্দযুক্ত নয়। একটি বাহ্যিক জোড় নীচের যেকোন একটি ছাড়াও ছেদ করা বি এর ফলাফল দেবে: এগুলির সমস্ত (বাম সংযুক্তি), সমস্ত বি (ডান সংযুক্তি) বা এ এর ​​সমস্ত এবং বি এর সমস্ত (সম্পূর্ণ যোগদান)। কেবলমাত্র এই শেষ দৃশ্যটি সত্যই একটি ইউনিয়ন বি। তবুও, একটি ভাল লিখিত ব্যাখ্যা।
থমাস

11
আমি কি ঠিক বলেছি যে পুরো জয়েন ফুল আউটার জোনের একটি উপন্যাস এবং বাম জয়েন্ট বাম আউটরের যোগদানের একটি উপনাম?
দামিয়ান

3
হ্যাঁ দুর্দান্ত এবং দুর্দান্ত ব্যাখ্যা। তবে কেন কলামে মানগুলি ক্রমযুক্ত নয়? অর্থাৎ এটি 5,6 হিসাবে 6,5 নয়?
আমির

7
আমির, ধন্যবাদ যোগদান কোনও আদেশের গ্যারান্টি দেয় না, আপনাকে একটি ধারা দ্বারা অর্ডার যুক্ত করতে হবে।
হ্যারিসন

730

ভেন চিত্রগুলি আমার জন্য সত্যই তা করে না।

তারা ক্রস জয়েন এবং একটি অভ্যন্তরীণ যোগদানের মধ্যে কোনও পার্থক্য দেখায় না, উদাহরণস্বরূপ, বা আরও সাধারণভাবে বিভিন্ন প্রকারের প্রিন্টেটের মধ্যে কোনও পার্থক্য দেখায় বা তারা কীভাবে কাজ করবে সে সম্পর্কে যুক্তির জন্য একটি কাঠামো সরবরাহ করে।

লজিকাল প্রসেসিং বোঝার কোনও বিকল্প নেই এবং এটি যেভাবেই বুঝতে পারা তুলনামূলক সহজ for

  1. একটি ক্রস যোগ কল্পনা করুন।
  2. প্রেডিকটি onযেখানে মূল্যায়ন করে সেখানে সেগুলি রেখে পদক্ষেপ 1 থেকে সমস্ত সারিগুলির বিরুদ্ধে ধারাটি মূল্যায়ন করুনtrue
  3. (কেবলমাত্র বাহ্যিক যোগদানের জন্য) ২ য় ধাপে হারিয়ে যাওয়া যে কোনও বাহ্যিক সারিতে ফিরে যুক্ত করুন।

(এনবি: অনুশীলনে কোয়েরি অপ্টিমাইজার উপরের খাঁটি যৌক্তিক বর্ণনার চেয়ে ক্যোয়ারি কার্যকর করার আরও কার্যকর উপায়গুলি খুঁজে পেতে পারে তবে চূড়ান্ত ফলাফলটি অবশ্যই একই হতে হবে)

আমি একটি সম্পূর্ণ বাইরের যোগদানের অ্যানিমেটেড সংস্করণ দিয়ে শুরু করব । আরও ব্যাখ্যা নিম্নলিখিত।

এখানে চিত্র বর্ণনা লিখুন


ব্যাখ্যা

উত্স সারণী

লিঙ্ক বিবরণ এখানে প্রবেশ করুন

প্রথমে একটি CROSS JOIN(একেএ কার্টেসিয়ান পণ্য) দিয়ে শুরু করুন। এর কোনও ONধারা নেই এবং কেবল দুটি টেবিল থেকে সারিগুলির প্রতিটি সমন্বয় ফিরে আসে।

এ। কালার নির্বাচন করুন, একটি ক্রস থেকে যোগ করুন বি

লিঙ্ক বিবরণ এখানে প্রবেশ করুন

অভ্যন্তরীণ এবং আউটারের সাথে একটি "চালু" ক্লজ প্রিকেট রয়েছে।

  • ভেতরের যোগ দিতে. ক্রস যোগদানের ফলাফলের সমস্ত সারিগুলির জন্য "চালু" ধারাটিতে শর্তটি মূল্যায়ন করুন। সত্য হিসাবে যদি যোগ সারিতে ফিরে আসে। অন্যথায় এটি বাতিল।
  • বাম বাইরের যোগদান। ডান টেবিলের কলামগুলির জন্য NULL মানগুলির সাথে কোনও আউটপুট মেলে না এমন বাম টেবিলের যে কোনও সারিগুলির জন্য অভ্যন্তরীণ যোগদান হিসাবে একই।
  • রাইট আউটার জয়েন করুন। বাম টেবিল কলামগুলির জন্য NULL মানগুলির সাথে কোনও আউটপুট মেলে না এমন ডান টেবিলের যে কোনও সারির জন্য অভ্যন্তরীণ যোগ হিসাবে একই।
  • সম্পূর্ণ আউটার জয়েন। অভ্যন্তরীণ যোগ হিসাবে একই, তারপর বাম বাহ্যিক জোড় হিসাবে বাম অ মেলে সারি এবং ডান বহির্মুখের যোগ হিসাবে ডান অ মেলে সারি সংরক্ষণ করুন।

কিছু উদাহরণ

এ। কালার, বি। কালার থেকে একটি অভ্যন্তরীণ যোগদান করুন বি এ.ক্লোর = বি। কালার নির্বাচন করুন

উপরেরটি হল ক্লাসিক ইকুই জোড়।

ভেতরের যোগ দিতে

অ্যানিমেটেড সংস্করণ

এখানে চিত্র বর্ণনা লিখুন

এ। কালার, বি। কালার থেকে একটি অভ্যন্তরীণ যোগদান করুন বি এ। কালার ইন নয় ('সবুজ', 'নীল') নির্বাচন করুন

অভ্যন্তরীণ যোগদানের শর্তটি অগত্যা একটি সমতা শর্ত হওয়ার দরকার নেই এবং এটি সারণীর উভয় (বা উভয়ই) কলামের রেফারেন্সের প্রয়োজন নেই। A.Colour NOT IN ('Green','Blue')ক্রসের প্রতিটি সারিতে মূল্যায়ন করা যোগে ফিরে আসে।

অভ্যন্তরীণ 2

এ। কালার নির্বাচন করুন, বি। কালার থেকে ইনার ইন বি যোগদান করুন 1 = 1 এ

যোগদানের শর্তটি ক্রসের সাথে যুক্ত হওয়ার ফলাফলের সমস্ত সারিটির জন্য সত্য হিসাবে মূল্যায়ন করে তাই এটি ক্রস জোড়ার মতোই। আমি আবার 16 টি সারির ছবিটি পুনরাবৃত্তি করব না।

এ। কালার, বি। কালার থেকে একটি বাম আউটয়ার বি এ.ক্লোর বি.ক্লোর বি নির্বাচন করুন = বি কলর

বহিরাগত যোগদানগুলি অন্তর্ভুক্ত হিসাবে একইভাবে যুক্তিযুক্তভাবে মূল্যায়ন করা হয় কেবল ব্যতীত যদি বাম টেবিলের একটি সারি (বাম জোড়ার জন্য) ডান হাতের টেবিল থেকে কোনও সারিটির সাথে যোগ না দেয় তবে ফলাফলটির জন্য NULLমান সহ ফলাফলটি সংরক্ষণ করা হয় ডান হাত কলাম।

LOJ

এ। কালার, বি। কালার থেকে একটি বাম আউটর বি এ.ক্লোর এ বি.ক্লোর নির্বাচন করুন = বি কলর যেখানে বি। কালার নাল

এটি কেবল আগের ফলাফলগুলিকে কেবল সারিগুলিতে ফিরে আসতে সীমাবদ্ধ করে B.Colour IS NULL। এই বিশেষ ক্ষেত্রে এটি হ'ল সারিগুলি যেগুলি সংরক্ষণ করা হয়েছিল কারণ ডান হাতের টেবিলের সাথে তাদের কোনও মিল নেই এবং কোয়েরিতে সারণীতে মেলে না এমন একক লাল সারি ফিরে আসে B। এটি একটি এন্টি সেমি জয়েন্ট হিসাবে পরিচিত।

IS NULLপরীক্ষার জন্য এমন একটি কলাম নির্বাচন করা গুরুত্বপূর্ণ যা হয় নমনীয় নয় বা যার জন্য যোগদানের শর্তটি নিশ্চিত করে যে NULLএই প্যাটার্নটি সঠিকভাবে কাজ করার জন্য কোনও মান বাদ থাকবে না এবং কেবল সারিগুলি ফিরিয়ে এড়িয়ে চলবে যার NULLজন্য এর মান রয়েছে avoid মিল না হওয়া সারিগুলির পাশাপাশি কলাম।

লোজ নাল

এ.ক্লোর নির্বাচন করুন, বি। কালার থেকে একটি সঠিক বাইরে যোগ করুন বি এ.ক্লোর বি বিতে যোগ করুন = বি কলর

ডান বাইরের সাথে যোগ দেয় বাম বাহ্যিক যোগগুলিতে একইভাবে কাজ করে তবে তারা ডান টেবিল থেকে মিল না থাকা সারিগুলি সংরক্ষণ করে এবং বাম হাতের কলামগুলি নাল করে দেয়।

ROJ

এ। কালার, বি। কালার থেকে পুরো আউটয়ার বি এ.ক্লোর বি.ক্লোর নির্বাচন করুন = বি। কালার

সম্পূর্ণ বাইরের সাথে যোগ দেয় বাম এবং ডানগুলির আচরণের সাথে মিলিত হয় এবং বাম এবং ডান টেবিল উভয় থেকে মিল না পাওয়া সারিগুলি সংরক্ষণ করে।

FOJ

এ.ক্লোর, বি। কালার থেকে সম্পূর্ণ আউট বি যোগ করুন 1 = 0 এ নির্বাচন করুন

ক্রসটিতে কোনও সারি 1=0প্রিডিটিকের সাথে মিলবে না । উভয় পক্ষের সমস্ত সারি অন্য পাশের টেবিলের কলামগুলিতে NUL সহ সাধারণ বহিরাগত যোগদানের নিয়মগুলি ব্যবহার করে সংরক্ষণ করা হয়।

এফওজে 2

কলের নির্বাচন করুন (এ। কালার, বি। কালার) হিসাবে একটি সম্পূর্ণ আউটয়ার বি থেকে 1 = 0 তে রঙিন করুন

পূর্ববর্তী কোয়েরিতে একটি ছোটখাটো সংশোধন UNION ALLকরলে দুটি টেবিলের মধ্যে একটি অনুকরণ করতে পারে ।

ইউনিয়ন সব

এ। কালার, বি। কালার থেকে একটি বাম আউটর বি এ.ক্লোর বি.ক্লোর বি.কুলার যেখানে বি.কুলার = 'সবুজ' নির্বাচন করুন

নোট করুন যে WHEREক্লজটি (উপস্থিত থাকলে) যুক্ত হওয়ার পরে যৌক্তিকভাবে চালিত হয়। একটি সাধারণ ত্রুটি হ'ল একটি বাম বাহ্যিক জোড় সম্পাদন করা এবং তারপরে ডান টেবিলের শর্ত সহ একটি WHERE ধারাটি অন্তর্ভুক্ত করা হয় যা মিল না থাকা সারিগুলি বাদ দিয়ে শেষ হয়। উপরের অংশটি বাহ্যিক সংযুক্তি সম্পাদন করে ...

LOJ

... এবং তারপরে "যেখানে" ক্লজটি চলে। NULL= 'Green'সত্য হিসাবে মূল্যায়ন করে না তাই বাহ্যিক জোড় দ্বারা সংরক্ষিত সারিটি বাতিল হয়ে যায় (নীল সাথে সাথে) কার্যকরভাবে জোড়টিকে একটি অভ্যন্তরীণ স্থানে রূপান্তর করে।

LOJtoInner

যদি উদ্দেশ্যটি হ'ল বি থেকে কেবল সারি অন্তর্ভুক্ত করা হয় যেখানে রঙ সবুজ এবং এ থেকে সমস্ত সারি সঠিক বিন্যাসটি নির্বিশেষে হবে

এ। কালার, বি। কালার থেকে একটি বাম আউটয়ার বি এ.ক্লোর বি.ক্লোর এবং বি.ক্লোর = 'সবুজ' নির্বাচন করুন

এখানে চিত্র বর্ণনা লিখুন

এসকিউএল ফিডল

এই উদাহরণগুলি এসকিউএলফিডাল ডট কম এ সরাসরি দেখুন


46
আমি বলব যে এটি ভেন ডায়াগ্রামগুলির মতো প্রায় আমার জন্য কাজ করে না, আমি কৃতজ্ঞ যে লোকেরা বিভিন্ন রকম হয় এবং আলাদাভাবে শেখে এবং এটি আমার আগে দেখা কোনও মত নয় এটি খুব ভালভাবে উপস্থাপিত একটি ব্যাখ্যা, তাই আমি @ সাইপারকিউবে সমর্থন করি বোনাস পয়েন্ট প্রদান। আরও ভাল শর্তাদি বনাম জওআইএন ধারাটিতে অতিরিক্ত শর্তাদি রাখার পার্থক্য ব্যাখ্যা করার জন্য ভাল কাজ। আপনার কাছে কুডোস, মার্টিন স্মিথ।
ওল্ড প্রো

22
@ ওল্ডপ্রো ভেন ডায়াগ্রামগুলি যতদূর যায় ঠিক তেমন আমি মনে করি তবে তারা ক্রস জয়েনকে কীভাবে উপস্থাপন করতে হবে বা একরকমের মধ্য থেকে ইকুই জোড়ের মতো এক প্রকারের যোগসূত্রকে আলাদা করার বিষয়ে নীরব রয়েছে। ক্রসের যোগদানের ক্রসের প্রতিটি সারিটিতে যোগদানের মূল্যায়ন করার মানসিক মডেল তারপরে কোনও বাহ্যিক যোগদানের সাথে মিল না থাকলে মিল না পাওয়া সারিগুলিতে ফিরে যুক্ত হওয়া এবং অবশেষে আমার জন্য যেখানে আরও ভাল কাজ করে তা মূল্যায়ন করে।
মার্টিন স্মিথ

18
ভেন চিত্রগুলি ইউনিয়নগুলি এবং ছেদগুলি এবং পার্থক্যগুলি উপস্থাপনের জন্য ভাল তবে যোগদান করে না। তাদের খুব সাধারণ যোগদানের জন্য কিছুটা ছোটখাটো শিক্ষাগত মান রয়েছে, অর্থাৎ যোগদানের শর্তটি অনন্য কলামগুলিতে যেখানে যোগ দেয়।
ypercubeᵀᴹ

12
@ আর্থ - না আপনি ভুল করছেন। এসকিউএল ফিডল স্ক্যালফিল্ড.com/#!3/9eecb7db59d16c80417c72d1/5155 এটি ভেন চিত্রগুলি চিত্রিত করতে পারে না।
মার্টিন স্মিথ

7
@ মার্টিনস্মিথ বাহ, আমি একমত, আমি সম্পূর্ণ ভুল! ওয়ান-টু-ম্যানিসের সাথে কাজ করার খুব অভ্যাস .. সংশোধনের জন্য ধন্যবাদ।
আর্থ

187

যোগদান দুটি টেবিল থেকে ডেটা একত্রিত করতে ব্যবহৃত হয়, ফলাফলটি একটি নতুন, অস্থায়ী সারণী হয়ে থাকে। প্রিনিকেট নামক কোনও কিছুর উপর ভিত্তি করে যোগদান করা হয়, যা যোগদানের জন্য শর্তটি নির্দিষ্ট করে। একটি অভ্যন্তরীণ যোগদান এবং একটি বাহ্যিক যোগদানের মধ্যে পার্থক্য হ'ল অভ্যন্তরীণ যোগদানটি কেবলমাত্র সারিগুলিতে ফিরে আসবে যা আসলে যোগদানের প্রাকটিকের উপর ভিত্তি করে মেলে। উদাহরণস্বরূপ- আসুন কর্মচারী এবং অবস্থানের টেবিলটি বিবেচনা করুন:

এখানে চিত্র বর্ণনা লিখুন

অভ্যন্তরীণ যোগদান: - অন্তর্ভুক্ত যোগদানের পূর্বেকারেরউপর ভিত্তি করেদুটি সারণীর ( কর্মচারী এবং অবস্থান )এর কলাম মানগুলির সমন্বয় করে একটি নতুন ফলাফল সারণীতৈরি করে। যোগদানের প্রস্তাবকে সন্তুষ্ট করে এমন সমস্ত জোড় সারি সন্ধানের জন্য ক্যোয়ারী কর্মচারীর প্রতিটি সারি অবস্থানের প্রতিটি সারিটির সাথেতুলনা করে। যখন যোগদান-প্রিডিটকটি নন-নুল মানগুলির সাথে মিলে সন্তুষ্ট হয়, তখন কর্মচারী এবং অবস্থানের প্রতিটি সারি যুক্ত জোড়ার জোড়গুলির জন্য কলামের মানগুলিফলাফল সারিতে একত্রিত হয়। অভ্যন্তরীণ যোগদানের জন্য এসকিউএল দেখতে কেমন হবে তা এখানে:

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

উপরের সারণীগুলি ব্যবহার করে, আমরা ডান বাহিরের যোগদানের ফলাফল সেটটি দেখতে কেমন তা প্রদর্শন করতে পারি:

এখানে চিত্র বর্ণনা লিখুন

সম্পূর্ণ আউটার যোগ দেয় : - সম্পূর্ণ আউটার জয়েন বা ফুল জয়েন হ'ল একটি জোড়ার ফলাফলগুলিতে ননম্যাচিং সারিগুলি অন্তর্ভুক্ত করে একটি সম্পূর্ণ বাহ্যিক যোগদান ব্যবহার করে নন ম্যাচিং তথ্য বজায় রাখা। এটিতে উভয় সারণীর সমস্ত সারি অন্তর্ভুক্ত রয়েছে, অন্য সারণির মিল রয়েছে কি না তা নির্বিশেষে।

চিত্র উত্স

মাইএসকিউএল 8.0 রেফারেন্স ম্যানুয়াল - সিন্টেক্সে যোগ দিন

ওরাকল অপারেশন যোগ দিন


3
এখন পর্যন্ত সেরা উত্তর, বিকল্প বাক্য গঠন - আমি এটি খুঁজছিলাম, ধন্যবাদ!
জো

1
ভেন চিত্রগুলি ভুলবিভক্ত। প্রশ্ন এবং অন্যান্য উত্তর সম্পর্কে আমার মন্তব্য দেখুন। এছাড়াও এই ভাষার বেশিরভাগ অংশই দরিদ্র। উদাহরণস্বরূপ: "যখন যোগদান-প্রিডিটিক অ-ন্যূনুয়াল মানগুলির সাথে মিলে সন্তুষ্ট হয়, তখন কর্মচারী এবং অবস্থানের প্রতিটি সারি যুক্ত জোড়ের জন্য কলামের মানগুলি ফলাফল সারিতে একত্রিত হয়" " না, "যখন যোগদান-প্রিডিটকে নন-ন্যুয়াল মানগুলি মিলে সন্তুষ্ট করা হয় না"। সারির মানগুলি সামগ্রিকভাবে শর্তটি সত্য বা মিথ্যা কিনা তা ব্যতীত অন্য কোনও বিষয় নয়। কিছু মান সত্যিকারের শর্তের জন্য শুভ হতে পারে।
ফিলিপ্সি

যদিও স্পষ্ট করে বলা হয়নি, এর মধ্যে চিত্রগুলি ভেন ডায়াগ্রাম। ভেন ডায়াগ্রামগুলি সাধারণভাবে কোনও জোড়ার সঠিক গাণিতিক বৈশিষ্ট্য নয়। আমি ভেন চিত্রটি অপসারণের পরামর্শ দিচ্ছি।
কলম ভান্ডাল

@ কলমভাণ্ডাল: ভেন চিত্রগুলি সরানো হয়েছে
অজিৎশর্মা

টেবিল এবং ইআরডি সহ - পাঠ্যের জন্য দয়া করে চিত্রগুলি / লিঙ্কগুলি নয়, পাঠ্য ব্যবহার করুন । পাঠ্য হিসাবে বা পাঠ্যকে বাড়িয়ে তোলার জন্য শুধুমাত্র চিত্রগুলি ব্যবহার করুন। চিত্রগুলি অনুসন্ধান বা কাটা এবং আটকানো যায় না। একটি চিত্র সহ কিংবদন্তি / কী এবং ব্যাখ্যা অন্তর্ভুক্ত করুন।
ফিলিপ্সি

132

ভেতরের যোগ দিতে

মেলে থাকা সারিগুলি কেবল পুনরুদ্ধার করুন, এটি 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

তথ্যসূত্র


14
সরঞ্জামটির নাম কী? আমার কাছে এটি আকর্ষণীয় মনে হয়েছে কারণ এটি সারি এবং ভেন ডায়াগ্রামের সংখ্যা দেখায়
গ্রিজেশ চৌহান

2
@ গ্রিজেশচৌহান হ্যাঁ তবে আপনি এটি ওয়াইন ব্যবহার করে চালানোর চেষ্টা করতে পারেন ।
তুষার গুপ্ত - কুরিউস্তুশর

2
ওহ! হ্যাঁ আমি .. আমি মদ ব্যবহার করে এসকিউএলজি ব্যবহার করেছি .. সেখানে প্লেঅনলিনাক্সও রয়েছে
গ্রিজেশ চৌহান ২14

1
আপনার পাঠ্যটি অস্পষ্ট এবং ভুল। "কেবল মিলিত সারিগুলি" এ ও বি এর ক্রস জোনের সারি এবং যা পুনরুদ্ধার করা হয় (একটি অভ্যন্তরীণ জোড় বি) একটি ছেদ করা বি নয় তবে (একটি বাম জোড় বি) ছেদ করা হয় (একটি ডান যোগ বি)। "নির্বাচিত" সারিগুলি এন্ড বি থেকে নয়, এগুলি ক্রোস বি-তে যোগদান করে এবং এ এবং বি থেকে সারিগুলির নাল-বর্ধিত মান থেকে
ফিলিপ্সি

@ তুষারগুপ্ত-কুরিউস্তুশার আপনার "এসকিউএল উদাহরণগুলির জন্য ব্যবহৃত টেবিলগুলি" অন্তর্ভুক্ত করা উচিত
ম্যানুয়েল জর্ডান

111

সহজ কথায়:

একটি ভেতরের যোগদানের মিলেছে সারি শুধুমাত্র পুনরুদ্ধার।

যখন কোনও বাহ্যিক যোগসূত্র এক সারণী থেকে সারণী সারণী এবং অন্য সারণীতে সমস্ত সারি পুনরুদ্ধার করে .... ফলাফলটি আপনি কোনটি ব্যবহার করছেন তার উপর নির্ভর করে:

  • বাম : ডান টেবিলের সারি এবং বাম টেবিলের সমস্ত সারি মিলছে

  • ডান : বাম টেবিলের সারি এবং ডান টেবিলের সমস্ত সারি মিলছে বা

  • পূর্ণ : সমস্ত সারণীতে সমস্ত সারি। ম্যাচ আছে কিনা তা কিছু যায় আসে না


1
@nomen এমন নয় যে এই উত্তর ঠিকানাগুলি এটা কিন্তু ভেতরের যোগ দিতে একটি সংযোগস্থলে হয় এবং সম্পূর্ণ বহিঃস্থ সংযোগ সংশ্লিষ্ট ইউনিয়নের যদি বাম & ডান সেট / চেনাশোনা (যথাক্রমে) বাম ও ডান দিকে যোগ দিতে সারি ধারণ করে। পিএস এই উত্তরটি ইনপুট বনাম আউটপুটটিতে সারি সম্পর্কে অস্পষ্ট। এটি "বাম / ডান টেবিলের" ​​সাথে "বিভ্রান্ত করে" এর সাথে "বাম / ডানদিকে একটি বাম / ডান অংশ রয়েছে" এবং এটি নকল দ্বারা অন্য টেবিল থেকে সারি দ্বারা সারি প্রসারিত সারি বোঝাতে "মিলিত সারি" বনাম "সমস্ত" ব্যবহার করে।
ফিলিপ্সি

103

অভ্যন্তরীণ যোগদানটি কেবলমাত্র সারিগুলি দেখায় যদি যোগটির অন্য (ডানদিকে) সাথে কোনও মিলের রেকর্ড থাকে।

একটি (বাম) বাহ্যিক জোড় জোড়ের অন্য (ডান) পাশে কোনও সাদৃশ্য সারি না থাকলেও বাম হাতের প্রতিটি রেকর্ডের জন্য সারি দেখায়। যদি কোনও মিলের সারি না থাকে, অন্য (ডানদিকে) কলামগুলি NULL দেখায়।


81

অভ্যন্তরীণ যোগদানের সাথে আবশ্যক যে কোনও যুক্ত আইডি সহ একটি রেকর্ড বিদ্যমান টেবিলে উপস্থিত থাকে।

বাইরের যোগদানকারীরা ডান পাশের জন্য কিছু না থাকলেও বাম দিকের জন্য রেকর্ডগুলি ফিরিয়ে দেবে।

উদাহরণস্বরূপ, আপনার একটি অর্ডার এবং একটি অর্ডার বিবরণ টেবিল রয়েছে। তারা একটি "অর্ডারআইডি" দ্বারা সম্পর্কিত।

অর্ডার

  • OrderID
  • ক্রেতার নাম

আদেশ বিবরণী

  • OrderDetailID
  • OrderID
  • পণ্যের নাম
  • Qty এ
  • মূল্য

অনুরোধ

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


1
আমি সহজ অথচ বাস্তববাদী উদাহরণটির প্রশংসা করি। আমি একটি অনুরোধ পরিবর্তিত 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সাফল্যের সঙ্গে (মাইএসকিউএল)। আমি অতিরিক্ত শর্তাদি সম্পর্কে নিশ্চিত ছিলাম না, তারা ভালভাবে মিশ্রিত হয়েছে ...
ফিলিহো

68

সহজ কথায়:

অভ্যন্তরীণ যোগ দিন -> পিতামাতা এবং সন্তানের টেবিল থেকে কেবলমাত্র সাধারণ রেকর্ড নিন যেখানে পিতামাতার সারণীর প্রাথমিক কী শিশু টেবিলে বিদেশী কীটির সাথে মেলে।

বাম যোগদান ->

সুডোকোড

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;

ডায়াগ্রাম্যালি এটি দেখতে দেখতে:

নকশা


4
ফলাফলটির প্রাথমিক / অনন্য / প্রার্থী কী এবং বিদেশী কীগুলির সাথে (প্রতি সেটে কর) কিছুই নেই। বেভিওর তাদের উল্লেখ ছাড়াই বর্ণনা করতে হবে এবং করা উচিত। একটি ক্রস জয়েন গণনা করা হয়, তারপরে ওএন শর্তের সাথে মেলে না এমন সারিগুলি ফিল্টার আউট হয়; বাইরের ফিল্টার সারি যোগদান করে অতিরিক্ত জন্য / অপ্রতিম সারি NULLs মানের (প্রতি বাম / ডান / সম্পূর্ণ প্রসারিত হয় এবং অন্তর্ভুক্ত করা হয়েছে।
philipxy

এই ধারণাটি যে এসকিউএল সবসময় প্রাথমিক / বিদেশী কীগুলির সাথে মিল থাকে তা ভেন চিত্রের এই অপব্যবহারের দিকে পরিচালিত করে। দয়া করে আপনার উত্তরটি সংশোধন করুন।
কলম্ব ভান্ডাল

58

INNER JOINযেখানে দুটি ম্যাচ আছে সেখানে দুটি সারণী থেকে আপনি সমস্ত সারি ফেরত দিতে ব্যবহার করুন । যেমন ফলাফল সারণীতে সমস্ত সারি এবং কলামের মান থাকবে।

ইন OUTER JOINফলে টেবিল খালি কলাম থাকতে পারে। বাইরের জোড় হয় LEFTবা হতে পারে RIGHT

LEFT OUTER JOIN দ্বিতীয় সারণীতে কোনও মিল না থাকলেও প্রথম সারণী থেকে সমস্ত সারি ফেরত দেয়।

RIGHT OUTER JOIN প্রথম টেবিলের সাথে ম্যাচ না থাকলেও দ্বিতীয় সারণী থেকে সমস্ত সারি ফিরিয়ে দেয়।


56

এটি যোগদানের জন্য একটি ভাল ব্যাখ্যা

এটি সমস্ত ধরণের যোগদানের জন্য একটি ভাল চিত্রের ব্যাখ্যা

উত্স: http://ssiddique.info/ বোঝার জন্য-sql-joins-in-easy-way.html


1
এই চিত্রটি কীভাবে এই চিত্রটির ব্যাখ্যা করতে হবে তা স্পষ্টভাবে ব্যাখ্যা করে না। এছাড়াও প্রশ্নের প্রথম মন্তব্য এবং এই পৃষ্ঠায় আমার অন্যান্য মন্তব্য দেখুন see
ফিলিপ্সি

54

INNER JOINদুটি টেবিলের তুলনায় কমপক্ষে একটি ম্যাচ প্রয়োজন। উদাহরণস্বরূপ, টেবিল A ​​এবং টেবিল বি যা A ٨ B (একটি ছেদ বি) বোঝায়।

LEFT OUTER JOINএবং LEFT JOINএকই। এটি উভয় সারণীতে এবং বাম টেবিলের সমস্ত সম্ভাবনার সাথে মিলে সমস্ত রেকর্ড দেয়।

একইভাবে, RIGHT OUTER JOINএবং RIGHT JOINএকই। এটি উভয় টেবিলের সাথে মিলিয়ে সমস্ত রেকর্ড দেয় এবং ডান টেবিলের সমস্ত সম্ভাবনা।

FULL JOINসদৃশ LEFT OUTER JOINএবং RIGHT OUTER JOINবিনা সংমিশ্রণ ।


43

উত্তর প্রতিটি একের অর্থ, তাই ফলাফল।

দ্রষ্টব্য:
মধ্যে 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মাইএসকিউএল-তে কোনও নেই।
পটাশিন

35

ভেতরের যোগ দিতে.

একটি জোড় দুটি সারণী থেকে সারি একত্রিত করা হয়। একটি অভ্যন্তরীণ যোগদান আপনি ক্যোয়ারীতে নির্দিষ্ট করেছেন সেই মানদণ্ডের উপর ভিত্তি করে দুটি টেবিলের সাথে মেলে যাবার চেষ্টা করে এবং কেবল যে সারিগুলি মেলে সেগুলিই ফিরিয়ে দেয়। যোগদানের প্রথম টেবিলের কোনও সারি যদি দ্বিতীয় সারণীতে দুটি সারি মেলে, তবে ফলাফলগুলিতে দুটি সারি ফিরে আসবে। প্রথম টেবিলের মধ্যে যদি একটি সারি থাকে যা দ্বিতীয়টিতে একটি সারির সাথে মেলে না, তবে এটি ফিরে আসেনি; একইভাবে, দ্বিতীয় টেবিলে যদি একটি সারি থাকে যা প্রথম সারির সাথে একটি সারি মেলে না, তবে এটি ফিরে আসেনি।

বাইরের যোগদান।

একজন যোগদানের বাম দ্বিতীয় সারণিতে সারি প্রথম টেবিল থেকে সারি মেলে খোঁজার চেষ্টা করে। যদি এটি কোনও মিল খুঁজে না পায় তবে এটি প্রথম টেবিল থেকে কলামগুলি ফিরিয়ে দেবে এবং দ্বিতীয় টেবিল থেকে কলামগুলি ফাঁকা (নাল) ছেড়ে দেবে।


28

এখানে চিত্র বর্ণনা লিখুন

  • 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 

27

অন্যান্য উত্তরে আমি পারফরম্যান্স এবং অপ্টিমাইজার সম্পর্কে খুব বেশি বিশদ দেখতে পাচ্ছি না।

কখনও কখনও এটি জেনে রাখা ভাল যে কেবলমাত্র INNER JOINসাহচর্যমূলক যার অর্থ অপ্টিমাইজারের সাথে এটি খেলতে সর্বাধিক বিকল্প রয়েছে। এটি একই ফলাফল রেখে দ্রুত তা করার জন্য যোগদানের ক্রমটিকে পুনরায় অর্ডার করতে পারে। অপ্টিমাইজার সর্বাধিক যোগদানের মোডগুলি ব্যবহার করতে পারে।

সাধারণত INNER JOINবিভিন্ন ধরণের যোগদানের পরিবর্তে ব্যবহার করার চেষ্টা করা ভাল অভ্যাস । (অবশ্যই যদি এটি প্রত্যাশিত ফলাফল সেট বিবেচনা করা সম্ভব হয়।)

এই অদ্ভুত সহযোগী আচরণ সম্পর্কে এখানে বেশ কয়েকটি ভাল উদাহরণ এবং ব্যাখ্যা রয়েছে:


4
এক ধরণের জোড়কে অন্যের উপরে ব্যবহার করা সম্ভবত "ভাল অনুশীলন" হতে পারে না। আপনার ব্যবহৃত কোনটি আপনার পছন্দসই ডেটা নির্ধারণ করে। আপনি যদি অন্যটি ব্যবহার করেন তবে আপনি ভুল। এছাড়াও, ওরাকলে অন্তত এই উত্তরটি সম্পূর্ণ ভুল। এটি প্রতিটি কিছুর জন্য সম্পূর্ণ ভুল বলে মনে হচ্ছে এবং আপনার কাছে কোনও প্রমাণ নেই। আপনার কি প্রমাণ আছে?
বেন

1. আমি বোঝার চেষ্টা করছি। আমি দেখেছি প্রচুর লোক বাম বাইরে ব্যবহার করে কোনও ভাল কারণ ছাড়াই সর্বত্র যোগদান করে। (যোগদানকৃত কলামগুলি 'নাল নয়' those) এই ক্ষেত্রে INNER- এ যোগদান করা অবশ্যই ভাল। ২. আমি আরও একটি লিঙ্ক যুক্ত করেছি যা অসমর্থনমূলক আচরণের বর্ণনা দিয়ে আমার চেয়ে আরও ভাল।
লাজোস Veres

আমি জানি INNER JOINতুলনায় ধীর হয় LEFT JOINসময়ের সবচেয়ে, এবং মানুষ ব্যবহার করতে পারেন LEFT JOINপরিবর্তে INNER JOINএকটি যোগ করে WHEREঅপ্রত্যাশিত সরানোর জন্য NULLফলাফল;)।
shA.t

এই মন্তব্যগুলি আমাকে কিছুটা অনিশ্চিত করে তুলেছিল। আপনি কেন INNERধীর বলে মনে করেন ?
লাজোস Veres

ইঞ্জিনের উপর নির্ভর করে। gnu join, joinkeys, DB2, MySQL। পারফরম্যান্স ট্র্যাপগুলি প্রচুর পরিমাণে, যেমন আলগা টাইপিং বা একটি সুস্পষ্ট কাস্ট।
mckenzm

26

লাল-ছায়াযুক্ত ভেন চিত্রের সমালোচনা করে, আমি নিজের চেষ্টাটি পোস্ট করা ঠিক মনে করি।

যদিও @ মার্টিন স্মিথের উত্তরটি এই গোছাটির মধ্যে সবচেয়ে ভাল, তবে প্রতিটি টেবিল থেকে তার একমাত্র মূল কলামটি দেখানো হয়েছে, যেখানে আমি মনে করি আদর্শভাবে নন-কী কলামগুলিও দেখানো উচিত।

অনুমোদিত অর্ধ ঘন্টা আমি যেটা করতে পারলাম সেরা, আমি এখনও মনে করি না যে এটি যথাযথভাবে দেখায় যে নালগুলি মূল মানগুলির অনুপস্থিতির কারণে রয়েছে TableBবা এটি OUTER JOINআসলে যোগদানের পরিবর্তে একটি ইউনিয়ন:

এখানে চিত্র বর্ণনা লিখুন


2
প্রশ্নটি INNER এবং OUTER এর মধ্যে পার্থক্যের জন্য জিজ্ঞাসা করছে যদিও
বাহ্যিকভাবে বাহ্যিকভাবে

@LearnByReading: ডানদিকে আমার ছবিটি একটি ডান বাহিরের TableA a LEFT OUTER JOIN TableB bTableB B RIGHT OUTER JOIN TableA a
যোগসূত্রের

26

জন্য সুনির্দিষ্ট অ্যালগরিদম INNER JOIN, LEFT/RIGHT OUTER JOINনিম্নলিখিত হল:

  1. প্রথম সারণী থেকে প্রতিটি সারিটি নিন: a
  2. এর পাশে দ্বিতীয় সারণী থেকে সমস্ত সারি বিবেচনা করুন: (a, b[i])
  3. ON ...প্রতিটি জুটির বিরুদ্ধে ধারাটি মূল্যায়ন করুন :ON( a, b[i] ) = true/false?
    • যখন শর্তটি মূল্যায়ন করে true, সেই সম্মিলিত সারিতে ফিরে আসুন (a, b[i])
    • যখন কোনও মিল ছাড়াই দ্বিতীয় টেবিলের শেষের দিকে পৌঁছে যায় এবং এটি অন্য টেবিলের সমস্ত কলামের জন্য ব্যবহার করে Outer Joinএকটি (ভার্চুয়াল) জুটি ফিরে Nullআসে: (a, Null)বাম বাহ্যিক জোড়ার জন্য বা ডানদিকে বাহ্যিক জোড়ার (Null, b)জন্য। এটি চূড়ান্ত ফলাফলগুলিতে প্রথম সারণীর সমস্ত সারি বিদ্যমান তা নিশ্চিত করা।

দ্রষ্টব্য: ধারাটিতে বর্ণিত শর্তটি ONযে কোনও কিছু হতে পারে, প্রাথমিক কীগুলি ব্যবহার করার প্রয়োজন নেই (এবং আপনাকে সর্বদা উভয় টেবিলের কলামগুলি উল্লেখ করতে হবে না)! উদাহরণ স্বরূপ:

অভ্যন্তরীণ যোগদান বনাম বাম বহিরাগত যোগদান


এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: বাম যোগদান = বাম বাহ্যিক যোগদান, ডান যোগ = ডান বহিরাগত যোগদান


20

সহজ সংজ্ঞা

অভ্যন্তরীণ যোগদান: উভয় সারণী থেকে রেকর্ড ম্যাচ।

ফুল বাইরের যোগদান করুন: রিটার্নস সঙ্গে মানানসই এবং অপ্রতিম রেকর্ড থেকে অপ্রতিম রেকর্ডের জন্য নাল সঙ্গে উভয় টেবিল থেকে উভয় টেবিল

বাম বাইরের যোগদান করুন: রিটার্নস সঙ্গে মানানসই এবং অপ্রতিম রেকর্ড শুধুমাত্র টেবিল থেকে বাম দিকে

ডান আউটার জয়েন: কেবল ডানদিকে টেবিল থেকে ম্যাচ এবং মিল নেই রেকর্ডস ।

সংক্ষেপে

মিলছে + বাম মিলহীন + ডান মিলহীন = সম্পূর্ণ বহিরাগত যোগদান

মেলে + বাম মিলহীন = বাম বাহ্যিক যোগদান

মিলছে + ডান মিল নেই = ডান বহিরাগত যোগদান

মিলছে = অভ্যন্তরীণ যোগ দিন


1
এটি উজ্জ্বল এবং ব্যাখ্যা দেয় যে কেন টাইম সিরিজ সূচকের জন্য প্রত্যাশার সাথে যোগ দেওয়া কাজ করে না। এক সেকেন্ডের ব্যবধানে টাইম স্ট্যাম্পগুলি অতুলনীয়।
yeliabsalohcin

1
@ ইয়েলিয়াবসালোহসিন আপনি এখানে "প্রত্যাশিত হিসাবে" বা প্রশ্নের উপর আপনার মন্তব্যে "কাজ" ব্যাখ্যা করেন না। এটি কেবল কিছু অব্যক্ত ব্যক্তিগত ভুল ধারণা যা আপনি আশ্চর্যরূপে অন্যের কাছে প্রত্যাশা করেন। আপনি যখন পড়ছেন তখন আপনি শব্দগুলিকে opালু হিসাবে বিবেচনা করেন - পরিষ্কার লেখার ভুল ব্যাখ্যা করা এবং / অথবা অস্পষ্ট লেখা গ্রহণ করা - আপনি যখন এখানে লিখছেন তখন আপনি ভুল ধারণা থাকার আশা করতে পারেন। প্রকৃতপক্ষে এখানে উত্তরটির মতো উত্তর অস্পষ্ট এবং ভুল। "অভ্যন্তরীণ যোগ দিন: উভয় টেবিলের সাথে মিলিত রেকর্ডগুলি ফেরত দেয়" ভুল হয় যখন ইনপুট কলাম সেট আলাদা হয়। এটি একটি নির্দিষ্ট কিছু বলার চেষ্টা করা হচ্ছে , তবে তা নয় । (আমার উত্তর দেখুন।)
ফিলিপ্সি

9

সহজ অর্থে,

1. অন্তর্ভুক্ত যোগ বা EQUI যোগদান: ফলাফল উভয় টেবিলের মধ্যে শুধুমাত্র শর্তের সাথে মেলে ফলাফল।

২. আউটার জয়েন : শর্ত মেলে কি না থাকলেও উভয় টেবিল থেকে সমস্ত মানের ফলাফল নির্ধারণ করে Return

3. বাম যোগদান: বাম টেবিল থেকে সমস্ত মানগুলির ফলাফলসেট এবং ডান টেবিলের শর্তের সাথে মেলে কেবল সারিগুলি সরিয়ে দেয়।

৪. সঠিক যোগদান: ডান টেবিল থেকে সমস্ত মানগুলির ফলাফলসেট এবং কেবল বাম টেবিলের শর্তের সাথে মেলে এমন সারিগুলি প্রদান করে।

৫. সম্পূর্ণ যোগদান: সম্পূর্ণ যোগদান এবং সম্পূর্ণ বাহ্যিক যোগদান একই।


5

এসকিউএলে প্রধানত 2 ধরণের জোয়েন্ট রয়েছে: [ইনার এবং আউটর]


উদাহরণ

ধরুন আপনার কাছে একটি করে কলাম সহ দুটি করে টেবিল রয়েছে এবং নীচের হিসাবে ডেটা রয়েছে:

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

1
ভেন ডায়াগ্রামগুলি সাধারণ ক্ষেত্রে এসকিউএল যোগদানের বর্ণনা দেওয়ার পক্ষে যথেষ্ট নয়। এসকিউএল যোগদান করে অগত্যা এক-এক-এক সারণীর মধ্যে সারিগুলি মিলতে হবে না, যেমন বিদেশী কী বনাম প্রাথমিক কী ব্যবহার করে।
কলম্ব ভান্ডাল

সারি না মিলিয়ে আপনি কীভাবে 2 টেবিলগুলিতে যোগদান করবেন? আপনার অবশ্যই একটি কলাম প্রাথমিক বা বিদেশী কী বা কিছু সাধারণ ক্ষেত্রের প্রয়োজন যাতে আপনি যোগদানটি সম্পাদন করতে পারেন। আমি ভাবছি আপনি কেন এই উত্তরটিকে নিম্নমান করে রেখেছেন? এবং ভেন চিত্রটি এসকিউএল জয়েন্ট কীভাবে কাজ করে তা ব্যাখ্যা করার উত্স। যোগদানের প্রতিনিধিত্ব করার জন্য আপনার আরও ভাল উদাহরণ কি আছে? যদি তা না হয় তবে দয়া করে এটিকে উত্সাহিত করুন, যাতে লোকেরা আরও ভাল সমাধান পেতে পারে। ধন্যবাদ.
ময়ূর

আপনি পোস্টে ডায়াগ্রামগুলি রাখছেন। চিত্রের জন্য কিংবদন্তি কী? - প্রতিটি সেটের উপাদানগুলি কী কী? এবং টেবিলগুলি ব্যাগ সেট নয় এমনটি কী? আপনি বলেন না। একটি জিনিস যা সেগুলির সেট নয় তা হ'ল লেবেলগুলিতে সারি ও এন্ড বি সারি। এই পৃষ্ঠায় পোস্টে আমার মন্তব্য দেখুন। এই পোস্টটি অন্ধভাবে অন্য কোথাও দেখা ভুল ব্যবহারের পুনরাবৃত্তি করেছে তবে বোঝা বা জিজ্ঞাসা করা হয়নি। এছাড়াও আপনি এখানে পাঠ্যে যে জিনিসগুলি বলছেন তা অস্পষ্ট এবং ভুল। এছাড়াও এটি ইতিমধ্যে এখানে অনেক উত্তর কিছুই যোগ করে। (যদিও প্রায় সকলেই যথেষ্ট দরিদ্র)) পিএস দয়া করে সম্পাদনার মাধ্যমে স্পষ্ট করুন, মন্তব্য নয়।
ফিলিপ্সি

এফকেগুলিতে যোগদান বা কোয়েরি করার দরকার নেই। যে কোনও 2 সারণী তাদের কলামগুলিতে জড়িত যে কোনও শর্তে এবং কোনও বাধা, ট্রিগার বা জোর বিবেচনা না করে যোগদান করতে পারে can
ফিলিপ্সি

3
  • অভ্যন্তরীণ যোগদান - সমতুল্য প্রশ্নের দুটি ব্যবহার করে একটি অভ্যন্তরীণ জোড় দুটি টেবিলের ছেদ দেয় , অর্থাত্ তাদের দুটি সারি মিল রয়েছে।

  • বাম বাহ্যিক জোড় - একটি বাম বাহ্যিক জোড় এ এর ​​সমস্ত সারি দেয়, এবং বি তে কোনও সাধারণ সারি দেবে

  • সম্পূর্ণ বাহ্যিক জোড় - সম্পূর্ণ বাইরের জোড় আপনাকে A এবং B মিলিয়ে দেবে, অর্থাৎ A এর সমস্ত সারি এবং B- এর সমস্ত সারি, যদি A এর কোনও কিছুর সাথে B তে একই ডেটাম না থাকে তবে B অংশটি নাল, এবং তদ্বিপরীত


1
এটি উভয়ই ভুল এবং অস্পষ্ট। টেবিলে একই কলাম না থাকলে যোগ দিন কোনও ছেদ নয় । বহিরাগতদের সাথে একই বা কলাম না থাকলে A বা B থেকে সারি থাকে না, সেক্ষেত্রে নাল যুক্ত না হয়। আপনি কিছু বলার চেষ্টা করছেন, কিন্তু আপনি এটি বলছেন না। আপনি সঠিক বা পরিষ্কারভাবে ব্যাখ্যা দিচ্ছেন না।
ফিলিপ্সি

@ ফিলিপ্সি: আপনার বিবৃতিতে অসম্মতি জানানো হয়েছে Join is not an intersection unless the tables have the same columnsআপনি যে কোনও কলামে আপনি চান তাতে যোগ দিতে পারেন এবং মানটি মিলে গেলে তারা একসাথে যোগ দেবে।
সুইসাইডশিপ

এই মন্তব্যটি আপনার উত্তর হিসাবে অস্পষ্ট। (আমি মনে করি আপনি হয়ত এরকম কিছু ভাবছেন, ফলাফলের সাধারণ কলামগুলির জন্য সাব্রো মানগুলির সেটটি প্রতিটি ইনপুটগুলির সাধারণ কলামগুলির জন্য সাব্রো মানগুলির সেটগুলির ছেদ হয়; তবে আপনি যা লিখেছেন তা নয় not আপনি পরিষ্কার নয়।)
ফিলিপ্সি

আমি যা বোঝাতে চেয়েছি তা হল যে যুক্ত হওয়া কেবলমাত্র ইনপুটগুলির একটি ছেদ যখন এটি একই কলামগুলির সাথে ইনপুটগুলির একটি প্রাকৃতিক অভ্যন্তরীণ যোগ হয় join আপনি "ছেদ" এবং "ইউনিয়ন" শব্দটি ভুলভাবে ব্যবহার করছেন।
ফিলিপ্সি

3

1. অভ্যন্তরীণ যোগদান: যোগ হিসাবেও ডাকা হয়। এটি উভয় বাম টেবিলের উপস্থিত সারিগুলি এবং ডান টেবিল কেবল যদি কোনও মিল থাকে তবে ফিরিয়ে দেয় । অন্যথায়, এটি শূন্য রেকর্ড দেয়।

উদাহরণ:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output1

২. সম্পূর্ণ আউটার জয়েন: একে সম্পূর্ণ যোগদান হিসাবেও ডাকা হয়। এটি বাম টেবিল এবং ডান টেবিল উভয় উপস্থিত সমস্ত সারি ফিরিয়ে দেয়

উদাহরণ:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output2

৩. বাম বহিরাগত যোগদান: বা কেবল বাম যোগদান হিসাবে পরিচিত। এটি বাম টেবিলের উপস্থিত সমস্ত সারি এবং ডান টেবিলের সাথে মিলিত সারিগুলি (যদি থাকে) প্রদান করে।

৪. রাইট আউটার জয়েন: একে ডান যোগ হিসাবেও ডাকা হয়। এটি বাম টেবিল (যদি থাকে তবে) এবং ডান টেবিলের সমস্ত সারি উপস্থিত থেকে মিলছে সারিগুলি প্রদান করে।

যোগদান করে

যোগদানের সুবিধা

  1. দ্রুত কার্যকর করে।

2
টেবিলগুলির একই কলাম সেট থাকলে এটি কেবল সঠিক। (এটি আন্তঃসংযোগের সাথে অভ্যন্তরীণ যোগদানকে এবং ইউনিয়নের সাথে সম্পূর্ণ যোগদানকে বিভ্রান্ত করে match) এছাড়াও "ম্যাচ" অপরিজ্ঞাত। আমার অন্যান্য মন্তব্য পড়ুন।
ফিলিপ্সি

2

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

এখানে ডেমোও পরীক্ষা করতে পারে ।


2

জেনারেল আইডিয়া

দয়া করে দেখুন উত্তর দ্বারা মার্টিন স্মিথ বিভিন্ন, যোগদান করে সহ এবং বিশেষ করে মধ্যে পার্থক্য একটি উন্নততর illustations এবং ব্যাখ্যার জন্য FULL OUTER JOIN, RIGHT OUTER JOINএবং LEFT OUTER JOIN

এই দুটি সারণী JOINনীচের গুলিগুলির প্রতিনিধিত্বের জন্য একটি ভিত্তি গঠন করে:

ভিত্তি

যোগ দিন

CrossJoin

SELECT *
  FROM citizen
 CROSS JOIN postalcode

ফলাফলটি সমস্ত সংমিশ্রনের কার্টেসিয়ান পণ্য হবে। কোনও JOINশর্তের প্রয়োজন নেই:

CrossJoinResult

ভেতরের যোগ দিতে

INNER JOIN সহজ হিসাবে একই: JOIN

ভেতরের যোগ দিতে

SELECT *
  FROM citizen    c
  JOIN postalcode p ON c.postal = p.postal

ফলাফলটি এমন সংমিশ্রণগুলি হবে যা প্রয়োজনীয় JOINশর্তটি পূরণ করে :

InnerJoinResult

বাম আউট জয়েন

LEFT OUTER JOIN হিসাবে একই LEFT JOIN

LeftJoin

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal

citizenকোনও ম্যাচ না থাকলেও ফলাফলটি সমস্ত কিছুই থেকে যাবে postalcode। আবার একটি JOINশর্ত প্রয়োজন:

LeftJoinResult

খেলার জন্য ডেটা

সমস্ত উদাহরণ একটি ওরাকল 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কোনওভাবেই কাজ করে না:

CrossJoinUnion1

এটি এর মতো উপস্থাপন করার চেষ্টা করছে:

CrossJoinUnion2Crossing

.. তবে এখন এটি দেখতে কেবল একটির মতো INTERSECTION, যা এটি অবশ্যই নেই । তদুপরি এর কোনও উপাদান নেই INTERSECTIONযা আসলে দুটি স্বতন্ত্র সেটের কোনওটিতেই রয়েছে। তবে এটি দেখতে অনেকটা এর মতো সন্ধানযোগ্য ফলাফলের মতো দেখাচ্ছে:

CrossJoinUnionUnion3

রেফারেন্সের জন্য টিগুলির জন্য একটি অনুসন্ধানযোগ্য ফলাফল টিউটোরিয়ালগেটওয়েতে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

SelfJoinResult

মানে স্মিথ সবুজ এবং জেনসেন উভয়েরই নেতা।

আউট জয়েন

আবার সমস্যাগুলি শুরু হয় যখন এক সারিটিতে অন্য সারণীতে একাধিক সারি সারি থাকে। এটি আরও জটিল কারণ 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


1

খুব নির্ভুল সম্পর্কের বীজগণিত উদাহরণ সহ এখানে অনেক ভাল উত্তর রয়েছে is এখানে একটি খুব সরলিকৃত উত্তর যা এসকিউএল কোডিং দ্বন্দ্ব সহ শৌখিন বা নবাগত কোডারদের জন্য সহায়ক হতে পারে।

মূলত, প্রায়শই নয়, প্রশ্নগুলি JOINদুটি ক্ষেত্রে ফোটে:

SELECTডেটা একটি উপসেট জন্য A:

  • ব্যবহার INNER JOINযখন সম্পর্কিত ডেটা Bআপনি খুঁজছেন আবশ্যক ডাটাবেস নকশা প্রতি বিদ্যমান;
  • ব্যবহার LEFT JOINযখন সম্পর্কিত ডেটা Bআপনি খুঁজছেন পারে বা নাও করতে পারে ডাটাবেস নকশা প্রতি বিদ্যমান।

1

মধ্যে পার্থক্য inner joinএবং outer joinঅনুসরণ নিম্নলিখিত :

  1. Inner joinমিলে যাওয়া টিপলগুলির উপর ভিত্তি করে সম্মিলিত টেবিলগুলি এমন একটি যুক্ত হওয়া, যেখানে outer joinমিলিত এবং মেলে না এমন উভয় টুপলের উপর ভিত্তি করে সম্মিলিত টেবিল join
  2. Inner joinদুটি টেবিলের সাথে মিলিত সারিটি মিলিত করে যেখানে মিল নেই সারি বাদ দেওয়া হয়েছে, যেখানে outer joinদুটি টেবিল থেকে সারিগুলি একত্রিত করা হয় এবং তুলনামূলক সারিগুলি নাল মান দিয়ে পূরণ করে।
  3. Inner joinএকটি ছেদ অপারেশন মত, অন্যদিকে outer joinইউনিয়ন অপারেশন মত।
  4. Inner joinদুটি প্রকারের, যেখানে outer joinতিন প্রকারের।
  5. outer joinতুলনায় দ্রুত inner join

1
একটি বাহ্যিক যোগদানের ফলাফলটি অভ্যন্তরীণ যোগদানের সমান তবে প্লাস কিছু অতিরিক্ত সারি তাই আপনি কেন ভাবেন যে বাইরের যোগদান দ্রুত হবে তা আমার কোনও ধারণা নেই। এছাড়াও অভ্যন্তরীণ যোগদানের এই "দুই ধরণের" কী কী? আমি মনে করি আপনি পুরো, বাম এবং ডান বাহিরের জন্য উল্লেখ করছেন?
মার্টিন স্মিথ

1
@ এমচাইবাউ দয়া করে এমন সম্পাদনাগুলি করবেন না যা অপ্রয়োজনীয় ফর্ম্যাট পরিবর্তন করে। অপারেটরদের নাম কোডে ব্যবহার না করা হয় না। অনুগ্রহ করে পোস্টের অর্থের পরিবর্তনের কোনও পরিবর্তন করবেন না, লেখকের কাছে একটি মন্তব্য পোস্ট করুন। যদি আপনার কাছে প্রতিনিধি না থাকে তবে আপনি না করা পর্যন্ত অপেক্ষা করুন। এমনটি ঘটে যে পোস্টার এটি অনুমোদিত করেছে তবে দয়া করে এ জাতীয় সম্পাদনা করবেন না। পিএস আউটার জয়েন অভ্যন্তরীণ যোগদানের চেয়ে দ্রুত নয়।
ফিলিপ্সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.