বাম, ডান, বহিরাগত এবং অভ্যন্তরীণ যোগদানের মধ্যে পার্থক্য কী?


562

আমি ভাবছি কীভাবে এই সমস্ত আলাদা যোগদান করে ...



3
আপনার বোধগম্যতার স্তরের
উপরও

6
এই অনুরূপ stackoverflow.com/questions/419375/sql-join-differences এবং কোন সন্দেহ নেই অন্যরা ...
cletus

1
এটি আমাকে অনেক সাহায্য করেছে ... সবচেয়ে সহজ উপায় হল টেস্ট টেবিলগুলি তৈরি করা এবং তাদের সাথে খেলাই। = পি
ডাগ্রেভিস

উত্তর:


797

সাধারণ উদাহরণ : আপনাকে একটি Studentsটেবিল এবং একটি Lockersটেবিল আছে বলে দেয় । এসকিউএল-এ, আপনি প্রথম যোগদানের ক্ষেত্রে যে সারণিটি নির্দিষ্ট করেছেন Studentsতা হ'ল বাম টেবিল এবং দ্বিতীয়টি Lockersহ'ল সঠিক সারণি।

প্রতিটি ছাত্রকে একটি লকারে নিয়োগ দেওয়া যেতে পারে, সুতরাং টেবিলে একটি LockerNumberকলাম Studentরয়েছে। একাধিক শিক্ষার্থী সম্ভাব্যভাবে একটি একক লকারে থাকতে পারে, তবে বিশেষত স্কুল বছরের শুরুতে আপনার কিছু আগত শিক্ষার্থী লকার ছাড়াই থাকতে পারে এবং কিছু লকারে কোনও শিক্ষার্থী বরাদ্দ নেই।

এই উদাহরণের স্বার্থে, যাক আপনার 100 জন শিক্ষার্থী রয়েছে যার মধ্যে 70 টিতে লকার রয়েছে। আপনার কাছে মোট 50 টি লকার রয়েছে যার মধ্যে 40 টিতে কমপক্ষে 1 জন ছাত্র এবং 10 টি লকারের কোনও ছাত্র নেই।

অন্তর্ভুক্ত যোগদান " লকার সহ সমস্ত শিক্ষার্থী আমাকে দেখান " এর সমতুল্য ।
লকার ছাড়া কোনও শিক্ষার্থী, বা ছাত্র ছাড়া কোনও লকার অনুপস্থিত।
70 টি সারি প্রদান করে

বাম আউটয়ার জয়েন হবেন " আমাকে সমস্ত শিক্ষার্থী দেখান, তাদের যদি তাদের সাথে সম্পর্কিত লকার থাকে তবে "।
এটি একটি সাধারণ শিক্ষার্থীর তালিকা হতে পারে, বা কোনও লকার ছাড়াই শিক্ষার্থীদের সনাক্ত করতে ব্যবহৃত হতে পারে।
100 টি সারি প্রদান করে

রাইট আউট জয়েন হবে " আমাকে সমস্ত লকার প্রদর্শন করুন, এবং ছাত্ররা যদি তাদের থাকে তবে তাদের নিযুক্ত করা হবে "।
এটি এমন কোনও লকারকে সনাক্ত করতে ব্যবহার করা যেতে পারে যার কোনও শিক্ষার্থী বরাদ্দ নেই, বা এমন অনেকগুলি শিক্ষার্থী রয়েছে এমন লকার।
৮০ টি সারি (40 টি লকারে 70 জন শিক্ষার্থীর তালিকা, সাথে সাথে 10 জন লকার কোনও ছাত্র নেই) প্রদান করে

সম্পূর্ণ আউট জয়েন মূর্খ হবে এবং সম্ভবত খুব বেশি ব্যবহার হয় না।
" আমাকে সমস্ত ছাত্র এবং সমস্ত লকার দেখান, এবং আপনি যেখানে পারেন সেখানে সেগুলি মেলে "
110 টি সারি ফেরত দেয় (সমস্ত 100 শিক্ষার্থী, লকার ছাড়া এটি সহ 10 জন শিক্ষার্থী ছাড়া 10 জন লকার)

ক্রস জয়েনও এই দৃশ্যে মোটামুটি মূর্খ।
এটি lockernumberছাত্রদের টেবিলে লিঙ্কযুক্ত ক্ষেত্রটি ব্যবহার করে না , সুতরাং আপনি মূলত প্রতিটি সম্ভাব্য শিক্ষার্থী থেকে লকার জুটির একটি বৃহত দৈত্য তালিকাটি শেষ করেন, এটি আসলে বিদ্যমান কিনা।
5000 সারি (100 শিক্ষার্থী x 50 লকার) প্রদান করে। নতুন শিক্ষার্থীদের খালি লকারগুলির সাথে মেলে তুলতে প্রাথমিক পয়েন্ট হিসাবে (ফিল্টারিং সহ) কার্যকর হতে পারে।


