लेफ्ट, राइट, आउटर और इनर जॉइन में क्या अंतर है?


562

मैं सोच रहा हूं कि इन सभी अलग-अलग योगों को कैसे अलग किया जाए ...


60
हॉरर का कोडिंग हॉरर ए विजुअल
एक्सपेंशन

3
आपकी समझ के स्तर पर भी निर्भर करता है, आपके जैसे किसी व्यक्ति के लिए वह लेख कुछ नहीं करता है, लेकिन किसी के लिए, जो शायद पूरी तरह से समझ में नहीं आता है, यह बहुत स्पष्ट है
SQLMenace

6
यह stackoverflow.com/questions/419375/sql-join-differences का डुप्लिकेट है और इसमें कोई संदेह नहीं है ...
cletus

1
इससे मुझे बहुत मदद मिली ... सबसे आसान तरीका टेस्ट टेबल बनाना और उनके साथ खेलना है। = पी
डेग्रीविस

जवाबों:


797

सरल उदाहरण : चलो कहते हैं कि आपके पास एक Studentsमेज है, और एक Lockersमेज है। एसक्यूएल में, पहली तालिका आप एक में शामिल होने में निर्दिष्ट करते हैं, Studentsयह है, वाम मेज, और दूसरा एक, Lockers, है सही तालिका।

प्रत्येक छात्र को एक लॉकर सौंपा जा सकता है, इसलिए तालिका LockerNumberमें एक कॉलम है Student। एक से अधिक छात्र संभावित रूप से एक एकल लॉकर में हो सकते हैं, लेकिन विशेष रूप से स्कूल वर्ष की शुरुआत में, आपके पास आने वाले कुछ छात्र बिना लॉकर और कुछ लॉकर हो सकते हैं, जिन्हें कोई छात्र नहीं सौंपा गया है।

इस उदाहरण के लिए, मान लें कि आपके पास 100 छात्र हैं , जिनमें से 70 के पास लॉकर हैं। आपके पास कुल 50 लॉकर हैं , जिनमें से 40 में कम से कम 1 छात्र है और 10 लॉकरों में कोई छात्र नहीं है।

INNER JOIN " मुझे सभी छात्रों को लॉकर के साथ दिखाने " के बराबर है ।
बिना लॉकर के कोई भी छात्र, या छात्रों के बिना कोई भी लॉकर गायब नहीं है।
70 पंक्तियों को लौटाता है

बाईं ओर जॉय " यदि उनके पास एक है तो सभी छात्रों को उनके संबंधित लॉकर के साथ " दिखाया जाएगा ।
यह एक सामान्य छात्र सूची हो सकती है, या इसका उपयोग बिना किसी लॉकर वाले छात्रों की पहचान करने के लिए किया जा सकता है।
100 पंक्तियों को लौटाता है

RIGHT OUTER JOIN होगा " मुझे सभी लॉकर दिखाओ, और अगर कोई हो तो छात्रों को उन्हें सौंपा "।
इसका उपयोग उन लॉकरों की पहचान करने के लिए किया जा सकता है जिनके पास कोई छात्र सौंपा नहीं गया है, या बहुत से छात्रों के पास लॉकर हैं।
Lock० पंक्तियों को लौटाता है (४० लॉकरों में in० छात्रों की सूची, और बिना छात्र वाले १० लॉकर)

फुल ओवर जॉइन मूर्खतापूर्ण होगा और शायद ज्यादा उपयोग नहीं होगा।
कुछ ऐसा है " मुझे सभी छात्रों और सभी लॉकरों को दिखाएं, और उन्हें मिलान करें जहां आप कर सकते हैं "
110 पंक्तियाँ (सभी 100 छात्र, जिनमें बिना लॉकर वाले भी शामिल हैं। प्लस 10 लॉकर्स बिना छात्र के)

क्रोस जॉइन भी इस परिदृश्य में काफी मूर्खतापूर्ण है।
यह lockernumberछात्रों की तालिका में लिंक किए गए फ़ील्ड का उपयोग नहीं करता है , इसलिए आप मूल रूप से हर संभव छात्र-से-लॉकर जोड़ी की एक बड़ी विशाल सूची के साथ समाप्त होते हैं, चाहे वह वास्तव में मौजूद हो या नहीं।
5000 पंक्तियाँ लौटाता है (100 छात्र x 50 लॉकर)। खाली लॉकर के साथ नए छात्रों से मेल खाने के लिए शुरुआती बिंदु के रूप में (फ़िल्टरिंग के साथ) उपयोगी हो सकता है।


