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


35

मैं SQL में नया हूँ और जानना चाहता हूँ कि उन दो JOINप्रकारों में क्या अंतर है ?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

मुझे एक या दूसरे का उपयोग कब करना चाहिए?


6
क्या यह डीबीए प्रश्न के रूप में फिट बैठता है? यह मेरे लिए अधिक कोडिंग प्रश्न लगता है।
BlackICE


@ डेविड तब VtC अगर आपको लगता है कि यह साइट के लिए गलत है। हम हमेशा फिर से खोल सकते हैं।
jcolebrand

3
मुझे लगता है कि यह एक महान सवाल है, और साइट के लिए बहुत उपयुक्त है।
डेटागोड

इसे डीबीए से बाहर ले जाने की जरूरत है, एक डीओबी आस्तीन को ठीक करने के लिए डीबी प्रदर्शन ठीक है: पी
एमबीडी

जवाबों:


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

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

अपने दूसरे उदाहरण में, यदि आप उपलब्ध हैं (यदि वे उपलब्ध नहीं हैं, तो आप टेलीफोन मानों के लिए प्राप्त करेंगे), आप सभी उपयोगकर्ताओं की सूची , और किसी भी टेलीफोन रिकॉर्ड को वापस कर देंगे NULL


13

हर बार कोई व्यक्ति यह प्रश्न पूछता है, इसका उत्तर है: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

आशा है कि यह आपको समझने में मदद करेगा,


3
मैंने 20 साल तक जॉइन किया है और वो डायग्राम सिर्फ मुझे भ्रमित करने वाले लगे।
होगन

3
मैं @ होगन के साथ हूं - वेन डायग्राम इसके लिए सबसे अच्छा विवरण नहीं हैं .. एक ग्रिड जो संयोजन लौटाता है वह संभवतः बेहतर होगा।
जो

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

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

1
मैं दृढ़ता से असहमत हूं, वेन आरेख में पहले से ही बहुत अच्छी तरह से परिभाषित व्याख्या है, चौराहा और संघ सेट है। जब आप गैर-विशिष्ट कुंजियों से जुड़ते हैं, तो यह व्याख्या सम्मिलित नहीं होती है। मुझे लगता है कि आप विन्न आरेखों की व्यापक रूप से व्याख्या करते हैं।
विल

8

एक आंतरिक जॉइन रिटर्न पंक्तियां जो जॉइन मानदंड के आधार पर संयुक्त हो सकती हैं।
एक बाहरी जुड़ाव इन और सभी पंक्तियों को वापस लौटाता है
   ... बाईं तालिका के लिए पहली तालिका
   से ... दूसरी तालिका से दाईं ओर जुड़ने के लिए
   ... दोनों तालिकाओं से पूर्ण जोड़ के लिए

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

अधिक जानकारी के लिए StackOverflow पर यह प्रश्न देखें ।


7

यदि आपके पास नीचे की तरह 2 टेबल हैं:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

यदि आप इनर जॉइन करते हैं तो आपको मिलता है:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

यदि आप पूर्ण बाहरी का उपयोग करते हैं, तो आप प्राप्त करें:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

यदि आप लेफ्ट आउटर का उपयोग करते हैं तो आपको मिलता है:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL

6

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

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

वैकल्पिक रूप से, एक ही परिणाम एसक्यूएल बाहरी सम्मिलित ऑपरेटर के साथ संयोजन के रूप में उपयोग करके प्राप्त किया जा सकता है COALESCE:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

"SQL और रिलेशनल थ्योरी: कैसे सही SQL कोड लिखने के लिए" CJ दिनांक द्वारा बाहरी जॉइन (4.6) पर एक टिप्पणी


5

एक आंतरिक जुड़ाव एक ऐसा जुड़ाव है जहां केवल प्रदर्शित किए जाने वाले परिणाम ही परिणाम होते हैं जहां कुंजियाँ दोनों तालिकाओं में होती हैं। एक बाहरी जुड़ाव एक तालिका में सभी कुंजियों के लिए परिणाम प्रदर्शित करेगा, पहले से एक बाएं जोड़ और दूसरे से दाएं जोड़। उदाहरण के लिए:

मान लें कि तालिका 1 में निम्नलिखित प्राथमिक कुंजी और डेटा जोड़े हैं: (1, ए), (2, बी), (3, सी)

मान लें कि तालिका 2 में निम्नलिखित प्राथमिक कुंजी और डेटा जोड़े हैं: (1, मजेदार), (3, कैन), (4, घटित)

इसलिए प्राथमिक कुंजियों पर तालिका 1 से तालिका 2 में एक आंतरिक जुड़ाव निम्नलिखित परिणामी ट्रिपल (सामान्य प्राथमिक कुंजी के साथ, पहली तालिका की दूसरी आइटम दूसरी और दूसरी तालिका के दूसरे आइटम तीसरे): (1, ए, मजेदार), ( 3, सी, कैन)

प्राथमिक कुंजियों पर तालिका 1 से टेबल 2 के बाएं बाहरी जुड़ाव के परिणामस्वरूप निम्नलिखित परिणाम प्राप्त होंगे (ऊपर जैसा प्रारूप): (1, a, मजेदार), (2, b, NULL), (3, c, can)

प्राथमिक कुंजियों पर तालिका 1 से टेबल 2 का एक सही बाहरी जुड़ाव निम्नलिखित परिणामी ट्रिपल (ऊपर के रूप में एक ही प्रारूप) प्राप्त करेगा: (1, ए, मजेदार), (3, सी, कैन), (4, NULL, होता है)

मुझे उम्मीद है कि यह अवधारणा अच्छी तरह से समझाती है।


4

मुझे इसे और अधिक सहज वर्णन करने का प्रयास करने दें।

भीतरी जुड़ाव उपयोगकर्ताओं को दिखाता है, जिनके पास एक या अधिक टेलीफोन (ओं) के साथ उनके टेलीफोन नंबर हैं।

बाएं बाहरी जोड़ अतिरिक्त रूप से उन 'उपयोगकर्ताओं' को सूचीबद्ध करते हैं जिनके पास कोई टेलीफोन नहीं है।


4

चूंकि आपने पूछा है कि कब क्या उपयोग करना है, तो यहां प्रश्नों के साथ एक परिदृश्य है - जो कि आवश्यकता के आधार पर उपयोग करना है।

डेटा:

तालिका उपयोगकर्ताओं के 10 रिकॉर्ड हैं। टेबल फोनो के 6 रिकॉर्ड हैं (1: 1 संबंध के साथ, जिसका अर्थ है कि फोनएनओ में एक प्रविष्टि केवल उपयोगकर्ताओं में एक प्रविष्टि को संदर्भित करेगी, और फोननो में केवल एक प्रविष्टि उपयोगकर्ताओं में दी गई प्रविष्टि को संदर्भित कर सकती है)।

आवश्यकता 1: सभी उपयोगकर्ताओं को उनके फ़ोन नंबरों के साथ दिखाएं। फोन नंबर के बिना उपयोगकर्ताओं को अनदेखा करें।

प्रश्न:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

परिणाम: 6 उपयोगकर्ताओं को दिखाता है जिनके पास फोन नंबर है

आवश्यकता 2: सभी उपयोगकर्ताओं को उनके फ़ोन नंबर के साथ दिखाएं। यदि उपयोगकर्ता के पास फोन डिस्प्ले 'एन / ए' नहीं है (उपलब्ध नहीं है)

प्रश्न:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

परिणाम:

सभी 10 रिकॉर्ड दिखाता है

नोट: ifnull शून्य मान को बदलने के लिए एक MySql सिंटैक्स है। मैंने इस फ़ंक्शन का उपयोग db इंजन शो 'N / A' बनाने के लिए किया है जब फोनो शून्य है। यदि आप किसी अन्य DBMS का उपयोग कर रहे हैं, तो उपयुक्त फ़ंक्शन देखें। SQL सर्वर में आपको CASEस्टेटमेंट का उपयोग करना होगा ।

आशा है कि ये आपकी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.