"INNER JOIN" और "OUTER JOIN" में क्या अंतर है?


4669

इसके अलावा कैसे LEFT JOIN, RIGHT JOINऔर में FULL JOINफिट?


63
उत्तरों और टिप्पणियों और उनके संदर्भों में से केवल एक ही वास्तव में बताता है कि वेन आरेख ऑपरेटरों का प्रतिनिधित्व कैसे करते हैं: सर्कल चौराहा क्षेत्र ए जोन बी में पंक्तियों के सेट का प्रतिनिधित्व करता है। प्रत्येक सर्कल के लिए अद्वितीय क्षेत्र पंक्तियों के सेट का प्रतिनिधित्व करता है जो आप इसे लेने से प्राप्त करते हैं। तालिका की पंक्तियाँ जो A JOIN B में भाग नहीं लेती हैं और कॉलम को NULL पर सेट की गई अन्य तालिका में अद्वितीय रूप से जोड़ देती हैं। (और सबसे ए और बी के लिए हलकों के एक अस्पष्ट फर्जी पत्राचार देते हैं)
फिलिप्पुस

1
नीचे सिद्धांत आधारित उत्तरों से कूदते हुए, एक वास्तविक विश्व अनुप्रयोग के लिए: मैं अक्सर प्रयोग डेटा के साथ काम करता हूं, प्रोसेसर डिजाइनों पर बेंचमार्क चला रहा हूं। अक्सर मैं 2 या अधिक हार्डवेयर विकल्पों के बीच परिणामों की तुलना करना चाहता हूं। INNER JOIN का मतलब है कि मैं केवल उन बेंचमार्क को देखता हूं जो सभी प्रयोगों में सफलतापूर्वक चले; OUTER JOIN का मतलब है कि मैं उन सभी प्रयोगों को देख सकता हूं, जिनमें कुछ कॉन्फ़िगरेशन पर चलने में विफल रहा। इस तरह के प्रयोगों में विफलताओं के साथ-साथ सफलताओं को देखना महत्वपूर्ण है। महत्वपूर्ण बात यह है कि मैंने ओएलआर जॉय को पाने के लिए पर्लक्लाइन लिखा था, जब कई आरडीबीएमएस में इसकी कमी थी,
क्रेजी

4
बहुत सारे उत्तर पहले से ही उपलब्ध हैं लेकिन मैंने इस ट्यूटोरियल का उल्लेख नहीं किया है। यदि आप वेन आरेखों को जानते हैं, तो यह एक महान ट्यूटोरियल है: blog.codinghorror.com/a-visual-explanation-of-sql-joins मेरे लिए, यह एक त्वरित पढ़ने के लिए पर्याप्त है, लेकिन फिर भी पूरी अवधारणा को समझने और सभी काम करता है बहुत अच्छी तरह से मामलों। अगर आपको पता नहीं है कि वेन आरेख क्या हैं - तो उन्हें सीखें। ऐसा करने के लिए 5-10 मिनट लगते हैं और जब भी आपको सेट पर काम करने और संचालन के प्रबंधन की आवश्यकता होगी, तब मदद मिलेगी।
दांतेइस्मिथ

14
@DanteTheSmith नहीं, जो यहाँ चित्र के समान समस्याओं से ग्रस्त है। प्रश्न के नीचे मेरी टिप्पणी देखें और फिर से उसी ब्लॉग पोस्ट को पुनः देखें: "जेफ ने अपने ब्लॉग को टिप्पणियों में कुछ पृष्ठों के नीचे लिखा है"। वेन आरेख सेट में तत्व दिखाते हैं। बस यह निर्धारित करने की कोशिश करें कि इन आरेखों में सेट क्या हैं और तत्व क्या हैं। सेट टेबल नहीं हैं और तत्व उनकी पंक्तियाँ नहीं हैं । इसके अलावा किसी भी दो तालिकाओं को जोड़ा जा सकता है, इसलिए पीके और एफके इरेलवेंट हैं। सब फर्जी। आप क्या कर रहे हैं दूसरों के हजारों अभी क्या किया है - एक मिल गया अस्पष्ट छाप आप (गलत तरीके से) मान बनाता है भावना।
दीक्षा

3
क्रिस मैं आपको इस लेख को पढ़ने की सलाह देता हूं: टाइप्डैटैसिएन्स . com/ ... ... और स्वीकार किए गए उत्तर की अपनी पसंद को बदलने पर विचार करें (शायद इनाम वाले व्यक्ति के साथ) एक ऐसे उत्तर में, जो वेन आरेख का उपयोग नहीं करता है। वर्तमान में स्वीकृत उत्तर बहुत से लोगों को गुमराह कर रहा है। मैं आपसे हमारे समुदाय की भलाई और हमारे ज्ञान के आधार की गुणवत्ता के लिए ऐसा करने का आग्रह करता हूं।
कोलम भंडाल

जवाबों:


6110

यह मानते हुए कि आप बिना किसी डुप्लिकेट वाले कॉलम में शामिल हो रहे हैं, जो एक बहुत ही सामान्य मामला है:

  • ए और बी का एक आंतरिक जुड़ाव ए इंटरसेक्ट बी का परिणाम देता है, अर्थात वेन आरेख चौराहे का आंतरिक भाग ।

  • ए और बी का एक बाहरी जुड़ाव ए यूनियन बी के परिणाम देता है, अर्थात वेन आरेख संघ के बाहरी हिस्से।

उदाहरण

मान लें कि आपके पास दो तालिकाएँ हैं, एक एकल स्तंभ के साथ, और डेटा निम्नानुसार है:

A    B
-    -
1    3
2    4
3    5
4    6

ध्यान दें कि (1,2) A के लिए अद्वितीय हैं, (3,4) सामान्य हैं, और (5,6) B के लिए अद्वितीय हैं।

आंतरिक रूप से जुड़ा

दोनों समतुल्य प्रश्नों का उपयोग करके एक आंतरिक जुड़ाव दो तालिकाओं के प्रतिच्छेदन देता है, अर्थात दो पंक्तियाँ जो उनके पास हैं।

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

बाईं ओर का बाहरी जोड़

एक बाईं बाहरी जुड़ाव A में सभी पंक्तियाँ देगा, साथ ही B में कोई भी सामान्य पंक्तियाँ।

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

सही बाहरी जुड़ना

एक सही बाहरी जुड़ाव B में सभी पंक्तियों को देगा, साथ ही A में किसी भी सामान्य पंक्तियों को।

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 में किसी चीज़ में B की संगत डेटम नहीं है, तो B भाग शून्य है, और इसके विपरीत विपरीत।

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 के सभी (बाएँ सम्मिलित), B के सभी (दाएँ सम्मिलित) या A के सभी और B के सभी (पूर्ण सम्मिलित)। केवल यह अंतिम परिदृश्य वास्तव में ए यूनियन बी स्टिल है, एक अच्छी तरह से लिखित स्पष्टीकरण।
थॉमस

11
क्या मैं सही हूं कि फुल जॉय, फुल ओपिन जॉइन का उपनाम है और लेफ्टिनेंट जॉइन, लेफ्ट ओटर जॉय का उपनाम है?
डेमियन

3
हाँ महान और उत्कृष्ट व्याख्या। लेकिन कॉलम b में मूल्य क्रम में क्यों नहीं हैं? यानी यह 6,5 नहीं 5,6 है?
अमीर

7
@ आमेर, धन्यवाद। ज्वाइन एक आदेश की गारंटी नहीं देता है, आपको आदेश द्वारा एक आदेश जोड़ना होगा।
मार्क हैरिसन

730