12
আপনার উদাহরণটি ব্যবহার করে, ক্রস জয়েন লকার অ্যাসাইনমেন্ট তৈরির জন্য একটি প্রাথমিক পয়েন্ট হিসাবে কার্যকর হবে: সমস্ত সম্ভাব্য সংমিশ্রণ দিয়ে শুরু করুন এবং তারপরে তালিকা থেকে ফলাফলগুলি ফিল্টার করার জন্য অন্যান্য মানদণ্ড ব্যবহার করুন।
জোয়েল কোহোর্ন

1
চমৎকার উত্তর. আমি বিশ্বাস করি ক্রস জয়েন বেশিরভাগ ক্ষেত্রে কয়েকটি সারি থেকে টেস্টিং ডেটা উত্পন্ন করতে ব্যবহৃত হয় যখন আপনার প্রচুর সংখ্যক রেকর্ডের প্রয়োজন হয়।
এলি

6
অনাথদের ডেটা অনুসন্ধান করার সময়, বা একই ডেটা সেটের বিভিন্ন সংস্করণের তুলনা করার সময় সম্পূর্ণ আউট জয়েনগুলি কার্যকর হতে পারে।
লারা ডগান


3
আমি মনে করি আপনি কীভাবে আপনার ক্যোয়ারী শুরু করবেন তা যোগদানের ধরণের ফলাফলকে প্রভাবিত করে। উদাহরণস্বরূপ, এর SELECT * FROM students RIGHT OUTER JOIN lockers...চেয়ে আলাদা ফলাফল হতে পারে SELECT * FROM lockers RIGHT OUTER JOIN students...। দুর্দান্ত উত্তর, তবে এটি সম্পূর্ণ SQLপ্রশ্নের সাথে আপডেট দেখতে দেখতে পছন্দ করবে
jbmilgrom

141

যোগ দেওয়ার তিনটি মূল ধরণ রয়েছে:

  • INNERযোগদান দুটি টেবিলের তুলনা করে এবং কেবল যেখানে ম্যাচ বিদ্যমান সেখানে ফলাফলগুলি প্রদর্শন করে। 1 ম সারণী থেকে রেকর্ডগুলি অনুলিপি করা হয় যখন তারা 2 য় একাধিক ফলাফলের সাথে মেলে। অন্তর্ভুক্ত হয় ফলাফল সেট ছোট করতে ঝোঁক, কিন্তু রেকর্ড নকল করা যেতে পারে কারণ এটি গ্যারান্টিযুক্ত না।
  • CROSSদুটি টেবিলের তুলনায় যোগ দিন এবং উভয় টেবিল থেকে সারিগুলির প্রতিটি সম্ভাব্য সংমিশ্রণটি ফিরিয়ে দিন। আপনি এই জাতীয় যোগদানের মাধ্যমে প্রচুর ফলাফল পেতে পারেন যা এমনকি অর্থবহ নাও হতে পারে, তাই সাবধানতার সাথে ব্যবহার করুন।
  • OUTERযোগ দুটি টেবিলের তুলনা করে এবং কোনও ম্যাচ উপলভ্য হলে ডেটা ফেরত দেয় বা অন্যথায় NULL মান দেয়। INNER যোগদানের মতো, এটি যখন অন্য টেবিলের একাধিক রেকর্ডের সাথে মেলে তখন এটি এক টেবিলের সারিগুলি নকল করে দেবে। আউটরের সাথে যোগ দেয় ফলাফল আরও বড় আকারে সেট করে, কারণ তারা নিজেরাই সেট থেকে কোনও রেকর্ড সরিয়ে ফেলবে না। NUL মানগুলি কখন এবং কোথায় যুক্ত করতে হবে তা নির্ধারণ করতে আপনাকে অবশ্যই একটি OUTER যোগদান করতে হবে:
    • LEFT মানে 1 ম টেবিল থেকে সমস্ত রেকর্ড রাখুন যাই হোক না কেন এবং যখন দ্বিতীয় টেবিলটি মেলে না তখন NULL মান সন্নিবেশ করান।
    • RIGHT তার বিপরীত অর্থ: দ্বিতীয় সারণী থেকে সমস্ত রেকর্ড রাখুন যাই হোক না কেন এবং সে 1 ম টেবিলের সাথে মেলে না কেন নূন্যতম মান সন্নিবেশ করান।
    • FULL অর্থ উভয় টেবিল থেকে সমস্ত রেকর্ড রাখুন, এবং কোনও মিল নেই যদি উভয় টেবিলের মধ্যে একটি নাল মান valueোকান।

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

