सवाल "इनर जॉइन" और "बाहरी जॉइन" के बीच क्या अंतर है?


यह भी कैसे करें LEFT JOIN, RIGHT JOIN तथा FULL JOIN में फिट?


4018
2017-09-01 22:36


मूल


उत्तर और टिप्पणियों और नीचे उनके संदर्भों में से केवल एक वास्तव में बताता है कि कैसे वेन आरेख ऑपरेटरों का प्रतिनिधित्व करते हैं: सर्कल चौराहे क्षेत्र एक जॉइन बी में पंक्तियों के सेट का प्रतिनिधित्व करता है। प्रत्येक सर्कल के लिए अद्वितीय क्षेत्र आपकी तालिका की पंक्तियों को ले कर प्राप्त पंक्तियों के सेट का प्रतिनिधित्व करता है जो एक जॉइन बी में भाग नहीं लेते हैं और सभी तालिकाओं के लिए अद्वितीय कॉलम को सभी को न्यूल में जोड़ना। (और अधिकांश ए और बी के लिए सर्किलों का एक अस्पष्ट फर्जी पत्राचार देते हैं) - philipxy
बहुत सारे उत्तर पहले ही उपलब्ध कराए गए हैं लेकिन मैंने इस ट्यूटोरियल का उल्लेख नहीं किया है। यदि आप वेन आरेखों को जानते हैं, तो यह एक महान ट्यूटोरियल है: blog.codinghorror.com/a-visual-explanation-of-sql-joins  मेरे लिए, यह एक त्वरित पढ़ने के लिए पर्याप्त संक्षिप्त है लेकिन अभी भी पूरी अवधारणा को समझता है और सभी मामलों को बहुत अच्छी तरह से काम करता है। यदि आपको नहीं पता कि वेन आरेख क्या हैं - उन्हें सीखें। ऐसा करने में 5-10 मिनट लगते हैं और जब भी आपको सेट पर काम करने और संचालन के संचालन के साथ काम करने की कल्पना करने की आवश्यकता होती है तो मदद मिलेगी। - DanteTheSmith
@DanteThemith नो, जो यहां चित्रों के समान समस्याओं से ग्रस्त है। प्रश्न के ऊपर मेरी टिप्पणी देखें और उस ब्लॉग पोस्ट के नीचे: "जेफ ने अपने ब्लॉग को टिप्पणियों में कुछ पेजों को अस्वीकार कर दिया"। वेन आरेख सेट में तत्व दिखाते हैं। बस यह निर्धारित करने की कोशिश करें कि सेट क्या हैं और इन आरेखों में तत्व क्या हैं। सेट नहीं कर रहे हैं टेबल और तत्व नहीं कर रहे हैं उनकी पंक्तियां इसके अलावा किसी भी दो टेबल में शामिल किया जा सकता है, इसलिए पीके और एफके असुरक्षित हैं। सब जाली। आप बस इतना कर रहे हैं कि हजारों अन्य ने क्या किया है - एक मिला अस्पष्ट प्रभाव आप (गलत तरीके से) मान लीजिये समझ में आता है। - philipxy
क्या कोई टाइम सीरीज़ अनुक्रमित डेटा के संदर्भ में इसका उत्तर दे सकता है - आंतरिक और बाहरी जोड़ों में अक्सर मानव-वेन अर्थ में काम नहीं होता है जब समय-टिकटों की बात आती है जो केवल मिलीसेकंड से अलग होती हैं। - yeliabsalohcin
@yeliabsalohcin इस पृष्ठ पर मेरी टिप्पणियां पढ़ें (और मेरा जवाब)। यदि कोई डुप्लिकेट पंक्तियां नहीं हैं तो वेन आरेख चित्रित करते हैं अंतर बाहरी और सहज जुड़ने वालों के बीच, इसलिए वे बाहरी जोड़ों को चित्रित करते हैं के अनुसार आंतरिक जुड़ता है और इसके विपरीत अगर आप जानते हैं कि वे क्या करते हैं। लेकिन वेन आरेख नहीं यह बताएं कि बाहरी जुड़ाव या आंतरिक वापसी में क्या शामिल है उनके इनपुट के संदर्भ में सिवाय इसके कि जब इनपुट में कोई डुप्लिकेट पंक्ति नहीं होती है और समान कॉलम होते हैं। (यदि आपके पास कोई अलग प्रश्न है, तो इसे एक प्रश्न के रूप में पोस्ट करें। अनुप्रयोग कोई फर्क नहीं पड़ता। "मेलिंग" मामलों, जो डेटा प्रकारों और मोडों पर निर्भर करते हैं।) - philipxy