वेन आरेख वास्तव में मेरे लिए नहीं है।

वे एक क्रॉस जॉइन और इनर जॉइन के बीच कोई अंतर नहीं दिखाते हैं, उदाहरण के लिए, या अधिक आम तौर पर विभिन्न प्रकार के जॉइन प्रेडिकेट के बीच कोई अंतर दिखाते हैं या तर्क के लिए एक रूपरेखा प्रदान करते हैं कि वे कैसे काम करेंगे।

तार्किक प्रसंस्करण को समझने के लिए कोई विकल्प नहीं है और यह वैसे भी समझ में अपेक्षाकृत सरल है।

  1. एक क्रॉस जॉइन की कल्पना करें।
  2. onचरण 1 से सभी पंक्तियों के खिलाफ खंड का मूल्यांकन करें , जहां उन विधेय का मूल्यांकन होता हैtrue
  3. (केवल बाहरी जोड़ के लिए) चरण 2 में खो गई किसी भी बाहरी पंक्तियों में वापस जोड़ें।

(NB: व्यवहार में क्वेरी ऑप्टिमाइज़र को क्वेरी को निष्पादित करने के अधिक कुशल तरीके मिल सकते हैं जो कि विशुद्ध रूप से तार्किक विवरण से ऊपर है, लेकिन अंतिम परिणाम समान होना चाहिए)

मैं एक पूर्ण बाहरी जोड़ के एक एनिमेटेड संस्करण के साथ शुरुआत करूँगा । इसके बाद की व्याख्या।

यहां छवि विवरण दर्ज करें


व्याख्या

स्रोत टेबल्स

यहां लिंक विवरण दर्ज करें

सबसे पहले एक CROSS JOIN(AKA Cartesian Product) से शुरुआत करें । यह एक ONखंड नहीं है और बस दो तालिकाओं से पंक्तियों के हर संयोजन को वापस करता है।

ए कॉलर का चयन करें, एक क्रोस जॉइन बी से कोलोर

यहां लिंक विवरण दर्ज करें

इनर और आउटर जॉइन में "ऑन" क्लॉज विधेय होता है।

  • आंतरिक रूप से जुड़ा। क्रॉस ज्वाइन परिणाम में सभी पंक्तियों के लिए "चालू" खंड में स्थिति का मूल्यांकन करें। अगर सच में शामिल पंक्ति वापस आ जाए। अन्यथा इसे त्याग दें।
  • बाईं ओर का बाहरी जोड़। इनर ज्वाइन करें फिर लेफ्ट टेबल की किसी भी पंक्तियों के लिए जो राइट टेबल कॉलम के लिए NULL मानों के साथ कुछ भी आउटपुट से मेल नहीं खाते।
  • राइट आउटर जॉइन करें। इनर ज्वाइन करें फिर राइट टेबल के किसी भी पंक्तियों के लिए जो लेफ्ट टेबल कॉलम के लिए NULL मानों के साथ कुछ भी आउटपुट से मेल नहीं खाते।
  • पूर्ण बाहरी सम्मिलित हों। इनर जॉइन के रूप में समान है तो लेफ्ट नॉन मैचेड रो को संरक्षित करें जैसा कि लेफ्ट आउटर जॉइन में और राइट नॉन मैचिंग रो भी राइट आउटर जॉइन के अनुसार।

कुछ उदाहरण

A.Colour का चयन करें, A.Colour = B.Colour में एक ININ JOIN B से B.Colour करें

उपरोक्त क्लासिक इक्वी जॉइन है।

आंतरिक रूप से जुड़ा

एनिमेटेड संस्करण

यहां छवि विवरण दर्ज करें

A.Colour का चयन करें, A.Colour Not IN ('Green', 'Blue') में एक ININ JOIN B से B.Colour करें।

आंतरिक रूप से जुड़ने की स्थिति में समानता की स्थिति होना जरूरी नहीं है और इसे तालिकाओं के दोनों (या यहां तक ​​कि) से संदर्भ कॉलम की आवश्यकता नहीं है। A.Colour NOT IN ('Green','Blue')क्रॉस की प्रत्येक पंक्ति पर मूल्यांकन रिटर्न में शामिल होता है।

भीतर का २

चुनें। ए। कौरौर, बी। कौरूर से एक इनर जॉयन बी 1 = 1 पर

क्रॉस ज्वाइन रिजल्ट में सभी पंक्तियों के लिए जॉइन कंडीशन सही है, इसलिए यह क्रॉस जॉइन की तरह ही है। मैं फिर से 16 पंक्तियों की तस्वीर नहीं दोहराऊंगा।

A.Colour का चयन करें, A.Colour = B.Colour पर एक LEFT OUTER JOIN B से B.Colour करें

आउटर जॉइंट्स का तार्किक रूप से उसी तरह मूल्यांकन किया जाता है जैसे कि आंतरिक जोड़ से मिलता है, सिवाय इसके कि अगर बाईं टेबल से कोई पंक्ति (लेफ्ट जॉइन के लिए) दाहिने हाथ की टेबल से किसी भी पंक्तियों के साथ नहीं जुड़ती है तो यह परिणाम में NULLमान के साथ संरक्षित है । दाहिने हाथ के स्तंभ।

LOJ

A.Colour का चयन करें, A.Colour पर B. LEOL OUTER JOIN B से B.Colour करें। B. जहां से B.Colour निकले हैं

यह केवल पिछले परिणाम को सीमित करता है जहां केवल पंक्तियों को वापस करें B.Colour IS NULL। इस विशेष मामले में ये वे पंक्तियाँ होंगी जिन्हें संरक्षित किया गया था क्योंकि उनके दाहिने हाथ की तालिका में कोई मिलान नहीं था और क्वेरी एकल लाल पंक्ति को तालिका में मेल नहीं खाती है B। इसे एंटी सेमी जॉइन के रूप में जाना जाता है।

IS NULLपरीक्षण के लिए एक स्तंभ का चयन करना महत्वपूर्ण है जो या तो अशक्त नहीं है या जिसके लिए जुड़ने की स्थिति यह सुनिश्चित करती है कि NULLइस पैटर्न को सही ढंग से काम करने के लिए किसी भी मान को बाहर रखा जाएगा और केवल उन पंक्तियों को लाने से बचें जो इसके लिए एक NULLमूल्य है। संयुक्त राष्ट्र की पंक्तियों के अलावा स्तंभ।

loj अशक्त है

A.Colour का चयन करें, A.Colour = B.Colour पर एक राईट ओपर जॉइन B से B.Colour करें।

दाएं बाहरी जोड़ समान रूप से बाएं बाहरी जोड़ से कार्य करते हैं, सिवाय इसके कि वे दाएं टेबल से गैर मिलान वाली पंक्तियों को संरक्षित करते हैं और बाएं हाथ के स्तंभों का विस्तार करते हैं।

रोज

A.Colour, B.Colour का चयन करें। FULL OUTER JOIN B से A.Colour = B.Colour

पूर्ण बाहरी जोड़ बाएं और दाएं जोड़ों के व्यवहार को जोड़ते हैं और बाएं और दाएं तालिकाओं से गैर-मिलान पंक्तियों को संरक्षित करते हैं।

FOJ

चुनें। ए। कल्लूर, बी। कल्लूर एक पूर्ण संतान के साथ बी = 1 = 0 पर

क्रॉस में कोई भी पंक्तियाँ 1=0विधेय से मेल नहीं खातीं । दोनों तरफ से सभी पंक्तियों को सामान्य बाहरी बाहरी नियमों के उपयोग से संरक्षित किया गया है, दूसरी तरफ तालिका से कॉलम में NULL के साथ।