আপনি কখন প্রতিটি ধরণের ব্যবহার করতে চাইতে পারেন তার উদাহরণ এখানে রয়েছে:

  • INNER: আপনি "চালান" টেবিল থেকে সমস্ত সম্পর্কিত, তাদের সম্পর্কিত "ইনভয়েসলাইনস" ফিরিয়ে দিতে চান। এটি ধরে নিয়েছে যে প্রতিটি বৈধ চালানের কমপক্ষে একটি লাইন থাকবে।
  • OUTER: আপনি একটি নির্দিষ্ট চালানের জন্য সমস্ত "ইনভয়েস লাইন্স" রেকর্ডগুলি, তাদের সংশ্লিষ্ট "ইনভেন্টরি আইটেম" রেকর্ডার সাথে ফিরিয়ে দিতে চান। এটি এমন একটি ব্যবসা যা পরিষেবাও বিক্রয় করে, যেমন সমস্ত ইনভয়েস লাইনের একটি আইভেন্টরি আইটেম থাকে না।
  • CROSS: আপনার কাছে 10 সারি সহ একটি অঙ্কের সারণী রয়েছে, প্রতিটি হোল্ডিংয়ের মান '0' এর মাধ্যমে '9' হয়। আপনি এর সাথে যোগ দিতে একটি তারিখের সীমা সারণী তৈরি করতে চান, যাতে আপনি পরিসরের মধ্যে প্রতিটি দিনের জন্য একটি রেকর্ড শেষ করেন। ক্রস-এই টেবিলটি নিজের সাথে বারবার যোগদানের মাধ্যমে আপনি আপনার প্রয়োজন মতো পরপর সংখ্যক পূর্ণসংখ্যা তৈরি করতে পারবেন (আপনি 10 থেকে 1 তম পাওয়ার শুরু করলে প্রতিটি জোড় ঘটিতে 1 যোগ করে)। তারপরে পরিসরের জন্য আপনার মূল তারিখে সেই মানগুলি যুক্ত করতে DATEADD () ফাংশনটি ব্যবহার করুন।

1
খুশী হলাম। আমি কেবল এটি যুক্ত করব যদি আপনি কেবল 'জয়েন' লিখেন তবে এর অর্থ অভ্যন্তরীণ যোগ দিন।
ম্যাটপপ

47

এখানে কেবল 4 ধরণের রয়েছে:

  1. অভ্যন্তরীণ যোগদান : সর্বাধিক সাধারণ প্রকার। যোগদানের শর্তে মেলে এমন প্রতিটি ইনপুট সারিগুলির জন্য একটি আউটপুট সারি তৈরি করা হয়।
  2. বাম বাহ্যিক জোড় : অভ্যন্তরীণ যোগ হিসাবে একই, ডানদিকে টেবিলের সাথে কোনও মিল নেই এমন সারি যদি পাওয়া যায় না তবে একটি সারি হ'ল আউটপুট যা বামে টেবিলের সাথে মানগুলির সাথে থাকে NULLএবং প্রতিটি জন্য থাকে ডানদিকে টেবিলের মান। এর অর্থ বামে থাকা টেবিল থেকে প্রতিটি সারি কমপক্ষে একবার আউটপুটে উপস্থিত হবে।
  3. ডান বাহ্যিক যোগদান : সারণীর ভূমিকা বিপরীত ব্যতীত বাম বাহ্যিক জোড়ার সমান।
  4. সম্পূর্ণ বাহ্যিক যোগদান : বাম এবং ডান বাহিরের সংমিশ্রণ। উভয় সারণী থেকে প্রতিটি সারি অন্তত একবার আউটপুটে উপস্থিত হবে।

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

পুরো যোগদানের বিষয়টি নির্দেশ করার জন্য রাসেলএহকে ধন্যবাদ, যা আমি বাদ দিয়েছি।


1
সম্পূর্ণ বাইরের যোগদান এবং ক্রস জয় (কার্টেসিয়ান পণ্য) সম্পর্কে কী?
এসকিউএলমেনেস

পূর্ণ হ'ল সত্যই দুটি বাহ্যিক যোগদানের সমতুল্য
রাসেলএইচ

25
আপনি যখন নিজের অভ্যন্তরীণ যোগদানটি আঁকেন তখন আপনি যা পান তা সম্পূর্ণ হয় এবং আপনি এখানে একটি প্রশ্ন জিজ্ঞাসা করেন "কেন আমি এন এর পরিবর্তে এন ^ 2 সারি পাচ্ছি?" তারপরে সবাই আপনাকে দেখে ক্রস করে।
পল টমবলিন

24

এসকিউএল যোগদানের পার্থক্য:

মনে রাখা খুব সহজ:

INNER JOIN কেবল উভয় সারণীতেই রেকর্ডগুলি সাধারণ দেখায়।

OUTER JOIN উভয় টেবিলের সমস্ত সামগ্রী একত্রিত হয় হয় সেগুলি মিলেছে কিনা not

LEFT JOINএর মতোই LEFT OUTER JOIN- (প্রথম টেস্টের রেকর্ডগুলি নির্বাচন করুন (বাম-সর্বাধিক) ডান টেবিলের রেকর্ডের সাথে টেবিল)

RIGHT JOINএর মতোই RIGHT OUTER JOIN- (বাম টেবিলের রেকর্ডের সাথে মিলে দ্বিতীয় (ডান-সর্বাধিক) সারণী থেকে রেকর্ড নির্বাচন করুন))

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


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

9

পরীক্ষা করে দেখুন (এসকিউএল) উইকিপিডিয়া এ যোগদান

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

  • সম্পূর্ণ আউটটার - প্রদত্ত দুটি টেবিল সমস্ত সারি প্রদান করে এবং বাম বা ডান কলাম না থাকলে নালাগুলি ফিরে আসবে

  • ক্রস যোগ দেয় - কার্টেসিয়ান যোগ দিন এবং সাবধানে ব্যবহার না করা বিপজ্জনক হতে পারে


6

এটিকে আরও দৃশ্যমান করা সাহায্য করতে পারে। একটি উদাহরণ:

1 নং টেবিল:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

টেবিল ২:

আইডিপুডেন্ট লকার

3               l1
4               l2
5               l3

আমি যখন পাই তখন কি পাই:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

4

LEFT JOINএবং এস RIGHT JOINএর ধরণ OUTER JOIN

INNER JOIN ডিফল্ট - উভয় টেবিলের সারিগুলি অবশ্যই যোগদানের শর্তের সাথে মেলে।


5
আমি বিশ্বাস করতে পারি না কীভাবে এই উত্তরটির কয়েকটি বেশ কয়েকটি উত্সাহ রয়েছে এবং একই সাথে এটি এতটা অসম্পূর্ণ।
nbro

আমি মনে করি এটি মূল প্রশ্নের উত্তম উত্তর ছিল।
রাসেলএইচ

3

অভ্যন্তরীণ যোগদান : কেবল সারিগুলি দেখান, যখন এতে উভয় সারণী থেকে ডেটা থাকে।

বহিরাগত যোগদান : (বাম / ডান) : জোড় সারি ( গুলি ) দিয়ে বাম / ডান টেবিলের সমস্ত ফলাফল উপস্থিত থাকে বা না থাকলে তা দেখান।


2

প্রথমে আপনাকে বুঝতে হবে যোগ দিন কী করে? আমরা একাধিক টেবিল সংযুক্ত করি এবং যোগদান করা টেবিলগুলি থেকে নির্দিষ্ট ফলাফল পাই। এটি করার সহজ উপায় হ'ল ক্রস জয়েন

যাক, টেবিলএর দুটি ক এবং এ এবং বি রয়েছে এবং টেবিলবিতে তিনটি কলাম সি এবং ডি রয়েছে we তারপরে প্রকৃত ডেটা পেতে আমাদের প্রাথমিক কী ব্যবহার করে মিলতে হবে।

বাম: এটি বাম টেবিল থেকে সমস্ত রেকর্ড এবং ডান টেবিল থেকে মিলিত রেকর্ড ফিরিয়ে দেবে।

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

আভ্যন্তরীণ: এটি ছেদ করার মতো। এটি উভয় টেবিল থেকে কেবল মিলিত রেকর্ডগুলি ফিরিয়ে দেবে।

বাইরের: এবং এটি ইউনিয়নের মতো। এটি উভয় সারণী থেকে সমস্ত উপলব্ধ রেকর্ড ফিরিয়ে দেবে।

কিছু সময় আমাদের সমস্ত ডেটা প্রয়োজন হয় না এবং এছাড়াও আমাদের কেবল সাধারণ তথ্য বা রেকর্ডের প্রয়োজন হয়। এই জয়েন পদ্ধতিগুলি ব্যবহার করে আমরা সহজেই এটি পেতে পারি। মনে রাখবেন বাম এবং ডান জোড় বাহ্যিক সংযুক্তি।

আপনি ক্রস জয়েন ব্যবহার করে সমস্ত রেকর্ড পেতে পারেন। এটি যখন কয়েক মিলিয়ন রেকর্ডে আসে তখন এটি ব্যয়বহুল হতে পারে। সুতরাং বাম, ডান, অভ্যন্তরীণ বা বাইরের জোড় ব্যবহার করে এটি সহজ করুন।

ধন্যবাদ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.