जवाब:


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

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

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

उदाहरण

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

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

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

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

समकक्ष प्रश्नों में से किसी एक का उपयोग करने में एक आंतरिक शामिल होने से दो तालिकाओं का चौराहे मिलता है, यानी वे दो पंक्तियां आम हैं।

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

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

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

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

सही बाहरी शामिल हों

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

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

5428
2017-09-01 22:59



तालिका 4 में मूल्य बी के साथ एक और पंक्ति जोड़कर उदाहरण को बढ़ाने के लिए अच्छा होगा। इससे पता चलता है कि आंतरिक जोड़ों को पंक्तियों के बराबर नहीं होना चाहिए। - softveda
एक उत्कृष्ट स्पष्टीकरण, हालांकि यह बयान: ए और बी का बाहरी हिस्सा एक यूनियन बी के परिणाम देता है, यानी वेन आरेख संघ के बाहरी हिस्सों। सटीक रूप से phrased नहीं है। एक बाहरी जुड़ाव निम्नलिखित में से किसी एक के अलावा एक अंतरण बी के परिणाम देगा: सभी ए (बाएं शामिल), बी के सभी (दाएं शामिल) या सभी ए और सभी बी (पूर्ण शामिल)। केवल यह आखिरी परिदृश्य वास्तव में एक संघ बी है। फिर भी, एक अच्छी तरह से लिखित स्पष्टीकरण। - Thomas
प्रो जवाब! अच्छा लगा। बीटीडब्ल्यू: मुझे अभी भी बाइट जॉइन और बाएं आउटर जॉइन इत्यादि में अंतर नहीं मिल रहा है। यदि यह प्रश्न का हिस्सा नहीं है तो मैं एक नया पोस्ट कर सकता हूं :) - YvesR
क्या मैं सही हूं कि पूर्ण जॉइन पूर्ण बाहरी जॉइन का एक उपनाम है और बाएं जॉइन बाएं बाहरी जॉइन का उपनाम है? - Damian
@ अमेर, धन्यवाद। शामिल हों ऑर्डर की गारंटी नहीं देता है, आपको क्लॉज द्वारा ऑर्डर जोड़ना होगा। - Mark Harrison


इसके अलावा आप विभिन्न प्रकार के प्रकारों के लिए निम्न स्कीमा पर विचार कर सकते हैं;

visual explanation of joins

स्रोत: दृश्य-प्रतिनिधित्व के- एसक्यूएल-में शामिल विस्तार से समझाया C.L. मोफ़ात


2443
2018-05-16 23:03



नोट: MySQL में कोई पूर्ण बाहरी जॉइन नहीं है। stackoverflow.com/questions/12473210/... - Michael Ozeryansky
मुझे लगता है कि यह चित्र मानता है कि कोई डुप्लिकेट नहीं है Key, मतलब Key अनोखा है। अगर Key अद्वितीय नहीं था, मुझे लगता है कि परिणाम एक क्रॉस होगा और वापसी की गणना ए के आकार की तुलना में काफी अधिक होगी। - AlikElzin-kilaka
छेड़छाड़ के भाग के साथ पूर्ण बाहरी जॉइन उदाहरण में, 'एके आईएस नल' का उपयोग नहीं करेगा, ए से सभी पंक्तियों को बाहर कर देगा क्योंकि यदि कुंजी शून्य है तो परिभाषा के अनुसार पंक्ति मौजूद नहीं है? मैं नहीं देख रहा हूं कि यह तंत्र दिखाए गए वीएनएन आरेख के परिणामों को कैसे प्राप्त करता है। - Kelly S. French
@ केलीसफ्रेंच प्रश्न और अन्य उत्तरों पर मेरी टिप्पणियां देखें कि वेन आरेखों को कैसे पढ़ा जाए। जोन टेबल ए और बी से पंक्तियां संलग्न नहीं करते हैं। वे ए से एक पंक्ति जोड़ने और बी से एक पंक्ति को जोड़ने से बना कुछ पंक्तियां संलग्न करते हैं, जो चयन कथन के आउटपुट की भी पंक्तियां नहीं हैं। वेन आरेख जवाब सभी गरीब हैं। - philipxy
ए सभी का प्रतिनिधित्व करता है क्षमता टेबल ए से आने वाली पंक्तियां, बी सभी का प्रतिनिधित्व करती है क्षमता टेबल बी से आने वाली पंक्तियां। आरेख चिह्न में लाल जोन इन पंक्तियों में से कौन सा परिणाम वास्तव में परिणाम सेट में शामिल किया जाएगा। ध्यान दें कि कई (और अक्सर) कई और हो सकते हैं क्षमता उस तालिका में वास्तव में पंक्तियों की तुलना में एक मेज से आने वाली पंक्तियां। ऐसा इसलिए है क्योंकि tableA में कोई भी पंक्ति होगी संभावित टेबलबी में प्रत्येक पंक्ति के लिए एक बार होता है जो इसका संदर्भ देता है। इसे कहा जाता है कार्तीय गुणन। - Stijn de Witt