एफओजे 2

1 से कम एक पूर्ण जॉयस बी 1 से रंग के रूप में चयन (ए। कोलोर, बी। कोलोर) का चयन करें।

पूर्ववर्ती क्वेरी के लिए एक मामूली संशोधन के साथ एक UNION ALLदो तालिकाओं का अनुकरण कर सकता है ।

यूनिअन ऑल

A.Colour का चयन करें, A. Ool में एक लेफ्टिनेंट जूस बी से Colour लें। B.Colour = B.Colour कहाँ से B.Colour = 'Green'

ध्यान दें कि WHEREक्लॉज (यदि मौजूद है) तार्किक रूप से जुड़ने के बाद चलता है। एक सामान्य त्रुटि बाईं बाहरी जुड़ाव प्रदर्शन करना है और फिर दाएं टेबल पर एक शर्त के साथ WHERE क्लॉज शामिल करना है जो गैर मिलान वाली पंक्तियों को छोड़कर समाप्त होता है। ऊपर के बाहरी प्रदर्शन में शामिल होने ...

LOJ

... और फिर "कहाँ" खंड चलता है। NULL= 'Green'सत्य का मूल्यांकन नहीं करता है, इसलिए बाहरी जुड़ाव द्वारा संरक्षित पंक्ति को समाप्त कर दिया जाता है (नीले एक के साथ) प्रभावी रूप से एक वापस एक में शामिल होने के लिए परिवर्तित करना।

LOJtoInner

यदि इरादा बी से केवल पंक्तियों को शामिल करना था जहां रंग हरा है और ए से सभी पंक्तियों की परवाह किए बिना सही सिंटैक्स होगा

A.Colour का चयन करें, A. Ool पर एक LEFT OUTER JOIN B से B.Colour करें। B.Colour और B.Colour = 'Green'

यहां छवि विवरण दर्ज करें

एसक्यूएल फिडल

SQLFiddle.com पर इन उदाहरणों को लाइव देखें ।


46
मैं कहूंगा कि जबकि यह मेरे लिए और साथ ही वेन आरेखों के लिए भी काम नहीं करता है, मैं सराहना करता हूं कि लोग अलग-अलग होते हैं और अलग-अलग सीखते हैं और यह मेरे द्वारा पहले देखे गए किसी भी विपरीत बहुत अच्छी तरह से प्रस्तुत विवरण है, इसलिए मैं @ypercube का समर्थन करता हूं बोनस अंक प्रदान करना। जॉइन क्लॉज बनाम व्हेयर क्लॉज में अतिरिक्त शर्तें लगाने के अंतर को समझाते हुए अच्छा काम। आपको कुदोस, मार्टिन स्मिथ।
ओल्ड प्रो

22
@ ओल्डप्रो वेन आरेख ठीक हैं जहां तक ​​वे जाते हैं मुझे लगता है लेकिन वे एक क्रॉस ज्वाइन का प्रतिनिधित्व करने के तरीके पर चुप हैं, या एक तरह के ज्वाइन को अलग करने के लिए अंतर करते हैं जैसे कि इक्वाइल दूसरे से जुड़ते हैं। क्रॉस के प्रत्येक पंक्ति पर जॉइन प्रॉडेक्ट का मूल्यांकन करने का मानसिक मॉडल परिणाम में शामिल होता है और फिर बेजोड़ पंक्तियों में वापस जुड़ जाता है यदि कोई बाहरी जुड़ता है और अंत में मूल्यांकन करता है कि मेरे लिए बेहतर काम कहां है।
मार्टिन स्मिथ

18
वेन आरेख यूनियनों और अंतर्विरोधों और अंतरों का प्रतिनिधित्व करने के लिए अच्छे हैं, लेकिन जुड़ते नहीं हैं। उनके पास बहुत ही सरल योगों के लिए कुछ मामूली शैक्षिक मूल्य हैं, यानी कि जहां जुड़ने की स्थिति अद्वितीय स्तंभों पर है।
ypercube y

12
@ अर्थ - नहीं आप गलत हैं। एसक्यूएल फिडल sqlfiddle.com/#/3/9eecb7db59d16c80417c72d1/5155 यह वेन आरेखों का चित्रण नहीं कर सकता है।
मार्टिन स्मिथ

7
@MartinSmith वाह, मैं सहमत हूँ, मैं पूरी तरह से गलत हूँ! बहुत एक-से-कई के साथ काम करते थे .. सुधार के लिए धन्यवाद।
आर्थर

187

दो तालिकाओं से डेटा को संयोजित करने के लिए जोड़ों का उपयोग किया जाता है, जिसके परिणामस्वरूप एक नया, अस्थायी तालिका होता है। जोड़ों को एक विधेय नामक चीज के आधार पर किया जाता है, जो जुड़ने के लिए स्थिति का उपयोग करने के लिए निर्दिष्ट करता है। एक आंतरिक जुड़ाव और एक बाहरी जुड़ाव के बीच का अंतर यह है कि एक आंतरिक जुड़ाव केवल उन पंक्तियों को वापस करेगा जो वास्तव में सम्मिलित विधेय पर आधारित मेल खाते हैं। उदाहरण के लिए- कर्मचारी और स्थान तालिका पर विचार करें:

यहां छवि विवरण दर्ज करें

इनर ज्वाइन: - इनरज्वाइन-प्रेडिकेट के आधार परदो टेबलों ( एम्प्लॉई और लोकेशन ) केकॉलम वैल्यू को मिला कर एक नया रिजल्ट टेबल बनाता है। क्वेरीउन सभी जोड़े पंक्तियों को खोजने के लिए स्थान की प्रत्येक पंक्ति के साथ कर्मचारी की प्रत्येक पंक्ति की तुलना करती हैजो जॉइन-प्रेडिकेट को संतुष्ट करते हैं। जब गैर-पूर्ण मानों के मिलान से जोड़-पूर्वक संतुष्ट हो जाता है, तो कर्मचारी और स्थान की प्रत्येक मिलान जोड़ी के लिए स्तंभ मानपरिणाम पंक्ति में संयुक्त हो जाते हैं। यहां बताया गया है कि आंतरिक जुड़ाव के लिए SQL कैसा दिखेगा:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

अब, यहां बताया गया है कि एसक्यूएल चलने का परिणाम क्या होगा: यहां छवि विवरण दर्ज करें

बाहरी जुड़ाव: - बाहरी जुड़ने के लिए दो सम्मिलित तालिकाओं में प्रत्येक रिकॉर्ड की आवश्यकता नहीं होती है ताकि मिलान रिकॉर्ड हो। शामिल तालिका प्रत्येक रिकॉर्ड को बरकरार रखती है - भले ही कोई अन्य मिलान रिकॉर्ड मौजूद न हो। बाहरी उप-जोड़ में बाएं बाहरी जोड़ और दाएं बाहरी जोड़ में जुड़ जाते हैं, जिसके आधार पर तालिका की पंक्तियां बरकरार रहती हैं (बाएं या दाएं)।

लेफ्ट आउटर ज्वाइन: - टेबल एम्प्लॉई और लोकेशन के लिए लेफ्ट आउटर जॉइन (या बस लेफ्ट जॉइन) का नतीजाहमेशा "लेफ्ट" टेबल ( एम्प्लॉई ) केसभी रिकॉर्ड में होता है, भले ही जॉइन-कंडीशन में कोई मैचिंग रिकॉर्ड न मिले। "सही" तालिका ( स्थान )। यहाँ ऊपर की तालिकाओं का उपयोग करते हुए बाईं बाहरी जोड़ के लिए SQL कैसा दिखेगा:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