12
अपने उदाहरण का उपयोग करते हुए, CROSS जॉइन लॉकर असाइनमेंट बनाने के लिए एक शुरुआती बिंदु के रूप में उपयोगी होगा: सभी संभावित संयोजनों के साथ शुरू करें और फिर सूची से परिणामों को फ़िल्टर करने के लिए अन्य मानदंडों का उपयोग करें।
जोएल कोएहॉर्न

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

6
अनाथ डेटा की खोज करते समय, या एक ही डेटा सेट के विभिन्न संस्करणों की तुलना करते समय पूर्ण OUTER JOINS उपयोगी हो सकता है।
लारा डगान

3
क्रॉस उर्फ ​​कार्टेशियन उत्पाद में शामिल हों
JavaRocky

3
मुझे लगता है कि आप अपनी क्वेरी कैसे शुरू करते हैं, इस प्रकार के परिणाम को प्रभावित करता है। उदाहरण के लिए, की SELECT * FROM students RIGHT OUTER JOIN lockers...तुलना में एक अलग परिणाम होगा SELECT * FROM lockers RIGHT OUTER JOIN students...। शानदार उत्तर, लेकिन इसे पूर्ण SQLप्रश्नों के साथ अद्यतन देखना पसंद करेंगे
jbmilgrom

141

जुड़ने के तीन मूल प्रकार हैं:

  • INNERजुड़ने के लिए दो तालिकाओं की तुलना करें और केवल वही परिणाम दें जहाँ एक मैच मौजूद है। जब वे 2 में कई परिणामों से मेल खाते हैं तो पहली तालिका के रिकॉर्ड की नकल की जाती है। INNER जुड़ने से परिणाम सेट छोटे हो जाते हैं, लेकिन क्योंकि रिकॉर्ड को दोहराया जा सकता है, इसकी गारंटी नहीं है।
  • CROSSदो तालिकाओं की तुलना में शामिल हों और दोनों तालिकाओं से पंक्तियों के हर संभव संयोजन को वापस करें। इस तरह के जुड़ने से आपको बहुत सारे परिणाम मिल सकते हैं जो कि सार्थक भी नहीं हो सकते हैं, इसलिए सावधानी के साथ उपयोग करें।
  • OUTERएक मैच के उपलब्ध होने या अन्यथा पूर्ण मान होने पर दो तालिकाओं और रिटर्न डेटा की तुलना करें। INNER के साथ जुड़ने की तरह, यह एक तालिका में पंक्तियों की नकल करेगा जब यह दूसरी तालिका में कई रिकॉर्ड से मेल खाता है। OUTER जुड़ने से परिणाम सेट अधिक बड़े हो जाते हैं, क्योंकि वे स्वयं सेट से कोई रिकॉर्ड नहीं निकालेंगे। NULL मान कब और कहाँ जोड़ना है, यह निर्धारित करने के लिए आपको एक OUTER ज्वाइन करना होगा:
    • LEFT इसका मतलब यह है कि 1 तालिका से सभी रिकॉर्ड रखें कोई बात नहीं और जब 2 तालिका मेल नहीं खाती है तो पूर्ण मान डालें।
    • RIGHT इसका अर्थ है: 2 तालिका से सभी रिकॉर्ड रखें चाहे वह कोई भी हो और पूर्ण मान दर्ज न करें वह 1 तालिका से मेल नहीं खाता है।
    • FULL इसका मतलब है कि दोनों तालिकाओं से सभी रिकॉर्ड रखें, और मिलान न होने पर या तो तालिका में एक पूर्ण मान डालें।

अक्सर आप देखेंगे OUTERकि सिंटैक्स से कीवर्ड छोड़ा जाएगा । इसके बजाय यह "LEFT JOIN", "राइट जॉइन", या "FULL JOIN" होगा। ऐसा इसलिए किया जाता है क्योंकि INNER और CROSS जॉइन का LEFT, RIGHT, या FULL के संबंध में कोई मतलब नहीं है, और इसलिए ये खुद से पर्याप्त हैं कि किसी OUTER जॉइन को इंगित करें।

