इसके अलावा कैसे LEFT JOIN
, RIGHT JOIN
और में FULL JOIN
फिट?
इसके अलावा कैसे LEFT JOIN
, RIGHT JOIN
और में FULL JOIN
फिट?
जवाबों:
यह मानते हुए कि आप बिना किसी डुप्लिकेट वाले कॉलम में शामिल हो रहे हैं, जो एक बहुत ही सामान्य मामला है:
ए और बी का एक आंतरिक जुड़ाव ए इंटरसेक्ट बी का परिणाम देता है, अर्थात वेन आरेख चौराहे का आंतरिक भाग ।
ए और बी का एक बाहरी जुड़ाव ए यूनियन बी के परिणाम देता है, अर्थात वेन आरेख संघ के बाहरी हिस्से।
उदाहरण
मान लें कि आपके पास दो तालिकाएँ हैं, एक एकल स्तंभ के साथ, और डेटा निम्नानुसार है:
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
वेन आरेख वास्तव में मेरे लिए नहीं है।
वे एक क्रॉस जॉइन और इनर जॉइन के बीच कोई अंतर नहीं दिखाते हैं, उदाहरण के लिए, या अधिक आम तौर पर विभिन्न प्रकार के जॉइन प्रेडिकेट के बीच कोई अंतर दिखाते हैं या तर्क के लिए एक रूपरेखा प्रदान करते हैं कि वे कैसे काम करेंगे।
तार्किक प्रसंस्करण को समझने के लिए कोई विकल्प नहीं है और यह वैसे भी समझ में अपेक्षाकृत सरल है।
on
चरण 1 से सभी पंक्तियों के खिलाफ खंड का मूल्यांकन करें , जहां उन विधेय का मूल्यांकन होता हैtrue
(NB: व्यवहार में क्वेरी ऑप्टिमाइज़र को क्वेरी को निष्पादित करने के अधिक कुशल तरीके मिल सकते हैं जो कि विशुद्ध रूप से तार्किक विवरण से ऊपर है, लेकिन अंतिम परिणाम समान होना चाहिए)
मैं एक पूर्ण बाहरी जोड़ के एक एनिमेटेड संस्करण के साथ शुरुआत करूँगा । इसके बाद की व्याख्या।
स्रोत टेबल्स
सबसे पहले एक CROSS JOIN
(AKA Cartesian Product) से शुरुआत करें । यह एक ON
खंड नहीं है और बस दो तालिकाओं से पंक्तियों के हर संयोजन को वापस करता है।
ए कॉलर का चयन करें, एक क्रोस जॉइन बी से कोलोर
इनर और आउटर जॉइन में "ऑन" क्लॉज विधेय होता है।
A.Colour का चयन करें, A.Colour = B.Colour में एक ININ JOIN B से B.Colour करें
उपरोक्त क्लासिक इक्वी जॉइन है।
आंतरिक रूप से जुड़ने की स्थिति में समानता की स्थिति होना जरूरी नहीं है और इसे तालिकाओं के दोनों (या यहां तक कि) से संदर्भ कॉलम की आवश्यकता नहीं है। A.Colour NOT IN ('Green','Blue')
क्रॉस की प्रत्येक पंक्ति पर मूल्यांकन रिटर्न में शामिल होता है।
चुनें। ए। कौरौर, बी। कौरूर से एक इनर जॉयन बी 1 = 1 पर
क्रॉस ज्वाइन रिजल्ट में सभी पंक्तियों के लिए जॉइन कंडीशन सही है, इसलिए यह क्रॉस जॉइन की तरह ही है। मैं फिर से 16 पंक्तियों की तस्वीर नहीं दोहराऊंगा।
आउटर जॉइंट्स का तार्किक रूप से उसी तरह मूल्यांकन किया जाता है जैसे कि आंतरिक जोड़ से मिलता है, सिवाय इसके कि अगर बाईं टेबल से कोई पंक्ति (लेफ्ट जॉइन के लिए) दाहिने हाथ की टेबल से किसी भी पंक्तियों के साथ नहीं जुड़ती है तो यह परिणाम में NULL
मान के साथ संरक्षित है । दाहिने हाथ के स्तंभ।
यह केवल पिछले परिणाम को सीमित करता है जहां केवल पंक्तियों को वापस करें B.Colour IS NULL
। इस विशेष मामले में ये वे पंक्तियाँ होंगी जिन्हें संरक्षित किया गया था क्योंकि उनके दाहिने हाथ की तालिका में कोई मिलान नहीं था और क्वेरी एकल लाल पंक्ति को तालिका में मेल नहीं खाती है B
। इसे एंटी सेमी जॉइन के रूप में जाना जाता है।
IS NULL
परीक्षण के लिए एक स्तंभ का चयन करना महत्वपूर्ण है जो या तो अशक्त नहीं है या जिसके लिए जुड़ने की स्थिति यह सुनिश्चित करती है कि NULL
इस पैटर्न को सही ढंग से काम करने के लिए किसी भी मान को बाहर रखा जाएगा और केवल उन पंक्तियों को लाने से बचें जो इसके लिए एक NULL
मूल्य है। संयुक्त राष्ट्र की पंक्तियों के अलावा स्तंभ।
दाएं बाहरी जोड़ समान रूप से बाएं बाहरी जोड़ से कार्य करते हैं, सिवाय इसके कि वे दाएं टेबल से गैर मिलान वाली पंक्तियों को संरक्षित करते हैं और बाएं हाथ के स्तंभों का विस्तार करते हैं।
पूर्ण बाहरी जोड़ बाएं और दाएं जोड़ों के व्यवहार को जोड़ते हैं और बाएं और दाएं तालिकाओं से गैर-मिलान पंक्तियों को संरक्षित करते हैं।
क्रॉस में कोई भी पंक्तियाँ 1=0
विधेय से मेल नहीं खातीं । दोनों तरफ से सभी पंक्तियों को सामान्य बाहरी बाहरी नियमों के उपयोग से संरक्षित किया गया है, दूसरी तरफ तालिका से कॉलम में NULL के साथ।
पूर्ववर्ती क्वेरी के लिए एक मामूली संशोधन के साथ एक UNION ALL
दो तालिकाओं का अनुकरण कर सकता है ।
ध्यान दें कि WHERE
क्लॉज (यदि मौजूद है) तार्किक रूप से जुड़ने के बाद चलता है। एक सामान्य त्रुटि बाईं बाहरी जुड़ाव प्रदर्शन करना है और फिर दाएं टेबल पर एक शर्त के साथ WHERE क्लॉज शामिल करना है जो गैर मिलान वाली पंक्तियों को छोड़कर समाप्त होता है। ऊपर के बाहरी प्रदर्शन में शामिल होने ...
... और फिर "कहाँ" खंड चलता है। NULL= 'Green'
सत्य का मूल्यांकन नहीं करता है, इसलिए बाहरी जुड़ाव द्वारा संरक्षित पंक्ति को समाप्त कर दिया जाता है (नीले एक के साथ) प्रभावी रूप से एक वापस एक में शामिल होने के लिए परिवर्तित करना।
यदि इरादा बी से केवल पंक्तियों को शामिल करना था जहां रंग हरा है और ए से सभी पंक्तियों की परवाह किए बिना सही सिंटैक्स होगा
SQLFiddle.com पर इन उदाहरणों को लाइव देखें ।
दो तालिकाओं से डेटा को संयोजित करने के लिए जोड़ों का उपयोग किया जाता है, जिसके परिणामस्वरूप एक नया, अस्थायी तालिका होता है। जोड़ों को एक विधेय नामक चीज के आधार पर किया जाता है, जो जुड़ने के लिए स्थिति का उपयोग करने के लिए निर्दिष्ट करता है। एक आंतरिक जुड़ाव और एक बाहरी जुड़ाव के बीच का अंतर यह है कि एक आंतरिक जुड़ाव केवल उन पंक्तियों को वापस करेगा जो वास्तव में सम्मिलित विधेय पर आधारित मेल खाते हैं। उदाहरण के लिए- कर्मचारी और स्थान तालिका पर विचार करें:
इनर ज्वाइन: - इनरज्वाइन-प्रेडिकेट के आधार परदो टेबलों ( एम्प्लॉई और लोकेशन ) केकॉलम वैल्यू को मिला कर एक नया रिजल्ट टेबल बनाता है। क्वेरीउन सभी जोड़े पंक्तियों को खोजने के लिए स्थान की प्रत्येक पंक्ति के साथ कर्मचारी की प्रत्येक पंक्ति की तुलना करती हैजो जॉइन-प्रेडिकेट को संतुष्ट करते हैं। जब गैर-पूर्ण मानों के मिलान से जोड़-पूर्वक संतुष्ट हो जाता है, तो कर्मचारी और स्थान की प्रत्येक मिलान जोड़ी के लिए स्तंभ मानपरिणाम पंक्ति में संयुक्त हो जाते हैं। यहां बताया गया है कि आंतरिक जुड़ाव के लिए 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
ऊपर दी गई तालिकाओं का उपयोग करके, हम दिखा सकते हैं कि सही बाहरी जोड़ का परिणाम सेट कैसा दिखेगा:
फुल आउटर जॉइन : - फुल आउटर ज्वाइन या फुल ज्वाइन है कि किसी ज्वाइन के रिजल्ट में नॉनमैचिंग रो को शामिल करके नॉमिनेटिंग की जानकारी को बरकरार रखें, फुल आउटर जॉइन का इस्तेमाल करें। इसमें दोनों तालिकाओं से सभी पंक्तियों को शामिल किया गया है, भले ही अन्य तालिका का मिलान मूल्य हो या न हो।
मिलान की गई पंक्तियों को पुनः प्राप्त करें, अर्थात 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
सरल शब्दों में:
एक आंतरिक जुड़ाव केवल मिलान की गई पंक्तियों को पुनः प्राप्त करता है।
जबकि एक बाहरी जुड़ाव एक तालिका से मिलान की गई पंक्तियों और अन्य तालिका में सभी पंक्तियों को पुनः प्राप्त करता है .... परिणाम इस बात पर निर्भर करता है कि आप किसका उपयोग कर रहे हैं:
बाएँ : दाएँ तालिका में पंक्तियाँ और बाईं तालिका में सभी पंक्तियाँ
दाईं ओर : बाईं तालिका में पंक्तियाँ और दाईं तालिका में सभी पंक्तियाँ या
पूर्ण : सभी तालिकाओं में सभी पंक्तियाँ। इससे कोई फर्क नहीं पड़ता कि कोई मैच है या नहीं
एक आंतरिक जुड़ाव केवल पंक्तियों को दिखाता है यदि जुड़ने के दूसरे (दाएं) तरफ एक मिलान रिकॉर्ड है।
ए (बाएं) बाहरी जुड़ाव बाएं हाथ की तरफ प्रत्येक रिकॉर्ड के लिए पंक्तियों को दिखाता है, भले ही जुड़ने के दूसरे (दाएं) पक्ष पर कोई मिलान पंक्तियां न हों। यदि कोई मिलान पंक्ति नहीं है, तो दूसरे (दाएं) पक्ष के कॉलम NULLs दिखाएंगे।
इनर जॉइन के लिए आवश्यक है कि संबंधित आईडी के साथ एक रिकॉर्ड ज्वाइन टेबल में मौजूद हो।
बाहरी जोड़ बाईं ओर के रिकॉर्ड को वापस कर देंगे, भले ही दाईं ओर कुछ भी मौजूद न हो।
उदाहरण के लिए, आपके पास एक आदेश और एक आदेश तालिका है। वे एक "आदेश" से संबंधित हैं।
आदेश
ऑर्डर का विवरण
अनुरोध
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
।
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)। मुझे अतिरिक्त परिस्थितियों के बारे में निश्चित नहीं था, वे अच्छी तरह से मिश्रण करते हैं ...
सरल शब्दों में:
इनर ज्वाइन -> पैरेंट और चाइल्ड टेबल से केवल सामान्य रिकॉर्ड लें। पेरेंट टेबल की प्राइमरी कुंजी चाइल्ड टेबल में फॉरेन की से मेल खाती है।
लेफ्ट जॉइन ->
छद्म कोड
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;
आरेखीय रूप से ऐसा लगता है:
आप INNER JOIN
दोनों तालिकाओं से सभी पंक्तियों को वापस करने के लिए उपयोग करते हैं जहां एक मैच होता है। अर्थात परिणामी तालिका में सभी पंक्तियों और स्तंभों में मान होंगे।
में OUTER JOIN
जिसके परिणामस्वरूप तालिका खाली कॉलम हो सकता है। बाहरी जुड़ाव LEFT
या तो हो सकता है RIGHT
।
LEFT OUTER JOIN
पहली तालिका से सभी पंक्तियों को लौटाता है, भले ही दूसरी तालिका में कोई मेल न हो।
RIGHT OUTER JOIN
दूसरी तालिका से सभी पंक्तियों को लौटाता है, भले ही पहली तालिका में कोई मेल न हो।
यह सभी प्रकार के जोड़ों के लिए एक अच्छा आरेखीय स्पष्टीकरण है
स्रोत: http://ssiddique.info/understanding-sql-joins-in-easy-way.html
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
।
उत्तर प्रत्येक के अर्थ में है, इसलिए परिणामों में।
नोट:
में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 join
MySQL में कोई भी नहीं है।
आंतरिक रूप से जुड़ा।
एक जुड़ाव दो तालिकाओं से पंक्तियों का संयोजन है। एक आंतरिक जुड़ाव क्वेरी में निर्दिष्ट मानदंडों के आधार पर दो तालिकाओं के मिलान का प्रयास करता है, और केवल उन पंक्तियों का मिलान करता है जो मेल खाती हैं। यदि जॉइन में पहली तालिका से एक पंक्ति दूसरी तालिका में दो पंक्तियों से मेल खाती है, तो परिणामों में दो पंक्तियों को वापस किया जाएगा। यदि पहली तालिका में एक पंक्ति है जो दूसरी पंक्ति में पंक्ति से मेल नहीं खाती है, तो यह वापस नहीं होती है; इसी तरह, यदि दूसरी तालिका में एक पंक्ति है जो पहले में एक पंक्ति से मेल नहीं खाती है, तो यह वापस नहीं आती है।
बाहरी सम्मिलित हों।
एक में शामिल होने के लिए छोड़ दिया दूसरा तालिका में पंक्तियों के लिए सबसे पहले मेज से पंक्तियों से मेल को खोजने के लिए प्रयास किए गए। यदि इसे कोई मिलान नहीं मिल रहा है, तो यह पहली तालिका से कॉलम लौटाएगा और दूसरी तालिका खाली (नल) से कॉलम छोड़ देगा।
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
मुझे अन्य उत्तरों में प्रदर्शन और आशावादी के बारे में अधिक जानकारी नहीं है।
कभी-कभी यह जानना अच्छा होता है कि केवल INNER JOIN
साहचर्य है जिसका अर्थ है कि अनुकूलक के पास इसके साथ खेलने का सबसे अधिक विकल्प है। यह समान परिणाम रखते हुए इसे तेजी से बनाने के लिए ज्वाइन ऑर्डर को फिर से व्यवस्थित कर सकता है। ऑप्टिमाइज़र सबसे अधिक जुड़ने वाले मोड का उपयोग कर सकता है।
आम तौर पर INNER JOIN
विभिन्न प्रकार के जोड़ो के बजाय उपयोग करने का प्रयास करना एक अच्छा अभ्यास है । (निश्चित रूप से यदि अपेक्षित परिणाम सेट पर विचार करना संभव है।)
इस अजीब साहचर्य व्यवहार के बारे में अच्छे उदाहरण और स्पष्टीकरण दिए गए हैं:
INNER JOIN
की तुलना में धीमी है LEFT JOIN
समय की सबसे में, और लोगों का उपयोग कर सकते LEFT JOIN
करने के बजाय INNER JOIN
एक जोड़कर WHERE
अप्रत्याशित दूर करने के लिए NULL
परिणाम;)।
INNER
है धीमा क्यों है ?
बहुत पसंद किए गए रेड-शेडेड वेन आरेख की आलोचना करते हुए, मैंने केवल अपना प्रयास पोस्ट करना उचित समझा।
हालाँकि @Martin Smith का उत्तर लंबे समय तक इस झुंड का सबसे अच्छा है, लेकिन उसका केवल प्रत्येक तालिका से कुंजी कॉलम दिखाता है, जबकि मुझे लगता है कि आदर्श रूप से गैर-कुंजी कॉलम भी दिखाए जाने चाहिए।
सबसे अच्छा मैं आधे घंटे में कर सकता था, मुझे अभी भी नहीं लगता कि यह पर्याप्त रूप से पता चलता है कि नल महत्वपूर्ण मानों की अनुपस्थिति के कारण हैं TableB
या OUTER JOIN
वास्तव में एक संघ के बजाय एक संघ हैं:
TableA a LEFT OUTER JOIN TableB b
के साथTableB B RIGHT OUTER JOIN TableA a
निम्न के लिए सटीक एल्गोरिदम INNER JOIN
, LEFT/RIGHT OUTER JOIN
निम्नानुसार हैं:
a
(a, b[i])
ON ...
प्रत्येक जोड़ी के खिलाफ खंड का मूल्यांकन करें :ON( a, b[i] ) = true/false?
true
, तो उस संयुक्त पंक्ति को वापस लौटाएं (a, b[i])
।Outer Join
एक (आभासी) जोड़ी है Null
: (a, Null)
LEFT बाहरी जुड़ने के लिए या (Null, b)
RIGHT बाहरी सम्मिलित होने के लिए। यह सुनिश्चित करना है कि अंतिम परिणामों में पहली तालिका की सभी पंक्तियाँ मौजूद हैं।नोट:ON
क्लॉज में निर्दिष्ट शर्त कुछ भी हो सकती है, प्राथमिक कीज़ का उपयोग करने की आवश्यकता नहीं है (और आपको दोनों तालिकाओं से हमेशा कॉलम का संदर्भ लेने की आवश्यकता नहीं है)! उदाहरण के लिए:
... ON T1.title = T2.title AND T1.version < T2.version
(=> इस पोस्ट को एक नमूना उपयोग के रूप में देखें: किसी स्तंभ पर अधिकतम मान वाली पंक्तियों का चयन करें )... ON T1.y IS NULL
... ON 1 = 0
(सिर्फ नमूने के रूप में)नोट: लेफ्ट जॉइन = लेफ्ट आउटर जॉइन, राइट जॉइन = राइट आउटर जॉइन।
सरलतम परिभाषाएँ
इनर जॉइन: रिटर्न दोनों टेबल से रिकॉर्ड से मेल खाता है ।
पूर्ण आउटर में शामिल हों: रिटर्न मेल खाते हैं और बेजोड़ रिकॉर्ड दोनों तालिकाओं से अशक्त के साथ से बेजोड़ रिकॉर्ड के लिए दोनों टेबल्स ।
लेफ्ट आउटर ज्वाइन: रिटर्न मैच और बेजोड़ रिकॉर्ड केवल लेफ्ट साइड की टेबल से ।
राइट आउटर जॉइन: रिटर्न राइट्स और बेजोड़ रेकॉर्ड्स केवल राईट साइड पर टेबल से ।
संक्षेप में
मिलान + वाम बेजोड़ + सही बेजोड़ = पूर्ण बाहरी सम्मिलित हों
मिलान + वाम बेजोड़ = बाएं बाहरी जुड़ना
मिलान + सही बेजोड़ = दायाँ बाहरी जुड़ाव
मिलान किया हुआ = भीतरी जुड़ना
समान्य शब्दों में,
1. INNER JOIN या EQUI JOIN: उन परिणामों को लौटाता है जो दोनों तालिकाओं में केवल स्थिति से मेल खाते हैं।
2. OUTER JOIN: कंडीशन मैच होने या न होने पर भी दोनों टेबलों से सभी मानों का परिणाम लौटाता है।
3. बाईं ओर: बाईं तालिका से सभी मानों का परिणाम लौटाता है और केवल पंक्तियों को दाएं तालिका में स्थिति से मिलाता है।
4. राइट जॉइन: दाएं टेबल से सभी मानों के परिणाम को लौटाता है और केवल उन पंक्तियों को छोड़ता है जो बाएं टेबल में स्थिति से मेल खाती हैं।
5. फुल जॉइन: फुल जॉइन और फुल बाहरी जॉइन समान हैं।
उदाहरण
मान लें कि आपके पास दो तालिकाएँ हैं, एक एकल स्तंभ के साथ, और डेटा निम्नानुसार है:
A B
- -
1 3
2 4
3 5
4 6
7
8
ध्यान दें कि (1,2,7,8) ए के लिए अद्वितीय हैं, (3,4) सामान्य हैं, और (5,6) बी के लिए अद्वितीय हैं।
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
यह ज्वाइन टेबल के सभी पंक्तियों को जॉइन के बाईं ओर और रिब के दाईं ओर टेबल के लिए मैचिंग पंक्तियों को मिलाता है। जिन पंक्तियों के लिए दाईं ओर कोई मिलान पंक्ति नहीं है, परिणाम-सेट में अशक्त होगा। बाईं ओर के रूप में भी जाना जाता है 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
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
आंतरिक रूप से जुड़ा - दोनों में से किसी एक समतुल्य क्वेरी का उपयोग करके एक इनर जॉइन दो टेबल , यानी दो पंक्तियों को एक दूसरे से जोड़ने का कार्य देता है ।
वाम बाहरी में शामिल होने के - एक बाहरी छोड़ दिया में शामिल होने बी में एक की सभी पंक्तियों के साथ ही आम पंक्तियों दे देंगे
पूर्ण बाहरी जुड़ाव - एक पूर्ण बाहरी जुड़ाव आपको A और B का मिलन प्रदान करेगा, अर्थात A में सभी पंक्तियाँ और B में सभी पंक्तियाँ। यदि A में किसी चीज़ में B की संगत डेटम नहीं है, तो B भाग है अशक्त, और इसके विपरीत
Join is not an intersection unless the tables have the same columns
नहीं। आप जो भी कॉलम चाहते हैं, उसमें शामिल हो सकते हैं और यदि मान मेल खाते हैं, तो वे एक साथ जुड़ेंगे।
1. इनर ज्वाइन: जिसे जॉइन कहा जाता है। यह दोनों तालिका में मौजूद पंक्तियों को और दाएं तालिका को मैच होने पर ही लौटाता है । अन्यथा, यह शून्य रिकॉर्ड लौटाता है।
उदाहरण:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
2. फुल ऑउट जॉइन: इसे फुल जॉइन भी कहा जाता है। यह सभी पंक्तियों को लौटाता है लेफ्ट टेबल और राइट टेबल दोनों में मौजूद ।
उदाहरण:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
3. बायां बाहरी हिस्सा: या बस लेफ्ट जॉइन कहा जाता है। यह बाईं तालिका में मौजूद सभी पंक्तियों और दाएं तालिका (यदि कोई हो) से मेल खाती पंक्तियों को लौटाता है।
4. राइट आउटर जॉइन: राइट जॉइन भी कहा जाता है। यह बाईं तालिका (यदि हो तो), और दाएं तालिका में मौजूद सभी पंक्तियों से मेल खाती पंक्तियाँ लौटाता है।
जुड़ने के फायदे
नीचे 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
से मुद्रित नहीं किया गया है क्योंकि यह विभाग तालिका में मेल नहीं खाता है। इसी तरह, और विभाग तालिका से पंक्तियों को मुद्रित नहीं किया जाता है क्योंकि उन्हें एम्प तालिका में एक मैच नहीं मिला है।6
HR
R&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
से पंक्तियों को मुद्रित नहीं किया जाता है क्योंकि उन्हें डेप_आईडी पर एम्प तालिका में एक मैच नहीं मिला है।
तो, बाईं ज्वाइंट लेफ्ट टेबल से सभी पंक्तियों को वापस करता है और केवल राइट टेबल से पंक्तियों का मिलान करता है।
कृपया मार्टिन स्मिथ द्वारा अलग-अलग जोड़ों के बेहतर उदाहरणों और स्पष्टीकरणों सहित, और विशेष रूप से , और , के बीच के अंतर के जवाब को देखें ।FULL OUTER JOIN
RIGHT OUTER JOIN
LEFT OUTER JOIN
ये दो तालिकाएँ JOIN
नीचे के प्रतिनिधित्व के लिए एक आधार बनाती हैं:
SELECT *
FROM citizen
CROSS JOIN postalcode
परिणाम सभी संयोजनों के कार्टेशियन उत्पाद होंगे। कोई JOIN
शर्त आवश्यक नहीं है:
INNER JOIN
बस के रूप में ही है: JOIN
SELECT *
FROM citizen c
JOIN postalcode p ON c.postal = p.postal
परिणाम संयोजन होगा जो आवश्यक JOIN
स्थिति को संतुष्ट करता है :
LEFT OUTER JOIN
के समान है LEFT JOIN
SELECT *
FROM citizen c
LEFT JOIN postalcode p ON c.postal = p.postal
citizen
अगर मैच नहीं होंगे तब भी परिणाम सब कुछ होगा postalcode
। फिर से एक JOIN
शर्त की आवश्यकता है:
सभी उदाहरण ओरेकल 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 JOIN
NULL
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
तत्व की मात्रा की आवश्यकता है । सेट सिद्धांत एक सेट में कई समान तत्वों के लिए नहीं बनाया गया है, इसलिए मैं वेन आरेखों को उचित रूप से अव्यवहारिक / असंभव का प्रतिनिधित्व करने के लिए पाता हूं। ऐसा लगता नहीं हैB
A
UNION
बिल्कुल फिट बैठता है।
पंक्तियाँ अलग हैं। UNION
कुल में 7 पंक्तियाँ है। लेकिन वे एक सामान्य SQL
परिणाम सेट के लिए असंगत हैं । और यह नहीं है कि कैसे CROSS JOIN
काम करता है:
इसे इस तरह प्रस्तुत करने की कोशिश की जा रही है:
..लेकिन अब यह सिर्फ एक जैसा दिखता है INTERSECTION
, जो निश्चित रूप से नहीं है । इसके अलावा वहाँ कोई तत्व नहीं है INTERSECTION
कि वास्तव में दो अलग सेट में से किसी में है। हालाँकि, यह बहुत समान परिणामों की तरह दिखता है:
संदर्भ के लिए 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
मतलब स्मिथ ग्रीन और जेनसेन दोनों का नेता है।
जब एक पंक्ति में दूसरी तालिका में पंक्तियों के लिए कई मिलान होते हैं, तो समस्याएँ शुरू होती हैं। यह और अधिक जटिल है क्योंकि OUTER JOIN
खाली सेट का मिलान करने के लिए किया जा सकता है। लेकिन सेट सिद्धांत में किसी भी सेट C
और एक खाली सेट का मिलन हमेशा होता है C
। खाली सेट कुछ नहीं जोड़ता है। इस का प्रतिनिधित्व LEFT OUTER JOIN
आमतौर पर सभी को A
यह दिखाने के लिए होता है कि पंक्तियों का A
चयन इस बात के लिए किया जाता है कि कोई मैच है या नहीं B
। हालांकि "मिलान तत्व" में ऊपर चित्रण के समान समस्याएं हैं। वे शर्त पर निर्भर हैं। और खाली सेट पर लगता है A
:
CROSS JOIN
स्मिथ के साथ सभी पंक्तियों को खोजना और चंद्रमा पर पोस्टलकोड:
SELECT *
FROM citizen c
CROSS JOIN postalcode p
WHERE c.name = 'Smith'
AND p.area = 'Moon';
अब वेन आरेख को प्रतिबिंबित करने के लिए उपयोग नहीं किया जाता है JOIN
। इसका उपयोग केवलWHERE
खंड के लिए किया जाता है :
..और जो समझ में आता है।
जैसा कि समझाया गया 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
।
बहुत ही सटीक संबंधपरक बीजगणित उदाहरणों के साथ यहां बहुत सारे अच्छे उत्तर हैं। यहाँ एक बहुत ही सरल उत्तर है जो SQL कोडिंग दुविधाओं के साथ शौकिया या नौसिखिए कोडर के लिए सहायक हो सकता है।
मूल रूप से, अधिक बार नहीं, JOIN
दो मामलों में सवाल उबलते हैं:
एक के लिए SELECT
डेटा के सबसेट A
:
INNER JOIN
करते समय संबंधित डेटा B
आप देख रहे हैं MUST डेटाबेस डिजाइन प्रति मौजूद है;LEFT JOIN
जब B
आप संबंधित डेटा को MIGHT या MIGHT के लिए देख रहे हों , तब उपयोग न करें , जो प्रति डेटाबेस डिज़ाइन में मौजूद नहीं है।के बीच का अंतर inner join
और outer join
इस प्रकार है:
Inner join
एक जुड़ाव है जो संयुक्त मिलानों के आधार पर संयुक्त तालिकाओं का है, जबकि outer join
एक ऐसा जोड़ है जो संयुक्त और बेमेल दोनों युग्मों के आधार पर संयुक्त तालिका है।Inner join
मर्ज दो तालिका से पंक्ति से मेल खाती है जिसमें बेजोड़ पंक्ति छोड़ दी outer join
जाती है , जबकि दो तालिकाओं और बेजोड़ पंक्तियों के विलय से शून्य मान भर जाता है।Inner join
एक चौराहे ऑपरेशन outer join
की तरह है , जबकि एक यूनियन ऑपरेशन की तरह है।Inner join
दो प्रकार है, जबकि outer join
तीन प्रकार हैं।outer join
से तेज है inner join
।