अब, इस SQL ​​को चलाने का परिणाम कैसा दिखेगा: यहां छवि विवरण दर्ज करें

राईट आउटर जॉइन: - राईट आउटर जॉइन (या राईट ज्वाइन) बारीकी से लेफ्ट आउटर जॉइन से मिलता जुलता है, सिवाय टेबल के ट्रीटमेंट के साथ। "दाएं" तालिका ( स्थान )से प्रत्येक पंक्तिकम से कम एक बार सम्मिलित तालिका में दिखाई देगी। यदि "बाईं" तालिका ( कर्मचारी )से कोई मेल खाता पंक्तिमौजूद नहीं है, तो NULLउन कर्मचारियों के लिए उन अभिलेखोंमें दिखाई देगा,जिनका स्थान में कोई मिलान नहीं है। यह SQL जैसा दिखता है:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

ऊपर दी गई तालिकाओं का उपयोग करके, हम दिखा सकते हैं कि सही बाहरी जोड़ का परिणाम सेट कैसा दिखेगा:

यहां छवि विवरण दर्ज करें

फुल आउटर जॉइन : - फुल आउटर ज्वाइन या फुल ज्वाइन है कि किसी ज्वाइन के रिजल्ट में नॉनमैचिंग रो को शामिल करके नॉमिनेटिंग की जानकारी को बरकरार रखें, फुल आउटर जॉइन का इस्तेमाल करें। इसमें दोनों तालिकाओं से सभी पंक्तियों को शामिल किया गया है, भले ही अन्य तालिका का मिलान मूल्य हो या न हो।

छवि स्रोत

MySQL 8.0 संदर्भ मैनुअल - सिंटैक्स से जुड़ें

Oracle ऑपरेशन में शामिल हों


3
सबसे अच्छा जवाब अब तक, वैकल्पिक वाक्यविन्यास - यही मैं तलाश कर रहा हूं, धन्यवाद!
जॉय

1
वेन आरेख गुमराह कर रहे हैं। प्रश्न और अन्य उत्तरों पर मेरी टिप्पणी देखें। साथ ही इस भाषा का अधिकांश भाग खराब है। उदाहरण के लिए: "जब गैर-पूर्ण मानों के मिलान से जोड़-पूर्वक संतुष्ट हो जाता है, तो कर्मचारी और स्थान की प्रत्येक मिलान जोड़ी के लिए स्तंभ मान परिणाम पंक्ति में संयुक्त हो जाते हैं।" नहीं, नहीं "जब गैर-पूर्ण मानों के मिलान से जुड़ने की भविष्यवाणी संतुष्ट हो जाती है"। पंक्तियों में मानों के अलावा कोई फर्क नहीं पड़ता कि क्या हालत पूरी तरह सही या गलत है। कुछ मान अच्छी स्थिति के लिए अच्छी तरह से NULL हो सकते हैं।
फिलिप

हालांकि स्पष्ट रूप से नहीं कहा गया है, इस में चित्र वेन आरेख हैं। वेन आरेख सामान्य रूप से, किसी जुड़ने के सही गणितीय लक्षण वर्णन के नहीं हैं। मैं वेन आरेखों को हटाने का सुझाव देता हूं।
कोलम भंडाल

@ColmBhandal: Venn आरेखों को हटा दिया
ajitksharma

कृपया टेक्स्ट का उपयोग करें, न कि छवियों / लिंक का, टेक्स्ट के लिए - टेबल और ईआरडी सहित । केवल पाठ के रूप में व्यक्त नहीं किया जा सकता है या पाठ को बढ़ाने के लिए छवियों का उपयोग करें। छवियां खोजी नहीं जा सकतीं, जिन्हें कट या पेस्ट नहीं किया जा सकता एक छवि के साथ एक किंवदंती / कुंजी और स्पष्टीकरण शामिल करें।
दीक्षा

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
@GrijeshChauhan हाँ, लेकिन आप इसे वाइन का उपयोग करके चलाने की कोशिश कर सकते हैं ।
तुषार गुप्ता -

2
ओह! हाँ मैं ..मैं शराब का उपयोग कर SQLyog इस्तेमाल किया .. वहाँ भी PlayOnLinux
Grijesh चौहान

1
आपका पाठ अस्पष्ट और गलत है। "मिलान की गई पंक्तियाँ" केवल A & B के क्रॉस जॉइन से प्राप्त पंक्तियाँ हैं और जो पुनः प्राप्त की गई है (A inner join B) एक प्रतिच्छेदन B नहीं है लेकिन (A left join B) प्रतिच्छेदन (A right join B)। "चयनित" पंक्तियाँ A & B से नहीं हैं, वे A क्रॉस B से शामिल हैं और A & B से पंक्तियों के अशक्त-विस्तारित मानों से
फिलीपिसे

@ तुषारगुप्त-करीवोत्सुहर में आपको "एसक्यूएल उदाहरणों के लिए इस्तेमाल की जाने वाली तालिकाएँ" शामिल होनी चाहिए
मैनुअल जॉर्डन

111

सरल शब्दों में:

एक आंतरिक जुड़ाव केवल मिलान की गई पंक्तियों को पुनः प्राप्त करता है।

जबकि एक बाहरी जुड़ाव एक तालिका से मिलान की गई पंक्तियों और अन्य तालिका में सभी पंक्तियों को पुनः प्राप्त करता है .... परिणाम इस बात पर निर्भर करता है कि आप किसका उपयोग कर रहे हैं:

  • बाएँ : दाएँ तालिका में पंक्तियाँ और बाईं तालिका में सभी पंक्तियाँ

  • दाईं ओर : बाईं तालिका में पंक्तियाँ और दाईं तालिका में सभी पंक्तियाँ या

  • पूर्ण : सभी तालिकाओं में सभी पंक्तियाँ। इससे कोई फर्क नहीं पड़ता कि कोई मैच है या नहीं


1
@nomen यह नहीं है कि यह उत्तर इसे संबोधित करता है, लेकिन INNER JOIN एक चौराहा है और FULL OUTER JOIN एक समान है यदि बाएं और दाएं सेट / सर्किल में क्रमशः (बाएँ) बाएँ और दाएँ भाग की पंक्तियाँ होती हैं। पुनश्च यह जवाब इनपुट बनाम आउटपुट में पंक्तियों के बारे में स्पष्ट नहीं है। यह "बाएँ / दाएँ तालिका में" के साथ भ्रमित करता है "बाएँ / दाएँ में एक बाएँ / दाएँ भाग है" और यह "मिलान पंक्ति" बनाम "सभी" का उपयोग करने के लिए पंक्ति द्वारा अन्य तालिका बनाम nulls द्वारा पंक्ति का मतलब है।
फिलिप

103

एक आंतरिक जुड़ाव केवल पंक्तियों को दिखाता है यदि जुड़ने के दूसरे (दाएं) तरफ एक मिलान रिकॉर्ड है।

ए (बाएं) बाहरी जुड़ाव बाएं हाथ की तरफ प्रत्येक रिकॉर्ड के लिए पंक्तियों को दिखाता है, भले ही जुड़ने के दूसरे (दाएं) पक्ष पर कोई मिलान पंक्तियां न हों। यदि कोई मिलान पंक्ति नहीं है, तो दूसरे (दाएं) पक्ष के कॉलम NULLs दिखाएंगे।


81

इनर जॉइन के लिए आवश्यक है कि संबंधित आईडी के साथ एक रिकॉर्ड ज्वाइन टेबल में मौजूद हो।