जब आप प्रत्येक प्रकार का उपयोग करना चाहते हैं, तो यहां एक उदाहरण दिया गया है:

  • INNER: आप "इनवॉयस" तालिका से सभी रिकॉर्ड वापस करना चाहते हैं, साथ ही उनके "इनवॉयललाइन" के साथ। यह मानता है कि प्रत्येक वैध चालान में कम से कम एक पंक्ति होगी।
  • OUTER: आप एक विशेष इनवॉइस के लिए सभी "इनवॉयललाइन" रिकॉर्ड, उनके संबंधित "इन्वेंटरी इटेम" रिकॉर्ड के साथ वापस करना चाहते हैं। यह एक व्यवसाय है जो सेवा भी बेचता है, जैसे कि सभी इनवॉयललाइन में IventoryItem नहीं होगा।
  • CROSS: आपके पास 10 पंक्तियों के साथ एक अंक तालिका है, प्रत्येक धारण मान '0' के माध्यम से '9' है। आप इसमें शामिल होने के लिए एक तिथि सीमा तालिका बनाना चाहते हैं, ताकि आप सीमा के भीतर प्रत्येक दिन के लिए एक रिकॉर्ड समाप्त कर सकें। अपने आप को बार-बार इस तालिका से जोड़कर आप लगातार कई पूर्णांकों को बना सकते हैं (यदि आप 10 से 1 शक्ति से शुरू करते हैं, तो प्रत्येक जोड़ 1 को घातांक में जोड़ता है)। फिर उन मानों को श्रेणी के लिए अपनी आधार तिथि में जोड़ने के लिए DATEADD () फ़ंक्शन का उपयोग करें।

1
अच्छा लगा। मैं केवल इसे जोड़ता हूँ अगर आप केवल 'JOIN' लिखते हैं तो इसका अर्थ INNER JOIN है।
Matpop

47

केवल 4 प्रकार हैं:

  1. इनर जॉइन : सबसे आम प्रकार। आउटपुट पंक्तियों के प्रत्येक जोड़ी के लिए एक आउटपुट पंक्ति का उत्पादन किया जाता है जो जॉइन शर्तों पर मेल खाता है।
  2. बायाँ बाहरी जुड़ाव : एक आंतरिक जोड़ के समान, सिवाय इसके कि यदि कोई ऐसी पंक्ति है जिसके लिए दाईं ओर की तालिका में कोई मिलान पंक्ति नहीं मिल सकती है, तो एक पंक्ति आउटपुट है जिसमें बाईं ओर तालिका से मान हैं, NULLप्रत्येक के लिए दाईं ओर तालिका में मान। इसका मतलब यह है कि बाईं ओर तालिका से प्रत्येक पंक्ति आउटपुट में कम से कम एक बार दिखाई देगी।
  3. दायां बाहरी जुड़ाव : बाईं बाहरी जोड़ के समान, उलटे टेबल की भूमिकाओं को छोड़कर।
  4. पूर्ण बाहरी जुड़ाव : बाएँ और दाएँ बाहरी जोड़ का मेल। दोनों तालिकाओं की प्रत्येक पंक्ति कम से कम एक बार आउटपुट में दिखाई देगी।

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

रसेल की ओर से फुल जॉइन करने के लिए धन्यवाद, जिसे मैंने छोड़ा था।


1
पूर्ण बाहरी जुड़ने और क्रॉस जॉइन (कार्टेशियन उत्पाद) के बारे में क्या?
SQLMenace

पूर्ण वास्तव में दो बाहरी जोड़ों के बराबर है
रसेल

25
जब आप अपने आंतरिक जुड़ाव को बढ़ाते हैं, तो पूर्ण क्या होता है, और फिर आप यहाँ एक प्रश्न पूछते हैं कि "मुझे N की जगह N ^ 2 पंक्तियाँ क्यों मिल रही हैं?" तब हर कोई आप पर क्रोस हो जाता है।
पॉल टॉम्बलिन

24

एसक्यूएल जॉन्स अंतर:

याद करने के लिए बहुत सरल:

INNER JOIN केवल दोनों तालिकाओं के लिए सामान्य रिकॉर्ड दिखाते हैं।

OUTER JOIN दोनों तालिकाओं की सभी सामग्री को एक साथ मिलाया जाता है या तो उनका मिलान किया जाता है या नहीं।

LEFT JOINके रूप में ही है LEFT OUTER JOIN- (सही बाएं रिकॉर्ड मिलान के साथ पहली (बाएं-सबसे) तालिका से रिकॉर्ड का चयन करें।)

RIGHT JOINके रूप में ही है RIGHT OUTER JOIN- (दूसरी (दाईं-सबसे) तालिका से मेल खाने वाले बाएं रिकॉर्ड के रिकॉर्ड का चयन करें।)

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


वेन आरेख हलकों को लेबल करने का एक सही और प्रासंगिक तरीका है, लेकिन यह ऐसा नहीं है। मंडलियां इनपुट टेबल नहीं हैं। साथ ही परिणाम पंक्तियाँ इनपुट पंक्तियाँ नहीं हैं, इसलिए आपका वर्णन गलत है। यह भी स्पष्ट नहीं है - आप "दोनों को आम", "मिलान", "विलय" के बारे में नहीं समझाते हैं।
फिलीपिक्सी

9

की जाँच करें (SQL) विकिपीडिया पर जुड़ें

  • इनर जॉइन - दो तालिकाओं को देखते हुए एक आंतरिक जुड़ाव दोनों पंक्तियों में मौजूद सभी पंक्तियों को लौटाता है
  • बाएँ / दाएँ (बाहरी) में शामिल हों - दो तालिकाओं को देने से सभी पंक्तियाँ वापस आ जाती हैं जो आपके सम्मिलित होने की बाएँ या दाएँ तालिका में मौजूद होती हैं, साथ ही दूसरी तरफ की पंक्तियों को वापस लौटाया जाएगा जब ज्वाइन क्लॉज मैच होता है या अशक्त के लिए वापस आ जाएगा उन स्तंभों

  • पूर्ण बाहरी - दो तालिकाएं सभी पंक्तियों को लौटाती हैं, और जब या तो बाएं या दाएं स्तंभ नहीं होते हैं तो नल वापस आ जाएंगे

  • क्रॉस जॉइन्स - कार्टेशियन जॉइन करते हैं और सावधानी से इस्तेमाल न किए जाने पर खतरनाक हो सकते हैं


6

इसे और अधिक दृश्यमान बनाने में मदद मिल सकती है। एक उदाहरण:

तालिका एक:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

तालिका 2:

ID_STUDENT LOCKER

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
मुझे विश्वास नहीं हो रहा है कि इस उत्तर में कुछ उत्थान हैं और साथ ही यह इतना अधूरा है।
नबर

मुझे लगता है कि यह मूल प्रश्न का बेहतर उत्तर था।
रसैल

3

इनर जॉइन : केवल पंक्तियों को दिखाएं, जब उसके पास दोनों तालिकाओं का डेटा हो।

बाहरी जोड़ : (बाएं / दाएं) : युग्मित पंक्ति ( ओं ) के साथ बाएं / दाएं तालिका से सभी परिणाम दिखाएं , अगर यह मौजूद है या नहीं।


2

सबसे पहले आपको यह समझना होगा कि जुड़ना क्या है? हम कई टेबल कनेक्ट करते हैं और जुड़ने वाले टेबल से विशिष्ट परिणाम प्राप्त करते हैं। ऐसा करने का सबसे सरल तरीका क्रॉस जॉइन है

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

बायाँ: यह बाएँ तालिका से सभी रिकॉर्ड लौटाएगा और राइट टेबल से मिलान रिकॉर्ड करेगा।

दाएं: यह लेफ्ट जॉइन के विपरीत लौटेगा। यह राइट टेबल से सभी रिकॉर्ड लौटाएगा और लेफ्ट टेबल से रिकॉर्ड से मिलान करेगा।

इनर: यह चौराहे की तरह है। यह दोनों तालिका से केवल मिलान किए गए रिकॉर्ड लौटाएगा।

बाहरी: और यह संघ की तरह है। यह दोनों तालिका से सभी उपलब्ध रिकॉर्ड लौटाएगा।

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

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

धन्यवाद

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