मेरा सुझाव है जेफ का ब्लॉग आलेख। सबसे अच्छा वर्णन मैंने कभी देखा है, साथ ही एक विज़ुअलाइजेशन भी है, उदाहरण:

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

enter image description here

पूर्ण बाहरी शामिल हों:

enter image description here


591
2017-08-30 11:52



यह चित्र अवधारणा के लिए थोड़ा भ्रामक है। पोस्ट में टिप्पणियां भी पढ़ें। - softveda
@ ya23: पूर्ण बाहरी शामिल होने से आपका क्या मतलब है? - ursitesion
इसके अलावा जेफ repudiates उनके ब्लॉग में टिप्पणियों में कुछ पेज नीचे दिए गए हैं: "कमेंटर्स यह इंगित करते हैं कि एकाधिक और डुप्लिकेट परिणामों के मामले में चित्र टूट जाते हैं, बिल्कुल सही हैं। मैं वास्तव में प्राथमिक कुंजी के साथ जुड़ने की सोच रहा था, जो अद्वितीय हो जाता है परिभाषा, यद्यपि उदाहरण इस तरह व्यक्त नहीं किए गए हैं। कार्टेसियन या क्रॉस उत्पाद की तरह, जो कुछ भी मूल रूप से शुरू होने की तुलना में अधिक पंक्तियों में होता है, वह पूरी तरह से पूरे वेन आरेख अवधारणा को तोड़ देता है। इसलिए इसे ध्यान में रखें। " - philipxy
@philipxy हाँ वेन आरेख समानता केवल NULLs को अनदेखा करने के बाद प्राथमिक कुंजी के लिए काम करता है- यह अक्सर नहीं कहा जाता है। वेन आरेख इस बात की व्याख्या करने में मदद नहीं करते हैं कि परिणामी सेट में अन्य कॉलम एनयूएलएल से कैसे भरे हुए हैं। - Galax
@ गैलेक्स दुर्भाग्यवश, क्या जॉइन कुंजी पर हैं (अकेले प्राथमिक कुंजी दें) आरेखों को समझने में मदद नहीं करते हैं। (भले ही मैंने जेफ को यह कहते हुए उद्धृत किया कि वह सोचता है कि यह करता है।) (मैं समझ नहीं पा रहा हूं कि "एनयूएलएल को अनदेखा करने के बाद प्राथमिक कुंजी के लिए काम करता है" या "परिणामस्वरूप सेट में अन्य कॉलम एनयूएलएल से भरे हुए हैं"। मुझे और पता है या कम तरह जिस चीज को आप कहने की कोशिश कर रहे हैं लेकिन कोई पत्राचार है लेकिन सवाल पर मेरी टिप्पणी में से एक है जटिल और एक है स्पष्ट स्पष्टीकरण। हालांकि मैं एक का स्वागत करता हूं। ठीक ठीक क्या समूहित किया जा रहा है किस तरह सर्कल से? - philipxy


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

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

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

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

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

मैं एक एनिमेटेड संस्करण के साथ शुरू कर दूंगा पूर्ण बाहरी शामिल हों। आगे स्पष्टीकरण निम्नानुसार है।

enter image description here


व्याख्या

स्रोत सारणी

enter link description here

पहले के साथ शुरू करो CROSS JOIN (एकेए कार्टेशियन उत्पाद)। इसमें कोई नहीं है ON खंड और बस दो तालिकाओं से पंक्तियों के हर संयोजन देता है।

एक क्रॉस जॉइन बी से एक रंग, बी। रंग चुनें

enter link description here

आंतरिक और बाहरी जुड़ने के लिए "चालू" खंड अनुमानित होता है।

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

कुछ उदाहरण

ए। कोलोर, बी। कोलर = बी। कोलोर पर बी में शामिल हों।

उपरोक्त क्लासिक इक्की शामिल है।

Inner Join

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

enter image description here

ए। कोलोर, बी। इनरर से बी में शामिल हों ए। कॉलोर इन नहीं ('ग्रीन', 'ब्लू')

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

inner 2

ए.कॉलर, बी। 1 से 1 में एक इंटर्नर बी बी से चुनें

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

AColour = B.Colour पर एक बाएं बाहरी जॉइन बी से एक रंग, बी। रंग चुनें।

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

LOJ

एकोलर, बी। कोलोर पर एक बाएं बाहरी जॉइन बी से चुनें। बी.कॉलर जहां बी.कॉलर न्यूल है

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

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

loj is null

एकोलर, बी। कोलोर पर एक सही आउटर बी बी से चुनें।

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

ROJ

एकोलर, बी। कोलोर पर एक पूर्ण बाहरी जॉइन बी से बी। सेलर, बी। रंग चुनें

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

FOJ

ए। कोलोर, बी। 1 से 0 पर एक पूर्ण बाहरी जॉइन बी से रंग चुनें

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

FOJ 2

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

एक मामूली पूछताछ में मामूली संशोधन के साथ एक अनुकरण कर सकता है UNION ALL दो टेबलों में से।

UNION ALL

एकोलर, बी। कोलोर पर एक बाएं बाहरी जॉइन बी से चुनें। बी.कॉलर जहां बी.कोलर = 'ग्रीन'

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

LOJ

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

LOJtoInner 

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

एकोलर, बी। कोलोर और बी। कोलोर = 'ग्रीन' पर एक बाएं बाहरी जॉइन बी से बी। कॉलोर, बी रंग चुनें।

enter image description here

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

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


529
2017-12-13 11:58



मैं कहूंगा कि यह मेरे लिए लगभग और साथ ही वेन आरेखों के लिए भी काम नहीं करता है, लेकिन मैं सराहना करता हूं कि लोग अलग-अलग होते हैं और अलग-अलग सीखते हैं और यह किसी भी तरह से मैंने देखा है जैसा कि एक बहुत अच्छी तरह से प्रस्तुत स्पष्टीकरण है, इसलिए मैं @ypercube का समर्थन करता हूं बोनस अंक प्रदान करना। जॉइन क्लॉज बनाम WHERE क्लॉज में अतिरिक्त स्थितियों को डालने के अंतर को समझाते हुए भी अच्छा काम है। आप के लिए कुडोस, मार्टिन स्मिथ। - Old Pro
@ ओल्डप्रो वेन आरेख ठीक है, जहां तक ​​वे मानते हैं, लेकिन वे एक क्रॉस जॉइन का प्रतिनिधित्व करने के तरीके पर चुप हैं, या एक तरह से जुड़ने वाले भविष्य जैसे कि इक्की से दूसरे में शामिल होने के बारे में चुप हैं। क्रॉस की प्रत्येक पंक्ति पर शामिल होने का अनुमान लगाने का मानसिक मॉडल परिणामस्वरूप शामिल हो जाता है, फिर बेजोड़ पंक्तियों में वापस जोड़ना अगर बाहरी शामिल हो और आखिर में मेरे लिए बेहतर काम करने का मूल्यांकन किया जाए। - Martin Smith
वेन आरेख संघों और चौराहे और मतभेदों का प्रतिनिधित्व करने के लिए अच्छे हैं लेकिन शामिल नहीं हैं। उनके पास बहुत ही सरल जुड़ने के लिए कुछ मामूली शैक्षिक मूल्य है, यानी उन जोड़ों में शामिल हों जहां शामिल होने की स्थिति अद्वितीय कॉलम पर है। - ypercubeᵀᴹ
@ अर्थ - नहीं, आप गलत हैं। एसक्यूएल फिडल sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 यह कुछ ऐसा है जो वेन आरेख चित्रित नहीं कर सकते हैं। - Martin Smith
@ मार्टिनस्मिथ वाह, मैं सहमत हूं, मैं पूरी तरह से गलत हूँ! बहुत से लोगों के साथ काम करने के लिए बहुत उपयोग किया जाता है .. सुधार के लिए धन्यवाद। - Arth


निम्नलिखित लेख से लिया गया था "MySQL - बाएं जॉइन और दाएं जॉइन, अंदरूनी जॉइन और बाहरी जॉइन"ग्राहम एलिस द्वारा उनके ब्लॉग हॉर्स मुथ पर।

MySQL जैसे डेटाबेस में, डेटा को कई तालिकाओं में विभाजित किया जाता है जो तब जुड़े होते हैं (Joined) एक साथ JOIN में SELECT एकाधिक तालिकाओं से रिकॉर्ड पढ़ने के लिए आदेश। यह उदाहरण यह देखने के लिए पढ़ें कि यह कैसे काम करता है।

सबसे पहले, कुछ नमूना डेटा:

people
    mysql> select * from people;
    +------------+--------------+------+
    | name       | phone        | pid  |
    +------------+--------------+------+
    | Mr Brown   | 01225 708225 |    1 |
    | Miss Smith | 01225 899360 |    2 |
    | Mr Pullen  | 01380 724040 |    3 |
    +------------+--------------+------+
    3 rows in set (0.00 sec)

property
    mysql> select * from property;
    +------+------+----------------------+
    | pid  | spid | selling              |
    +------+------+----------------------+
    |    1 |    1 | Old House Farm       |
    |    3 |    2 | The Willows          |
    |    3 |    3 | Tall Trees           |
    |    3 |    4 | The Melksham Florist |
    |    4 |    5 | Dun Roamin           |
    +------+------+----------------------+
    5 rows in set (0.00 sec)

नियमित जॉइन

यदि हम नियमित रूप से जॉइन करते हैं (किसी भी कीवर्ड में INNER, आउटर, बाएं या दाएं) के साथ, तो हमें दो रिकॉर्डों में उचित तरीके से मेल खाने वाले सभी रिकॉर्ड मिलते हैं, और इनकमिंग टेबलों में रिकॉर्ड जो मेल नहीं खाते हैं, की रिपोर्ट नहीं की जाती है :

mysql> select name, phone, selling 
from people join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
4 rows in set (0.01 sec)

बाँया जोड़

यदि हम एक बाएं जॉइन करते हैं, तो हमें सभी रिकॉर्ड मिलते हैं जो एक ही तरीके से मेल खाते हैं और अतिरिक्त में हमें शामिल होने की बाएं तालिका में प्रत्येक बेजोड़ रिकॉर्ड के लिए एक अतिरिक्त रिकॉर्ड मिलता है - इस प्रकार सुनिश्चित करना (इस उदाहरण में) कि प्रत्येक व्यक्ति का उल्लेख हो :

   mysql> select name, phone, selling 
    from people left join property 
    on people.pid = property.pid; 
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL <<-- unmatch    |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    5 rows in set (0.00 sec)

सही जॉइन

अगर हम सही जुड़ाव करते हैं, तो हम सभी रिकॉर्ड प्राप्त करते हैं और जोड़ों में शामिल होने की सही तालिका में प्रत्येक बेजोड़ रिकॉर्ड के लिए एक अतिरिक्त रिकॉर्ड - मेरे उदाहरण में, इसका मतलब है कि प्रत्येक संपत्ति का उल्लेख होता है भले ही हम नहीं करते विक्रेता विवरण है:

mysql> select name, phone, selling 
from people right join property 
on people.pid = property.pid;
+-----------+--------------+----------------------+
| name      | phone        | selling              |
+-----------+--------------+----------------------+
| Mr Brown  | 01225 708225 | Old House Farm       |
| Mr Pullen | 01380 724040 | The Willows          |
| Mr Pullen | 01380 724040 | Tall Trees           |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL      | NULL         | Dun Roamin           |
+-----------+--------------+----------------------+
5 rows in set (0.00 sec)

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


291
2018-02-14 05:53



REGULAR JOIN तथा INNER JOIN वही बात है क्या ग्राहम एलिस सफेद कहना चाहता था REGULAR यह है कि अंदरूनी जॉइन "डिफ़ॉल्ट" जॉइन है, जब कोई भी नहीं LEFT या RIGHT कीवर्ड निर्दिष्ट थे। यदि आप पूरी पोस्ट पढ़ते हैं, तो अंत में वह कहता है "एक इंटर्न जॉइन एक पूर्ण जुड़ाव करता है, जैसा कि पहले उदाहरण की तरह है, और पिछले दो उदाहरणों में शब्द बाएं या दाएं शब्द के बाद शब्द जोड़ा जा सकता है - यह ओडीबीसी के लिए प्रदान किया जाता है संगतता और अतिरिक्त क्षमताओं को जोड़ नहीं है। " - vegatripy
उन लोगों के लिए जो भ्रमित हैं pid तथा spid, pid "व्यक्ति आईडी" के लिए खड़ा है, और spid "बिक्री संपत्ति आईडी" के लिए खड़ा है। - Andrew Grimm
क्या होगा यदि हम केवल श्री ब्रौन, मिस स्मिथ और श्री पुलेन का चयन करना चाहते हैं? - Fortune
@ फोर्ट्यून का चयन करें (पंक्तियां हैं name उनमें से एक के बराबर) क्या से? यह आंतरिक और बाहरी जुड़ने के बीच के अंतर से कैसे संबंधित है? - philipxy
कई जवाब एक के बारे में नहीं सोचते हैं - बहुतायत की स्थिति, और यह किसी को गुमराह कर देगा, आपका जवाब बेहतर है! - rocket1037


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

मिलान की गई पंक्तियों को केवल पुनर्प्राप्त करें, यानी, A intersect B

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

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

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

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

पूर्ण बाहरी शामिल हों

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

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

संदर्भ


114
2018-01-27 12:16



उपकरण का नाम क्या है? मुझे लगता है कि यह दिलचस्प है क्योंकि यह पंक्तियों और वेन-आरेखों की संख्या दिखाता है - Grijesh Chauhan
@GrijeshChauhan Datamartist :) - Tushar Gupta
@ त्रिशहर :( यह लिनक्स सिस्टम के लिए नहीं है .. - Grijesh Chauhan
@GrijeshChauhan हाँ लेकिन आप इसे चलाने के लिए चलाने की कोशिश कर सकते हैं वाइन । - Tushar Gupta
ओह! हाँ मैं .. मैं शराब का उपयोग कर SQLyog इस्तेमाल किया .. वहाँ भी है PlayOnLinux - Grijesh Chauhan


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

enter image description here

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

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

अब, एसक्यूएल चलाने का नतीजा यह है कि ऐसा दिखाई देगा: enter image description here enter image description here

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

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

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

अब, यह एसक्यूएल चलाने का नतीजा यहां दिखेगा: enter image description here enter image description here

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

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

उपर्युक्त सारणी का उपयोग करके, हम दिखा सकते हैं कि सही बाहरी जुड़ने का परिणाम सेट कैसा दिखता है:

enter image description hereenter image description here

पूर्ण बाहरी जुड़ता है: - पूर्ण बाहरी शामिल हों या पूर्ण जुड़ें शामिल होने के परिणामों में नॉनमैचिंग पंक्तियों को शामिल करके नॉनमैचिंग जानकारी को बनाए रखना है, पूर्ण बाहरी शामिल होने का उपयोग करें। इसमें दोनों टेबलों की सभी पंक्तियां शामिल हैं, इस पर ध्यान दिए बिना कि अन्य तालिका का मिलान मूल्य है या नहीं। enter image description here

छवि स्रोत

MySQL 8.0 संदर्भ मैनुअल - सिंटेक्स में शामिल हों

ओरेकल संचालन में शामिल हों


108
2017-12-18 06:54





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

एक आंतरिक रूप से जुड़ा केवल मिलान पंक्तियों को पुनः प्राप्त करें।

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

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

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

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


101
2018-01-12 11:07



@nomen यह नहीं कि यह उत्तर इसे संबोधित करता है, लेकिन इनर जॉइन एक चौराहे है और पूर्ण बाहरी जॉइन संबंधित यूनियन है अगर बाएं और दाएं सेट / मंडलियों में पंक्तियां (क्रमशः) बाएं और दाएं शामिल हैं। पीएस यह जवाब इनपुट बनाम आउटपुट में पंक्तियों के बारे में अस्पष्ट है। यह "बाएं / दाएं तालिका में" बाएं / दाएं भाग में "बाएं / दाएं भाग में" है और यह "मिलान पंक्ति" बनाम "सभी" का उपयोग करता है जिसका मतलब पंक्ति से अन्य तालिका बनाम पंक्ति से बढ़ाया गया है। - philipxy