बाहरी जोड़ बाईं ओर के रिकॉर्ड को वापस कर देंगे, भले ही दाईं ओर कुछ भी मौजूद न हो।

उदाहरण के लिए, आपके पास एक आदेश और एक आदेश तालिका है। वे एक "आदेश" से संबंधित हैं।

आदेश

  • आदेश ID
  • ग्राहक का नाम

ऑर्डर का विवरण

  • OrderDetailID
  • आदेश ID
  • उत्पाद का नाम
  • मात्रा
  • कीमत

अनुरोध

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

केवल वही ऑर्डर लौटाएगा जिसके पास ऑर्डरडेल तालिका में कुछ है।

यदि आप इसे OUTER LEFT JOIN में बदलते हैं

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सफलता के साथ (MySQL)। मुझे अतिरिक्त परिस्थितियों के बारे में निश्चित नहीं था, वे अच्छी तरह से मिश्रण करते हैं ...
PhiLho

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। यदि लेफ्ट टेबल में रिकॉर्ड प्राइमरी, फ़ॉरइग्न कुंजी के आधार पर राइट टेबल से मेल नहीं खा रहे हैं, तो जॉइन के परिणाम के रूप में NULL वैल्यू का उपयोग करें।

उदाहरण :

उदाहरण

अब 2 टेबल के लिए मान लेते हैं

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

यहां, कर्मचारी तालिका मास्टर तालिका है, phone_numbers_employees चाइल्ड टेबल है (इसमें emp_idविदेशी कुंजी के रूप में शामिल है जो employee.idइसकी तालिका को जोड़ता है।)

भीतर जुड़ता है

2 टेबल के रिकॉर्ड लो कर्मचारियों तालिका (अपने आईडी) की प्राथमिक कुंजी बाल तालिका phone_numbers_employees के विदेश कुंजी (emp_id) से मेल खाता है केवल तभी

तो क्वेरी होगी:

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;

यहां केवल प्राथमिक कुंजी पर मेल वाली पंक्तियाँ लें। जैसा कि ऊपर बताया गया है। प्राथमिक कुंजी पर गैर मिलान वाली पंक्तियाँ = विदेशी कुंजी जुड़ने के परिणामस्वरूप छोड़ दी जाती हैं।

बायां जोड़ :

लेफ्ट जॉइन में लेफ्ट टेबल की सभी पंक्तियों को बरकरार रखा गया है, फिर चाहे वह ऐसी कोई पंक्ति हो जो राइट टेबल पर मैच करती हो।

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
परिणाम में प्राथमिक / अद्वितीय / उम्मीदवार कुंजी और विदेशी कुंजी के साथ (प्रति से) कुछ भी नहीं है। बावड़ी को उनके संदर्भ के बिना वर्णित किया जा सकता है। एक क्रॉस जॉइन की गणना की जाती है, फिर ON कंडीशन से मेल न करने वाली पंक्तियों को फ़िल्टर किया जाता है; अतिरिक्त रूप से बाहरी जोड़ वाली पंक्तियों के लिए फ़िल्टर की गई / बेजोड़ पंक्तियाँ NULLs (प्रति LEFT / RIGHT / FULL और सम्मिलित) द्वारा विस्तारित की जाती हैं।
फिलीपिक्सी

यह मान लेना कि एसक्यूएल जॉइन हमेशा प्राथमिक / विदेशी कुंजी पर एक मैच है, वेन डायग्राम के इस दुरुपयोग के लिए अग्रणी है। कृपया अपने उत्तर को अपने अनुसार संशोधित करें।
कोलम भंडाल

58

आप INNER JOINदोनों तालिकाओं से सभी पंक्तियों को वापस करने के लिए उपयोग करते हैं जहां एक मैच होता है। अर्थात परिणामी तालिका में सभी पंक्तियों और स्तंभों में मान होंगे।

में OUTER JOINजिसके परिणामस्वरूप तालिका खाली कॉलम हो सकता है। बाहरी जुड़ाव LEFTया तो हो सकता है RIGHT

LEFT OUTER JOIN पहली तालिका से सभी पंक्तियों को लौटाता है, भले ही दूसरी तालिका में कोई मेल न हो।

RIGHT OUTER JOIN दूसरी तालिका से सभी पंक्तियों को लौटाता है, भले ही पहली तालिका में कोई मेल न हो।


56

यह जोड़ के लिए एक अच्छा स्पष्टीकरण है

यह सभी प्रकार के जोड़ों के लिए एक अच्छा आरेखीय स्पष्टीकरण है

स्रोत: http://ssiddique.info/understanding-sql-joins-in-easy-way.html


1
यह पोस्ट स्पष्ट रूप से नहीं बताती है कि इस आरेख की व्याख्या कैसे करें। इस पृष्ठ पर प्रश्न और मेरी अन्य टिप्पणियों पर पहली टिप्पणी भी देखें।
फिलीपिक्सी

54

INNER JOINआवश्यकता है कि दो तालिकाओं की तुलना में कम से कम एक मैच हो। उदाहरण के लिए, तालिका A और तालिका B, जिसका अर्थ है ٨ B (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

INNER JOIN:
जब आप किसी रिलेशन के आधार पर उपरोक्त परिणामों के लिए एक फ़िल्टर जोड़ना चाहते हैं जैसे 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 [OUTER] JOIN:
जब आप ऊपर के रिजल्ट में किसी एक टेबल की सभी पंक्तियों को रखना चाहते हैं- तो उसी संबंध के साथ- आप उपयोग कर सकते हैं 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 joinMySQL में कोई भी नहीं है।
पोटाशिन

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. मेरा मतलब है कि उपयोग करने का प्रयास करें। मैंने देखा कि बहुत से लोग बिना किसी अच्छे कारण के LEFT OUTER जॉइन का उपयोग करते हैं। (शामिल किए गए कॉलम 'शून्य नहीं' थे।) उन मामलों में INNER जॉइन का उपयोग करना निश्चित रूप से बेहतर होगा। 2. मैंने गैर-सहयोगी व्यवहार की व्याख्या करते हुए एक लिंक जोड़ा है जो मैं कर सकता था।
लाजोस वेरेस

मुझे पता है INNER JOINकी तुलना में धीमी है LEFT JOINसमय की सबसे में, और लोगों का उपयोग कर सकते LEFT JOINकरने के बजाय INNER JOINएक जोड़कर WHEREअप्रत्याशित दूर करने के लिए NULLपरिणाम;)।
shA.t

इन टिप्पणियों ने मुझे थोड़ा अनिश्चित बना दिया। आपको क्या लगता INNERहै धीमा क्यों है ?
लाजोस

इंजन पर निर्भर करता है। gnu join, joinkeys, DB2, MySQL। प्रदर्शन जाल लाजिमी है, जैसे कि ढीले टाइपिंग या एक स्पष्ट कलाकारों।
मैकेंज़्म

26

बहुत पसंद किए गए रेड-शेडेड वेन आरेख की आलोचना करते हुए, मैंने केवल अपना प्रयास पोस्ट करना उचित समझा।

हालाँकि @Martin Smith का उत्तर लंबे समय तक इस झुंड का सबसे अच्छा है, लेकिन उसका केवल प्रत्येक तालिका से कुंजी कॉलम दिखाता है, जबकि मुझे लगता है कि आदर्श रूप से गैर-कुंजी कॉलम भी दिखाए जाने चाहिए।

सबसे अच्छा मैं आधे घंटे में कर सकता था, मुझे अभी भी नहीं लगता कि यह पर्याप्त रूप से पता चलता है कि नल महत्वपूर्ण मानों की अनुपस्थिति के कारण हैं TableBया OUTER JOINवास्तव में एक संघ के बजाय एक संघ हैं:

