जॉइन (एसक्यूएल): Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{Short description|SQL clause}} | {{Short description|SQL clause}} | ||
[[File:Square join.png|thumb|वेन आरेख | [[File:Square join.png|thumb|वेन आरेख टेबल ए और बी के मध्य पूर्ण जॉइन एसक्यूएल कथन का प्रतिनिधित्व करता है।]]स्ट्रक्चर्ड क्वेरी लैंग्वेज ([[एसक्यूएल]]) में '''जॉइन''' क्लॉज एक या अधिक [[ तालिका (डेटाबेस) |टेबल]] के [[कॉलम (डेटाबेस)|कॉलम]] को नई टेबल में जॉइनता है। यह ऑपरेशन संबंधपरक बीजगणित में जॉइन ऑपरेशन से युग्मित होता है। अनौपचारिक रूप से, जॉइन दो तालिकाओं को जॉइनता है और युग्मित होने वाली फ़ील्ड के साथ एक ही पंक्ति में रिकॉर्ड रखता है: <code>INNER</code>, <code>LEFT OUTER</code>, <code>RIGHT OUTER</code>, <code>FULL OUTER</code> और <code>CROSS</code>आदि। | ||
==उदाहरण तालिकाएँ== | ==उदाहरण तालिकाएँ== | ||
Line 69: | Line 69: | ||
==क्रॉस जॉइन== | ==क्रॉस जॉइन== | ||
<code>CROSS JOIN</code> जॉइन में तालिकाओं से पंक्तियों का कार्टेशियन उत्पाद लौटाता है। दूसरे शब्दों में, यह ऐसी पंक्तियाँ उत्पन्न करेगा जो प्रथम | <code>CROSS JOIN</code> जॉइन में तालिकाओं से पंक्तियों का कार्टेशियन उत्पाद लौटाता है। दूसरे शब्दों में, यह ऐसी पंक्तियाँ उत्पन्न करेगा जो प्रथम टेबल की प्रत्येक पंक्ति को दूसरी टेबल की प्रत्येक पंक्ति के साथ जॉइनती हैं।<ref>[http://www.sqlguides.com/sql_cross_join.php SQL CROSS JOIN]</ref> | ||
{| class="wikitable" style="text-align:center" | {| class="wikitable" style="text-align:center" | ||
Line 138: | Line 138: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<code>CROSS JOIN</code> सम्मिलित | <code>CROSS JOIN</code> सम्मिलित टेबल से पंक्तियों को फ़िल्टर करने के लिए स्वयं कोई प्रेडिकेट प्रारम्भ नहीं करता है। ए के परिणाम <code>CROSS JOIN</code> के परिणामों को <code>WHERE</code> क्लॉज का उपयोग करके फ़िल्टर किया जा सकता है, जो तब इनर जॉइन के समतुल्य उत्पन्न कर सकता है। | ||
एसक्यूएल:2011 मानक में, क्रॉस जॉइन वैकल्पिक F401, एक्सटेंडेड जॉइन्ड टेबल, पैकेज का भाग हैं। | एसक्यूएल:2011 मानक में, क्रॉस जॉइन वैकल्पिक F401, एक्सटेंडेड जॉइन्ड टेबल, पैकेज का भाग हैं। | ||
Line 146: | Line 146: | ||
==इनर जॉइन== | ==इनर जॉइन== | ||
इनर जॉइन (या जॉइन) के लिए दो सम्मिलित तालिकाओं में प्रत्येक पंक्ति में युग्मित होने वाले कॉलम मानों की आवश्यकता होती है, और यह [[अनुप्रयोग प्रक्रिया सामग्री]] में सामान्यतः उपयोग किया जाने वाला जॉइन ऑपरेशन है, किन्तु इसे सभी स्थितियों में सबसे उत्तम विकल्प नहीं माना जाना चाहिए। इनर जॉइन, जॉइन-प्रेडिकेट के आधार पर दो तालिकाओं (ए और बी) के कॉलम मानों को सम्मिलित करके नई परिणाम | इनर जॉइन (या जॉइन) के लिए दो सम्मिलित तालिकाओं में प्रत्येक पंक्ति में युग्मित होने वाले कॉलम मानों की आवश्यकता होती है, और यह [[अनुप्रयोग प्रक्रिया सामग्री]] में सामान्यतः उपयोग किया जाने वाला जॉइन ऑपरेशन है, किन्तु इसे सभी स्थितियों में सबसे उत्तम विकल्प नहीं माना जाना चाहिए। इनर जॉइन, जॉइन-प्रेडिकेट के आधार पर दो तालिकाओं (ए और बी) के कॉलम मानों को सम्मिलित करके नई परिणाम टेबल बनाता है। क्वेरी ए की प्रत्येक पंक्ति की तुलना बी की प्रत्येक पंक्ति से करती है जिससे कि पंक्तियों के सभी जॉइने ज्ञात किये जा सकें जो जॉइन-प्रेडिकेट को संतुष्ट करते हैं। जब जॉइन-प्रेडिकेट गैर-[[ शून्य (एसक्यूएल) | शून्य]] मानों के मिलान से संतुष्ट होता है, तो ए और बी की पंक्तियों की प्रत्येक मिलान जॉइनी के लिए कॉलम मान परिणाम पंक्ति में संयोजित होते हैं। | ||
जॉइन के परिणाम को प्रथम तालिकाओं में सभी पंक्तियों के कार्टेशियन उत्पाद (या क्रॉस जॉइन) लेने के परिणाम के रूप में परिभाषित किया जा सकता है ( | जॉइन के परिणाम को प्रथम तालिकाओं में सभी पंक्तियों के कार्टेशियन उत्पाद (या क्रॉस जॉइन) लेने के परिणाम के रूप में परिभाषित किया जा सकता है (टेबल ए में प्रत्येक पंक्ति को टेबल बी में प्रत्येक पंक्ति के साथ जॉइनना) और फिर सभी पंक्तियों को वापस करना जो जॉइन प्रेडिकेट को संतुष्ट करते हैं। वास्तविक एसक्यूएल कार्यान्वयन सामान्यतः अन्य दृष्टिकोणों का उपयोग करते हैं, जैसे [[हैश जॉइन]] या [[सॉर्ट-मर्ज जॉइन]], क्योंकि कार्टेशियन उत्पाद की गणना धीमी है और स्टोर करने के लिए प्रायः बड़ी मात्रा में मेमोरी की आवश्यकता होती है। | ||
एसक्यूएल जॉइन को व्यक्त करने के लिए दो भिन्न-भिन्न वाक्यात्मक प्रकार निर्दिष्ट करता है: जो एक्सप्लिसिट जॉइन नोटेशन और इम्प्लिसिट जॉइन नोटेशन है। इम्प्लिसिट जॉइन नोटेशन को अब सर्वोत्तम अभ्यास नहीं माना जाता है{{By whom|date=September 2022}}, चूँकि डेटाबेस सिस्टम अभी भी इसका समर्थन करते हैं। | एसक्यूएल जॉइन को व्यक्त करने के लिए दो भिन्न-भिन्न वाक्यात्मक प्रकार निर्दिष्ट करता है: जो एक्सप्लिसिट जॉइन नोटेशन और इम्प्लिसिट जॉइन नोटेशन है। इम्प्लिसिट जॉइन नोटेशन को अब सर्वोत्तम अभ्यास नहीं माना जाता है{{By whom|date=September 2022}}, चूँकि डेटाबेस सिस्टम अभी भी इसका समर्थन करते हैं। | ||
एक्सप्लिसिट जॉइन नोटेशन सम्मिलित होने के लिए | एक्सप्लिसिट जॉइन नोटेशन सम्मिलित होने के लिए टेबल निर्दिष्ट करने के लिए वैकल्पिक रूप से <code>INNER</code> कीवर्ड से पूर्व <code>JOIN</code> कीवर्ड का उपयोग करता है, और सम्मिलित होने के लिए पूर्वानुमान निर्दिष्ट करने के लिए <code>ON</code> कीवर्ड का उपयोग करता है, जैसा कि निम्नलिखित उदाहरण में है: | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
Line 200: | Line 200: | ||
|| रैफर्टी || 31 || सेल्स | || रैफर्टी || 31 || सेल्स | ||
|} | |} | ||
एम्प्लॉयी विलियम्स और डिपार्टमेंट मार्केटिंग क्वेरी निष्पादन परिणामों में दिखाई नहीं देते हैं। इनमें से किसी की भी अन्य संबंधित | एम्प्लॉयी विलियम्स और डिपार्टमेंट मार्केटिंग क्वेरी निष्पादन परिणामों में दिखाई नहीं देते हैं। इनमें से किसी की भी अन्य संबंधित टेबल में कोई युग्मित होने वाली पंक्तियाँ नहीं हैं: "विलियम्स" का कोई संबद्ध डिपार्टमेंट नहीं है, और किसी भी एम्प्लॉयी के पास डिपार्टमेंट आईडी 35 (मार्केटिंग) नहीं है। वांछित परिणामों के आधार पर, यह व्यवहार सूक्ष्म बग हो सकता है, जिसे इनर जॉइन को आउटर जॉइन से प्रतिस्थापित करके बचा जा सकता है। | ||
=== इनर जॉइन और शून्य मान === | === इनर जॉइन और शून्य मान === | ||
प्रोग्रामर को उन स्तंभों पर तालिकाओं को | प्रोग्रामर को उन स्तंभों पर तालिकाओं को जॉइनते समय विशेष ध्यान रखना चाहिए जिनमें शून्य मान हो सकते हैं, क्योंकि शून्य कभी भी किसी अन्य मान से युग्मित नहीं हो सकता (यहां तक कि नल भी नहीं), जब तक कि जुड़ने की स्थिति स्पष्ट रूप से संयोजन प्रेडिकेट का उपयोग नहीं करती है जो प्रथम परीक्षण करता है कि जुड़ने वाले कॉलम <code> NOT NULL</code> हैं शेष प्रेडिकेट नियम को प्रस्तावित करने से पूर्व होते हैं। इनर जॉइन का उपयोग केवल उस डेटाबेस में सुरक्षित रूप से किया जा सकता है जो संदर्भात्मक अखंडता को प्रस्तावित करता है या जहां जॉइन कॉलम के शून्य न होने का आश्वासन होता है। कई लेनदेन प्रसंस्करण संबंधपरक डेटाबेस डेटा अखंडता सुनिश्चित करने के लिए परमाणुता, स्थिरता, भिन्नता, स्थायित्व (एसीआईडी) डेटा अद्यतन मानकों पर विश्वास करते हैं, जिससे इनर जॉइन उपयुक्त विकल्प बन जाता है। चूँकि, लेन-देन डेटाबेस में सामान्यतः वांछनीय जॉइन वाले कॉलम भी होते हैं जिन्हें शून्य होने की अनुमति होती है। कई रिपोर्टिंग रिलेशनल डेटाबेस और [[डेटा वेयरहाउस]] हाई वॉल्यूम एक्सट्रैक्ट, ट्रांसफॉर्म, लोड (ईटीएल) बैच अपडेट का उपयोग करते हैं जो संदर्भात्मक अखंडता को प्रस्तावित करना कठिन या असंभव बनाते हैं, जिसके परिणामस्वरूप संभावित रूप से शून्य जॉइन कॉलम होते हैं जिन्हें एसक्यूएल क्वेरी लेखक संशोधित नहीं कर सकता है और जो किसी त्रुटि के संकेत के बिना डेटा को छोड़ने के लिए इनर जॉइन का कारण बनता है। इनर जॉइन का उपयोग करने का विकल्प डेटाबेस डिज़ाइन और डेटा विशेषताओं पर निर्भर करता है। जब टेबल में सम्मिलित कॉलम में शून्य मान हो सकते हैं, तो बाएं आउटर जॉइन को सामान्यतः इनर जॉइन के लिए प्रतिस्थापित किया जा सकता है। | ||
कोई भी डेटा कॉलम जो शून्य (रिक्त) हो सकता है, उसे कभी भी इनर जॉइन में लिंक के रूप में उपयोग नहीं किया जाना चाहिए, जब तक कि इच्छित परिणाम शून्य मान वाली पंक्तियों को समाप्त करना न हो। यदि [[परिणाम सेट]] से शून्य जॉइन कॉलम को निश्चयपूर्वक विस्थापित किया जाता है, तो इनर जॉइन आउटर जॉइन से तीव्र हो सकता है क्योंकि टेबल जॉइन और फ़िल्टरिंग एक ही चरण में की जाती है। इसके विपरीत, एसक्यूएल व्हेयर क्लॉज में डेटाबेस फ़ंक्शंस के साथ संयोजन में बड़ी मात्रा में क्वेरी में उपयोग किए जाने पर इनर जॉइन के परिणामस्वरूप विनाशकारी रूप से धीमा प्रदर्शन या सर्वर क्रैश भी हो सकता है।<ref>Greg Robidoux, "Avoid SQL Server functions in the WHERE clause for Performance", MSSQL Tips, 3 May 2007</ref><ref>Patrick Wolf, "Inside Oracle APEX "Caution when using PL/SQL functions in a SQL statement", 30 November 2006</ref><ref>Gregory A. Larsen, "T-SQL Best Practices - Don't Use Scalar Value Functions in Column List or WHERE Clauses", 29 October 2009,</ref> एसक्यूएल व्हेयर क्लॉज़ में फ़ंक्शन के परिणामस्वरूप डेटाबेस अपेक्षाकृत कॉम्पैक्ट टेबल इंडेक्स को अनदेखा कर सकता है। गणना किए गए मान पर निर्भर फ़िल्टर का उपयोग करके पंक्तियों की संख्या को कम करने से पूर्व डेटाबेस दोनों तालिकाओं से चयनित कॉलम को पढ़ और इनर रूप से जॉइन सकता है, जिसके परिणामस्वरूप अपेक्षाकृत भारी मात्रा में अकुशल प्रसंस्करण होता है। | कोई भी डेटा कॉलम जो शून्य (रिक्त) हो सकता है, उसे कभी भी इनर जॉइन में लिंक के रूप में उपयोग नहीं किया जाना चाहिए, जब तक कि इच्छित परिणाम शून्य मान वाली पंक्तियों को समाप्त करना न हो। यदि [[परिणाम सेट]] से शून्य जॉइन कॉलम को निश्चयपूर्वक विस्थापित किया जाता है, तो इनर जॉइन आउटर जॉइन से तीव्र हो सकता है क्योंकि टेबल जॉइन और फ़िल्टरिंग एक ही चरण में की जाती है। इसके विपरीत, एसक्यूएल व्हेयर क्लॉज में डेटाबेस फ़ंक्शंस के साथ संयोजन में बड़ी मात्रा में क्वेरी में उपयोग किए जाने पर इनर जॉइन के परिणामस्वरूप विनाशकारी रूप से धीमा प्रदर्शन या सर्वर क्रैश भी हो सकता है।<ref>Greg Robidoux, "Avoid SQL Server functions in the WHERE clause for Performance", MSSQL Tips, 3 May 2007</ref><ref>Patrick Wolf, "Inside Oracle APEX "Caution when using PL/SQL functions in a SQL statement", 30 November 2006</ref><ref>Gregory A. Larsen, "T-SQL Best Practices - Don't Use Scalar Value Functions in Column List or WHERE Clauses", 29 October 2009,</ref> एसक्यूएल व्हेयर क्लॉज़ में फ़ंक्शन के परिणामस्वरूप डेटाबेस अपेक्षाकृत कॉम्पैक्ट टेबल इंडेक्स को अनदेखा कर सकता है। गणना किए गए मान पर निर्भर फ़िल्टर का उपयोग करके पंक्तियों की संख्या को कम करने से पूर्व डेटाबेस दोनों तालिकाओं से चयनित कॉलम को पढ़ और इनर रूप से जॉइन सकता है, जिसके परिणामस्वरूप अपेक्षाकृत भारी मात्रा में अकुशल प्रसंस्करण होता है। | ||
जब परिणाम सेट कई तालिकाओं को | जब परिणाम सेट कई तालिकाओं को जॉइनकर प्रस्तुत किया जाता है, जिसमें संख्यात्मक पहचानकर्ता कोड ( लुकअप तालिका) के पूर्ण-पाठ विवरण देखने के लिए उपयोग की जाने वाली मास्टर तालिकाएं भी सम्मिलित होती हैं, तो विदेशी कुंजी में से किसी में शून्य मान के परिणामस्वरूप परिणाम सेट से पूर्ण पंक्ति को विस्थापित किया जा सकता है, त्रुटि का कोई संकेत नहीं है। जटिल एसक्यूएल क्वेरी जिसमें एक या अधिक इनर जॉइन और कई आउटर जॉइन सम्मिलित होते हैं, इनर जॉइन लिंक कॉलम में शून्य मानों के लिए समान संकट होता है। | ||
इनर जॉइन वाले एसक्यूएल कोड के प्रति प्रतिबद्धता यह मानती है कि शून्य जॉइन कॉलम को भविष्य में होने वाले परिवर्तनों द्वारा प्रस्तुत नहीं किया जाएगा, जिसमें विक्रेता अपडेट, डिज़ाइन परिवर्तन और एप्लिकेशन के डेटा सत्यापन नियमों के बाहर बल्क प्रोसेसिंग जैसे डेटा रूपांतरण, माइग्रेशन, बल्क आयात और मर्ज सम्मिलित हैं। | इनर जॉइन वाले एसक्यूएल कोड के प्रति प्रतिबद्धता यह मानती है कि शून्य जॉइन कॉलम को भविष्य में होने वाले परिवर्तनों द्वारा प्रस्तुत नहीं किया जाएगा, जिसमें विक्रेता अपडेट, डिज़ाइन परिवर्तन और एप्लिकेशन के डेटा सत्यापन नियमों के बाहर बल्क प्रोसेसिंग जैसे डेटा रूपांतरण, माइग्रेशन, बल्क आयात और मर्ज सम्मिलित हैं। | ||
इनर जॉइन को आगे चलकर समान | इनर जॉइन को आगे चलकर समान जॉइन, नेचुरल जॉइन या क्रॉस-जॉइन के रूप में वर्गीकृत किया जा सकता है। | ||
===इक्वि-जॉइन=== | ===इक्वि-जॉइन=== | ||
Line 233: | Line 233: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
चूँकि,<code>USING</code> निर्माण केवल वाक्यात्मक चीनी से अधिक है,क्योंकि परिणाम सेट स्पष्ट प्रेडिकेट के साथ संस्करण के परिणाम सेट से भिन्न होता है। विशेष रूप से, <code>USING</code> सूची में उल्लिखित कोई भी कॉलम जॉइन में प्रत्येक | चूँकि,<code>USING</code> निर्माण केवल वाक्यात्मक चीनी से अधिक है,क्योंकि परिणाम सेट स्पष्ट प्रेडिकेट के साथ संस्करण के परिणाम सेट से भिन्न होता है। विशेष रूप से, <code>USING</code> सूची में उल्लिखित कोई भी कॉलम जॉइन में प्रत्येक टेबल के लिए एक बार के अतिरिक्त केवल अयोग्य नाम के साथ दिखाई देगा। उपरोक्त स्थिति में, एक ही <code>DepartmentID</code> कॉलम होगा और कोई <code>employee.DepartmentID</code> या <code>department.DepartmentID</code> नहीं होगा। | ||
<code>USING</code> क्लॉज एमएस एसक्यूएल सर्वर और Sybase द्वारा समर्थित नहीं है। | <code>USING</code> क्लॉज एमएस एसक्यूएल सर्वर और Sybase द्वारा समर्थित नहीं है। | ||
Line 246: | Line 246: | ||
|+ एम्प्लॉयी | |+ एम्प्लॉयी | ||
|- | |- | ||
! | ! नेम !! एम्प्लॉयीआईडी !! डिपार्टमेंटनेम | ||
|- | |- | ||
| | | हैरी || 3415 || फाइनेंस | ||
|- | |- | ||
| | | सैली || 2241 || सेल्स | ||
|- | |- | ||
| | | जॉर्ज || 3401 || फाइनेंस | ||
|- | |- | ||
| | | हेरिएट || 2202 || सेल्स | ||
|} | |} | ||
|| | || | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ डिपार्टमेंट | ||
|- | |- | ||
! | ! डिपार्टमेंटनेम !! मैनेजर | ||
|- | |- | ||
| | | फाइनेंस || जॉर्ज | ||
|- | |- | ||
| सेल्स || | | सेल्स || हेरिएट | ||
|- | |- | ||
| | | प्रोडक्शन || चार्ल्स | ||
|} | |} | ||
|| | || | ||
Line 272: | Line 272: | ||
|+ ''Employee'' <math> \bowtie </math> ''Dept'' | |+ ''Employee'' <math> \bowtie </math> ''Dept'' | ||
|- | |- | ||
! | ! नेम !! एम्प्लॉयीआईडी !! डिपार्टमेंटनेम !! मैनेजर | ||
|- | |- | ||
| | | हैरी || 3415 || फाइनेंस || जॉर्ज | ||
|- | |- | ||
| | | सैली || 2241 || सेल्स || हेरिएट | ||
|- | |- | ||
| | | जॉर्ज || 3401 || फाइनेंस || जॉर्ज | ||
|- | |- | ||
| | | हेरिएट || 2202 || सेल्स || हेरिएट | ||
|} | |} | ||
|} | |} | ||
Line 286: | Line 286: | ||
इसका उपयोग [[संबंधों की संरचना]] को परिभाषित करने के लिए भी किया जा सकता है। उदाहरण के लिए, एम्प्लॉयी और डिपार्टमेंट की संरचना उनका जॉइन है जैसा कि ऊपर दिखाया गया है, सामान्य विशेषता विभागनाम को छोड़कर सभी पर प्रक्षेपित किया गया है। [[श्रेणी सिद्धांत]] में, जॉइन बिल्कुल [[फाइबर उत्पाद]] है। | इसका उपयोग [[संबंधों की संरचना]] को परिभाषित करने के लिए भी किया जा सकता है। उदाहरण के लिए, एम्प्लॉयी और डिपार्टमेंट की संरचना उनका जॉइन है जैसा कि ऊपर दिखाया गया है, सामान्य विशेषता विभागनाम को छोड़कर सभी पर प्रक्षेपित किया गया है। [[श्रेणी सिद्धांत]] में, जॉइन बिल्कुल [[फाइबर उत्पाद]] है। | ||
नेचुरल जॉइन निश्चित सबसे महत्वपूर्ण ऑपरेटरों में से है क्योंकि यह तार्किक AND का संबंधपरक समकक्ष है। ध्यान दें कि यदि AND से जुड़े दो विधेयों में से प्रत्येक में एक ही चर दिखाई देता है, तो वह चर एक ही चीज़ के लिए खड़ा होता है और दोनों दिखावे को सदैव एक ही मान से प्रतिस्थापित किया जाना चाहिए। विशेष रूप से, नेचुरल जॉइन उन संबंधों के संयोजन की अनुमति देता है जो किसी विदेशी कुंजी से जुड़े होते हैं। उदाहरण के लिए, उपरोक्त उदाहरण में विदेशी कुंजी संभवतः Employee.DeptName से Dept.DeptName तक होती है और फिर एम्प्लॉयी और डिपार्टमेंट का नेचुरल जॉइन सभी कर्मचारियों को उनके डिपार्टमेंट के साथ | नेचुरल जॉइन निश्चित सबसे महत्वपूर्ण ऑपरेटरों में से है क्योंकि यह तार्किक AND का संबंधपरक समकक्ष है। ध्यान दें कि यदि AND से जुड़े दो विधेयों में से प्रत्येक में एक ही चर दिखाई देता है, तो वह चर एक ही चीज़ के लिए खड़ा होता है और दोनों दिखावे को सदैव एक ही मान से प्रतिस्थापित किया जाना चाहिए। विशेष रूप से, नेचुरल जॉइन उन संबंधों के संयोजन की अनुमति देता है जो किसी विदेशी कुंजी से जुड़े होते हैं। उदाहरण के लिए, उपरोक्त उदाहरण में विदेशी कुंजी संभवतः Employee.DeptName से Dept.DeptName तक होती है और फिर एम्प्लॉयी और डिपार्टमेंट का नेचुरल जॉइन सभी कर्मचारियों को उनके डिपार्टमेंट के साथ जॉइनता है। यह काम करता है क्योंकि विदेशी कुंजी समान नाम वाली विशेषताओं के मध्य रहती है। यदि ऐसी स्थिति नहीं है जैसे डिपार्टमेंट प्रबंधक से एम्प्लॉयी नाम तक की विदेशी कुंजी में तो नेचुरल जॉइन लेने से पूर्व इन कॉलमों का नाम परिवर्तित करना होगा। इस प्रकार के जॉइन को कभी-कभी 'इक्वी-जॉइन' भी कहा जाता है। | ||
अधिक औपचारिक रूप से नेचुरल जॉइन के शब्दार्थ को इस प्रकार परिभाषित किया गया है: | अधिक औपचारिक रूप से नेचुरल जॉइन के शब्दार्थ को इस प्रकार परिभाषित किया गया है: | ||
Line 297: | Line 297: | ||
:<math>T = \rho_{x_1/c_1,\ldots,x_m/c_m}(S) = \rho_{x_1/c_1}(\rho_{x_2/c_2}(\ldots\rho_{x_m/c_m}(S)\ldots))</math> | :<math>T = \rho_{x_1/c_1,\ldots,x_m/c_m}(S) = \rho_{x_1/c_1}(\rho_{x_2/c_2}(\ldots\rho_{x_m/c_m}(S)\ldots))</math> | ||
तब हम कार्टेशियन उत्पाद लेते हैं और उन टुपल्स का चयन करते हैं जिन्हें | तब हम कार्टेशियन उत्पाद लेते हैं और उन टुपल्स का चयन करते हैं जिन्हें जॉइना जाना है: | ||
:<math>U = \pi_{r_1,\ldots,r_n,c_1,\ldots,c_m,s_1,\ldots,s_k}(P)</math> | :<math>U = \pi_{r_1,\ldots,r_n,c_1,\ldots,c_m,s_1,\ldots,s_k}(P)</math> | ||
[[ प्राकृतिक जुड़ाव | नेचुरल जॉइन]] एक प्रकार का इक्वि-जॉइन है जहां जॉइन प्रेडिकेट दोनों तालिकाओं में सभी कॉलमों की तुलना करके अंतर्निहित रूप से उत्पन्न होता है, जिसमें सम्मिलित तालिकाओं में समान कॉलम-नाम होते हैं। परिणामी सम्मिलित | [[ प्राकृतिक जुड़ाव | नेचुरल जॉइन]] एक प्रकार का इक्वि-जॉइन है जहां जॉइन प्रेडिकेट दोनों तालिकाओं में सभी कॉलमों की तुलना करके अंतर्निहित रूप से उत्पन्न होता है, जिसमें सम्मिलित तालिकाओं में समान कॉलम-नाम होते हैं। परिणामी सम्मिलित टेबल में समान रूप से नामित स्तंभों की प्रत्येक जॉइनी के लिए केवल स्तंभ होता है। ऐसी स्थिति में जब समान नाम वाला कोई कॉलम नहीं मिलता है, तो परिणाम [[क्रॉस जॉइन]] होता है। | ||
अधिकांश विशेषज्ञ इस विषय से सहमत हैं कि नेचुरल जॉइन खतरनाक हैं और इसलिए उनके उपयोग को दृढ़ता से हतोत्साहित करते हैं।<ref>[http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:13430766143199 Ask Tom "Oracle support of ANSI joins."] [http://awads.net/wp/2006/03/20/back-to-basics-inner-joins/#comment-2837 Back to basics: inner joins » Eddie Awad's Blog] {{Webarchive|url=https://web.archive.org/web/20101119182541/http://awads.net/wp/2006/03/20/back-to-basics-inner-joins/#comment-2837 |date=2010-11-19 }}</ref> खतरा अज्ञात स्थिति में नया कॉलम | अधिकांश विशेषज्ञ इस विषय से सहमत हैं कि नेचुरल जॉइन खतरनाक हैं और इसलिए उनके उपयोग को दृढ़ता से हतोत्साहित करते हैं।<ref>[http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:13430766143199 Ask Tom "Oracle support of ANSI joins."] [http://awads.net/wp/2006/03/20/back-to-basics-inner-joins/#comment-2837 Back to basics: inner joins » Eddie Awad's Blog] {{Webarchive|url=https://web.archive.org/web/20101119182541/http://awads.net/wp/2006/03/20/back-to-basics-inner-joins/#comment-2837 |date=2010-11-19 }}</ref> खतरा अज्ञात स्थिति में नया कॉलम जॉइनने से आता है, जिसका नाम दूसरी टेबल के दूसरे कॉलम के समान है। उपस्थित नेचुरल जॉइन स्वाभाविक रूप से तुलना के लिए नए कॉलम का उपयोग कर सकता है, पूर्व की तुलना में विभिन्न पैरामीटर (विभिन्न कॉलमों से) का उपयोग करके तुलना/मिलान कर सकता है। इस प्रकार उपस्थित क्वेरी भिन्न-भिन्न परिणाम दे सकती है, भले ही तालिकाओं में डेटा परिवर्तित नहीं किया गया है, बल्कि केवल संवर्धित किया गया है। टेबल लिंक को स्वचालित रूप से निर्धारित करने के लिए कॉलम नामों का उपयोग सैकड़ों या हजारों तालिकाओं वाले बड़े डेटाबेस में विकल्प नहीं है, जहां यह नामकरण परंपराओं पर अवास्तविक बाधा डालेगा। वास्तविक विश्व के डेटाबेस सामान्यतः विदेशी कुंजी डेटा के साथ डिज़ाइन किए जाते हैं जो व्यावसायिक नियमों और संदर्भ के कारण निरंतर पॉप्युलेट नहीं होते हैं (शून्य मानों की अनुमति है)। विभिन्न तालिकाओं में समान डेटा के कॉलम नामों को संशोधित करना सामान्य विषय है और कठोर स्थिरता की यह कमी नेचुरल जॉइन को वर्णन के लिए सैद्धांतिक अवधारणा में परिवर्तित कर देती है। | ||
इनर जॉइन के लिए उपरोक्त प्रतिरूप क्वेरी को नेचुरल जॉइन के रूप में निम्नलिखित प्रकार से व्यक्त किया जा सकता है: | इनर जॉइन के लिए उपरोक्त प्रतिरूप क्वेरी को नेचुरल जॉइन के रूप में निम्नलिखित प्रकार से व्यक्त किया जा सकता है: | ||
Line 309: | Line 309: | ||
FROM employee NATURAL JOIN department; | FROM employee NATURAL JOIN department; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
स्पष्ट <code>USING</code> क्लॉज के जैसे, सम्मिलित | स्पष्ट <code>USING</code> क्लॉज के जैसे, सम्मिलित टेबल में केवल डिपार्टमेंटआईडी कॉलम होता है, जिसमें कोई क्वालीफायर नहीं होता है: | ||
{| class="wikitable" style="text-align:center" | {| class="wikitable" style="text-align:center" | ||
Line 330: | Line 330: | ||
==आउटर जॉइन== | ==आउटर जॉइन== | ||
सम्मिलित | सम्मिलित टेबल प्रत्येक पंक्ति को निरंतर रखती है - भले ही कोई अन्य मिलान पंक्ति उपस्थित न हो। आउटर जॉइन को बाएँ आउटर जॉइन, दाएँ आउटर जॉइन और पूर्ण आउटर जॉइन में उप-विभाजित किया जाता है, यह इस पर निर्भर करता है कि किस टेबल की पंक्तियाँ निरंतर रखी गई हैं: बाएँ, दाएँ, या दोनों (इस स्थिति में बाएँ और दाएँ <code>JOIN</code> कीवर्ड के दोनों पक्षों को संदर्भित करते हैं)। इनर जॉइन के जैसे, कोई भी सभी प्रकार के आउटर जॉइन को इक्वि-जॉइन, नेचुरल जॉइन, <code>'''ON''' ''<predicate>''</code> (θ-जॉइन), आदि के रूप में उप-वर्गीकृत कर सकता है।<ref>{{cite book |title=डेटाबेस सिस्टम अवधारणाएँ|section=Section 4.10.2: Join Types and Conditions |page=166 |last1=Silberschatz |first1=Abraham |author-link1=Abraham Silberschatz|author2-link=Henry F. Korth |last2=Korth |first2=Hank |last3=Sudarshan |first3=S. |edition=4th |year=2002 |isbn=0072283637}}</ref> | ||
मानक एसक्यूएल में आउटर जॉइनों के लिए कोई अंतर्निहित जॉइन-नोटेशन | |||
[[File:SQL Join - 01 A Left Join B.svg|alt=A Venn diagram showing the left circle and overlapping portion filled.|अंगूठा|एक वेन आरेख जो तालिका ए और बी के बीच बाईं ओर जुड़े एसक्यूएल कथन का प्रतिनिधित्व करता है।]] | मानक एसक्यूएल में आउटर जॉइनों के लिए कोई अंतर्निहित जॉइन-नोटेशन उपस्थित नहीं है। | ||
[[File:SQL Join - 01 A Left Join B.svg|alt=A Venn diagram showing the left circle and overlapping portion filled.|अंगूठा|एक वेन आरेख जो तालिका ए और बी के बीच बाईं ओर जुड़े एसक्यूएल कथन का प्रतिनिधित्व करता है।]] | |||
===बायां आउटर जॉइन=== | ===बायां आउटर जॉइन=== | ||
टेबल ए और बी के लिए बाएं आउटर जॉइन (या बस बाएं जॉइन) के परिणाम में सदैव बाईं टेबल (ए) की सभी पंक्तियां सम्मिलित होती हैं, भले ही सम्मिलित होने की स्थिति को सही टेबल (बी) में कोई मिलान पंक्ति नहीं मिलती है। इसका तात्पर्य यह है कि यदि <code>ON</code> क्लॉज़ बी में 0 (शून्य) पंक्तियों से युग्मित होता है (ए में दी गई पंक्ति के लिए), तो जॉइन अभी भी परिणाम में पंक्ति लौटाएगा (उस पंक्ति के लिए) - किन्तु बी से प्रत्येक कॉलम में शून्य के साथ है। बयां आउटर जॉइन सभी को लौटाता है इनर जॉइन के मान और बाईं टेबल के सभी मान जो दाहिनी टेबल से युग्मित नहीं होते हैं, जिसमें लिंक कॉलम में शून्य (रिक्त) मान वाली पंक्तियाँ भी सम्मिलित हैं। | |||
उदाहरण के लिए, यह हमें किसी एम्प्लॉयी का डिपार्टमेंट | उदाहरण के लिए, यह हमें किसी एम्प्लॉयी का डिपार्टमेंट अन्वेषण की अनुमति देता है, किन्तु फिर भी उन कर्मचारियों को दिखाता है जिन्हें किसी डिपार्टमेंट को नहीं सौंपा गया है (ऊपर दिए गए इनर-जॉइन उदाहरण के विपरीत, जहां बिना असाइन किए गए एम्प्लॉयी को परिणाम से बाहर रखा गया था)। | ||
बाएँ आउटर जॉइन का उदाहरण ( | बाएँ आउटर जॉइन का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति (इनर जॉइन की तुलना में) इटैलिकाइज़्ड के साथ है: | ||
<syntaxhighlight lang=sql> | <syntaxhighlight lang=sql> | ||
Line 363: | Line 365: | ||
|} | |} | ||
'''वैकल्पिक | '''वैकल्पिक सिंटैक्स''' | ||
ओरेकल | ओरेकल अप्रचलित<ref name="deprecated_plus_sign">[http://www.dba-oracle.com/tips_oracle_left_outer_join.htm Oracle लेफ्ट आउटर जॉइन]</ref> सिंटैक्स का समर्थन करता है: | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT * | SELECT * | ||
Line 371: | Line 373: | ||
WHERE employee.DepartmentID = department.DepartmentID(+) | WHERE employee.DepartmentID = department.DepartmentID(+) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Sybase]] सिंटैक्स का समर्थन करता है ( | [[Sybase]] सिंटैक्स का समर्थन करता है (माइक्रोसॉफ्ट एसक्यूएल सर्वर ने संस्करण 2000 से इस सिंटैक्स को विस्थापित कर दिया है): | ||
<syntaxhighlight lang=tsql> | <syntaxhighlight lang=tsql> | ||
SELECT * | SELECT * | ||
Line 377: | Line 379: | ||
WHERE employee.DepartmentID *= department.DepartmentID | WHERE employee.DepartmentID *= department.DepartmentID | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[IBM Informix]] सिंटैक्स का समर्थन करता है: | [[IBM Informix|आईबीएम इनफॉर्मिक्स]] सिंटैक्स का समर्थन करता है: | ||
<syntaxhighlight lang=sql> | <syntaxhighlight lang=sql> | ||
SELECT * | SELECT * | ||
Line 387: | Line 389: | ||
===दायां आउटर जॉइन=== | ===दायां आउटर जॉइन=== | ||
दायां आउटर जॉइन (या दायां | दायां आउटर जॉइन (या दायां जॉइन) बाएं आउटर जॉइन से अधिक इसके अतिरिक्त तालिकाओं के विपरीत व्यवहार से मिलता-जुलता है। दाहिनी टेबल (बी) से प्रत्येक पंक्ति कम से कम एक बार सम्मिलित टेबल में दिखाई देगी। यदि बाईं टेबल (ए) से कोई मिलान पंक्ति उपस्थित नहीं है, तो शून्य उन पंक्तियों के लिए ए से कॉलम में दिखाई देगा जिनका बी में कोई युग्मन नहीं है। | ||
दायां आउटर जॉइन दाहिनी | दायां आउटर जॉइन दाहिनी टेबल से सभी मान लौटाता है और बाईं टेबल से मिलान किए गए मान लौटाता है (कोई मिलान न होने की स्थिति में शून्य)। उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी और उसके डिपार्टमेंट को अन्वेषण की अनुमति देता है, किन्तु फिर भी ऐसे डिपार्टमेंट दिखाता है जिनमें कोई एम्प्लॉयी नहीं है। | ||
नीचे दाएं आउटर जॉइन का उदाहरण दिया गया है ( | नीचे दाएं आउटर जॉइन का उदाहरण दिया गया है (<code>OUTER</code>कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति इटैलिकाइज़्ड के साथ है: | ||
<syntaxhighlight lang=sql> | <syntaxhighlight lang=sql> | ||
Line 414: | Line 416: | ||
| {{null result}} || {{null result}} || मार्केटिंग || ''35'' | | {{null result}} || {{null result}} || मार्केटिंग || ''35'' | ||
|} | |} | ||
दाएं और बाएं आउटर जॉइन कार्यात्मक रूप से समतुल्य हैं। इनमें से कोई भी ऐसी कोई कार्यक्षमता प्रदान नहीं करता है जो दूसरा नहीं करता है, इसलिए जब तक | दाएं और बाएं आउटर जॉइन कार्यात्मक रूप से समतुल्य हैं। इनमें से कोई भी ऐसी कोई कार्यक्षमता प्रदान नहीं करता है जो दूसरा नहीं करता है, इसलिए जब तक टेबल क्रम स्विच किया जाता है तब तक दाएं और बाएं आउटर जॉइन -दूसरे को प्रतिस्थापित कर सकते हैं। | ||
[[File:SQL Join - 05b A Full Join B.svg|alt=A Venn diagram showing the right circle, left circle, and overlapping portion filled.|अंगूठे|एक वेन आरेख तालिका ए और बी के बीच पूर्ण जुड़ाव एसक्यूएल कथन का प्रतिनिधित्व करता है।]] | [[File:SQL Join - 05b A Full Join B.svg|alt=A Venn diagram showing the right circle, left circle, and overlapping portion filled.|अंगूठे|एक वेन आरेख तालिका ए और बी के बीच पूर्ण जुड़ाव एसक्यूएल कथन का प्रतिनिधित्व करता है।]] | ||
===पूर्ण आउटर जॉइन=== | ===पूर्ण आउटर जॉइन=== | ||
वैचारिक रूप से, पूर्ण आउटर जॉइन बाएँ और दाएँ दोनों आउटर जॉइनों को | वैचारिक रूप से, पूर्ण आउटर जॉइन बाएँ और दाएँ दोनों आउटर जॉइनों को प्रस्तावित करने के प्रभाव को जोड़ता है। जहां पूर्ण आउटर सम्मिलित तालिकाओं में पंक्तियाँ युग्मित नहीं होती हैं, परिणाम सेट में टेबल के प्रत्येक कॉलम के लिए शून्य मान होंगे जिनमें मिलान पंक्ति का अभाव है। उन पंक्तियों के लिए जो युग्मित होती हैं, परिणाम सेट में एकल पंक्ति प्रस्तुत की जाएगी (जिसमें दोनों तालिकाओं से भरे गए कॉलम होंगे)। | ||
उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी को देखने की अनुमति देता है जो | उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी को देखने की अनुमति देता है जो डिपार्टमेंट में है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी है, किन्तु प्रत्येक एम्प्लॉयी को भी देख सकता है जो डिपार्टमेंट का भाग नहीं है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी नहीं है। | ||
पूर्ण आउटर जॉइन का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है): | पूर्ण आउटर जॉइन का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है): | ||
Line 447: | Line 450: | ||
| {{null result}} || {{null result}} || मार्केटिंग || ''35'' | | {{null result}} || {{null result}} || मार्केटिंग || ''35'' | ||
|} | |} | ||
कुछ डेटाबेस प्रणालियाँ सीधे पूर्ण आउटर जॉइन कार्यक्षमता का समर्थन नहीं करती हैं, किन्तु वे क्रमशः बाएँ और दाएँ तालिकाओं से | कुछ डेटाबेस प्रणालियाँ सीधे पूर्ण आउटर जॉइन कार्यक्षमता का समर्थन नहीं करती हैं, किन्तु वे क्रमशः बाएँ और दाएँ तालिकाओं से एकल टेबल पंक्तियों के सभी चयनों और इनर जॉइन के उपयोग के माध्यम से इसका अनुकरण कर सकते हैं। वही उदाहरण इस प्रकार दिखाई दे सकता है: | ||
<syntaxhighlight lang=sql> | <syntaxhighlight lang=sql> | ||
SELECT employee.LastName, employee.DepartmentID, | SELECT employee.LastName, employee.DepartmentID, | ||
Line 472: | Line 475: | ||
WHERE employee.DepartmentID = department.DepartmentID) | WHERE employee.DepartmentID = department.DepartmentID) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
अन्य दृष्टिकोण यूनियन हो सकता है, सभी बाएँ आउटर जॉइन और दाएँ आउटर जॉइन माइनस इनर | अन्य दृष्टिकोण यूनियन हो सकता है, सभी बाएँ आउटर जॉइन और दाएँ आउटर जॉइन माइनस इनर जॉइन है। | ||
== | ==सेल्फ-जॉइन== | ||
सेल्फ-जॉइन | सेल्फ-जॉइन का अर्थ टेबल को स्वयं से जोड़ना है।<ref>{{Harvnb|Shah|2005|p=165}}</ref> | ||
'''उदाहरण''' | '''उदाहरण''' | ||
यदि कर्मचारियों के लिए दो | यदि कर्मचारियों के लिए दो भिन्न-भिन्न तालिकाएँ थीं और क्वेरी जिसमें प्रथम टेबल में कर्मचारियों से दूसरी टेबल में कर्मचारियों के समान देश का अनुरोध किया गया था, तो उत्तर टेबल अन्वेषण के लिए सामान्य जॉइन ऑपरेशन का उपयोग किया जा सकता था। चूँकि, सभी एम्प्लॉयी की सूचना बड़ी टेबल में समाहित है।<ref>Adapted from {{harvnb|Pratt|2005|pp=115–6}}</ref> | ||
संशोधित | |||
निम्नलिखित जैसे कि संशोधित <code>Employee</code> टेबल पर विचार करें : | |||
{| class="wikitable" style="text-align:center; float:left; margin-right:5px" | {| class="wikitable" style="text-align:center; float:left; margin-right:5px" | ||
|+एम्प्लॉयी टेबल | |+एम्प्लॉयी टेबल | ||
Line 505: | Line 509: | ||
ORDER BY F.EmployeeID, S.EmployeeID; | ORDER BY F.EmployeeID, S.EmployeeID; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
जिसके परिणामस्वरूप निम्न | जिसके परिणामस्वरूप निम्न टेबल उत्पन्न होती है। | ||
{| class="wikitable" style="text-align:center; float:left; margin-right:5px" | {| class="wikitable" style="text-align:center; float:left; margin-right:5px" | ||
|+एम्प्लॉयी टेबल आफ्टर सेल्फ-जॉइन बाय कंट्री | |+एम्प्लॉयी टेबल आफ्टर सेल्फ-जॉइन बाय कंट्री | ||
Line 520: | Line 524: | ||
|} | |} | ||
इस उदाहरण के लिए: | इस उदाहरण के लिए: | ||
* <code>F</code> और <code>S</code> एम्प्लॉयी | * <code>F</code> और <code>S</code> एम्प्लॉयी टेबल की पहली और दूसरी प्रतियों के लिए [[उपनाम (एसक्यूएल)]] हैं। | ||
* स्थिति <code>F.Country = S.Country</code> विभिन्न देशों में कर्मचारियों के मध्य युग्मों को सम्मिलित नहीं किया गया है। उदाहरण प्रश्न केवल ही देश में कर्मचारियों के | * स्थिति <code>F.Country = S.Country</code> विभिन्न देशों में कर्मचारियों के मध्य युग्मों को सम्मिलित नहीं किया गया है। उदाहरण प्रश्न केवल ही देश में कर्मचारियों के जॉइने चाहता था। | ||
* स्थिति <code>F.EmployeeID < S.EmployeeID</code> जहां | * स्थिति <code>F.EmployeeID < S.EmployeeID</code> जहां जॉइनों को सम्मिलित नहीं किया गया है <code>EmployeeID</code> पहले एम्प्लॉयी से अधिक या उसके बराबर है <code>EmployeeID</code> दूसरे एम्प्लॉयी का. दूसरे शब्दों में, इस शर्त का प्रभाव डुप्लिकेट जॉइनियों और स्वयं-जॉइनियों को बाहर करना है। इसके बिना, निम्नलिखित कम उपयोगी टेबल तैयार की जाएगी (नीचे दी गई टेबल परिणाम का केवल जर्मनी भाग प्रदर्शित करती है): | ||
{| class="wikitable" style="text-align:center; float:left; margin-right:5px" | {| class="wikitable" style="text-align:center; float:left; margin-right:5px" | ||
! एम्प्लॉयीआईडी !! लास्टनेम !! एम्प्लॉयीआईडी !! लास्टनेम !! कंट्री | ! एम्प्लॉयीआईडी !! लास्टनेम !! एम्प्लॉयीआईडी !! लास्टनेम !! कंट्री | ||
Line 537: | Line 541: | ||
==विकल्प== | ==विकल्प== | ||
आउटर जॉइन का प्रभाव इनर जॉइन और मुख्य | आउटर जॉइन का प्रभाव इनर जॉइन और मुख्य टेबल में उन पंक्तियों के चयन के मध्य यूनियन ऑल का उपयोग करके भी प्राप्त किया जा सकता है जो जुड़ने की शर्त को पूरा नहीं करते हैं। उदाहरण के लिए, | ||
<syntaxhighlight lang=sql> | <syntaxhighlight lang=sql> | ||
Line 571: | Line 575: | ||
डेटाबेस-सिस्टम में बहुत से काम का उद्देश्य जॉइन के कुशल कार्यान्वयन पर है, क्योंकि रिलेशनल सिस्टम सामान्यतः जॉइन की मांग करते हैं, फिर भी उनके कुशल निष्पादन को अनुकूलित करने में कठिनाइयों का सामना करना पड़ता है। समस्या इसलिए उत्पन्न होती है क्योंकि इनर जॉइन क्रम[[विनिमेय]] और साहचर्य दोनों तरह से काम करते हैं। व्यवहार में, इसका मतलब यह है कि उपयोगकर्ता केवल जुड़ने के लिए तालिकाओं की सूची और उपयोग करने के लिए जुड़ने की शर्तों की आपूर्ति करता है, और डेटाबेस सिस्टम के पास ऑपरेशन करने का सबसे कुशल तरीका निर्धारित करने का कार्य होता है। [[क्वेरी अनुकूलक]] यह निर्धारित करता है कि जॉइन वाली क्वेरी को कैसे निष्पादित किया जाए। क्वेरी ऑप्टिमाइज़र में दो बुनियादी स्वतंत्रताएँ होती हैं: | डेटाबेस-सिस्टम में बहुत से काम का उद्देश्य जॉइन के कुशल कार्यान्वयन पर है, क्योंकि रिलेशनल सिस्टम सामान्यतः जॉइन की मांग करते हैं, फिर भी उनके कुशल निष्पादन को अनुकूलित करने में कठिनाइयों का सामना करना पड़ता है। समस्या इसलिए उत्पन्न होती है क्योंकि इनर जॉइन क्रम[[विनिमेय]] और साहचर्य दोनों तरह से काम करते हैं। व्यवहार में, इसका मतलब यह है कि उपयोगकर्ता केवल जुड़ने के लिए तालिकाओं की सूची और उपयोग करने के लिए जुड़ने की शर्तों की आपूर्ति करता है, और डेटाबेस सिस्टम के पास ऑपरेशन करने का सबसे कुशल तरीका निर्धारित करने का कार्य होता है। [[क्वेरी अनुकूलक]] यह निर्धारित करता है कि जॉइन वाली क्वेरी को कैसे निष्पादित किया जाए। क्वेरी ऑप्टिमाइज़र में दो बुनियादी स्वतंत्रताएँ होती हैं: | ||
# जुड़ने का क्रम: क्योंकि यह कार्यों को क्रमविनिमेय और साहचर्य रूप से | # जुड़ने का क्रम: क्योंकि यह कार्यों को क्रमविनिमेय और साहचर्य रूप से जॉइनता है, जिस क्रम में सिस्टम तालिकाओं से जुड़ता है वह क्वेरी के अंतिम परिणाम सेट को नहीं बदलता है। हालाँकि, जॉइन-ऑर्डर का जॉइन ऑपरेशन की लागत पर भारी प्रभाव पड़ सकता है, इसलिए सबसे अच्छा जॉइन ऑर्डर चुनना बहुत महत्वपूर्ण हो जाता है। | ||
# सम्मिलित होने की विधि: दो तालिकाओं और जुड़ने की स्थिति को देखते हुए, कई [[कलन विधि]] सम्मिलित होने के परिणाम सेट का उत्पादन कर सकते हैं। कौन सा एल्गोरिदम सबसे अधिक कुशलता से चलता है यह इनपुट तालिकाओं के आकार, प्रत्येक | # सम्मिलित होने की विधि: दो तालिकाओं और जुड़ने की स्थिति को देखते हुए, कई [[कलन विधि]] सम्मिलित होने के परिणाम सेट का उत्पादन कर सकते हैं। कौन सा एल्गोरिदम सबसे अधिक कुशलता से चलता है यह इनपुट तालिकाओं के आकार, प्रत्येक टेबल से जुड़ने की स्थिति से मेल खाने वाली पंक्तियों की संख्या और बाकी क्वेरी के लिए आवश्यक संचालन पर निर्भर करता है। | ||
कई जॉइन-एल्गोरिदम अपने इनपुट को अलग तरह से व्यवहार करते हैं। किसी जॉइन के इनपुट को क्रमशः आउटर और इनर जॉइन ऑपरेंड, या बाएँ और दाएँ के रूप में संदर्भित किया जा सकता है। उदाहरण के लिए, नेस्टेड लूप के मामले में, डेटाबेस सिस्टम आउटर संबंध की प्रत्येक पंक्ति के लिए संपूर्ण इनर संबंध को स्कैन करेगा। | कई जॉइन-एल्गोरिदम अपने इनपुट को अलग तरह से व्यवहार करते हैं। किसी जॉइन के इनपुट को क्रमशः आउटर और इनर जॉइन ऑपरेंड, या बाएँ और दाएँ के रूप में संदर्भित किया जा सकता है। उदाहरण के लिए, नेस्टेड लूप के मामले में, डेटाबेस सिस्टम आउटर संबंध की प्रत्येक पंक्ति के लिए संपूर्ण इनर संबंध को स्कैन करेगा। | ||
Line 585: | Line 589: | ||
===एल्गोरिदम से जुड़ें=== | ===एल्गोरिदम से जुड़ें=== | ||
[[Image:Comparison of join algorithms.png|thumb|सबसे खराब स्थिति वाले इष्टतम एल्गोरिदम जैसे कि जेनेरिक जॉइन समय में ही विशेषता पर काम करते हैं किन्तु इस विशेषता पर सभी संबंधों को | [[Image:Comparison of join algorithms.png|thumb|सबसे खराब स्थिति वाले इष्टतम एल्गोरिदम जैसे कि जेनेरिक जॉइन समय में ही विशेषता पर काम करते हैं किन्तु इस विशेषता पर सभी संबंधों को जॉइनते हैं।<ref>{{Cite arXiv |last1=Wang |first1=Yisu Remy |last2=Willsey |first2=Max |last3=Suciu |first3=Dan |date=2023-01-27 |title=Free Join: Unifying Worst-Case Optimal and Traditional Joins |class=cs.DB |eprint=2301.10841 }}</ref>]]बाइनरी जॉइन ऑपरेशन करने के लिए तीन मौलिक एल्गोरिदम मौजूद हैं: [[नेस्टेड लूप जॉइन]], सॉर्ट-मर्ज जॉइन और हैश जॉइन। सबसे खराब स्थिति में इष्टतम जॉइन एल्गोरिदम, सबसे खराब स्थिति में दो से अधिक संबंधों के मध्य जुड़ने के लिए बाइनरी जॉइन एल्गोरिदम की तुलना में एसिम्प्टोटिक रूप से तेज़ हैं। | ||
===जॉइन इन्डेक्सेस === | ===जॉइन इन्डेक्सेस === | ||
Line 591: | Line 595: | ||
टेराडाटा कार्यान्वयन में, निर्दिष्ट कॉलम, कॉलम पर समग्र कार्य, या या अधिक तालिकाओं से दिनांक कॉलम के घटकों को [[डेटाबेस दृश्य]] की परिभाषा के समान सिंटैक्स का उपयोग करके निर्दिष्ट किया जाता है: 64 कॉलम/कॉलम अभिव्यक्तियों को ल में निर्दिष्ट किया जा सकता है सूचकांक में सम्मिलित हों. वैकल्पिक रूप से, कॉलम जो समग्र डेटा की प्राथमिक कुंजी को परिभाषित करता है, उसे भी निर्दिष्ट किया जा सकता है: समानांतर हार्डवेयर पर, कॉलम मानों का उपयोग सूचकांक की सामग्री को कई डिस्क में विभाजित करने के लिए किया जाता है। जब स्रोत तालिकाओं को उपयोगकर्ताओं द्वारा इंटरैक्टिव रूप से अपडेट किया जाता है, तो जॉइन इंडेक्स की सामग्री स्वचालित रूप से अपडेट हो जाती है। कोई भी क्वेरी जिसका [[ कहां (एसक्यूएल) ]] कॉलम या कॉलम ्सप्रेशन के किसी भी संयोजन को निर्दिष्ट करता है जो कि जॉइन इंडेक्स (तथाकथित कवरिंग क्वेरी) में परिभाषित लोगों का सटीक सबसेट है, मूल तालिकाओं और उनके इंडेक्स के बजाय जॉइन इंडेक्स का कारण बनेगा, क्वेरी निष्पादन के दौरान परामर्श लिया जाना। | टेराडाटा कार्यान्वयन में, निर्दिष्ट कॉलम, कॉलम पर समग्र कार्य, या या अधिक तालिकाओं से दिनांक कॉलम के घटकों को [[डेटाबेस दृश्य]] की परिभाषा के समान सिंटैक्स का उपयोग करके निर्दिष्ट किया जाता है: 64 कॉलम/कॉलम अभिव्यक्तियों को ल में निर्दिष्ट किया जा सकता है सूचकांक में सम्मिलित हों. वैकल्पिक रूप से, कॉलम जो समग्र डेटा की प्राथमिक कुंजी को परिभाषित करता है, उसे भी निर्दिष्ट किया जा सकता है: समानांतर हार्डवेयर पर, कॉलम मानों का उपयोग सूचकांक की सामग्री को कई डिस्क में विभाजित करने के लिए किया जाता है। जब स्रोत तालिकाओं को उपयोगकर्ताओं द्वारा इंटरैक्टिव रूप से अपडेट किया जाता है, तो जॉइन इंडेक्स की सामग्री स्वचालित रूप से अपडेट हो जाती है। कोई भी क्वेरी जिसका [[ कहां (एसक्यूएल) ]] कॉलम या कॉलम ्सप्रेशन के किसी भी संयोजन को निर्दिष्ट करता है जो कि जॉइन इंडेक्स (तथाकथित कवरिंग क्वेरी) में परिभाषित लोगों का सटीक सबसेट है, मूल तालिकाओं और उनके इंडेक्स के बजाय जॉइन इंडेक्स का कारण बनेगा, क्वेरी निष्पादन के दौरान परामर्श लिया जाना। | ||
Oracle कार्यान्वयन स्वयं को [[ बिटमैप सूचकांक ]] का उपयोग करने तक सीमित रखता है। बिटमैप जॉइन इंडेक्स का उपयोग कम-कार्डिनैलिटी कॉलम के लिए किया जाता है (यानी, ओरेकल दस्तावेज़ के अनुसार 300 से कम विशिष्ट मान वाले कॉलम): यह कई संबंधित तालिकाओं से कम-कार्डिनैलिटी कॉलम को | Oracle कार्यान्वयन स्वयं को [[ बिटमैप सूचकांक ]] का उपयोग करने तक सीमित रखता है। बिटमैप जॉइन इंडेक्स का उपयोग कम-कार्डिनैलिटी कॉलम के लिए किया जाता है (यानी, ओरेकल दस्तावेज़ के अनुसार 300 से कम विशिष्ट मान वाले कॉलम): यह कई संबंधित तालिकाओं से कम-कार्डिनैलिटी कॉलम को जॉइनता है। Oracle जिस उदाहरण का उपयोग करता है वह इन्वेंट्री सिस्टम का है, जहां विभिन्न आपूर्तिकर्ता अलग-अलग हिस्से प्रदान करते हैं। [[डेटाबेस स्कीमा]] में तीन लिंक्ड टेबल हैं: दो मास्टर टेबल, पार्ट और सप्लायर, और डिटेल टेबल, इन्वेंटरी। अंतिम अनेक-से-अनेक टेबल है जो आपूर्तिकर्ता को भाग से जॉइनती है, और इसमें सबसे अधिक पंक्तियाँ होती हैं। प्रत्येक भाग का भाग प्रकार होता है, और प्रत्येक आपूर्तिकर्ता अमेरिका में स्थित होता है, और उसके पास राज्य कॉलम होता है। अमेरिका में 60 से अधिक राज्य+क्षेत्र नहीं हैं, और 300 से अधिक भाग प्रकार नहीं हैं। बिटमैप जॉइन इंडेक्स को उपरोक्त तीन तालिकाओं पर मानक तीन-टेबल जॉइन का उपयोग करके परिभाषित किया गया है, और इंडेक्स के लिए पार्ट_टाइप और सप्लायर_स्टेट कॉलम निर्दिष्ट किया गया है। हालाँकि, इसे इन्वेंटरी टेबल पर परिभाषित किया गया है, भले ही कॉलम पार्ट_टाइप और सप्लायर_स्टेट क्रमशः सप्लायर और पार्ट से उधार लिए गए हों। | ||
टेराडेटा के लिए, ओरेकल बिटमैप जॉइन इंडेक्स का उपयोग केवल प्रश्न का उत्तर देने के लिए किया जाता है जब क्वेरी का व्हेयर क्लॉज उन कॉलमों तक सीमित होता है जो जॉइन इंडेक्स में सम्मिलित होते हैं। | टेराडेटा के लिए, ओरेकल बिटमैप जॉइन इंडेक्स का उपयोग केवल प्रश्न का उत्तर देने के लिए किया जाता है जब क्वेरी का व्हेयर क्लॉज उन कॉलमों तक सीमित होता है जो जॉइन इंडेक्स में सम्मिलित होते हैं। |
Revision as of 12:37, 4 August 2023
स्ट्रक्चर्ड क्वेरी लैंग्वेज (एसक्यूएल) में जॉइन क्लॉज एक या अधिक टेबल के कॉलम को नई टेबल में जॉइनता है। यह ऑपरेशन संबंधपरक बीजगणित में जॉइन ऑपरेशन से युग्मित होता है। अनौपचारिक रूप से, जॉइन दो तालिकाओं को जॉइनता है और युग्मित होने वाली फ़ील्ड के साथ एक ही पंक्ति में रिकॉर्ड रखता है: INNER
, LEFT OUTER
, RIGHT OUTER
, FULL OUTER
और CROSS
आदि।
उदाहरण तालिकाएँ
जॉइन प्रकारों को समझाने के लिए, इस आलेख का शेष भाग निम्नलिखित तालिकाओं का उपयोग करता है:
लास्टनेम | डिपार्टमेंटआईडी |
---|---|
रैफर्टी | 31 |
जोन्स | 33 |
हाइजेनबर्ग | 33 |
रॉबिंसन | 34 |
स्मिथ | 34 |
विलियम्स | NULL
|
डिपार्टमेंटआईडी | डिपार्टमेंटनेम |
---|---|
31 | सेल्स |
33 | इंजीनियरिंग |
34 | क्लेरिकल |
35 | मार्केटिंग |
Department.DepartmentID
Department
टेबल की प्राथमिक कुंजी है, जबकि Employee.DepartmentID
विदेशी कुंजी है।
ध्यान दें कि Employee
में, विलियम्स को अभी तक कोई डिपार्टमेंट नहीं दिया गया है। इसके अतिरिक्त, मार्केटिंग डिपार्टमेंट में किसी भी एम्प्लॉयी को नियुक्त नहीं किया गया है।
उपरोक्त तालिकाएँ बनाने के लिए ये एसक्यूएल कथन हैं:
<सिंटैक्सहाइलाइट लैंग= एसक्यूएल लाइन= 1 > टेबल डिपार्टमेंट बनाएं(
डिपार्टमेंटआईडी इंट प्राथमिक कुंजी शून्य नहीं है, डिपार्टमेंट का नाम VARCHAR(20)
);
टेबल एम्प्लॉयी बनाएं (
अंतिम नाम VARCHAR(20), DepartmentID पूर्ण संदर्भ विभाग(DepartmentID)
);
डिपार्टमेंट में सम्मिलित करें मान (31, 'बिक्री'),
(33, 'इंजीनियरिंग'), (34, 'लिपिकीय'), (35, 'मार्केटिंग');
एम्प्लॉयी में डालें मूल्य ('रैफर्टी', 31),
('जोन्स', 33), ('हाइजेनबर्ग', 33), ('रॉबिन्सन', 34), ('स्मिथ', 34), ('विलियम्स', शून्य);
</सिंटैक्सहाइलाइट>
क्रॉस जॉइन
CROSS JOIN
जॉइन में तालिकाओं से पंक्तियों का कार्टेशियन उत्पाद लौटाता है। दूसरे शब्दों में, यह ऐसी पंक्तियाँ उत्पन्न करेगा जो प्रथम टेबल की प्रत्येक पंक्ति को दूसरी टेबल की प्रत्येक पंक्ति के साथ जॉइनती हैं।[1]
एम्प्लॉयी लास्टनेम | एम्प्लॉयी डिपार्टमेंटआईडी | डिपार्टमेंट डिपार्टमेंटनेम | डिपार्टमेंट डिपार्टमेंटआईडी |
---|---|---|---|
रैफर्टी | 31 | सेल्स | 31 |
जोन्स | 33 | सेल्स | 31 |
हाइजेनबर्ग | 33 | सेल्स | 31 |
स्मिथ | 34 | सेल्स | 31 |
रॉबिंसन | 34 | सेल्स | 31 |
विलियम्स | NULL |
सेल्स | 31 |
रैफर्टी | 31 | इंजीनियरिंग | 33 |
जोन्स | 33 | इंजीनियरिंग | 33 |
हाइजेनबर्ग | 33 | इंजीनियरिंग | 33 |
स्मिथ | 34 | इंजीनियरिंग | 33 |
रॉबिंसन | 34 | इंजीनियरिंग | 33 |
विलियम्स | NULL |
इंजीनियरिंग | 33 |
रैफर्टी | 31 | क्लेरिकल | 34 |
जोन्स | 33 | क्लेरिकल | 34 |
हाइजेनबर्ग | 33 | क्लेरिकल | 34 |
स्मिथ | 34 | क्लेरिकल | 34 |
रॉबिंसन | 34 | क्लेरिकल | 34 |
विलियम्स | NULL |
क्लेरिकल | 34 |
रैफर्टी | 31 | मार्केटिंग | 35 |
जोन्स | 33 | मार्केटिंग | 35 |
हाइजेनबर्ग | 33 | मार्केटिंग | 35 |
स्मिथ | 34 | मार्केटिंग | 35 |
रॉबिंसन | 34 | मार्केटिंग | 35 |
विलियम्स | NULL |
मार्केटिंग | 35 |
स्पष्ट क्रॉस जॉइन का उदाहरण है:
SELECT *
FROM employee CROSS JOIN department;
अंतर्निहित क्रॉस जॉइन का उदाहरण है:
SELECT *
FROM employee, department;
क्रॉस जॉइन को सदैव उचित स्थिति के साथ इनर जॉइन से परिवर्तित किया जा सकता है:
SELECT *
FROM employee INNER JOIN department ON 1=1;
CROSS JOIN
सम्मिलित टेबल से पंक्तियों को फ़िल्टर करने के लिए स्वयं कोई प्रेडिकेट प्रारम्भ नहीं करता है। ए के परिणाम CROSS JOIN
के परिणामों को WHERE
क्लॉज का उपयोग करके फ़िल्टर किया जा सकता है, जो तब इनर जॉइन के समतुल्य उत्पन्न कर सकता है।
एसक्यूएल:2011 मानक में, क्रॉस जॉइन वैकल्पिक F401, एक्सटेंडेड जॉइन्ड टेबल, पैकेज का भाग हैं।
सामान्य उपयोग सर्वर के प्रदर्शन के परीक्षण के लिए होता है।[why?]
इनर जॉइन
इनर जॉइन (या जॉइन) के लिए दो सम्मिलित तालिकाओं में प्रत्येक पंक्ति में युग्मित होने वाले कॉलम मानों की आवश्यकता होती है, और यह अनुप्रयोग प्रक्रिया सामग्री में सामान्यतः उपयोग किया जाने वाला जॉइन ऑपरेशन है, किन्तु इसे सभी स्थितियों में सबसे उत्तम विकल्प नहीं माना जाना चाहिए। इनर जॉइन, जॉइन-प्रेडिकेट के आधार पर दो तालिकाओं (ए और बी) के कॉलम मानों को सम्मिलित करके नई परिणाम टेबल बनाता है। क्वेरी ए की प्रत्येक पंक्ति की तुलना बी की प्रत्येक पंक्ति से करती है जिससे कि पंक्तियों के सभी जॉइने ज्ञात किये जा सकें जो जॉइन-प्रेडिकेट को संतुष्ट करते हैं। जब जॉइन-प्रेडिकेट गैर- शून्य मानों के मिलान से संतुष्ट होता है, तो ए और बी की पंक्तियों की प्रत्येक मिलान जॉइनी के लिए कॉलम मान परिणाम पंक्ति में संयोजित होते हैं।
जॉइन के परिणाम को प्रथम तालिकाओं में सभी पंक्तियों के कार्टेशियन उत्पाद (या क्रॉस जॉइन) लेने के परिणाम के रूप में परिभाषित किया जा सकता है (टेबल ए में प्रत्येक पंक्ति को टेबल बी में प्रत्येक पंक्ति के साथ जॉइनना) और फिर सभी पंक्तियों को वापस करना जो जॉइन प्रेडिकेट को संतुष्ट करते हैं। वास्तविक एसक्यूएल कार्यान्वयन सामान्यतः अन्य दृष्टिकोणों का उपयोग करते हैं, जैसे हैश जॉइन या सॉर्ट-मर्ज जॉइन, क्योंकि कार्टेशियन उत्पाद की गणना धीमी है और स्टोर करने के लिए प्रायः बड़ी मात्रा में मेमोरी की आवश्यकता होती है।
एसक्यूएल जॉइन को व्यक्त करने के लिए दो भिन्न-भिन्न वाक्यात्मक प्रकार निर्दिष्ट करता है: जो एक्सप्लिसिट जॉइन नोटेशन और इम्प्लिसिट जॉइन नोटेशन है। इम्प्लिसिट जॉइन नोटेशन को अब सर्वोत्तम अभ्यास नहीं माना जाता है[by whom?], चूँकि डेटाबेस सिस्टम अभी भी इसका समर्थन करते हैं।
एक्सप्लिसिट जॉइन नोटेशन सम्मिलित होने के लिए टेबल निर्दिष्ट करने के लिए वैकल्पिक रूप से INNER
कीवर्ड से पूर्व JOIN
कीवर्ड का उपयोग करता है, और सम्मिलित होने के लिए पूर्वानुमान निर्दिष्ट करने के लिए ON
कीवर्ड का उपयोग करता है, जैसा कि निम्नलिखित उदाहरण में है:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName
FROM employee
INNER JOIN department ON
employee.DepartmentID = department.DepartmentID;
एम्प्लॉयी लास्टनेम | एम्प्लॉयी डिपार्टमेंटआईडी | डिपार्टमेंट डिपार्टमेंटनेम |
---|---|---|
रॉबिंसन | 34 | क्लेरिकल |
जोन्स | 33 | इंजीनियरिंग |
स्मिथ | 34 | क्लेरिकल |
हाइजेनबर्ग | 33 | इंजीनियरिंग |
रैफर्टी | 31 | सेल्स |
इम्प्लिसिट जॉइन नोटेशन केवल SELECT
कथन के FROM
क्लॉज में सम्मिलित होने के लिए तालिकाओं को सूचीबद्ध करता है, और उन्हें अलग करने के लिए अल्पविराम का उपयोग करता है। इस प्रकार यह क्रॉस जॉइन निर्दिष्ट करता है, और WHERE
क्लॉज अतिरिक्त फ़िल्टर-प्रेडिकेट प्रारम्भ कर सकता है (जो स्पष्ट नोटेशन में जॉइन-प्रेडिकेट की तुलना में कार्य करता है)।
निम्नलिखित उदाहरण पूर्व उदाहरण के समान है, किन्तु इस बार इम्प्लिसिट जॉइन नोटेशन का उपयोग किया जा रहा है:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;
ऊपर दिए गए उदाहरणों में दिए गए प्रश्न दोनों तालिकाओं के डिपार्टमेंटआईडी कॉलम का उपयोग करके एम्प्लॉयी और डिपार्टमेंट तालिकाओं में सम्मिलित हो जाएंगे। जहां इन तालिकाओं का डिपार्टमेंटआईडी युग्मित होता है (अर्थात जॉइन-प्रेडिकेट संतुष्ट है), क्वेरी दो तालिकाओं से लास्टनेम, डिपार्टमेंटआईडी और डिपार्टमेंटनेम कॉलम को परिणाम पंक्ति में संयोजित करेगी। जहां डिपार्टमेंट आईडी युग्मित नहीं होती, और वहां कोई परिणाम पंक्ति उत्पन्न नहीं होती है।
इस प्रकार उपरोक्त क्वेरी के निष्पादन का परिणाम होगा:
एम्प्लॉयी लास्टनेम | एम्प्लॉयी डिपार्टमेंटआईडी | डिपार्टमेंट डिपार्टमेंटनेम |
---|---|---|
रॉबिंसन | 34 | क्लेरिकल |
जोन्स | 33 | इंजीनियरिंग |
स्मिथ | 34 | क्लेरिकल |
हाइजेनबर्ग | 33 | इंजीनियरिंग |
रैफर्टी | 31 | सेल्स |
एम्प्लॉयी विलियम्स और डिपार्टमेंट मार्केटिंग क्वेरी निष्पादन परिणामों में दिखाई नहीं देते हैं। इनमें से किसी की भी अन्य संबंधित टेबल में कोई युग्मित होने वाली पंक्तियाँ नहीं हैं: "विलियम्स" का कोई संबद्ध डिपार्टमेंट नहीं है, और किसी भी एम्प्लॉयी के पास डिपार्टमेंट आईडी 35 (मार्केटिंग) नहीं है। वांछित परिणामों के आधार पर, यह व्यवहार सूक्ष्म बग हो सकता है, जिसे इनर जॉइन को आउटर जॉइन से प्रतिस्थापित करके बचा जा सकता है।
इनर जॉइन और शून्य मान
प्रोग्रामर को उन स्तंभों पर तालिकाओं को जॉइनते समय विशेष ध्यान रखना चाहिए जिनमें शून्य मान हो सकते हैं, क्योंकि शून्य कभी भी किसी अन्य मान से युग्मित नहीं हो सकता (यहां तक कि नल भी नहीं), जब तक कि जुड़ने की स्थिति स्पष्ट रूप से संयोजन प्रेडिकेट का उपयोग नहीं करती है जो प्रथम परीक्षण करता है कि जुड़ने वाले कॉलम NOT NULL
हैं शेष प्रेडिकेट नियम को प्रस्तावित करने से पूर्व होते हैं। इनर जॉइन का उपयोग केवल उस डेटाबेस में सुरक्षित रूप से किया जा सकता है जो संदर्भात्मक अखंडता को प्रस्तावित करता है या जहां जॉइन कॉलम के शून्य न होने का आश्वासन होता है। कई लेनदेन प्रसंस्करण संबंधपरक डेटाबेस डेटा अखंडता सुनिश्चित करने के लिए परमाणुता, स्थिरता, भिन्नता, स्थायित्व (एसीआईडी) डेटा अद्यतन मानकों पर विश्वास करते हैं, जिससे इनर जॉइन उपयुक्त विकल्प बन जाता है। चूँकि, लेन-देन डेटाबेस में सामान्यतः वांछनीय जॉइन वाले कॉलम भी होते हैं जिन्हें शून्य होने की अनुमति होती है। कई रिपोर्टिंग रिलेशनल डेटाबेस और डेटा वेयरहाउस हाई वॉल्यूम एक्सट्रैक्ट, ट्रांसफॉर्म, लोड (ईटीएल) बैच अपडेट का उपयोग करते हैं जो संदर्भात्मक अखंडता को प्रस्तावित करना कठिन या असंभव बनाते हैं, जिसके परिणामस्वरूप संभावित रूप से शून्य जॉइन कॉलम होते हैं जिन्हें एसक्यूएल क्वेरी लेखक संशोधित नहीं कर सकता है और जो किसी त्रुटि के संकेत के बिना डेटा को छोड़ने के लिए इनर जॉइन का कारण बनता है। इनर जॉइन का उपयोग करने का विकल्प डेटाबेस डिज़ाइन और डेटा विशेषताओं पर निर्भर करता है। जब टेबल में सम्मिलित कॉलम में शून्य मान हो सकते हैं, तो बाएं आउटर जॉइन को सामान्यतः इनर जॉइन के लिए प्रतिस्थापित किया जा सकता है।
कोई भी डेटा कॉलम जो शून्य (रिक्त) हो सकता है, उसे कभी भी इनर जॉइन में लिंक के रूप में उपयोग नहीं किया जाना चाहिए, जब तक कि इच्छित परिणाम शून्य मान वाली पंक्तियों को समाप्त करना न हो। यदि परिणाम सेट से शून्य जॉइन कॉलम को निश्चयपूर्वक विस्थापित किया जाता है, तो इनर जॉइन आउटर जॉइन से तीव्र हो सकता है क्योंकि टेबल जॉइन और फ़िल्टरिंग एक ही चरण में की जाती है। इसके विपरीत, एसक्यूएल व्हेयर क्लॉज में डेटाबेस फ़ंक्शंस के साथ संयोजन में बड़ी मात्रा में क्वेरी में उपयोग किए जाने पर इनर जॉइन के परिणामस्वरूप विनाशकारी रूप से धीमा प्रदर्शन या सर्वर क्रैश भी हो सकता है।[2][3][4] एसक्यूएल व्हेयर क्लॉज़ में फ़ंक्शन के परिणामस्वरूप डेटाबेस अपेक्षाकृत कॉम्पैक्ट टेबल इंडेक्स को अनदेखा कर सकता है। गणना किए गए मान पर निर्भर फ़िल्टर का उपयोग करके पंक्तियों की संख्या को कम करने से पूर्व डेटाबेस दोनों तालिकाओं से चयनित कॉलम को पढ़ और इनर रूप से जॉइन सकता है, जिसके परिणामस्वरूप अपेक्षाकृत भारी मात्रा में अकुशल प्रसंस्करण होता है।
जब परिणाम सेट कई तालिकाओं को जॉइनकर प्रस्तुत किया जाता है, जिसमें संख्यात्मक पहचानकर्ता कोड ( लुकअप तालिका) के पूर्ण-पाठ विवरण देखने के लिए उपयोग की जाने वाली मास्टर तालिकाएं भी सम्मिलित होती हैं, तो विदेशी कुंजी में से किसी में शून्य मान के परिणामस्वरूप परिणाम सेट से पूर्ण पंक्ति को विस्थापित किया जा सकता है, त्रुटि का कोई संकेत नहीं है। जटिल एसक्यूएल क्वेरी जिसमें एक या अधिक इनर जॉइन और कई आउटर जॉइन सम्मिलित होते हैं, इनर जॉइन लिंक कॉलम में शून्य मानों के लिए समान संकट होता है।
इनर जॉइन वाले एसक्यूएल कोड के प्रति प्रतिबद्धता यह मानती है कि शून्य जॉइन कॉलम को भविष्य में होने वाले परिवर्तनों द्वारा प्रस्तुत नहीं किया जाएगा, जिसमें विक्रेता अपडेट, डिज़ाइन परिवर्तन और एप्लिकेशन के डेटा सत्यापन नियमों के बाहर बल्क प्रोसेसिंग जैसे डेटा रूपांतरण, माइग्रेशन, बल्क आयात और मर्ज सम्मिलित हैं।
इनर जॉइन को आगे चलकर समान जॉइन, नेचुरल जॉइन या क्रॉस-जॉइन के रूप में वर्गीकृत किया जा सकता है।
इक्वि-जॉइन
इक्वि-जॉइन विशिष्ट प्रकार का तुलनित्र-आधारित जॉइन है, जो जॉइन-प्रेडिकेट में केवल समानता तुलना का उपयोग करता है। अन्य तुलना ऑपरेटरों (जैसे <
) का उपयोग करना जॉइन को इक्वि-जॉइन के रूप में अयोग्य घोषित करता है। ऊपर दिखाई गई क्वेरी पूर्व ही समान-जॉइन का उदाहरण प्रदान कर चुकी है:
SELECT *
FROM employee JOIN department
ON employee.DepartmentID = department.DepartmentID;
हम इक्वी-जॉइन को नीचे इस प्रकार लिख सकते हैं,
SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;
यदि इक्वि-जॉइन में कॉलमों का नाम समान है, तो एसक्यूएल-92 USING
निर्माण के माध्यम से इक्वि-जॉइन को व्यक्त करने के लिए वैकल्पिक शॉर्टहैंड नोटेशन प्रदान करता है:[5]
SELECT *
FROM employee INNER JOIN department USING (DepartmentID);
चूँकि,USING
निर्माण केवल वाक्यात्मक चीनी से अधिक है,क्योंकि परिणाम सेट स्पष्ट प्रेडिकेट के साथ संस्करण के परिणाम सेट से भिन्न होता है। विशेष रूप से,USING
सूची में उल्लिखित कोई भी कॉलम जॉइन में प्रत्येक टेबल के लिए एक बार के अतिरिक्त केवल अयोग्य नाम के साथ दिखाई देगा। उपरोक्त स्थिति में, एक हीDepartmentID
कॉलम होगा और कोईemployee.DepartmentID
याdepartment.DepartmentID
नहीं होगा।
USING
क्लॉज एमएस एसक्यूएल सर्वर और Sybase द्वारा समर्थित नहीं है।
नेचुरल जॉइन
नेचुरल जॉइन इक्वी-जॉइन की विशेष स्थिति है। नेचुरल जॉइन (⋈) बाइनरी ऑपरेटर है जिसे (R ⋈ S) के रूप में लिखा जाता है जहां R और S संबंध (डेटाबेस) हैं।[6] नेचुरल जॉइन का परिणाम R और S में टुपल्स के सभी संयोजनों का सेट है जो उनके सामान्य विशेषता नामों पर समान हैं। उदाहरण के लिए एम्प्लॉयी और डिपार्टमेंट और उनके स्वाभाविक जॉइन तालिकाओं पर विचार करें:
|
|
|
इसका उपयोग संबंधों की संरचना को परिभाषित करने के लिए भी किया जा सकता है। उदाहरण के लिए, एम्प्लॉयी और डिपार्टमेंट की संरचना उनका जॉइन है जैसा कि ऊपर दिखाया गया है, सामान्य विशेषता विभागनाम को छोड़कर सभी पर प्रक्षेपित किया गया है। श्रेणी सिद्धांत में, जॉइन बिल्कुल फाइबर उत्पाद है।
नेचुरल जॉइन निश्चित सबसे महत्वपूर्ण ऑपरेटरों में से है क्योंकि यह तार्किक AND का संबंधपरक समकक्ष है। ध्यान दें कि यदि AND से जुड़े दो विधेयों में से प्रत्येक में एक ही चर दिखाई देता है, तो वह चर एक ही चीज़ के लिए खड़ा होता है और दोनों दिखावे को सदैव एक ही मान से प्रतिस्थापित किया जाना चाहिए। विशेष रूप से, नेचुरल जॉइन उन संबंधों के संयोजन की अनुमति देता है जो किसी विदेशी कुंजी से जुड़े होते हैं। उदाहरण के लिए, उपरोक्त उदाहरण में विदेशी कुंजी संभवतः Employee.DeptName से Dept.DeptName तक होती है और फिर एम्प्लॉयी और डिपार्टमेंट का नेचुरल जॉइन सभी कर्मचारियों को उनके डिपार्टमेंट के साथ जॉइनता है। यह काम करता है क्योंकि विदेशी कुंजी समान नाम वाली विशेषताओं के मध्य रहती है। यदि ऐसी स्थिति नहीं है जैसे डिपार्टमेंट प्रबंधक से एम्प्लॉयी नाम तक की विदेशी कुंजी में तो नेचुरल जॉइन लेने से पूर्व इन कॉलमों का नाम परिवर्तित करना होगा। इस प्रकार के जॉइन को कभी-कभी 'इक्वी-जॉइन' भी कहा जाता है।
अधिक औपचारिक रूप से नेचुरल जॉइन के शब्दार्थ को इस प्रकार परिभाषित किया गया है:
- ,
जहां फन प्रेडिकेट है जो किसी संबंध r के लिए सत्य है यदि और केवल r फ़ंक्शन है। सामान्यतः यह आवश्यक है कि R और S में कम से कम सामान्य विशेषता होनी चाहिए, किन्तु यदि इस बाधा को त्याग दिया जाता है, और R और S में कोई सामान्य विशेषता नहीं है, तो नेचुरल जॉइन बिल्कुल कार्टेशियन उत्पाद बन जाता है।
नेचुरल जॉइन को कोडड के आदिमों के साथ निम्नानुसार अनुकरण किया जा सकता है। मान लीजिए कि c1, ..., cm R और S, के लिए सामान्य विशेषता नाम हैं, r1, ..., rn R के लिए अद्वितीय विशेषता नाम हैं और s1, ..., sk S के लिए अद्वितीय विशेषता नाम हैं। इसके अतिरिक्त, मान लें कि विशेषता नाम x1, ..., xm न तो R में हैं और न ही S में हैं। प्रथम चरण में अब S में सामान्य विशेषता नामों का नाम परिवर्तित किया जा सकता है:
तब हम कार्टेशियन उत्पाद लेते हैं और उन टुपल्स का चयन करते हैं जिन्हें जॉइना जाना है:
नेचुरल जॉइन एक प्रकार का इक्वि-जॉइन है जहां जॉइन प्रेडिकेट दोनों तालिकाओं में सभी कॉलमों की तुलना करके अंतर्निहित रूप से उत्पन्न होता है, जिसमें सम्मिलित तालिकाओं में समान कॉलम-नाम होते हैं। परिणामी सम्मिलित टेबल में समान रूप से नामित स्तंभों की प्रत्येक जॉइनी के लिए केवल स्तंभ होता है। ऐसी स्थिति में जब समान नाम वाला कोई कॉलम नहीं मिलता है, तो परिणाम क्रॉस जॉइन होता है।
अधिकांश विशेषज्ञ इस विषय से सहमत हैं कि नेचुरल जॉइन खतरनाक हैं और इसलिए उनके उपयोग को दृढ़ता से हतोत्साहित करते हैं।[7] खतरा अज्ञात स्थिति में नया कॉलम जॉइनने से आता है, जिसका नाम दूसरी टेबल के दूसरे कॉलम के समान है। उपस्थित नेचुरल जॉइन स्वाभाविक रूप से तुलना के लिए नए कॉलम का उपयोग कर सकता है, पूर्व की तुलना में विभिन्न पैरामीटर (विभिन्न कॉलमों से) का उपयोग करके तुलना/मिलान कर सकता है। इस प्रकार उपस्थित क्वेरी भिन्न-भिन्न परिणाम दे सकती है, भले ही तालिकाओं में डेटा परिवर्तित नहीं किया गया है, बल्कि केवल संवर्धित किया गया है। टेबल लिंक को स्वचालित रूप से निर्धारित करने के लिए कॉलम नामों का उपयोग सैकड़ों या हजारों तालिकाओं वाले बड़े डेटाबेस में विकल्प नहीं है, जहां यह नामकरण परंपराओं पर अवास्तविक बाधा डालेगा। वास्तविक विश्व के डेटाबेस सामान्यतः विदेशी कुंजी डेटा के साथ डिज़ाइन किए जाते हैं जो व्यावसायिक नियमों और संदर्भ के कारण निरंतर पॉप्युलेट नहीं होते हैं (शून्य मानों की अनुमति है)। विभिन्न तालिकाओं में समान डेटा के कॉलम नामों को संशोधित करना सामान्य विषय है और कठोर स्थिरता की यह कमी नेचुरल जॉइन को वर्णन के लिए सैद्धांतिक अवधारणा में परिवर्तित कर देती है।
इनर जॉइन के लिए उपरोक्त प्रतिरूप क्वेरी को नेचुरल जॉइन के रूप में निम्नलिखित प्रकार से व्यक्त किया जा सकता है:
SELECT *
FROM employee NATURAL JOIN department;
स्पष्ट USING
क्लॉज के जैसे, सम्मिलित टेबल में केवल डिपार्टमेंटआईडी कॉलम होता है, जिसमें कोई क्वालीफायर नहीं होता है:
डिपार्टमेंटआईडी | एम्प्लॉयी लास्टनेम | डिपार्टमेंट डिपार्टमेंटनेम |
---|---|---|
34 | स्मिथ | क्लेरिकल |
33 | जोन्स | इंजीनियरिंग |
34 | रॉबिंसन | क्लेरिकल |
33 | हाइजेनबर्ग | इंजीनियरिंग |
31 | रैफर्टी | सेल्स |
पोस्टग्रेएसक्यूएल, माईएसक्यूएल और ओरेकल नेचुरल जॉइन का समर्थन करते हैं; माइक्रोसॉफ्ट टी-एसक्यूएल और आईबीएम डीबी2 नहीं करते हैं। जॉइन में उपयोग किए गए कॉलम अंतर्निहित हैं, इसलिए जॉइन कोड यह नहीं दिखाता है कि कौन से कॉलम अपेक्षित हैं, और कॉलम नामों में परिवर्तन से परिणाम परिवर्तित हो सकते हैं। एसक्यूएल:2011 मानक में, नेचुरल जॉइन वैकल्पिक F401, "एक्सटेंडेड जॉइन्ड टेबल", पैकेज का भाग हैं।
कई डेटाबेस परिवेशों में कॉलम नाम किसी आउटर विक्रेता द्वारा नियंत्रित होते हैं, क्वेरी डेवलपर द्वारा नहीं होते हैं। नेचुरल जॉइन कॉलम नामों में स्थिरता और स्थिरता मानता है जो विक्रेता द्वारा अनिवार्य संस्करण अपग्रेड के समय परिवर्तित किया जा सकता है।
आउटर जॉइन
सम्मिलित टेबल प्रत्येक पंक्ति को निरंतर रखती है - भले ही कोई अन्य मिलान पंक्ति उपस्थित न हो। आउटर जॉइन को बाएँ आउटर जॉइन, दाएँ आउटर जॉइन और पूर्ण आउटर जॉइन में उप-विभाजित किया जाता है, यह इस पर निर्भर करता है कि किस टेबल की पंक्तियाँ निरंतर रखी गई हैं: बाएँ, दाएँ, या दोनों (इस स्थिति में बाएँ और दाएँ JOIN
कीवर्ड के दोनों पक्षों को संदर्भित करते हैं)। इनर जॉइन के जैसे, कोई भी सभी प्रकार के आउटर जॉइन को इक्वि-जॉइन, नेचुरल जॉइन, ON <predicate>
(θ-जॉइन), आदि के रूप में उप-वर्गीकृत कर सकता है।[8]
मानक एसक्यूएल में आउटर जॉइनों के लिए कोई अंतर्निहित जॉइन-नोटेशन उपस्थित नहीं है।
बायां आउटर जॉइन
टेबल ए और बी के लिए बाएं आउटर जॉइन (या बस बाएं जॉइन) के परिणाम में सदैव बाईं टेबल (ए) की सभी पंक्तियां सम्मिलित होती हैं, भले ही सम्मिलित होने की स्थिति को सही टेबल (बी) में कोई मिलान पंक्ति नहीं मिलती है। इसका तात्पर्य यह है कि यदि ON
क्लॉज़ बी में 0 (शून्य) पंक्तियों से युग्मित होता है (ए में दी गई पंक्ति के लिए), तो जॉइन अभी भी परिणाम में पंक्ति लौटाएगा (उस पंक्ति के लिए) - किन्तु बी से प्रत्येक कॉलम में शून्य के साथ है। बयां आउटर जॉइन सभी को लौटाता है इनर जॉइन के मान और बाईं टेबल के सभी मान जो दाहिनी टेबल से युग्मित नहीं होते हैं, जिसमें लिंक कॉलम में शून्य (रिक्त) मान वाली पंक्तियाँ भी सम्मिलित हैं।
उदाहरण के लिए, यह हमें किसी एम्प्लॉयी का डिपार्टमेंट अन्वेषण की अनुमति देता है, किन्तु फिर भी उन कर्मचारियों को दिखाता है जिन्हें किसी डिपार्टमेंट को नहीं सौंपा गया है (ऊपर दिए गए इनर-जॉइन उदाहरण के विपरीत, जहां बिना असाइन किए गए एम्प्लॉयी को परिणाम से बाहर रखा गया था)।
बाएँ आउटर जॉइन का उदाहरण (OUTER
कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति (इनर जॉइन की तुलना में) इटैलिकाइज़्ड के साथ है:
SELECT *
FROM employee
LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
एम्प्लॉयी लास्टनेम | एम्प्लॉयी डिपार्टमेंटआईडी | डिपार्टमेंट डिपार्टमेंटनेम | डिपार्टमेंट डिपार्टमेंटआईडी |
---|---|---|---|
जोन्स | 33 | इंजीनियरिंग | 33 |
रैफर्टी | 31 | सेल्स | 31 |
रॉबिंसन | 34 | क्लेरिकल | 34 |
स्मिथ | 34 | क्लेरिकल | 34 |
विलियम्स | NULL |
NULL |
NULL
|
हाइजेनबर्ग | 33 | इंजीनियरिंग | 33 |
वैकल्पिक सिंटैक्स
ओरेकल अप्रचलित[9] सिंटैक्स का समर्थन करता है:
SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID(+)
Sybase सिंटैक्स का समर्थन करता है (माइक्रोसॉफ्ट एसक्यूएल सर्वर ने संस्करण 2000 से इस सिंटैक्स को विस्थापित कर दिया है):
SELECT *
FROM employee, department
WHERE employee.DepartmentID *= department.DepartmentID
आईबीएम इनफॉर्मिक्स सिंटैक्स का समर्थन करता है:
SELECT *
FROM employee, OUTER department
WHERE employee.DepartmentID = department.DepartmentID
दायां आउटर जॉइन
दायां आउटर जॉइन (या दायां जॉइन) बाएं आउटर जॉइन से अधिक इसके अतिरिक्त तालिकाओं के विपरीत व्यवहार से मिलता-जुलता है। दाहिनी टेबल (बी) से प्रत्येक पंक्ति कम से कम एक बार सम्मिलित टेबल में दिखाई देगी। यदि बाईं टेबल (ए) से कोई मिलान पंक्ति उपस्थित नहीं है, तो शून्य उन पंक्तियों के लिए ए से कॉलम में दिखाई देगा जिनका बी में कोई युग्मन नहीं है।
दायां आउटर जॉइन दाहिनी टेबल से सभी मान लौटाता है और बाईं टेबल से मिलान किए गए मान लौटाता है (कोई मिलान न होने की स्थिति में शून्य)। उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी और उसके डिपार्टमेंट को अन्वेषण की अनुमति देता है, किन्तु फिर भी ऐसे डिपार्टमेंट दिखाता है जिनमें कोई एम्प्लॉयी नहीं है।
नीचे दाएं आउटर जॉइन का उदाहरण दिया गया है (OUTER
कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति इटैलिकाइज़्ड के साथ है:
SELECT *
FROM employee RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;
एम्प्लॉयी लास्टनेम | एम्प्लॉयी डिपार्टमेंटआईडी | डिपार्टमेंट डिपार्टमेंटनेम | डिपार्टमेंट डिपार्टमेंटआईडी |
---|---|---|---|
स्मिथ | 34 | क्लेरिकल | 34 |
जोन्स | 33 | इंजीनियरिंग | 33 |
रॉबिंसन | 34 | क्लेरिकल | 34 |
हाइजेनबर्ग | 33 | इंजीनियरिंग | 33 |
रैफर्टी | 31 | सेल्स | 31 |
NULL |
NULL |
मार्केटिंग | 35 |
दाएं और बाएं आउटर जॉइन कार्यात्मक रूप से समतुल्य हैं। इनमें से कोई भी ऐसी कोई कार्यक्षमता प्रदान नहीं करता है जो दूसरा नहीं करता है, इसलिए जब तक टेबल क्रम स्विच किया जाता है तब तक दाएं और बाएं आउटर जॉइन -दूसरे को प्रतिस्थापित कर सकते हैं।
पूर्ण आउटर जॉइन
वैचारिक रूप से, पूर्ण आउटर जॉइन बाएँ और दाएँ दोनों आउटर जॉइनों को प्रस्तावित करने के प्रभाव को जोड़ता है। जहां पूर्ण आउटर सम्मिलित तालिकाओं में पंक्तियाँ युग्मित नहीं होती हैं, परिणाम सेट में टेबल के प्रत्येक कॉलम के लिए शून्य मान होंगे जिनमें मिलान पंक्ति का अभाव है। उन पंक्तियों के लिए जो युग्मित होती हैं, परिणाम सेट में एकल पंक्ति प्रस्तुत की जाएगी (जिसमें दोनों तालिकाओं से भरे गए कॉलम होंगे)।
उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी को देखने की अनुमति देता है जो डिपार्टमेंट में है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी है, किन्तु प्रत्येक एम्प्लॉयी को भी देख सकता है जो डिपार्टमेंट का भाग नहीं है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी नहीं है।
पूर्ण आउटर जॉइन का उदाहरण (OUTER
कीवर्ड वैकल्पिक है):
SELECT *
FROM employee FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;
एम्प्लॉयी लास्टनेम | एम्प्लॉयी डिपार्टमेंटआईडी | डिपार्टमेंट डिपार्टमेंटनेम | डिपार्टमेंट डिपार्टमेंटआईडी |
---|---|---|---|
स्मिथ | 34 | क्लेरिकल | 34 |
जोन्स | 33 | इंजीनियरिंग | 33 |
रॉबिंसन | 34 | क्लेरिकल | 34 |
विलियम्स | NULL |
NULL |
NULL
|
हाइजेनबर्ग | 33 | इंजीनियरिंग | 33 |
रैफर्टी | 31 | सेल्स | 31 |
NULL |
NULL |
मार्केटिंग | 35 |
कुछ डेटाबेस प्रणालियाँ सीधे पूर्ण आउटर जॉइन कार्यक्षमता का समर्थन नहीं करती हैं, किन्तु वे क्रमशः बाएँ और दाएँ तालिकाओं से एकल टेबल पंक्तियों के सभी चयनों और इनर जॉइन के उपयोग के माध्यम से इसका अनुकरण कर सकते हैं। वही उदाहरण इस प्रकार दिखाई दे सकता है:
SELECT employee.LastName, employee.DepartmentID,
department.DepartmentName, department.DepartmentID
FROM employee
INNER JOIN department ON employee.DepartmentID = department.DepartmentID
UNION ALL
SELECT employee.LastName, employee.DepartmentID,
cast(NULL as varchar(20)), cast(NULL as integer)
FROM employee
WHERE NOT EXISTS (
SELECT * FROM department
WHERE employee.DepartmentID = department.DepartmentID)
UNION ALL
SELECT cast(NULL as varchar(20)), cast(NULL as integer),
department.DepartmentName, department.DepartmentID
FROM department
WHERE NOT EXISTS (
SELECT * FROM employee
WHERE employee.DepartmentID = department.DepartmentID)
अन्य दृष्टिकोण यूनियन हो सकता है, सभी बाएँ आउटर जॉइन और दाएँ आउटर जॉइन माइनस इनर जॉइन है।
सेल्फ-जॉइन
सेल्फ-जॉइन का अर्थ टेबल को स्वयं से जोड़ना है।[10]
उदाहरण
यदि कर्मचारियों के लिए दो भिन्न-भिन्न तालिकाएँ थीं और क्वेरी जिसमें प्रथम टेबल में कर्मचारियों से दूसरी टेबल में कर्मचारियों के समान देश का अनुरोध किया गया था, तो उत्तर टेबल अन्वेषण के लिए सामान्य जॉइन ऑपरेशन का उपयोग किया जा सकता था। चूँकि, सभी एम्प्लॉयी की सूचना बड़ी टेबल में समाहित है।[11]
निम्नलिखित जैसे कि संशोधित Employee
टेबल पर विचार करें :
एम्प्लॉयीआईडी | लास्टनेम | कंट्री | डिपार्टमेंटआईडी |
---|---|---|---|
123 | रैफर्टी | ऑस्ट्रेलिया | 31 |
124 | जोन्स | ऑस्ट्रेलिया | 33 |
145 | हाइजेनबर्ग | ऑस्ट्रेलिया | 33 |
201 | रॉबिंसन | यूनाइटेड स्टेट्स | 34 |
305 | स्मिथ | जर्मनी | 34 |
306 | विलियम्स | जर्मनी | NULL
|
उदाहरण समाधान क्वेरी इस प्रकार हो सकती है:
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
FROM Employee F INNER JOIN Employee S ON F.Country = S.Country
WHERE F.EmployeeID < S.EmployeeID
ORDER BY F.EmployeeID, S.EmployeeID;
जिसके परिणामस्वरूप निम्न टेबल उत्पन्न होती है।
एम्प्लॉयीआईडी | लास्टनेम | एम्प्लॉयीआईडी | लास्टनेम | कंट्री |
---|---|---|---|---|
123 | रैफर्टी | 124 | जोन्स | ऑस्ट्रेलिया |
123 | रैफर्टी | 145 | हाइजेनबर्ग | ऑस्ट्रेलिया |
124 | जोन्स | 145 | हाइजेनबर्ग | ऑस्ट्रेलिया |
305 | स्मिथ | 306 | विलियम्स | जर्मनी |
इस उदाहरण के लिए:
F
औरS
एम्प्लॉयी टेबल की पहली और दूसरी प्रतियों के लिए उपनाम (एसक्यूएल) हैं।- स्थिति
F.Country = S.Country
विभिन्न देशों में कर्मचारियों के मध्य युग्मों को सम्मिलित नहीं किया गया है। उदाहरण प्रश्न केवल ही देश में कर्मचारियों के जॉइने चाहता था। - स्थिति
F.EmployeeID < S.EmployeeID
जहां जॉइनों को सम्मिलित नहीं किया गया हैEmployeeID
पहले एम्प्लॉयी से अधिक या उसके बराबर हैEmployeeID
दूसरे एम्प्लॉयी का. दूसरे शब्दों में, इस शर्त का प्रभाव डुप्लिकेट जॉइनियों और स्वयं-जॉइनियों को बाहर करना है। इसके बिना, निम्नलिखित कम उपयोगी टेबल तैयार की जाएगी (नीचे दी गई टेबल परिणाम का केवल जर्मनी भाग प्रदर्शित करती है):
एम्प्लॉयीआईडी | लास्टनेम | एम्प्लॉयीआईडी | लास्टनेम | कंट्री |
---|---|---|---|---|
305 | स्मिथ | 305 | स्मिथ | जर्मनी |
305 | स्मिथ | 306 | विलियम्स | जर्मनी |
306 | विलियम्स | 305 | स्मिथ | जर्मनी |
306 | विलियम्स | 306 | विलियम्स | जर्मनी |
मूल प्रश्न को संतुष्ट करने के लिए दो मध्य युग्मों में से केवल की आवश्यकता है, और सबसे ऊपर और सबसे नीचे वाले को इस उदाहरण में कोई दिलचस्पी नहीं है।
विकल्प
आउटर जॉइन का प्रभाव इनर जॉइन और मुख्य टेबल में उन पंक्तियों के चयन के मध्य यूनियन ऑल का उपयोग करके भी प्राप्त किया जा सकता है जो जुड़ने की शर्त को पूरा नहीं करते हैं। उदाहरण के लिए,
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName
FROM employee
LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
के रूप में भी लिखा जा सकता है
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName
FROM employee
INNER JOIN department ON employee.DepartmentID = department.DepartmentID
UNION ALL
SELECT employee.LastName, employee.DepartmentID, cast(NULL as varchar(20))
FROM employee
WHERE NOT EXISTS (
SELECT * FROM department
WHERE employee.DepartmentID = department.DepartmentID)
कार्यान्वयन
डेटाबेस-सिस्टम में बहुत से काम का उद्देश्य जॉइन के कुशल कार्यान्वयन पर है, क्योंकि रिलेशनल सिस्टम सामान्यतः जॉइन की मांग करते हैं, फिर भी उनके कुशल निष्पादन को अनुकूलित करने में कठिनाइयों का सामना करना पड़ता है। समस्या इसलिए उत्पन्न होती है क्योंकि इनर जॉइन क्रमविनिमेय और साहचर्य दोनों तरह से काम करते हैं। व्यवहार में, इसका मतलब यह है कि उपयोगकर्ता केवल जुड़ने के लिए तालिकाओं की सूची और उपयोग करने के लिए जुड़ने की शर्तों की आपूर्ति करता है, और डेटाबेस सिस्टम के पास ऑपरेशन करने का सबसे कुशल तरीका निर्धारित करने का कार्य होता है। क्वेरी अनुकूलक यह निर्धारित करता है कि जॉइन वाली क्वेरी को कैसे निष्पादित किया जाए। क्वेरी ऑप्टिमाइज़र में दो बुनियादी स्वतंत्रताएँ होती हैं:
- जुड़ने का क्रम: क्योंकि यह कार्यों को क्रमविनिमेय और साहचर्य रूप से जॉइनता है, जिस क्रम में सिस्टम तालिकाओं से जुड़ता है वह क्वेरी के अंतिम परिणाम सेट को नहीं बदलता है। हालाँकि, जॉइन-ऑर्डर का जॉइन ऑपरेशन की लागत पर भारी प्रभाव पड़ सकता है, इसलिए सबसे अच्छा जॉइन ऑर्डर चुनना बहुत महत्वपूर्ण हो जाता है।
- सम्मिलित होने की विधि: दो तालिकाओं और जुड़ने की स्थिति को देखते हुए, कई कलन विधि सम्मिलित होने के परिणाम सेट का उत्पादन कर सकते हैं। कौन सा एल्गोरिदम सबसे अधिक कुशलता से चलता है यह इनपुट तालिकाओं के आकार, प्रत्येक टेबल से जुड़ने की स्थिति से मेल खाने वाली पंक्तियों की संख्या और बाकी क्वेरी के लिए आवश्यक संचालन पर निर्भर करता है।
कई जॉइन-एल्गोरिदम अपने इनपुट को अलग तरह से व्यवहार करते हैं। किसी जॉइन के इनपुट को क्रमशः आउटर और इनर जॉइन ऑपरेंड, या बाएँ और दाएँ के रूप में संदर्भित किया जा सकता है। उदाहरण के लिए, नेस्टेड लूप के मामले में, डेटाबेस सिस्टम आउटर संबंध की प्रत्येक पंक्ति के लिए संपूर्ण इनर संबंध को स्कैन करेगा।
कोई भी सम्मिलित होने वाली क्वेरी-योजनाओं को निम्नानुसार वर्गीकृत कर सकता है:[12]
- लेफ्ट-डीप
- योजना में प्रत्येक जॉइन के इनर ऑपरेंड के रूप में बेस टेबल (किसी अन्य जॉइन के बजाय) का उपयोग करना
- राइट-डीप
- योजना में प्रत्येक जॉइन के आउटर ऑपरेंड के रूप में बेस टेबल का उपयोग करना
- झाड़ीदार
- न बाएँ-गहरा, न दाएँ-गहरा; किसी जॉइन के दोनों इनपुट स्वयं जॉइन के परिणामस्वरूप हो सकते हैं
यदि ट्री डेटा संरचना के रूप में तैयार किया जाता है, तो ये नाम क्वेरी योजना की उपस्थिति से प्राप्त होते हैं, जिसमें बाईं ओर आउटर जॉइन संबंध और दाईं ओर इनर संबंध होता है (जैसा कि सम्मेलन तय करता है)।
एल्गोरिदम से जुड़ें
![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/Comparison_of_join_algorithms.png/300px-Comparison_of_join_algorithms.png)
बाइनरी जॉइन ऑपरेशन करने के लिए तीन मौलिक एल्गोरिदम मौजूद हैं: नेस्टेड लूप जॉइन, सॉर्ट-मर्ज जॉइन और हैश जॉइन। सबसे खराब स्थिति में इष्टतम जॉइन एल्गोरिदम, सबसे खराब स्थिति में दो से अधिक संबंधों के मध्य जुड़ने के लिए बाइनरी जॉइन एल्गोरिदम की तुलना में एसिम्प्टोटिक रूप से तेज़ हैं।
जॉइन इन्डेक्सेस
जॉइन इंडेक्स डेटाबेस सूचकांक हैं जो डेटा वेयरहाउस में जॉइन क्वेरी के प्रसंस्करण की सुविधा प्रदान करते हैं: वे वर्तमान में (2012) ओरेकल डेटाबेस द्वारा कार्यान्वयन में उपलब्ध हैं[14] और टेराडाटा.[15] टेराडाटा कार्यान्वयन में, निर्दिष्ट कॉलम, कॉलम पर समग्र कार्य, या या अधिक तालिकाओं से दिनांक कॉलम के घटकों को डेटाबेस दृश्य की परिभाषा के समान सिंटैक्स का उपयोग करके निर्दिष्ट किया जाता है: 64 कॉलम/कॉलम अभिव्यक्तियों को ल में निर्दिष्ट किया जा सकता है सूचकांक में सम्मिलित हों. वैकल्पिक रूप से, कॉलम जो समग्र डेटा की प्राथमिक कुंजी को परिभाषित करता है, उसे भी निर्दिष्ट किया जा सकता है: समानांतर हार्डवेयर पर, कॉलम मानों का उपयोग सूचकांक की सामग्री को कई डिस्क में विभाजित करने के लिए किया जाता है। जब स्रोत तालिकाओं को उपयोगकर्ताओं द्वारा इंटरैक्टिव रूप से अपडेट किया जाता है, तो जॉइन इंडेक्स की सामग्री स्वचालित रूप से अपडेट हो जाती है। कोई भी क्वेरी जिसका कहां (एसक्यूएल) कॉलम या कॉलम ्सप्रेशन के किसी भी संयोजन को निर्दिष्ट करता है जो कि जॉइन इंडेक्स (तथाकथित कवरिंग क्वेरी) में परिभाषित लोगों का सटीक सबसेट है, मूल तालिकाओं और उनके इंडेक्स के बजाय जॉइन इंडेक्स का कारण बनेगा, क्वेरी निष्पादन के दौरान परामर्श लिया जाना।
Oracle कार्यान्वयन स्वयं को बिटमैप सूचकांक का उपयोग करने तक सीमित रखता है। बिटमैप जॉइन इंडेक्स का उपयोग कम-कार्डिनैलिटी कॉलम के लिए किया जाता है (यानी, ओरेकल दस्तावेज़ के अनुसार 300 से कम विशिष्ट मान वाले कॉलम): यह कई संबंधित तालिकाओं से कम-कार्डिनैलिटी कॉलम को जॉइनता है। Oracle जिस उदाहरण का उपयोग करता है वह इन्वेंट्री सिस्टम का है, जहां विभिन्न आपूर्तिकर्ता अलग-अलग हिस्से प्रदान करते हैं। डेटाबेस स्कीमा में तीन लिंक्ड टेबल हैं: दो मास्टर टेबल, पार्ट और सप्लायर, और डिटेल टेबल, इन्वेंटरी। अंतिम अनेक-से-अनेक टेबल है जो आपूर्तिकर्ता को भाग से जॉइनती है, और इसमें सबसे अधिक पंक्तियाँ होती हैं। प्रत्येक भाग का भाग प्रकार होता है, और प्रत्येक आपूर्तिकर्ता अमेरिका में स्थित होता है, और उसके पास राज्य कॉलम होता है। अमेरिका में 60 से अधिक राज्य+क्षेत्र नहीं हैं, और 300 से अधिक भाग प्रकार नहीं हैं। बिटमैप जॉइन इंडेक्स को उपरोक्त तीन तालिकाओं पर मानक तीन-टेबल जॉइन का उपयोग करके परिभाषित किया गया है, और इंडेक्स के लिए पार्ट_टाइप और सप्लायर_स्टेट कॉलम निर्दिष्ट किया गया है। हालाँकि, इसे इन्वेंटरी टेबल पर परिभाषित किया गया है, भले ही कॉलम पार्ट_टाइप और सप्लायर_स्टेट क्रमशः सप्लायर और पार्ट से उधार लिए गए हों।
टेराडेटा के लिए, ओरेकल बिटमैप जॉइन इंडेक्स का उपयोग केवल प्रश्न का उत्तर देने के लिए किया जाता है जब क्वेरी का व्हेयर क्लॉज उन कॉलमों तक सीमित होता है जो जॉइन इंडेक्स में सम्मिलित होते हैं।
स्ट्रैट जॉइन
कुछ डेटाबेस सिस्टम उपयोगकर्ता को सिस्टम को विशेष क्रम में तालिकाओं को पढ़ने के लिए बाध्य करने की अनुमति देते हैं। इसका उपयोग तब किया जाता है जब जॉइन ऑप्टिमाइज़र तालिकाओं को अकुशल क्रम में पढ़ने का विकल्प चयन किया जाता है। उदाहरण के लिए, MySQL में कमांड STRAIGHT_JOIN
तालिकाओं को क्वेरी में सूचीबद्ध क्रम में ही पढ़ता है।[16]
यह भी देखें
- जुड़ें (संबंधपरक बीजगणित)
- एंटीजॉइन
- सेट ऑपरेशन (एसक्यूएल)
संदर्भ
उद्धरण
- ↑ SQL CROSS JOIN
- ↑ Greg Robidoux, "Avoid SQL Server functions in the WHERE clause for Performance", MSSQL Tips, 3 May 2007
- ↑ Patrick Wolf, "Inside Oracle APEX "Caution when using PL/SQL functions in a SQL statement", 30 November 2006
- ↑ Gregory A. Larsen, "T-SQL Best Practices - Don't Use Scalar Value Functions in Column List or WHERE Clauses", 29 October 2009,
- ↑ Simplifying Joins with the USING Keyword
- ↑ In Unicode, the bowtie symbol is ⋈ (U+22C8).
- ↑ Ask Tom "Oracle support of ANSI joins." Back to basics: inner joins » Eddie Awad's Blog Archived 2010-11-19 at the Wayback Machine
- ↑ Silberschatz, Abraham; Korth, Hank; Sudarshan, S. (2002). "Section 4.10.2: Join Types and Conditions". डेटाबेस सिस्टम अवधारणाएँ (4th ed.). p. 166. ISBN 0072283637.
- ↑ Oracle लेफ्ट आउटर जॉइन
- ↑ Shah 2005, p. 165
- ↑ Adapted from Pratt 2005, pp. 115–6
- ↑ Yu & Meng 1998, p. 213
- ↑ Wang, Yisu Remy; Willsey, Max; Suciu, Dan (2023-01-27). "Free Join: Unifying Worst-Case Optimal and Traditional Joins". arXiv:2301.10841 [cs.DB].
- ↑ Oracle Bitmap Join Index. URL: http://www.dba-oracle.com/art_builder_bitmap_join_idx.htm
- ↑ Teradata Join Indexes. "Join Index". Archived from the original on 2012-12-16. Retrieved 2012-06-14.
- ↑ "13.2.9.2 JOIN Syntax". MySQL 5.7 Reference Manual. Oracle Corporation. Retrieved 2015-12-03.
स्रोत
- Pratt, Phillip J (2005), A Guide To SQL, Seventh Edition, Thomson Course Technology, ISBN 978-0-619-21674-0
- Shah, Nilesh (2005) [2002], Database Systems Using Oracle – A Simplified Guide to SQL and PL/SQL Second Edition (International ed.), Pearson Education International, ISBN 0-13-191180-5
- Yu, Clement T.; Meng, Weiyi (1998), Principles of Database Query Processing for Advanced Applications, Morgan Kaufmann, ISBN 978-1-55860-434-6, retrieved 2009-03-03