यहां छवि विवरण दर्ज करें


2
प्रश्न INNER और OUTER के बीच अंतर के लिए पूछ रहा है, हालांकि जरूरी नहीं कि बाहरी
जुड़ाव लोल में

@LearnByReading: सही पर मेरी तस्वीर है एक सही बाहरी यानी शामिल होने की जगह TableA a LEFT OUTER JOIN TableB bके साथTableB B RIGHT OUTER JOIN TableA a
onedaywhen

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)LEFT बाहरी जुड़ने के लिए या (Null, b)RIGHT बाहरी सम्मिलित होने के लिए। यह सुनिश्चित करना है कि अंतिम परिणामों में पहली तालिका की सभी पंक्तियाँ मौजूद हैं।

नोट:ON क्लॉज में निर्दिष्ट शर्त कुछ भी हो सकती है, प्राथमिक कीज़ का उपयोग करने की आवश्यकता नहीं है (और आपको दोनों तालिकाओं से हमेशा कॉलम का संदर्भ लेने की आवश्यकता नहीं है)! उदाहरण के लिए:

इनर जॉइन बनाम लेफ्ट आउटर जॉइन


यहां छवि विवरण दर्ज करें

नोट: लेफ्ट जॉइन = लेफ्ट आउटर जॉइन, राइट जॉइन = राइट आउटर जॉइन।


20

सरलतम परिभाषाएँ

इनर जॉइन: रिटर्न दोनों टेबल से रिकॉर्ड से मेल खाता है

पूर्ण आउटर में शामिल हों: रिटर्न मेल खाते हैं और बेजोड़ रिकॉर्ड दोनों तालिकाओं से अशक्त के साथ से बेजोड़ रिकॉर्ड के लिए दोनों टेबल्स

लेफ्ट आउटर ज्वाइन: रिटर्न मैच और बेजोड़ रिकॉर्ड केवल लेफ्ट साइड की टेबल से ।

राइट आउटर जॉइन: रिटर्न राइट्स और बेजोड़ रेकॉर्ड्स केवल राईट साइड पर टेबल से ।

संक्षेप में

मिलान + वाम बेजोड़ + सही बेजोड़ = पूर्ण बाहरी सम्मिलित हों

मिलान + वाम बेजोड़ = बाएं बाहरी जुड़ना

मिलान + सही बेजोड़ = दायाँ बाहरी जुड़ाव

मिलान किया हुआ = भीतरी जुड़ना


1
यह शानदार है और बताती है कि ज्वाइन टाइम सीरीज इंडेक्स के लिए उम्मीद के मुताबिक काम क्यों नहीं करता है। टाइम स्टैम्प एक सेकंड के अलावा बेजोड़ हैं।
yeliabsalohcin

1
@yeliabsalohcin आप इस सवाल पर अपनी टिप्पणी में "उम्मीद के मुताबिक" यहाँ या "काम" नहीं करते हैं। यह सिर्फ कुछ अस्पष्टीकृत व्यक्तिगत गलतफहमी है जो आप दूसरों से अजीब तरह से उम्मीद करते हैं। यदि आप पढ़ते समय शब्दों का ढलान के रूप में व्यवहार करते हैं - स्पष्ट लेखन की गलत व्याख्या करना और / या अस्पष्ट लेखन को स्वीकार करना - जब आप यहां लिख रहे हैं तो आप गलतफहमी की उम्मीद कर सकते हैं। वास्तव में यह यहाँ की तरह स्पष्ट और गलत है। "इनर जॉइन: रिटर्न इन दोनों टेबल से रिकॉर्ड से मेल खाता है" इनपुट कॉलम सेट अलग होने पर गलत है। यह एक निश्चित बात कहने की कोशिश कर रहा है, लेकिन यह नहीं है । (मेरा उत्तर देखें।)
फिलिप्पिक्स २२'१

9

समान्य शब्दों में,

1. INNER JOIN या EQUI JOIN: उन परिणामों को लौटाता है जो दोनों तालिकाओं में केवल स्थिति से मेल खाते हैं।

2. OUTER JOIN: कंडीशन मैच होने या न होने पर भी दोनों टेबलों से सभी मानों का परिणाम लौटाता है।

3. बाईं ओर: बाईं तालिका से सभी मानों का परिणाम लौटाता है और केवल पंक्तियों को दाएं तालिका में स्थिति से मिलाता है।

4. राइट जॉइन: दाएं टेबल से सभी मानों के परिणाम को लौटाता है और केवल उन पंक्तियों को छोड़ता है जो बाएं टेबल में स्थिति से मेल खाती हैं।

5. फुल जॉइन: फुल जॉइन और फुल बाहरी जॉइन समान हैं।


5

SQL में मुख्य रूप से 2 प्रकार के JOIN हैं: [INNER और OUTER]


उदाहरण

मान लें कि आपके पास दो तालिकाएँ हैं, एक एकल स्तंभ के साथ, और डेटा निम्नानुसार है:

A    B
-    -
1    3
2    4
3    5
4    6
7
8

ध्यान दें कि (1,2,7,8) ए के लिए अद्वितीय हैं, (3,4) सामान्य हैं, और (5,6) बी के लिए अद्वितीय हैं।



  • (INNER) JOIN :

INNER JOIN कीवर्ड तब तक दोनों तालिकाओं से सभी पंक्तियों का चयन करता है जब तक कि स्थिति संतुष्ट नहीं हो जाती। यह कीवर्ड दोनों तालिकाओं से सभी पंक्तियों को जोड़कर परिणाम-सेट बनाएगा, जहां स्थिति संतुष्ट करती है अर्थात सामान्य फ़ील्ड का मान समान होगा।

आंतरिक रूप से जुड़ा

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


  • वाम (OUTER) शामिल हों :

यह ज्वाइन टेबल के सभी पंक्तियों को जॉइन के बाईं ओर और रिब के दाईं ओर टेबल के लिए मैचिंग पंक्तियों को मिलाता है। जिन पंक्तियों के लिए दाईं ओर कोई मिलान पंक्ति नहीं है, परिणाम-सेट में अशक्त होगा। बाईं ओर के रूप में भी जाना जाता है 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


  • राइट (OUTER) JOIN : राइट टेबल से सभी रिकॉर्ड लौटाता है, और बाईं टेबल से मिलान रिकॉर्ड करता है

राइट जॉइन / राइट ऑउट जॉइन

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


  • पूर्ण (OUTER) जोइन :

    पूर्ण जॉइन LEFT JOIN और RIGHT JOIN दोनों के परिणाम को मिलाकर परिणाम-सेट बनाता है। परिणाम-सेट में दोनों तालिकाओं से सभी पंक्तियाँ होंगी। जिन पंक्तियों के लिए कोई मेल नहीं है, परिणाम-सेट में NULL मान होंगे।

फुल जॉय / फुल ऑवर जॉय

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 तालिकाओं में कैसे शामिल होते हैं? आपको कॉलम प्राथमिक या विदेशी कुंजी या कुछ सामान्य फ़ील्ड की आवश्यकता होगी ताकि आप इसमें शामिल हो सकें। मैं सोच रहा हूं कि आपने इस जवाब को क्यों ठुकरा दिया। और Venn आरेख यह समझाने का स्रोत है कि SQL JOIN कैसे काम करता है। क्या आपके पास जोड़ों का प्रतिनिधित्व करने के लिए कोई बेहतर उदाहरण है? यदि नहीं, तो कृपया इसे बढ़ाएं, ताकि लोगों को बेहतर समाधान मिल सके। धन्यवाद।
मयूर

आप पोस्ट में आरेख डाल रहे हैं। आरेखों के लिए किंवदंती क्या है? - प्रत्येक सेट के तत्व क्या हैं? और इस तथ्य के बारे में क्या है कि टेबल बैग सेट नहीं हैं? तुम मत कहो एक चीज़ जो वे सेट नहीं कर रहे हैं, वह लेबल प्रति A & B की पंक्तियाँ हैं। इस पेज पर पोस्ट पर मेरी टिप्पणी देखें। यह पोस्ट कहीं और देखा गया गलत उपयोग दोहराता है लेकिन समझा या पूछताछ नहीं की जाती है। साथ ही आपके द्वारा पाठ में बताई गई बातें अस्पष्ट और गलत हैं। इसके अलावा यह यहाँ पहले से ही कई उत्तरों के लिए कुछ नहीं जोड़ता है। (हालांकि लगभग सभी काफी गरीब हैं।) पीएस कृपया संपादन के माध्यम से स्पष्ट करें, टिप्पणी नहीं।
philipxy

FK को जुड़ने या क्वेरी करने की आवश्यकता नहीं है। किसी भी 2 टेबल को किसी भी शर्त पर अपने कॉलम में शामिल किया जा सकता है और बिना किसी बाधा, ट्रिगर या अभिकथन के शामिल किया जा सकता है।
दार्शनिक

3
  • आंतरिक रूप से जुड़ा - दोनों में से किसी एक समतुल्य क्वेरी का उपयोग करके एक इनर जॉइन दो टेबल , यानी दो पंक्तियों को एक दूसरे से जोड़ने का कार्य देता है ।

  • वाम बाहरी में शामिल होने के - एक बाहरी छोड़ दिया में शामिल होने बी में एक की सभी पंक्तियों के साथ ही आम पंक्तियों दे देंगे

  • पूर्ण बाहरी जुड़ाव - एक पूर्ण बाहरी जुड़ाव आपको A और B का मिलन प्रदान करेगा, अर्थात A में सभी पंक्तियाँ और B में सभी पंक्तियाँ। यदि A में किसी चीज़ में B की संगत डेटम नहीं है, तो B भाग है अशक्त, और इसके विपरीत


1
यह गलत और अस्पष्ट दोनों है। जब तक तालिकाओं में समान कॉलम हों, तब तक जुड़ना एक चौराहा नहीं है। बाहरी जोड़ A या B की पंक्तियाँ नहीं हैं जब तक कि उनके समान स्तंभ न हों, उस स्थिति में नल नहीं जोड़े जाते हैं। आप कुछ कहना चाह रहे हैं, लेकिन आप यह नहीं कह रहे हैं। आप सही या स्पष्ट रूप से नहीं समझा रहे हैं।
फिलीपिक्सी

@philipxy: आपके कथन पर सहमत Join is not an intersection unless the tables have the same columnsनहीं। आप जो भी कॉलम चाहते हैं, उसमें शामिल हो सकते हैं और यदि मान मेल खाते हैं, तो वे एक साथ जुड़ेंगे।
सुसाइडशीप

वह टिप्पणी उतनी ही अस्पष्ट है जितना आपका उत्तर। (मुझे लगता है कि आप कुछ सोच रहे होंगे, परिणाम के सामान्य कॉलम के लिए सबरो वैल्यू का सेट प्रत्येक इनपुट के कॉमन कॉलम के लिए सबरो वैल्यू के सेट का प्रतिच्छेदन है; लेकिन ऐसा आपने नहीं लिखा है।) स्पष्ट नहीं हैं।)
दीक्षा

मेरा मतलब यह था कि जुड़ाव केवल इनपुट का एक अंतर है जब यह एक ही कॉलम के साथ इनपुट का एक प्राकृतिक आंतरिक जुड़ाव है। आप "चौराहे" और "संघ" शब्दों का गलत तरीके से उपयोग कर रहे हैं।
दर्शन

3

1. इनर ज्वाइन: जिसे जॉइन कहा जाता है। यह दोनों तालिका में मौजूद पंक्तियों को और दाएं तालिका को मैच होने पर ही लौटाता है । अन्यथा, यह शून्य रिकॉर्ड लौटाता है।

उदाहरण:

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

output1

2. फुल ऑउट जॉइन: इसे फुल जॉइन भी कहा जाता है। यह सभी पंक्तियों को लौटाता है लेफ्ट टेबल और राइट टेबल दोनों में मौजूद ।

उदाहरण:

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

output2

3. बायां बाहरी हिस्सा: या बस लेफ्ट जॉइन कहा जाता है। यह बाईं तालिका में मौजूद सभी पंक्तियों और दाएं तालिका (यदि कोई हो) से मेल खाती पंक्तियों को लौटाता है।

4. राइट आउटर जॉइन: राइट जॉइन भी कहा जाता है। यह बाईं तालिका (यदि हो तो), और दाएं तालिका में मौजूद सभी पंक्तियों से मेल खाती पंक्तियाँ लौटाता है।

मिलती है

जुड़ने के फायदे

  1. तेजी से होता है।

2
यह केवल तभी सही होता है जब तालिकाओं में समान कॉलम सेट हो। (यह अंतर-अंतर्ज्ञान को चौराहे से जोड़कर भ्रमित करता है और संघ से पूर्ण रूप से जुड़ जाता है।) इसके अलावा "मैच" अपरिभाषित है। मेरी अन्य टिप्पणियाँ पढ़ें।
दार्शनिक

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

आंतरिक रूप से जुड़ा:

ज्यादातर sql प्रश्नों में सिर्फ JOIN के रूप में लिखा गया है । यह केवल तालिकाओं के बीच मिलान रिकॉर्ड लौटाता है।

सभी कर्मचारियों और उनके विभाग के नामों का पता लगाएं:

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 से मुद्रित नहीं किया गया है क्योंकि यह विभाग तालिका में मेल नहीं खाता है। इसी तरह, और विभाग तालिका से पंक्तियों को मुद्रित नहीं किया जाता है क्योंकि उन्हें एम्प तालिका में एक मैच नहीं मिला है।6HRR&D

तो, INNER JOIN करें या केवल JOIN करें, केवल मेल खाने वाली पंक्तियों को लौटाता है।

बाँया जोड़ :

यह LEFT तालिका से सभी रिकॉर्ड लौटाता है और RIGHT तालिका से केवल मिलान रिकॉर्ड करता है।

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    

इसलिए, यदि आप उपरोक्त आउटपुट का निरीक्षण करते हैं, तो LEFT तालिका (Emp) से सभी रिकॉर्ड राइट टेबल से सिर्फ मिलान रिकॉर्ड के साथ मुद्रित होते हैं।

HRऔर विभाग की तालिका R&Dसे पंक्तियों को मुद्रित नहीं किया जाता है क्योंकि उन्हें डेप_आईडी पर एम्प तालिका में एक मैच नहीं मिला है।

तो, बाईं ज्वाइंट लेफ्ट टेबल से सभी पंक्तियों को वापस करता है और केवल राइट टेबल से पंक्तियों का मिलान करता है।

यहां डेमो भी चेक कर सकते हैं


2

सामान्य विचार

कृपया मार्टिन स्मिथ द्वारा अलग-अलग जोड़ों के बेहतर उदाहरणों और स्पष्टीकरणों सहित, और विशेष रूप से , और , के बीच के अंतर के जवाब को देखें ।FULL OUTER JOINRIGHT OUTER JOINLEFT 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

बाँया जोड़

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

citizenअगर मैच नहीं होंगे तब भी परिणाम सब कुछ होगा postalcode। फिर से एक JOINशर्त की आवश्यकता है:

LeftJoinResult

खेलने के लिए डेटा

सभी उदाहरण ओरेकल 18 सी पर चलाए गए हैं। वे 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 JOINNULL

आंतरिक रूप से जुड़ा

INNER JOINएक कार्टेशियन उत्पाद बन जाता है। यह सामान्य विचार के समान है CROSS JOIN:

SELECT *
  FROM citizen    c
  JOIN postalcode p ON 1 = 1  -- < -- The ON condition makes it a CROSS JOIN

यह वह जगह है जहां आंतरिक जुड़ाव को वास्तव में देखा जा सकता है क्योंकि हटाए गए शर्त से मेल नहीं खाते परिणामों के साथ क्रॉस में शामिल हो सकते हैं। यहां परिणामी पंक्तियों में से कोई भी हटाया नहीं गया है।

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

वेन आरेख के साथ परेशानी

"साइकल जॉइन क्रॉस इनर आउटर" पर एक छवि इंटरनेट खोज वेन आरेखों की भीड़ को दिखाएगी। मेरे पास मेरी डेस्क पर एक मुद्रित प्रति होती थी। लेकिन प्रतिनिधित्व के साथ मुद्दे हैं।

वेन आरेख सेट सिद्धांत के लिए उत्कृष्ट हैं, जहां एक तत्व एक या दोनों सेट में हो सकता है। लेकिन डेटाबेस के लिए, एक "सेट" में एक तत्व मुझे लगता है, एक तालिका में एक पंक्ति होने के लिए, और इसलिए किसी अन्य तालिका में भी मौजूद नहीं है। कई तालिकाओं में मौजूद एक पंक्ति जैसी कोई चीज नहीं है। एक पंक्ति तालिका के लिए अद्वितीय है।

आत्म जुड़ाव एक कोने का मामला है जहां प्रत्येक तत्व वास्तव में दोनों सेटों में समान है। लेकिन यह अभी भी नीचे के किसी भी मुद्दे से मुक्त नहीं है।

सेट Aबाईं ओर ( citizenतालिका) पर सेट का प्रतिनिधित्व करता Bहै और सेट postalcodeनीचे चर्चा में दाईं ओर ( तालिका) पर सेट है ।

क्रोस जॉइन

दोनों सेटों में हर तत्व दूसरे सेट में हर तत्व के साथ मेल खाता है, जिसका अर्थ है कि हमें कार्टेसियन उत्पाद का सही प्रतिनिधित्व करने के लिए हर तत्व की Aमात्रा और हर Bतत्व की मात्रा की आवश्यकता है । सेट सिद्धांत एक सेट में कई समान तत्वों के लिए नहीं बनाया गया है, इसलिए मैं वेन आरेखों को उचित रूप से अव्यवहारिक / असंभव का प्रतिनिधित्व करने के लिए पाता हूं। ऐसा लगता नहीं हैBAUNION बिल्कुल फिट बैठता है।

पंक्तियाँ अलग हैं। 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:

LeftJoinIntersection - भरा हुआ

जहां खंड - समझ में आता है

CROSS JOINस्मिथ के साथ सभी पंक्तियों को खोजना और चंद्रमा पर पोस्टलकोड:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   AND p.area = 'Moon';

कहाँ - परिणाम

अब वेन आरेख को प्रतिबिंबित करने के लिए उपयोग नहीं किया जाता है JOIN। इसका उपयोग केवलWHERE खंड के लिए किया जाता है :

कहाँ पे

..और जो समझ में आता है।

जब इंटरसेक्ट और यूनिअन समझ में आता है

INTERSECT

जैसा कि समझाया गया 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 से परिणाम की संरचना समान होती है, जिससे तुलना या मिलन सक्षम होता है। इन दोनों के परिणाम सक्षम नहीं होंगे:

SELECT *
  FROM citizen
 WHERE name = 'Smith'
SELECT *
  FROM postalcode
 WHERE area = 'Moon';

.. के साथ परिणाम गठबंधन करने की कोशिश कर UNIONएक देता है

ORA-01790: expression must have same datatype as corresponding expression

आगे की रुचि के लिए, वेन आरेख के रूप में वीएन डायग्राम्स को ना कहना पढ़ें और वीएन डायग्राम के रूप में एसक्यूएल जुड़ता है । दोनों को भी कवर किया EXCEPT


1

बहुत ही सटीक संबंधपरक बीजगणित उदाहरणों के साथ यहां बहुत सारे अच्छे उत्तर हैं। यहाँ एक बहुत ही सरल उत्तर है जो SQL कोडिंग दुविधाओं के साथ शौकिया या नौसिखिए कोडर के लिए सहायक हो सकता है।

मूल रूप से, अधिक बार नहीं, JOINदो मामलों में सवाल उबलते हैं:

एक के लिए SELECTडेटा के सबसेट A:

  • का उपयोग INNER JOINकरते समय संबंधित डेटा Bआप देख रहे हैं MUST डेटाबेस डिजाइन प्रति मौजूद है;
  • LEFT JOINजब Bआप संबंधित डेटा को MIGHT या MIGHT के लिए देख रहे हों , तब उपयोग न करें , जो प्रति डेटाबेस डिज़ाइन में मौजूद नहीं है।

1

के बीच का अंतर inner joinऔर outer joinइस प्रकार है:

  1. Inner joinएक जुड़ाव है जो संयुक्त मिलानों के आधार पर संयुक्त तालिकाओं का है, जबकि outer joinएक ऐसा जोड़ है जो संयुक्त और बेमेल दोनों युग्मों के आधार पर संयुक्त तालिका है।
  2. Inner joinमर्ज दो तालिका से पंक्ति से मेल खाती है जिसमें बेजोड़ पंक्ति छोड़ दी outer joinजाती है , जबकि दो तालिकाओं और बेजोड़ पंक्तियों के विलय से शून्य मान भर जाता है।
  3. Inner joinएक चौराहे ऑपरेशन outer joinकी तरह है , जबकि एक यूनियन ऑपरेशन की तरह है।
  4. Inner joinदो प्रकार है, जबकि outer joinतीन प्रकार हैं।
  5. outer joinसे तेज है inner join

1
एक बाहरी जॉइन रिजल्ट इनर जॉइन के समान है, लेकिन साथ ही कुछ अतिरिक्त पंक्तियां भी हैं, इसलिए मुझे नहीं पता कि आपको क्यों लगता है कि बाहरी जॉइन तेजी से होगा। इसके अलावा ये "दो प्रकार" के आंतरिक जुड़ाव क्या हैं? मुझे लगता है कि आप बाहरी के लिए पूर्ण, बाएं और दाएं का उल्लेख कर रहे हैं?
मार्टिन स्मिथ

1
@ M.achaibou कृपया ऐसे संपादन न करें जो अनावश्यक प्रारूप में बदलाव करते हैं। ऑपरेटरों के नाम कोड नहीं हैं जब तक कि वे कोड में उपयोग नहीं किए जाते हैं। कृपया अर्थ पोस्ट करने के लिए बदलाव न करें, लेखक पर टिप्पणी पोस्ट करें। यदि आपके पास प्रतिनिधि नहीं है तो आप तब तक प्रतीक्षा करें जब तक आप ऐसा न करें। ऐसा होता है कि पोस्टर ने इसे मंजूरी दे दी है लेकिन कृपया ऐसे संपादन न करें। PS Outer join भीतरी जुड़ाव से तेज नहीं है।
philipxy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.