जॉइन (एसक्यूएल): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(15 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|SQL clause}}
{{Short description|SQL clause}}
[[File:Square join.png|thumb|वेन आरेख तालिका ए और बी के बीच पूर्ण जुड़ाव एसक्यूएल कथन का प्रतिनिधित्व करता है।]]स्ट्रक्चर्ड क्वेरी लैंग्वेज ([[एसक्यूएल]]) में '''जॉइन''' क्लॉज एक या अधिक [[ तालिका (डेटाबेस) |टेबल]] के [[कॉलम (डेटाबेस)|कॉलम]] को नई टेबल में जोड़ता है। यह ऑपरेशन संबंधपरक बीजगणित में जॉइन ऑपरेशन से युग्मित होता है। अनौपचारिक रूप से, जोड़ दो तालिकाओं को जोड़ता है और युग्मित होने वाली फ़ील्ड के साथ एक ही पंक्ति में रिकॉर्ड रखता है: <code>INNER</code>, <code>LEFT OUTER</code>, <code>RIGHT OUTER</code>, <code>FULL OUTER</code> और <code>CROSS</code>आदि।
[[File:Square join.png|thumb|वेन आरेख टेबल A और B के मध्य पूर्ण जॉइन एसक्यूएल कथन का प्रतिनिधित्व करता है।]]स्ट्रक्चर्ड क्वेरी लैंग्वेज ([[एसक्यूएल]]) में '''जॉइन''' क्लॉज एक या अधिक [[ तालिका (डेटाबेस) |टेबल]] के [[कॉलम (डेटाबेस)|कॉलम]] को नई टेबल में जॉइनता है। यह ऑपरेशन संबंधपरक बीजगणित में जॉइन ऑपरेशन से युग्मित होता है। अनौपचारिक रूप से, जॉइन दो तालिकाओं को जॉइनता है और युग्मित होने वाली फ़ील्ड के साथ एक ही पंक्ति में रिकॉर्ड रखता है: <code>INNER</code>, <code>LEFT OUTER</code>, <code>RIGHT OUTER</code>, <code>FULL OUTER</code> और <code>CROSS</code>आदि।


==उदाहरण तालिका==
==उदाहरण तालिकाएँ==
जुड़ाव प्रकारों को समझाने के लिए, इस आलेख का शेष भाग निम्नलिखित तालिकाओं का उपयोग करता है:
जॉइन प्रकारों को समझाने के लिए, इस आलेख का शेष भाग निम्नलिखित तालिकाओं का उपयोग करता है:
{| class="wikitable" style="text-align:center; float:left; margin-right:5px"
{| class="wikitable" style="text-align:center; float:left; margin-right:5px"
|+एम्प्लॉयी टेबल
|+एम्प्लॉयी टेबल
Line 36: Line 36:
|}
|}


<code>Department.DepartmentID</code> की [[प्राथमिक कुंजी]] है <code>Department</code> तालिका, जबकि <code>Employee.DepartmentID</code>  [[विदेशी कुंजी]] है.
<code>Department.DepartmentID</code> <code>Department</code> टेबल की [[प्राथमिक कुंजी]] है, जबकि <code>Employee.DepartmentID</code>  [[विदेशी कुंजी]] है।


ध्यान दें कि इसमें <code>Employee</code>, विलियम्स को अभी तक कोई विभाग नहीं सौंपा गया है। इसके अलावा, विपणन विभाग में कोई कर्मचारी नियुक्त नहीं किया गया है।
ध्यान दें कि <code>Employee</code> में, विलियम्स को अभी तक कोई डिपार्टमेंट नहीं दिया गया है। इसके अतिरिक्त, मार्केटिंग डिपार्टमेंट में किसी भी एम्प्लॉयी को नियुक्त नहीं किया गया है।


उपरोक्त तालिकाएँ बनाने के लिए ये SQL कथन हैं:
उपरोक्त तालिकाएँ बनाने के लिए ये एसक्यूएल कथन हैं:


<सिंटैक्सहाइलाइट लैंग= एसक्यूएल लाइन= 1 >
CREATE TABLE department(
टेबल विभाग बनाएं(
    डिपार्टमेंटआईडी इंट प्राथमिक कुंजी शून्य नहीं है,
    विभाग का नाम VARCHAR(20)
);


टेबल कर्मचारी बनाएं (
  DepartmentID INT PRIMARY KEY NOT NULL,
    अंतिम नाम VARCHAR(20),
    DepartmentID पूर्ण संदर्भ विभाग(DepartmentID)
);


विभाग में सम्मिलित करें
DepartmentName VARCHAR(20)
मान (31, 'बिक्री'),
      (33, 'इंजीनियरिंग'),
      (34, 'लिपिकीय'),
      (35, 'मार्केटिंग');


कर्मचारी में डालें
  );
मूल्य ('रैफर्टी', 31),
 
      ('जोन्स', 33),
  CREATE TABLE employee (
      ('हाइजेनबर्ग', 33),
 
      ('रॉबिन्सन', 34),
LastName VARCHAR(20),
      ('स्मिथ', 34),
 
      ('विलियम्स', शून्य);
DepartmentID INT REFERENCES department(DepartmentID)
</सिंटैक्सहाइलाइट>
 
);
 
      INSERT INTO department
      VALUES (31, 'Sales'),
 
  (33, 'Engineering'),
  (34, 'Clerical'),
  (35, 'Marketing');
 
      INSERT INTO employee
      VALUES ('Rafferty', 31),
 
('Jones', 33),
('Heisenberg', 33),
('Robinson', 34),
('Smith', 34),
 
('Williams', NULL);


==क्रॉस जॉइन==
==क्रॉस जॉइन==
<code>CROSS JOIN</code> जॉइन में तालिकाओं से पंक्तियों का कार्टेशियन उत्पाद लौटाता है। दूसरे शब्दों में, यह ऐसी पंक्तियाँ उत्पन्न करेगा जो पहली तालिका की प्रत्येक पंक्ति को दूसरी तालिका की प्रत्येक पंक्ति के साथ जोड़ती हैं।<ref>[http://www.sqlguides.com/sql_cross_join.php SQL CROSS JOIN]</ref>
<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"
|-
|-
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
! एम्प्लॉयी लास्टनेम !! एम्प्लॉयी डिपार्टमेंटआईडी !! डिपार्टमेंट डिपार्टमेंटनेम !! डिपार्टमेंट डिपार्टमेंटआईडी
|-
|-
| रैफर्टी || 31 || सेल्स || 31
| रैफर्टी || 31 || सेल्स || 31
Line 123: Line 130:
| विलियम्स || {{null result}} || मार्केटिंग || 35
| विलियम्स || {{null result}} || मार्केटिंग || 35
|}
|}
स्पष्ट क्रॉस जॉइन का उदाहरण:
स्पष्ट क्रॉस जॉइन का उदाहरण है:
<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>


Line 129: Line 136:
FROM employee CROSS JOIN department;
FROM employee CROSS JOIN department;
</syntaxhighlight>
</syntaxhighlight>
अंतर्निहित क्रॉस जॉइन का उदाहरण:
अंतर्निहित क्रॉस जॉइन का उदाहरण है:
<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
SELECT *
SELECT *
FROM employee, department;
FROM employee, department;
</syntaxhighlight>क्रॉस जॉइन को हमेशा सही स्थिति के साथ आंतरिक जॉइन से बदला जा सकता है:<syntaxhighlight lang="sql">
</syntaxhighlight>क्रॉस जॉइन को सदैव उचित स्थिति के साथ इनर जॉइन से परिवर्तित किया जा सकता है:<syntaxhighlight lang="sql">
SELECT *
SELECT *
FROM employee INNER JOIN department ON 1=1;
FROM employee INNER JOIN department ON 1=1;
</syntaxhighlight>
</syntaxhighlight>


<code>CROSS JOIN</code> सम्मिलित तालिका से पंक्तियों को फ़िल्टर करने के लिए स्वयं कोई विधेय लागू नहीं करता है। ए के परिणाम <code>CROSS JOIN</code> व्हेयर (एसक्यूएल)| का उपयोग करके फ़िल्टर किया जा सकता है<code>WHERE</code>खंड, जो तब आंतरिक जुड़ाव के समतुल्य उत्पन्न कर सकता है।
<code>CROSS JOIN</code> सम्मिलित टेबल से पंक्तियों को फ़िल्टर करने के लिए स्वयं कोई प्रेडिकेट प्रारम्भ नहीं करता है। ए के परिणाम <code>CROSS JOIN</code> के परिणामों को <code>WHERE</code> क्लॉज का उपयोग करके फ़िल्टर किया जा सकता है, जो तब इनर जॉइन के समतुल्य उत्पन्न कर सकता है।


SQL:2011 मानक में, क्रॉस जॉइन वैकल्पिक F401, ्सटेंडेड जॉइन्ड टेबल, पैकेज का हिस्सा हैं।
एसक्यूएल:2011 मानक में, क्रॉस जॉइन वैकल्पिक F401, एक्सटेंडेड जॉइन्ड टेबल, पैकेज का भाग हैं।


सामान्य उपयोग सर्वर के प्रदर्शन की जाँच के लिए होता है।{{Why|date=May 2021}}
सामान्य उपयोग सर्वर के प्रदर्शन के परीक्षण के लिए होता है।{{Why|date=May 2021}}


==आंतरिक जुड़ाव==
==इनर जॉइन==


इनर जॉइन (या जॉइन) के लिए दो जुड़ी हुई तालिकाओं में प्रत्येक पंक्ति में मेल खाने वाले कॉलम मानों की आवश्यकता होती है, और यह [[अनुप्रयोग प्रक्रिया सामग्री]] में आमतौर पर उपयोग किया जाने वाला जॉइन ऑपरेशन है, लेकिन इसे सभी स्थितियों में सबसे अच्छा विकल्प नहीं माना जाना चाहिए। इनर जॉइन, जॉइन-प्रेडिकेट के आधार पर दो तालिकाओं (ए और बी) के कॉलम मानों को मिलाकर  नई परिणाम तालिका बनाता है। क्वेरी ए की प्रत्येक पंक्ति की तुलना बी की प्रत्येक पंक्ति से करती है ताकि पंक्तियों के सभी जोड़े ढूंढे जा सकें जो जुड़ाव-विधेय को संतुष्ट करते हैं। जब जॉइन-प्रेडिकेट गैर-[[ शून्य (एसक्यूएल) ]] मानों के मिलान से संतुष्ट होता है, तो ए और बी की पंक्तियों की प्रत्येक मिलान जोड़ी के लिए कॉलम मान परिणाम पंक्ति में संयोजित होते हैं।
इनर जॉइन (या जॉइन) के लिए दो सम्मिलित तालिकाओं में प्रत्येक पंक्ति में युग्मित होने वाले कॉलम मानों की आवश्यकता होती है, और यह [[अनुप्रयोग प्रक्रिया सामग्री]] में सामान्यतः उपयोग किया जाने वाला जॉइन ऑपरेशन है, किन्तु इसे सभी स्थितियों में सबसे उत्तम विकल्प नहीं माना जाना चाहिए। इनर जॉइन, जॉइन-प्रेडिकेट के आधार पर दो तालिकाओं (ए और बी) के कॉलम मानों को सम्मिलित करके नई परिणाम टेबल बनाता है। क्वेरी ए की प्रत्येक पंक्ति की तुलना बी की प्रत्येक पंक्ति से करती है जिससे कि पंक्तियों के सभी जॉइने ज्ञात किये जा सकें जो जॉइन-प्रेडिकेट को संतुष्ट करते हैं। जब जॉइन-प्रेडिकेट गैर-[[ शून्य (एसक्यूएल) | शून्य]] मानों के मिलान से संतुष्ट होता है, तो ए और बी की पंक्तियों की प्रत्येक मिलान जॉइनी के लिए कॉलम मान परिणाम पंक्ति में संयोजित होते हैं।


जॉइन के परिणाम को पहले तालिकाओं में सभी पंक्तियों के कार्टेशियन उत्पाद (या #क्रॉस जॉइन) लेने के परिणाम के रूप में परिभाषित किया जा सकता है (तालिका ए में प्रत्येक पंक्ति को तालिका बी में प्रत्येक पंक्ति के साथ जोड़ना) और फिर सभी पंक्तियों को वापस करना जो जॉइन विधेय को संतुष्ट करते हैं। वास्तविक एसक्यूएल कार्यान्वयन आम तौर पर अन्य दृष्टिकोणों का उपयोग करते हैं, जैसे [[हैश जॉइन]] या [[सॉर्ट-मर्ज जॉइन]], क्योंकि कार्टेशियन उत्पाद की गणना धीमी है और स्टोर करने के लिए अक्सर बड़ी मात्रा में मेमोरी की आवश्यकता होती है।
जॉइन के परिणाम को प्रथम तालिकाओं में सभी पंक्तियों के कार्टेशियन उत्पाद (या क्रॉस जॉइन) लेने के परिणाम के रूप में परिभाषित किया जा सकता है (टेबल ए में प्रत्येक पंक्ति को टेबल बी में प्रत्येक पंक्ति के साथ जॉइनना) और फिर सभी पंक्तियों को वापस करना जो जॉइन प्रेडिकेट को संतुष्ट करते हैं। वास्तविक एसक्यूएल कार्यान्वयन सामान्यतः अन्य दृष्टिकोणों का उपयोग करते हैं, जैसे [[हैश जॉइन]] या [[सॉर्ट-मर्ज जॉइन]], क्योंकि कार्टेशियन उत्पाद की गणना धीमी है और स्टोर करने के लिए प्रायः बड़ी मात्रा में मेमोरी की आवश्यकता होती है।


SQL जुड़ाव को व्यक्त करने के लिए दो अलग-अलग वाक्यात्मक तरीके निर्दिष्ट करता है: स्पष्ट जुड़ाव संकेतन और अंतर्निहित जुड़ाव संकेतन। अंतर्निहित जुड़ाव संकेतन को अब सर्वोत्तम अभ्यास नहीं माना जाता है{{By whom|date=September 2022}}, हालाँकि डेटाबेस सिस्टम अभी भी इसका समर्थन करते हैं।
एसक्यूएल जॉइन को व्यक्त करने के लिए दो भिन्न-भिन्न वाक्यात्मक प्रकार निर्दिष्ट करता है: जो एक्सप्लिसिट जॉइन नोटेशन और इम्प्लिसिट जॉइन नोटेशन है। इम्प्लिसिट जॉइन नोटेशन को अब सर्वोत्तम अभ्यास नहीं माना जाता है{{By whom|date=September 2022}}, चूँकि डेटाबेस सिस्टम अभी भी इसका समर्थन करते हैं।


स्पष्ट जॉइन नोटेशन का उपयोग करता है <code>JOIN</code> कीवर्ड, वैकल्पिक रूप से पहले <code>INNER</code> कीवर्ड, शामिल होने के लिए तालिका निर्दिष्ट करने के लिए, और <code>ON</code> शामिल होने के लिए पूर्वानुमान निर्दिष्ट करने के लिए कीवर्ड, जैसा कि निम्नलिखित उदाहरण में है:
एक्सप्लिसिट जॉइन नोटेशन सम्मिलित होने के लिए टेबल निर्दिष्ट करने के लिए वैकल्पिक रूप से <code>INNER</code> कीवर्ड से पूर्व <code>JOIN</code> कीवर्ड का उपयोग करता है, और सम्मिलित होने के लिए पूर्वानुमान निर्दिष्ट करने के लिए <code>ON</code> कीवर्ड का उपयोग करता है, जैसा कि निम्नलिखित उदाहरण में है:


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
Line 162: Line 169:


{| class="wikitable"
{| class="wikitable"
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName
! एम्प्लॉयी लास्टनेम !! एम्प्लॉयी डिपार्टमेंटआईडी !! डिपार्टमेंट डिपार्टमेंटनेम
|-
|-
| Robinson || 34 || Clerical
| रॉबिंसन || 34 || क्लेरिकल
|-
|-
| Jones || 33 || Engineering
| जोन्स || 33 || इंजीनियरिंग
|-
|-
|| Smith || 34 || Clerical
|| स्मिथ || 34 || क्लेरिकल
|-
|-
|| Heisenberg || 33 || Engineering
|| हाइजेनबर्ग || 33 || इंजीनियरिंग
|-
|-
|| Rafferty || 31 || Sales
|| रैफर्टी || 31 || सेल्स
|}
|}
अंतर्निहित जॉइन नोटेशन केवल शामिल होने के लिए तालिकाओं को सूचीबद्ध करता है <code>FROM</code> का खंड <code>SELECT</code> कथन, उन्हें अलग करने के लिए अल्पविराम का उपयोग करना। इस प्रकार यह #क्रॉस जॉइन निर्दिष्ट करता है, और <code>WHERE</code> खंड अतिरिक्त फ़िल्टर-विधेय लागू कर सकता है (जो स्पष्ट नोटेशन में सम्मिलित-विधेय की तुलना में कार्य करता है)।
इम्प्लिसिट जॉइन नोटेशन केवल <code>SELECT</code> कथन के <code>FROM</code> क्लॉज में सम्मिलित होने के लिए तालिकाओं को सूचीबद्ध करता है, और उन्हें अलग करने के लिए अल्पविराम का उपयोग करता है। इस प्रकार यह क्रॉस जॉइन निर्दिष्ट करता है, और <code>WHERE</code> क्लॉज अतिरिक्त फ़िल्टर-प्रेडिकेट प्रारम्भ कर सकता है (जो स्पष्ट नोटेशन में जॉइन-प्रेडिकेट की तुलना में कार्य करता है)।


निम्नलिखित उदाहरण पिछले उदाहरण के बराबर है, लेकिन इस बार अंतर्निहित जॉइन नोटेशन का उपयोग किया जा रहा है:
निम्नलिखित उदाहरण पूर्व उदाहरण के समान है, किन्तु इस बार इम्प्लिसिट जॉइन नोटेशन का उपयोग किया जा रहा है:


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 183: Line 190:
WHERE employee.DepartmentID = department.DepartmentID;
WHERE employee.DepartmentID = department.DepartmentID;
</syntaxhighlight>
</syntaxhighlight>
ऊपर दिए गए उदाहरणों में दिए गए प्रश्न दोनों तालिकाओं के डिपार्टमेंटआईडी कॉलम का उपयोग करके कर्मचारी और विभाग तालिकाओं में शामिल हो जाएंगे। जहां इन तालिकाओं का डिपार्टमेंटआईडी मेल खाता है (यानी जॉइन-प्रेडिकेट संतुष्ट है), क्वेरी दो तालिकाओं से लास्टनाम, डिपार्टमेंटआईडी और डिपार्टमेंटनाम कॉलम को परिणाम पंक्ति में संयोजित करेगी। जहां डिपार्टमेंट आईडी मेल नहीं खाती, वहां कोई परिणाम पंक्ति उत्पन्न नहीं होती है।
ऊपर दिए गए उदाहरणों में दिए गए प्रश्न दोनों तालिकाओं के डिपार्टमेंटआईडी कॉलम का उपयोग करके एम्प्लॉयी और डिपार्टमेंट तालिकाओं में सम्मिलित हो जाएंगे। जहां इन तालिकाओं का डिपार्टमेंटआईडी युग्मित होता है (अर्थात जॉइन-प्रेडिकेट संतुष्ट है), क्वेरी दो तालिकाओं से लास्टनेम, डिपार्टमेंटआईडी और डिपार्टमेंटनेम कॉलम को परिणाम पंक्ति में संयोजित करेगी। जहां डिपार्टमेंट आईडी युग्मित नहीं होती, और वहां कोई परिणाम पंक्ति उत्पन्न नहीं होती है।


इस प्रकार उपरोक्त क्वेरी की क्वेरी योजना का परिणाम होगा:
इस प्रकार उपरोक्त क्वेरी के निष्पादन का परिणाम होगा:


{| class="wikitable"
{| class="wikitable"
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName
! एम्प्लॉयी लास्टनेम !! एम्प्लॉयी डिपार्टमेंटआईडी !! डिपार्टमेंट डिपार्टमेंटनेम
|-
|-
| Robinson || 34 || Clerical
| रॉबिंसन || 34 || क्लेरिकल
|-
|-
| Jones || 33 || Engineering
| जोन्स || 33 || इंजीनियरिंग
|-
|-
|| Smith || 34 || Clerical
|| स्मिथ || 34 || क्लेरिकल
|-
|-
|| Heisenberg || 33 || Engineering
|| हाइजेनबर्ग || 33 || इंजीनियरिंग
|-
|-
|| Rafferty || 31 || Sales
|| रैफर्टी || 31 || सेल्स
|}
|}
कर्मचारी विलियम्स और विभाग मार्केटिंग क्वेरी निष्पादन परिणामों में दिखाई नहीं देते हैं। इनमें से किसी की भी अन्य संबंधित तालिका में कोई मेल खाने वाली पंक्तियाँ नहीं हैं: विलियम्स के पास कोई संबद्ध विभाग नहीं है, और किसी भी कर्मचारी के पास विभाग आईडी 35 (मार्केटिंग) नहीं है। वांछित परिणामों के आधार पर, यह व्यवहार सूक्ष्म बग हो सकता है, जिसे आंतरिक जोड़ को #बाहरी जोड़ से बदलकर टाला जा सकता है।
एम्प्लॉयी विलियम्स और डिपार्टमेंट मार्केटिंग क्वेरी निष्पादन परिणामों में दिखाई नहीं देते हैं। इनमें से किसी की भी अन्य संबंधित टेबल में कोई युग्मित होने वाली पंक्तियाँ नहीं हैं: "विलियम्स" का कोई संबद्ध डिपार्टमेंट नहीं है, और किसी भी एम्प्लॉयी के पास डिपार्टमेंट आईडी 35 (मार्केटिंग) नहीं है। वांछित परिणामों के आधार पर, यह व्यवहार सूक्ष्म बग हो सकता है, जिसे इनर जॉइन को आउटर जॉइन से प्रतिस्थापित करके बचा जा सकता है।


=== आंतरिक जुड़ाव और शून्य मान ===
=== इनर जॉइन और शून्य मान ===
प्रोग्रामर को उन स्तंभों पर तालिकाओं को जोड़ते समय विशेष ध्यान रखना चाहिए जिनमें नल (एसक्यूएल) मान हो सकते हैं, क्योंकि NULL कभी भी किसी अन्य मान से मेल नहीं खाएगा (यहां तक ​​कि NULL भी नहीं), जब तक कि जुड़ने की स्थिति स्पष्ट रूप से  संयोजन विधेय का उपयोग नहीं करती है जो पहले जांचता है कि कॉलम जुड़ते हैं हैं <code> NOT NULL</code> शेष विधेय शर्त(शर्तों) को लागू करने से पहले। इनर जॉइन का उपयोग केवल उस डेटाबेस में सुरक्षित रूप से किया जा सकता है जो संदर्भात्मक अखंडता को लागू करता है या जहां जॉइन कॉलम के शून्य न होने की गारंटी होती है। कई लेनदेन प्रसंस्करण संबंधपरक डेटाबेस डेटा अखंडता सुनिश्चित करने के लिए ACID|परमाणुता, स्थिरता, अलगाव, स्थायित्व (ACID) डेटा अद्यतन मानकों पर भरोसा करते हैं, जिससे आंतरिक जुड़ाव  उपयुक्त विकल्प बन जाता है। हालाँकि, लेन-देन डेटाबेस में आमतौर पर वांछनीय जुड़ाव वाले कॉलम भी होते हैं जिन्हें NULL होने की अनुमति होती है। कई रिपोर्टिंग रिलेशनल डेटाबेस और [[डेटा वेयरहाउस]] हाई वॉल्यूम ्सट्रैक्ट, ट्रांसफॉर्म, लोड (ईटीएल) बैच अपडेट का उपयोग करते हैं जो संदर्भात्मक अखंडता को लागू करना मुश्किल या असंभव बनाते हैं, जिसके परिणामस्वरूप संभावित रूप से NULL जॉइन कॉलम होते हैं जिन्हें SQL क्वेरी लेखक संशोधित नहीं कर सकता है और जो किसी त्रुटि के संकेत के बिना डेटा को छोड़ने के लिए इनर जॉइन का कारण बनता है। इनर जॉइन का उपयोग करने का विकल्प डेटाबेस डिज़ाइन और डेटा विशेषताओं पर निर्भर करता है। जब  तालिका में शामिल कॉलम में NULL मान हो सकते हैं, तो बाएं बाहरी जुड़ाव को आमतौर पर आंतरिक जुड़ाव के लिए प्रतिस्थापित किया जा सकता है।
प्रोग्रामर को उन स्तंभों पर तालिकाओं को जॉइनते समय विशेष ध्यान रखना चाहिए जिनमें शून्य मान हो सकते हैं, क्योंकि शून्य कभी भी किसी अन्य मान से युग्मित नहीं हो सकता (यहां तक ​​कि नल भी नहीं), जब तक कि जुड़ने की स्थिति स्पष्ट रूप से  संयोजन प्रेडिकेट का उपयोग नहीं करती है जो प्रथम परीक्षण करता है कि जुड़ने वाले कॉलम <code> NOT NULL</code> हैं शेष प्रेडिकेट नियम को प्रस्तावित करने से पूर्व होते हैं। इनर जॉइन का उपयोग केवल उस डेटाबेस में सुरक्षित रूप से किया जा सकता है जो संदर्भात्मक अखंडता को प्रस्तावित करता है या जहां जॉइन कॉलम के शून्य न होने का आश्वासन होता है। कई लेनदेन प्रसंस्करण संबंधपरक डेटाबेस डेटा अखंडता सुनिश्चित करने के लिए परमाणुता, स्थिरता, भिन्नता, स्थायित्व (एसीआईडी) डेटा अद्यतन मानकों पर विश्वास करते हैं, जिससे इनर जॉइन उपयुक्त विकल्प बन जाता है। चूँकि, लेन-देन डेटाबेस में सामान्यतः वांछनीय जॉइन वाले कॉलम भी होते हैं जिन्हें शून्य होने की अनुमति होती है। कई रिपोर्टिंग रिलेशनल डेटाबेस और [[डेटा वेयरहाउस]] हाई वॉल्यूम एक्सट्रैक्ट, ट्रांसफॉर्म, लोड (ईटीएल) बैच अपडेट का उपयोग करते हैं जो संदर्भात्मक अखंडता को प्रस्तावित करना कठिन या असंभव बनाते हैं, जिसके परिणामस्वरूप संभावित रूप से शून्य जॉइन कॉलम होते हैं जिन्हें एसक्यूएल क्वेरी लेखक संशोधित नहीं कर सकता है और जो किसी त्रुटि के संकेत के बिना डेटा को छोड़ने के लिए इनर जॉइन का कारण बनता है। इनर जॉइन का उपयोग करने का विकल्प डेटाबेस डिज़ाइन और डेटा विशेषताओं पर निर्भर करता है। जब  टेबल में सम्मिलित कॉलम में शून्य मान हो सकते हैं, तो लेफ्ट आउटर जॉइन को सामान्यतः इनर जॉइन के लिए प्रतिस्थापित किया जा सकता है।


कोई भी डेटा कॉलम जो NULL (खाली) हो सकता है, उसे कभी भी इनर जॉइन में लिंक के रूप में उपयोग नहीं किया जाना चाहिए, जब तक कि इच्छित परिणाम NULL मान वाली पंक्तियों को खत्म करना न हो। यदि [[परिणाम सेट]] से NULL जॉइन कॉलम को जानबूझकर हटाया जाना है, तो आंतरिक जॉइन बाहरी जॉइन से तेज़ हो सकता है क्योंकि टेबल जॉइन और फ़िल्टरिंग ही चरण में की जाती है। इसके विपरीत, SQL व्हेयर क्लॉज में डेटाबेस फ़ंक्शंस के साथ संयोजन में बड़ी मात्रा में क्वेरी में उपयोग किए जाने पर आंतरिक जुड़ाव के परिणामस्वरूप विनाशकारी रूप से धीमा प्रदर्शन या सर्वर क्रैश भी हो सकता है।<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> SQL व्हेयर क्लॉज़ में फ़ंक्शन के परिणामस्वरूप डेटाबेस अपेक्षाकृत कॉम्पैक्ट टेबल इंडेक्स को अनदेखा कर सकता है। गणना किए गए मान पर निर्भर फ़िल्टर का उपयोग करके पंक्तियों की संख्या को कम करने से पहले डेटाबेस दोनों तालिकाओं से चयनित कॉलम को पढ़ और आंतरिक रूप से जोड़ सकता है, जिसके परिणामस्वरूप अपेक्षाकृत भारी मात्रा में अकुशल प्रसंस्करण होता है।
कोई भी डेटा कॉलम जो शून्य (रिक्त) हो सकता है, उसे कभी भी इनर जॉइन में लिंक के रूप में उपयोग नहीं किया जाना चाहिए, जब तक कि इच्छित परिणाम शून्य मान वाली पंक्तियों को समाप्त करना न हो। यदि [[परिणाम सेट]] से शून्य जॉइन कॉलम को निश्चयपूर्वक विस्थापित किया जाता  है, तो इनर जॉइन आउटर जॉइन से तीव्र हो सकता है क्योंकि टेबल जॉइन और फ़िल्टरिंग एक ही चरण में की जाती है। इसके विपरीत, एसक्यूएल व्हेयर क्लॉज में डेटाबेस फ़ंक्शंस के साथ संयोजन में बड़ी मात्रा में क्वेरी में उपयोग किए जाने पर इनर जॉइन के परिणामस्वरूप विनाशकारी रूप से धीमा प्रदर्शन या सर्वर क्रैश भी हो सकता है।<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> एसक्यूएल व्हेयर क्लॉज़ में फ़ंक्शन के परिणामस्वरूप डेटाबेस अपेक्षाकृत कॉम्पैक्ट टेबल इंडेक्स को अनदेखा कर सकता है। गणना किए गए मान पर निर्भर फ़िल्टर का उपयोग करके पंक्तियों की संख्या को कम करने से पूर्व डेटाबेस दोनों तालिकाओं से चयनित कॉलम को पढ़ और इनर रूप से जॉइन सकता है, जिसके परिणामस्वरूप अपेक्षाकृत भारी मात्रा में अकुशल प्रसंस्करण होता है।


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


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


आंतरिक जोड़ को आगे चलकर समान जोड़, प्राकृतिक जोड़ या क्रॉस-जोड़ के रूप में वर्गीकृत किया जा सकता है।
इनर जॉइन को आगे चलकर समान जॉइन, नेचुरल जॉइन या क्रॉस-जॉइन के रूप में वर्गीकृत किया जा सकता है।


===इक्वि-जॉइन===
===इक्वि-जॉइन===
इक्वि-जॉइन विशिष्ट प्रकार का तुलनित्र-आधारित जॉइन है, जो जॉइन-प्रेडिकेट में केवल [[समानता (गणित)]] तुलना का उपयोग करता है। अन्य तुलना ऑपरेटरों का उपयोग करना (जैसे <code>&lt;</code>) जॉइन को इक्वि-जॉइन के रूप में अयोग्य घोषित करता है। ऊपर दिखाई गई क्वेरी पहले ही समान-जॉइन का उदाहरण प्रदान कर चुकी है:
इक्वि-जॉइन विशिष्ट प्रकार का तुलनित्र-आधारित जॉइन है, जो जॉइन-प्रेडिकेट में केवल [[समानता (गणित)|समानता]] तुलना का उपयोग करता है। अन्य तुलना ऑपरेटरों (जैसे <code>&lt;</code>) का उपयोग करना जॉइन को इक्वि-जॉइन के रूप में अयोग्य घोषित करता है। ऊपर दिखाई गई क्वेरी पूर्व ही समान-जॉइन का उदाहरण प्रदान कर चुकी है:
<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
SELECT *
SELECT *
Line 227: Line 234:
WHERE employee.DepartmentID = department.DepartmentID;
WHERE employee.DepartmentID = department.DepartmentID;
</syntaxhighlight>
</syntaxhighlight>
यदि इक्वि-जॉइन में कॉलमों का नाम समान है, तो [[SQL-92]] इक्वि-जॉइन को व्यक्त करने के लिए वैकल्पिक शॉर्टहैंड नोटेशन प्रदान करता है। <code>USING</code> निर्माण:<ref>[http://www.java2s.com/Tutorial/Oracle/0140__Table-Joins/SimplifyingJoinswiththeUSINGKeyword.htm Simplifying Joins with the USING Keyword]</ref>
यदि इक्वि-जॉइन में कॉलमों का नाम समान है, तो [[SQL-92|एसक्यूएल-92]] <code>USING</code> निर्माण के माध्यम से इक्वि-जॉइन को व्यक्त करने के लिए वैकल्पिक शॉर्टहैंड नोटेशन प्रदान करता है:<ref>[http://www.java2s.com/Tutorial/Oracle/0140__Table-Joins/SimplifyingJoinswiththeUSINGKeyword.htm Simplifying Joins with the USING Keyword]</ref>
<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
SELECT *
SELECT *
Line 233: Line 240:
</syntaxhighlight>
</syntaxhighlight>


  <code>USING</code> ई> निर्माण केवल वाक्यात्मक चीनी से अधिक है, हालांकि, परिणाम सेट स्पष्ट विधेय के साथ संस्करण के परिणाम सेट से भिन्न होता है। विशेष रूप से, में उल्लिखित कोई भी कॉलम <code>USING</code> सूची शामिल होने वाली प्रत्येक तालिका के लिए बार के बजाय केवल बार अयोग्य नाम के साथ दिखाई देगी। उपरोक्त मामले में, ल होगा <code>DepartmentID</code> कॉलम और नं <code>employee.DepartmentID</code> या <code>department.DepartmentID</code>. <code>USING</code> e> क्लॉज MS SQL सर्वर और Sybase द्वारा समर्थित नहीं है।
  चूँकि,<code>USING</code> निर्माण केवल वाक्यात्मक चीनी से अधिक है,क्योंकि परिणाम सेट स्पष्ट प्रेडिकेट के साथ संस्करण के परिणाम सेट से भिन्न होता है। विशेष रूप से, <code>USING</code> सूची में उल्लिखित कोई भी कॉलम जॉइन में प्रत्येक टेबल के लिए एक बार के अतिरिक्त केवल अयोग्य नाम के साथ दिखाई देगा। उपरोक्त स्थिति में, एक ही <code>DepartmentID</code> कॉलम होगा और कोई <code>employee.DepartmentID</code> या <code>department.DepartmentID</code> नहीं होगा।
 
  <code>USING</code> क्लॉज एमएस एसक्यूएल सर्वर और Sybase द्वारा समर्थित नहीं है।


====प्राकृतिक जुड़ाव====
====नेचुरल जॉइन====
प्राकृतिक जुड़ाव सम-जुड़ का  विशेष मामला है। प्राकृतिक जुड़ाव (⋈)  [[द्विआधारी संबंध]] है जिसे (आर एस) के रूप में लिखा जाता है जहां आर और एस [[संबंध (डेटाबेस)]] हैं।<ref>In [[Unicode]], the bowtie symbol is ⋈ (U+22C8).</ref> प्राकृतिक जुड़ाव का परिणाम आर और एस में [[टुपल्स]] के सभी संयोजनों का सेट है जो उनके सामान्य विशेषता नामों पर समान हैं। उदाहरण के लिए कर्मचारी और विभाग और उनके स्वाभाविक जुड़ाव तालिकाओं पर विचार करें:
नेचुरल जॉइन इक्वी-जॉइन की विशेष स्थिति है। नेचुरल जॉइन (⋈)  [[द्विआधारी संबंध|बाइनरी ऑपरेटर]] है जिसे (R S) के रूप में लिखा जाता है जहां R और S [[संबंध (डेटाबेस)]] हैं।<ref>In [[Unicode]], the bowtie symbol is ⋈ (U+22C8).</ref> नेचुरल जॉइन का परिणाम R और S में [[टुपल्स]] के सभी संयोजनों का सेट है जो उनके सामान्य विशेषता नामों पर समान हैं। उदाहरण के लिए एम्प्लॉयी और डिपार्टमेंट और उनके स्वाभाविक जॉइन तालिकाओं पर विचार करें:


{| style="margin: 0 auto;" cellpadding="20"
{| style="margin: 0 auto;" cellpadding="20"
Line 242: Line 251:
|
|
{| class="wikitable"
{| class="wikitable"
  |+          ''Employee''
  |+          एम्प्लॉयी
  |-
  |-
  ! Name  !! EmpId !! DeptName
  ! नेम !! एम्प्लॉयीआईडी  !! डिपार्टमेंटनेम
  |-
  |-
  | Harry  || 3415  || Finance
  | हैरी || 3415  || फाइनेंस
  |-
  |-
  | Sally  || 2241  || Sales
  | सैली || 2241  || सेल्स
  |-
  |-
  | George || 3401  || Finance
  | जॉर्ज || 3401  || फाइनेंस
  |-
  |-
  | Harriet || 2202 || Sales
  | हेरिएट || 2202 || सेल्स
|}
|}
||
||
{| class="wikitable"
{| class="wikitable"
  |+          ''Dept''
  |+          डिपार्टमेंट
  |-
  |-
  ! DeptName  !! Manager
  ! डिपार्टमेंटनेम !! मैनेजर
  |-
  |-
  | Finance  || George
  | फाइनेंस || जॉर्ज
  |-
  |-
  | Sales || Harriet
  | सेल्स || हेरिएट
  |-
  |-
  | Production || Charles
  | प्रोडक्शन || चार्ल्स
|}
|}
||
||
Line 270: Line 279:
  |+  ''Employee''&nbsp;<math> \bowtie </math>&nbsp;''Dept''
  |+  ''Employee''&nbsp;<math> \bowtie </math>&nbsp;''Dept''
  |-
  |-
  ! Name  !! EmpId !!  DeptName  !! Manager
  ! नेम !! एम्प्लॉयीआईडी !!  डिपार्टमेंटनेम !! मैनेजर
  |-
  |-
  | Harry  || 3415  || Finance  || George
  | हैरी || 3415  || फाइनेंस || जॉर्ज
  |-
  |-
  | Sally  || 2241  || Sales || Harriet
  | सैली || 2241  || सेल्स || हेरिएट
  |-
  |-
  | George || 3401  || Finance || George
  | जॉर्ज || 3401  || फाइनेंस || जॉर्ज
  |-
  |-
  | Harriet || 2202 || Sales || Harriet
  | हेरिएट || 2202 || सेल्स || हेरिएट
|}
|}
|}
|}


इसका उपयोग [[संबंधों की संरचना]] को परिभाषित करने के लिए भी किया जा सकता है। उदाहरण के लिए, कर्मचारी और विभाग की संरचना उनका जुड़ाव है जैसा कि ऊपर दिखाया गया है, सामान्य विशेषता विभागनाम को छोड़कर सभी पर प्रक्षेपित किया गया है। [[श्रेणी सिद्धांत]] में, जुड़ाव बिल्कुल [[फाइबर उत्पाद]] है।
इसका उपयोग [[संबंधों की संरचना]] को परिभाषित करने के लिए भी किया जा सकता है। उदाहरण के लिए, एम्प्लॉयी और डिपार्टमेंट की संरचना उनका जॉइन है जैसा कि ऊपर दिखाया गया है, सामान्य विशेषता विभागनाम को छोड़कर सभी पर प्रक्षेपित किया गया है। [[श्रेणी सिद्धांत]] में, जॉइन बिल्कुल [[फाइबर उत्पाद]] है।


प्राकृतिक जुड़ाव यकीनन सबसे महत्वपूर्ण ऑपरेटरों में से  है क्योंकि यह तार्किक AND का संबंधपरक समकक्ष है। ध्यान दें कि यदि AND से जुड़े दो विधेयों में से प्रत्येक में  ही चर दिखाई देता है, तो वह चर ही चीज़ के लिए खड़ा होता है और दोनों दिखावे को हमेशा  ही मान से प्रतिस्थापित किया जाना चाहिए। विशेष रूप से, प्राकृतिक जुड़ाव उन संबंधों के संयोजन की अनुमति देता है जो किसी विदेशी कुंजी से जुड़े होते हैं। उदाहरण के लिए, उपरोक्त उदाहरण में  विदेशी कुंजी संभवतः Employee.DeptName से Dept.DeptName तक होती है और फिर कर्मचारी और विभाग का प्राकृतिक जुड़ाव सभी कर्मचारियों को उनके विभागों के साथ जोड़ता है। यह काम करता है क्योंकि विदेशी कुंजी समान नाम वाली विशेषताओं के बीच रहती है। यदि ऐसा मामला नहीं है जैसे विभाग प्रबंधक से कर्मचारी नाम तक की विदेशी कुंजी में तो प्राकृतिक जुड़ाव लेने से पहले इन कॉलमों का नाम बदलना होगा। इस तरह के जुड़ाव को कभी-कभी 'इक्वी-जॉइन' भी कहा जाता है।
नेचुरल जॉइन निश्चित सबसे महत्वपूर्ण ऑपरेटरों में से  है क्योंकि यह तार्किक AND का संबंधपरक समकक्ष है। ध्यान दें कि यदि AND से जुड़े दो विधेयों में से प्रत्येक में  एक ही चर दिखाई देता है, तो वह चर एक ही चीज़ के लिए खड़ा होता है और दोनों दिखावे को सदैव एक ही मान से प्रतिस्थापित किया जाना चाहिए। विशेष रूप से, नेचुरल जॉइन उन संबंधों के संयोजन की अनुमति देता है जो किसी विदेशी कुंजी से जुड़े होते हैं। उदाहरण के लिए, उपरोक्त उदाहरण में  विदेशी कुंजी संभवतः Employee.DeptName से Dept.DeptName तक होती है और फिर एम्प्लॉयी और डिपार्टमेंट का नेचुरल जॉइन सभी कर्मचारियों को उनके डिपार्टमेंट के साथ जॉइनता है। यह कार्य करता है क्योंकि विदेशी कुंजी समान नाम वाली विशेषताओं के मध्य रहती है। यदि ऐसी स्थिति नहीं है जैसे डिपार्टमेंट प्रबंधक से एम्प्लॉयी नाम तक की विदेशी कुंजी में तो नेचुरल जॉइन लेने से पूर्व इन कॉलमों का नाम परिवर्तित करना होगा। इस प्रकार के जॉइन को कभी-कभी 'इक्वी-जॉइन' भी कहा जाता है।


अधिक औपचारिक रूप से प्राकृतिक जुड़ाव के शब्दार्थ को इस प्रकार परिभाषित किया गया है:
अधिक औपचारिक रूप से नेचुरल जॉइन के शब्दार्थ को इस प्रकार परिभाषित किया गया है:


:<math>R \bowtie S = \left\{ t \cup s \mid t \in R \ \land \ s \in S \ \land \ \mathit{Fun}(t \cup s) \right\}</math>,
:<math>R \bowtie S = \left\{ t \cup s \mid t \in R \ \land \ s \in S \ \land \ \mathit{Fun}(t \cup s) \right\}</math>,


जहां फन [[विधेय (गणित)]] है जो  [[संबंध (गणित)]] आर के लिए सत्य है यदि और केवल यदि आर  फ़ंक्शन है। आमतौर पर यह आवश्यक है कि आर और एस में कम से कम सामान्य विशेषता होनी चाहिए, लेकिन यदि इस बाधा को छोड़ दिया जाता है, और आर और एस में कोई सामान्य विशेषता नहीं है, तो प्राकृतिक जुड़ाव बिल्कुल कार्टेशियन उत्पाद बन जाता है।
जहां फन [[विधेय (गणित)|प्रेडिकेट]] है जो किसी [[संबंध (गणित)|संबंध]] r के लिए सत्य है यदि और केवल r फ़ंक्शन है। सामान्यतः यह आवश्यक है कि R और S में कम से कम सामान्य विशेषता होनी चाहिए, किन्तु यदि इस बाधा को त्याग दिया जाता है, और R और S में कोई सामान्य विशेषता नहीं है, तो नेचुरल जॉइन बिल्कुल कार्टेशियन उत्पाद बन जाता है।


प्राकृतिक जुड़ाव को कोडड के आदिमों के साथ निम्नानुसार अनुकरण किया जा सकता है। चलो सी<sub>1</sub>, ..., सी<sub>''m''</sub> आर और एस, आर के लिए सामान्य विशेषता नाम बनें<sub>1</sub>, ..., आर<sub>''n''</sub> आर और लेट एस के लिए अद्वितीय विशेषता नाम बनें<sub>1</sub>, ..., एस<sub>''k''</sub> एस के लिए अद्वितीय विशेषताएँ बनें। इसके अलावा, मान लें कि विशेषता नाम x है<sub>1</sub>, ..., ्स<sub>''m''</sub> न तो आर में हैं और न ही एस में। पहले चरण में अब एस में सामान्य विशेषता नामों का नाम बदला जा सकता है:
नेचुरल जॉइन को कोडड के आदिमों के साथ निम्नानुसार अनुकरण किया जा सकता है। मान लीजिए कि c<sub>1</sub>, ..., c<sub>''m''</sub> R और S, के लिए सामान्य विशेषता नाम हैं, r<sub>1</sub>, ..., r<sub>''n''</sub> R के लिए अद्वितीय विशेषता नाम हैं और  s<sub>1</sub>, ..., s<sub>''k''</sub> S के लिए अद्वितीय विशेषता नाम हैं। इसके अतिरिक्त, मान लें कि विशेषता नाम x<sub>1</sub>, ..., x<sub>''m''</sub> न तो R में हैं और न ही S में हैं। प्रथम चरण में अब S में सामान्य विशेषता नामों का नाम परिवर्तित किया जा सकता है:


:<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> खतरा अज्ञात स्थिति में नया कॉलम जॉइनने से आता है, जिसका नाम दूसरी टेबल के दूसरे कॉलम के समान है। उपस्थित नेचुरल जॉइन स्वाभाविक रूप से तुलना के लिए नए कॉलम का उपयोग कर सकता है, पूर्व की तुलना में विभिन्न पैरामीटर (विभिन्न कॉलमों से) का उपयोग करके तुलना/मिलान कर सकता है। इस प्रकार उपस्थित क्वेरी भिन्न-भिन्न परिणाम दे सकती है, भले ही तालिकाओं में डेटा परिवर्तित नहीं किया गया है, बल्कि केवल संवर्धित किया गया है। टेबल लिंक को स्वचालित रूप से निर्धारित करने के लिए कॉलम नामों का उपयोग सैकड़ों या हजारों तालिकाओं वाले बड़े डेटाबेस में  विकल्प नहीं है, जहां यह नामकरण परंपराओं पर अवास्तविक बाधा डालेगा। वास्तविक विश्व के डेटाबेस सामान्यतः विदेशी कुंजी डेटा के साथ डिज़ाइन किए जाते हैं जो व्यावसायिक नियमों और संदर्भ के कारण निरंतर पॉप्युलेट नहीं होते हैं (शून्य मानों की अनुमति है)। विभिन्न तालिकाओं में समान डेटा के कॉलम नामों को संशोधित करना सामान्य विषय है और कठोर स्थिरता की यह कमी नेचुरल जॉइन को वर्णन के लिए सैद्धांतिक अवधारणा में परिवर्तित कर देती है।


आंतरिक जुड़ाव के लिए उपरोक्त नमूना क्वेरी को प्राकृतिक जुड़ाव के रूप में निम्नलिखित तरीके से व्यक्त किया जा सकता है:
इनर जॉइन के लिए उपरोक्त प्रतिरूप क्वेरी को नेचुरल जॉइन के रूप में निम्नलिखित प्रकार से व्यक्त किया जा सकता है:
<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
SELECT *
SELECT *
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"
|-
|-
! DepartmentID !! Employee.LastName !! Department.DepartmentName
! डिपार्टमेंटआईडी !! एम्प्लॉयी लास्टनेम !! डिपार्टमेंट डिपार्टमेंटनेम
|-
|-
| 34 || Smith || Clerical
| 34 || स्मिथ || क्लेरिकल
|-
|-
| 33 || Jones || Engineering
| 33 || जोन्स || इंजीनियरिंग
|-
|-
| 34 || Robinson || Clerical
| 34 || रॉबिंसन || क्लेरिकल
|-
|-
| 33 || Heisenberg || Engineering
| 33 || हाइजेनबर्ग || इंजीनियरिंग
|-
|-
| 31 || Rafferty || Sales
| 31 || रैफर्टी || सेल्स
|}
|}
PostgreSQL, MySQL और Oracle प्राकृतिक जुड़ाव का समर्थन करते हैं; Microsoft T-SQL और IBM DB2 नहीं करते हैं। जॉइन में उपयोग किए गए कॉलम अंतर्निहित हैं, इसलिए जॉइन कोड यह नहीं दिखाता है कि कौन से कॉलम अपेक्षित हैं, और कॉलम नामों में बदलाव से परिणाम बदल सकते हैं। SQL:2011 मानक में, प्राकृतिक जोड़ वैकल्पिक F401, विस्तारित शामिल तालिका, पैकेज का हिस्सा हैं।
पोस्टग्रेएसक्यूएल, माईएसक्यूएल और ओरेकल नेचुरल जॉइन का समर्थन करते हैं; माइक्रोसॉफ्ट टी-एसक्यूएल और आईबीएम डीबी2 नहीं करते हैं। जॉइन में उपयोग किए गए कॉलम अंतर्निहित हैं, इसलिए जॉइन कोड यह नहीं दिखाता है कि कौन से कॉलम अपेक्षित हैं, और कॉलम नामों में परिवर्तन से परिणाम परिवर्तित हो सकते हैं। एसक्यूएल:2011 मानक में, नेचुरल जॉइन वैकल्पिक F401, "एक्सटेंडेड जॉइन्ड टेबल", पैकेज का भाग हैं।
 
कई डेटाबेस परिवेशों में कॉलम नाम किसी आउटर विक्रेता द्वारा नियंत्रित होते हैं, क्वेरी डेवलपर द्वारा नहीं होते हैं। नेचुरल जॉइन कॉलम नामों में स्थिरता और स्थिरता मानता है जो विक्रेता द्वारा अनिवार्य संस्करण अपग्रेड के समय परिवर्तित किया जा सकता है।
 
==आउटर जॉइन==
सम्मिलित टेबल प्रत्येक पंक्ति को निरंतर रखती है - भले ही कोई अन्य मिलान पंक्ति उपस्थित न हो। आउटर जॉइन को लेफ्ट आउटर जॉइन, दाएँ आउटर जॉइन और पूर्ण आउटर जॉइन में उप-विभाजित किया जाता है, यह इस पर निर्भर करता है कि किस टेबल की पंक्तियाँ निरंतर रखी गई हैं: बाएँ, दाएँ, या दोनों (इस स्थिति में लेफ्ट और दाएँ  <code>JOIN</code> कीवर्ड के दोनों पक्षों को संदर्भित करते हैं)। इनर जॉइन के जैसे, कोई भी सभी प्रकार के आउटर जॉइन को इक्वि-जॉइन, नेचुरल जॉइन,  <code>'''ON''' ''&lt;predicate&gt;''</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.|अंगूठा|एक वेन आरेख जो तालिका ए और बी के बीच बाईं ओर जुड़े एसक्यूएल कथन का प्रतिनिधित्व करता है।]]  
सम्मिलित तालिका प्रत्येक पंक्ति को बरकरार रखती है - भले ही कोई अन्य मिलान पंक्ति मौजूद न हो। बाहरी जोड़ को बाएँ बाहरी जोड़, दाएँ बाहरी जोड़ और पूर्ण बाहरी जोड़ में उप-विभाजित किया जाता है, यह इस पर निर्भर करता है कि किस तालिका की पंक्तियाँ बरकरार रखी गई हैं: बाएँ, दाएँ, या दोनों (इस मामले में बाएँ और दाएँ तालिका के दो पक्षों को संदर्भित करते हैं) <code>JOIN</code> कीवर्ड)। #इनर जॉइन की तरह, कोई भी सभी प्रकार के बाहरी जॉइन को #इक्वि-जॉइन|इक्वि-जॉइन, #नेचुरल जॉइन, के रूप में उप-वर्गीकृत कर सकता है। <code>'''ON''' ''&lt;predicate&gt;''</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>
मानक SQL में बाहरी जुड़ावों के लिए कोई अंतर्निहित जुड़ाव-नोटेशन मौजूद नहीं है।
[[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 (शून्य) पंक्तियों से मेल खाता है (ए में दी गई पंक्ति के लिए), जुड़ाव अभी भी परिणाम में पंक्ति लौटाएगा (उस पंक्ति के लिए) - लेकिन बी से प्रत्येक कॉलम में शून्य के साथ। बायां बाहरी जुड़ाव सभी को लौटाता है आंतरिक जुड़ाव के मान और बाईं तालिका के सभी मान जो दाहिनी तालिका से मेल नहीं खाते हैं, जिसमें लिंक कॉलम में NULL (खाली) मान वाली पंक्तियाँ भी शामिल हैं।
टेबल ए और बी के लिए लेफ्ट आउटर जॉइन (या बस लेफ्ट जॉइन) के परिणाम में सदैव बाईं टेबल (ए) की सभी पंक्तियां सम्मिलित होती हैं, भले ही सम्मिलित होने की स्थिति को सही टेबल (बी) में कोई मिलान पंक्ति नहीं मिलती है। इसका तात्पर्य यह है कि यदि <code>ON</code> क्लॉज़ बी में 0 (शून्य) पंक्तियों से युग्मित होता है (ए में दी गई पंक्ति के लिए), तो जॉइन अभी भी परिणाम में पंक्ति लौटाएगा (उस पंक्ति के लिए) - किन्तु बी से प्रत्येक कॉलम में शून्य के साथ है। बयां आउटर जॉइन सभी को लौटाता है इनर जॉइन के मान और बाईं टेबल के सभी मान जो दाहिनी टेबल से युग्मित नहीं होते हैं, जिसमें लिंक कॉलम में शून्य (रिक्त) मान वाली पंक्तियाँ भी सम्मिलित हैं।


उदाहरण के लिए, यह हमें किसी कर्मचारी का विभाग ढूंढने की अनुमति देता है, लेकिन फिर भी उन कर्मचारियों को दिखाता है जिन्हें किसी विभाग को नहीं सौंपा गया है (ऊपर दिए गए इनर-जॉइन उदाहरण के विपरीत, जहां बिना असाइन किए गए कर्मचारियों को परिणाम से बाहर रखा गया था)।
उदाहरण के लिए, यह हमें किसी एम्प्लॉयी का डिपार्टमेंट अन्वेषण की अनुमति देता है, किन्तु फिर भी उन कर्मचारियों को दिखाता है जिन्हें किसी डिपार्टमेंट को नहीं सौंपा गया है (ऊपर दिए गए इनर-जॉइन उदाहरण के विपरीत, जहां बिना असाइन किए गए एम्प्लॉयी को परिणाम से बाहर रखा गया था)।


बाएँ बाहरी जुड़ाव का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति (आंतरिक जुड़ाव की तुलना में) इटैलिकाइज़्ड के साथ:
लेफ्ट आउटर जॉइन का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति (इनर जॉइन की तुलना में) इटैलिकाइज़्ड के साथ है:


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 346: Line 357:


{| class="wikitable" style="text-align:center"
{| class="wikitable" style="text-align:center"
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
! एम्प्लॉयी लास्टनेम !! एम्प्लॉयी डिपार्टमेंटआईडी !! डिपार्टमेंट डिपार्टमेंटनेम !! डिपार्टमेंट डिपार्टमेंटआईडी
|-
|-
| Jones || 33 || Engineering || 33
| जोन्स || 33 || इंजीनियरिंग || 33
|-
|-
| Rafferty || 31 || Sales || 31
| रैफर्टी || 31 || सेल्स || 31
|-
|-
| Robinson || 34 || Clerical || 34
| रॉबिंसन || 34 || क्लेरिकल || 34
|-
|-
| Smith || 34 || Clerical || 34
| स्मिथ || 34 || क्लेरिकल || 34
|-
|-
| ''Williams'' || {{null result}} || {{null result}} || {{null result}}
| विलियम्स || {{null result}} || {{null result}} || {{null result}}
|-
|-
| Heisenberg || 33 || Engineering || 33
| हाइजेनबर्ग || 33 || इंजीनियरिंग || 33
|}
|}


'''वैकल्पिक वाक्यविन्यास'''
'''वैकल्पिक सिंटैक्स'''


ओरेकल बहिष्कृत का समर्थन करता है<ref name="deprecated_plus_sign">[http://www.dba-oracle.com/tips_oracle_left_outer_join.htm Oracle लेफ्ट आउटर जॉइन]</ref> सिंटैक्स:
ओरेकल अप्रचलित<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 369: Line 380:
WHERE employee.DepartmentID = department.DepartmentID(+)
WHERE employee.DepartmentID = department.DepartmentID(+)
</syntaxhighlight>
</syntaxhighlight>
[[Sybase]] सिंटैक्स का समर्थन करता है (Microsoft SQL सर्वर ने संस्करण 2000 से इस सिंटैक्स को हटा दिया है):
[[Sybase]] सिंटैक्स का समर्थन करता है (माइक्रोसॉफ्ट एसक्यूएल सर्वर ने संस्करण 2000 से इस सिंटैक्स को विस्थापित कर दिया है):
<syntaxhighlight lang=tsql>
<syntaxhighlight lang=tsql>
SELECT *
SELECT *
Line 375: Line 386:
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 384: Line 395:
तालिका ए और बी के बीच सही जुड़ने वाले एसक्यूएल कथन का प्रतिनिधित्व करने वाला एक वेन आरेख।]]
तालिका ए और बी के बीच सही जुड़ने वाले एसक्यूएल कथन का प्रतिनिधित्व करने वाला एक वेन आरेख।]]


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


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


नीचे दाएं बाहरी जुड़ाव का  उदाहरण दिया गया है (<code>OUTER</code>कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति इटैलिकाइज़्ड के साथ:
नीचे राइट आउटर जॉइन का  उदाहरण दिया गया है (<code>OUTER</code>कीवर्ड वैकल्पिक है), अतिरिक्त परिणाम पंक्ति इटैलिकाइज़्ड के साथ है:


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 398: Line 409:


{| class="wikitable" style="text-align:center"
{| class="wikitable" style="text-align:center"
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
! एम्प्लॉयी लास्टनेम !! एम्प्लॉयी डिपार्टमेंटआईडी !! डिपार्टमेंट डिपार्टमेंटनेम !! डिपार्टमेंट डिपार्टमेंटआईडी
|-
|-
| Smith || 34 || Clerical || 34
| स्मिथ || 34 || क्लेरिकल || 34
|-
|-
| Jones || 33 || Engineering || 33
| जोन्स || 33 || इंजीनियरिंग || 33
|-
|-
| Robinson || 34 || Clerical || 34
| रॉबिंसन || 34 || क्लेरिकल || 34
|-
|-
| Heisenberg || 33 || Engineering || 33
| हाइजेनबर्ग || 33 || इंजीनियरिंग || 33
|-
|-
| Rafferty || 31 || Sales || 31
| रैफर्टी || 31 || सेल्स || 31
|-
|-
| {{null result}} || {{null result}} || ''Marketing'' || ''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.|अंगूठे|एक वेन आरेख तालिका ए और बी के बीच पूर्ण जुड़ाव एसक्यूएल कथन का प्रतिनिधित्व करता है।]]


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


उदाहरण के लिए, यह हमें प्रत्येक कर्मचारी को देखने की अनुमति देता है जो विभाग में है और प्रत्येक विभाग जिसमें  कर्मचारी है, लेकिन प्रत्येक कर्मचारी को भी देख सकता है जो विभाग का हिस्सा नहीं है और प्रत्येक विभाग जिसमें कर्मचारी नहीं है।
उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी को देखने की अनुमति देता है जो डिपार्टमेंट में है और प्रत्येक डिपार्टमेंट जिसमें  एम्प्लॉयी है, किन्तु प्रत्येक एम्प्लॉयी को भी देख सकता है जो डिपार्टमेंट का भाग नहीं है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी नहीं है।


पूर्ण बाहरी जोड़ का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है):
पूर्ण आउटर जॉइन का उदाहरण (<code>OUTER</code>कीवर्ड वैकल्पिक है):


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 429: Line 441:


{| class="wikitable" style="text-align:center"
{| class="wikitable" style="text-align:center"
! Employee.LastName !! Employee.DepartmentID !! Department.DepartmentName !! Department.DepartmentID
! एम्प्लॉयी लास्टनेम !! एम्प्लॉयी डिपार्टमेंटआईडी !! डिपार्टमेंट डिपार्टमेंटनेम !! डिपार्टमेंट डिपार्टमेंटआईडी
|-
|-
| Smith || 34 || Clerical || 34
| स्मिथ || 34 || क्लेरिकल || 34
|-
|-
| Jones || 33 || Engineering || 33
| जोन्स || 33 || इंजीनियरिंग || 33
|-
|-
| Robinson || 34 || Clerical || 34
| रॉबिंसन || 34 || क्लेरिकल || 34
|-
|-
| ''Williams'' || {{null result}} || {{null result}} || {{null result}}
| विलियम्स || {{null result}} || {{null result}} || {{null result}}
|-
|-
| Heisenberg || 33 || Engineering || 33
| हाइजेनबर्ग || 33 || इंजीनियरिंग || 33
|-
|-
| Rafferty || 31 || Sales || 31
| रैफर्टी || 31 || सेल्स || 31
|-
|-
| {{null result}} || {{null result}} || ''Marketing'' || ''35''
| {{null result}} || {{null result}} || मार्केटिंग || ''35''
|}
|}
कुछ डेटाबेस प्रणालियाँ सीधे पूर्ण बाहरी जुड़ाव कार्यक्षमता का समर्थन नहीं करती हैं, लेकिन वे क्रमशः बाएँ और दाएँ तालिकाओं से ल तालिका पंक्तियों के सभी चयनों और आंतरिक जुड़ाव के उपयोग के माध्यम से इसका अनुकरण कर सकते हैं। वही उदाहरण इस प्रकार दिखाई दे सकता है:
कुछ डेटाबेस प्रणालियाँ सीधे पूर्ण आउटर जॉइन कार्यक्षमता का समर्थन नहीं करती हैं, किन्तु वे क्रमशः लेफ्ट और दाएँ तालिकाओं से एकल टेबल पंक्तियों के सभी चयनों और इनर जॉइन के उपयोग के माध्यम से इसका अनुकरण कर सकते हैं। वही उदाहरण इस प्रकार दिखाई दे सकता है:
<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
SELECT employee.LastName, employee.DepartmentID,
SELECT employee.LastName, employee.DepartmentID,
Line 470: Line 482:
             WHERE employee.DepartmentID = department.DepartmentID)
             WHERE employee.DepartmentID = department.DepartmentID)
</syntaxhighlight>
</syntaxhighlight>
अन्य दृष्टिकोण यूनियन हो सकता है, सभी बाएँ बाहरी जोड़ और दाएँ बाहरी जोड़ माइनस आंतरिक जुड़ाव।
अन्य दृष्टिकोण यूनियन हो सकता है, सभी लेफ्ट आउटर जॉइन और दाएँ आउटर जॉइन माइनस इनर जॉइन है।


==स्वयं-जुड़ना==
==सेल्फ-जॉइन==
सेल्फ-जॉइन टेबल को खुद से जोड़ना है।<ref>{{Harvnb|Shah|2005|p=165}}</ref>
सेल्फ-जॉइन का अर्थ टेबल को स्वयं से जोड़ना है।<ref>{{Harvnb|Shah|2005|p=165}}</ref>


'''उदाहरण'''
'''उदाहरण'''


यदि कर्मचारियों के लिए दो अलग-अलग तालिकाएँ थीं और  क्वेरी जिसमें पहली तालिका में कर्मचारियों से दूसरी तालिका में कर्मचारियों के समान देश का अनुरोध किया गया था, तो उत्तर तालिका खोजने के लिए सामान्य जॉइन ऑपरेशन का उपयोग किया जा सकता था। हालाँकि, सभी कर्मचारी जानकारी  ही बड़ी तालिका में समाहित है।<ref>Adapted from {{harvnb|Pratt|2005|pp=115–6}}</ref>
यदि कर्मचारियों के लिए दो भिन्न-भिन्न तालिकाएँ थीं और  क्वेरी जिसमें प्रथम टेबल में कर्मचारियों से दूसरी टेबल में कर्मचारियों के समान देश का अनुरोध किया गया था, तो उत्तर टेबल अन्वेषण के लिए सामान्य जॉइन ऑपरेशन का उपयोग किया जा सकता था। चूँकि, सभी एम्प्लॉयी की सूचना बड़ी टेबल में समाहित है।<ref>Adapted from {{harvnb|Pratt|2005|pp=115–6}}</ref>
संशोधित पर विचार करें <code>Employee</code> तालिका जैसे कि निम्नलिखित:
 
निम्नलिखित जैसे कि संशोधित <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"
|+Employee Table
|+एम्प्लॉयी टेबल
|-
|-
! EmployeeID !! LastName !! Country !! DepartmentID
! एम्प्लॉयीआईडी !! लास्टनेम !! कंट्री   !! डिपार्टमेंटआईडी
|-
|-
| 123 || Rafferty || Australia || 31
| 123 || रैफर्टी || ऑस्ट्रेलिया || 31
|-
|-
| 124 || Jones || Australia || 33
| 124 || जोन्स || ऑस्ट्रेलिया || 33
|-
|-
| 145 || Heisenberg || Australia || 33
| 145 || हाइजेनबर्ग || ऑस्ट्रेलिया || 33
|-
|-
| 201 || Robinson || United States || 34
| 201 || रॉबिंसन || यूनाइटेड स्टेट्स || 34
|-
|-
| 305 || Smith || Germany || 34
| 305 || स्मिथ || जर्मनी || 34
|-
|-
| 306 || Williams || Germany || {{null result}}
| 306 || विलियम्स || जर्मनी || {{null result}}
|}उदाहरण समाधान क्वेरी इस प्रकार हो सकती है:
|}उदाहरण- समाधान क्वेरी इस प्रकार हो सकती है:


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 503: Line 516:
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"
|+Employee Table after Self-join by Country
|+एम्प्लॉयी टेबल आफ्टर सेल्फ-जॉइन बाय कंट्री
|-
|-
! EmployeeID !! LastName !! EmployeeID !! LastName !! Country
! एम्प्लॉयीआईडी !! लास्टनेम !! एम्प्लॉयीआईडी !! लास्टनेम !! कंट्री  
|-
|-
| 123 || Rafferty || 124 || Jones || Australia
| 123 || रैफर्टी || 124 || जोन्स || ऑस्ट्रेलिया
|-
|-
| 123 || Rafferty || 145 || Heisenberg || Australia
| 123 || रैफर्टी || 145 || हाइजेनबर्ग || ऑस्ट्रेलिया
|-
|-
| 124 || Jones || 145 || Heisenberg || Australia
| 124 || जोन्स || 145 || हाइजेनबर्ग || ऑस्ट्रेलिया
|-
|-
| 305 || Smith || 306 || Williams || Germany
| 305 || स्मिथ || 306 || विलियम्स || जर्मनी
|}
|}
इस उदाहरण के लिए:
इस उदाहरण के लिए:
* <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>EmployeeID</code> पहले कर्मचारी से अधिक या उसके बराबर है <code>EmployeeID</code> दूसरे कर्मचारी का. दूसरे शब्दों में, इस शर्त का प्रभाव डुप्लिकेट जोड़ियों और स्वयं-जोड़ियों को बाहर करना है। इसके बिना, निम्नलिखित कम उपयोगी तालिका तैयार की जाएगी (नीचे दी गई तालिका परिणाम का केवल जर्मनी भाग प्रदर्शित करती है):
* स्थिति <code>F.EmployeeID < S.EmployeeID</code> उन युग्मों को बाहर करती है, जहां पहले कर्मचारी का  <code>EmployeeID</code> दूसरे एम्प्लॉयी का <code>EmployeeID</code> से अधिक या उसके बराबर है I इस नियम का प्रभाव डुप्लिकेट जॉइनियों और स्वयं-जॉइनियों को बाहर करना है। इसके अतिरिक्त, निम्नलिखित कम उपयोगी टेबल तैयार की जाएगी (नीचे दी गई टेबल परिणाम का केवल जर्मनी भाग प्रदर्शित करती है):
{| class="wikitable" style="text-align:center; float:left; margin-right:5px"
{| class="wikitable" style="text-align:center; float:left; margin-right:5px"
! EmployeeID !! LastName !! EmployeeID !! LastName !! Country
! एम्प्लॉयीआईडी !! लास्टनेम !! एम्प्लॉयीआईडी !! लास्टनेम !! कंट्री  
|-
|-
| 305 || Smith || 305 || Smith || Germany
| 305 || स्मिथ || 305 || स्मिथ || जर्मनी
|-
|-
| 305 || Smith || 306 || Williams || Germany
| 305 || स्मिथ || 306 || विलियम्स || जर्मनी
|-
|-
| 306 || Williams || 305 || Smith || Germany
| 306 || विलियम्स || 305 || स्मिथ || जर्मनी
|-
|-
| 306 || Williams || 306 || Williams || Germany
| 306 || विलियम्स || 306 || विलियम्स || जर्मनी
|}
|}
मूल प्रश्न को संतुष्ट करने के लिए दो मध्य युग्मों में से केवल की आवश्यकता है, और सबसे ऊपर और सबसे नीचे वाले को इस उदाहरण में कोई दिलचस्पी नहीं है।
मूल प्रश्न को संतुष्ट करने के लिए दो मध्य युग्मों में से केवल एक की आवश्यकता है, और सबसे ऊपर और सबसे नीचे वाले को इस उदाहरण में कोई रुचि नहीं है।


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


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 542: Line 555:
LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
</syntaxhighlight>
</syntaxhighlight>
के रूप में भी लिखा जा सकता है
के रूप में भी लिखा जा सकता है I


<syntaxhighlight lang=sql>
<syntaxhighlight lang=sql>
Line 567: Line 580:
| footer            = Two possible [[query plan]]s for the {{dfni|triangle query}} {{math|R(A, B) ⋈ S(B, C) ⋈ T(A, C)}}; the first joins {{mvar|S}} and {{mvar|T}} first and joins the result with {{mvar|R}}, the second joins {{mvar|R}} and {{mvar|S}} first and joins the result with {{mvar|T}}
| footer            = Two possible [[query plan]]s for the {{dfni|triangle query}} {{math|R(A, B) ⋈ S(B, C) ⋈ T(A, C)}}; the first joins {{mvar|S}} and {{mvar|T}} first and joins the result with {{mvar|R}}, the second joins {{mvar|R}} and {{mvar|S}} first and joins the result with {{mvar|T}}
}}
}}
डेटाबेस-सिस्टम में बहुत से काम का उद्देश्य जॉइन के कुशल कार्यान्वयन पर है, क्योंकि रिलेशनल सिस्टम आमतौर पर जॉइन की मांग करते हैं, फिर भी उनके कुशल निष्पादन को अनुकूलित करने में कठिनाइयों का सामना करना पड़ता है। समस्या इसलिए उत्पन्न होती है क्योंकि आंतरिक जोड़ क्रम[[विनिमेय]] और साहचर्य दोनों तरह से काम करते हैं। व्यवहार में, इसका मतलब यह है कि उपयोगकर्ता केवल जुड़ने के लिए तालिकाओं की सूची और उपयोग करने के लिए जुड़ने की शर्तों की आपूर्ति करता है, और डेटाबेस सिस्टम के पास ऑपरेशन करने का सबसे कुशल तरीका निर्धारित करने का कार्य होता है।  [[क्वेरी अनुकूलक]] यह निर्धारित करता है कि जॉइन वाली क्वेरी को कैसे निष्पादित किया जाए। क्वेरी ऑप्टिमाइज़र में दो बुनियादी स्वतंत्रताएँ होती हैं:
डेटाबेस-सिस्टम में कार्य का उद्देश्य जॉइन के कुशल कार्यान्वयन पर है, क्योंकि रिलेशनल सिस्टम सामान्यतः जॉइन की मांग करते हैं, फिर भी उनके कुशल निष्पादन को अनुकूलित करने में कठिनाइयों का सामना करना पड़ता है। समस्या इसलिए उत्पन्न होती है क्योंकि इनर जॉइन क्रम [[विनिमेय]] और साहचर्य दोनों प्रकार से कार्य करते हैं। व्यवहार में, इसका आशय यह है कि उपयोगकर्ता केवल जुड़ने के लिए तालिकाओं की सूची और उपयोग करने के लिए जुड़ने की नियमों की आपूर्ति करता है, और डेटाबेस सिस्टम के निकट ऑपरेशन करने का सबसे कुशल उपाय निर्धारित करने का कार्य होता है।  [[क्वेरी अनुकूलक]] यह निर्धारित करता है कि जॉइन वाली क्वेरी को कैसे निष्पादित किया जाए। क्वेरी ऑप्टिमाइज़र में दो मूलरूपी स्वतंत्रताएँ होती हैं:


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


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


कोई भी शामिल होने वाली क्वेरी-योजनाओं को निम्नानुसार वर्गीकृत कर सकता है:<ref name="Yu1998">{{Harvnb|Yu|Meng|1998|p=213}}
कोई भी सम्मिलित होने वाली क्वेरी-योजनाओं को निम्नानुसार वर्गीकृत कर सकता है:<ref name="Yu1998">{{Harvnb|Yu|Meng|1998|p=213}}
</ref>
</ref>
; लेफ्ट-डीप: योजना में प्रत्येक जॉइन के आंतरिक ऑपरेंड के रूप में बेस टेबल (किसी अन्य जॉइन के बजाय) का उपयोग करना
; लेफ्ट-डीप: योजना में प्रत्येक जॉइन के इनर ऑपरेंड के रूप में बेस टेबल (किसी अन्य जॉइन के बजाय) का उपयोग करना I
; राइट-डीप: योजना में प्रत्येक जुड़ाव के बाहरी ऑपरेंड के रूप में बेस टेबल का उपयोग करना
; राइट-डीप: योजना में प्रत्येक जॉइन के आउटर ऑपरेंड के रूप में बेस टेबल का उपयोग करना I
; झाड़ीदार: न बाएँ-गहरा, न दाएँ-गहरा; किसी जॉइन के दोनों इनपुट स्वयं जॉइन के परिणामस्वरूप हो सकते हैं
; घना: न बाएँ-गहरा, न दाएँ-गहरा; किसी जॉइन के दोनों इनपुट स्वयं जॉइन के परिणामस्वरूप हो सकते हैं I


यदि ट्री डेटा संरचना के रूप में तैयार किया जाता है, तो ये नाम क्वेरी योजना की उपस्थिति से प्राप्त होते हैं, जिसमें बाईं ओर बाहरी जुड़ाव संबंध और दाईं ओर आंतरिक संबंध होता है (जैसा कि सम्मेलन तय करता है)।
यदि ट्री डेटा संरचना के रूप में निर्मित किया जाता है, तो ये नाम क्वेरी योजना की उपस्थिति से प्राप्त होते हैं, जिसमें बाईं ओर आउटर जॉइन संबंध और दाईं ओर इनर संबंध होता है (जैसा कि सम्मेलन तय करता है)।


===एल्गोरिदम से जुड़ें===
===एल्गोरिदम से जुड़ें===
[[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>]]बाइनरी जॉइन ऑपरेशन करने के लिए तीन मौलिक एल्गोरिदम मौजूद हैं: [[नेस्टेड लूप जॉइन]], सॉर्ट-मर्ज जॉइन और हैश जॉइन। सबसे खराब स्थिति में इष्टतम जॉइन एल्गोरिदम, सबसे खराब स्थिति में दो से अधिक संबंधों के बीच जुड़ने के लिए बाइनरी जॉइन एल्गोरिदम की तुलना में एसिम्प्टोटिक रूप से तेज़ हैं।
[[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>]]बाइनरी जॉइन ऑपरेशन करने के लिए तीन मौलिक एल्गोरिदम उपस्थित हैं: [[नेस्टेड लूप जॉइन]], सॉर्ट-मर्ज जॉइन और हैश जॉइन आदि। सबसे अनुपयुक्त स्थिति में इष्टतम जॉइन एल्गोरिदम, सबसे अनुपयुक्त स्थिति में दो से अधिक संबंधों के मध्य जुड़ने के लिए बाइनरी जॉइन एल्गोरिदम की तुलना में एसिम्प्टोटिक रूप से तीव्र होता हैं।
 
===जॉइन इन्डेक्सेस ===
जॉइन इंडेक्स [[ डेटाबेस सूचकांक |डेटाबेस सूचकांक]] हैं, जो डेटा वेयरहाउस में जॉइन क्वेरी के प्रसंस्करण की सुविधा प्रदान करते हैं: वे वर्तमान में (2012) [[ओरेकल डेटाबेस]] और [[टेराडाटा]] द्वारा कार्यान्वयन में उपलब्ध हैं I<ref>Oracle Bitmap Join Index. URL: http://www.dba-oracle.com/art_builder_bitmap_join_idx.htm</ref> <ref>Teradata Join Indexes. {{cite web|url=http://www.coffingdw.com/sql/tdsqlutp/join_index.htm |title=Join Index |access-date=2012-06-14 |url-status=dead |archive-url=https://web.archive.org/web/20121216123745/http://www.coffingdw.com/sql/tdsqlutp/join_index.htm |archive-date=2012-12-16 }}</ref>


===अनुक्रमणिका से जुड़ें===
टेराडाटा कार्यान्वयन में, निर्दिष्ट कॉलम पर समग्र कार्य, या अधिक तालिकाओं से दिनांक कॉलम के घटकों को [[डेटाबेस दृश्य]] की परिभाषा के समान सिंटैक्स का उपयोग करके निर्दिष्ट किया जाता है: 64 कॉलम अभिव्यक्तियों को एकल में निर्दिष्ट किया जा सकता है I सूचकांक में सम्मिलित वैकल्पिक रूप से,  कॉलम जो समग्र डेटा की प्राथमिक कुंजी को परिभाषित करता है, उसे भी निर्दिष्ट किया जा सकता है: समानांतर हार्डवेयर पर, कॉलम मानों का उपयोग सूचकांक की सामग्री को कई डिस्क में विभाजित करने के लिए किया जाता है। जब स्रोत तालिकाओं को उपयोगकर्ताओं द्वारा इंटरैक्टिव रूप से अपडेट किया जाता है, तो जॉइन इंडेक्स की सामग्री स्वचालित रूप से अपडेट हो जाती है। कोई भी क्वेरी जिसका [[ कहां (एसक्यूएल) |वेयर (एसक्यूएल)]] कॉलम या कॉलम एक्सप्रेशन के किसी भी संयोजन को निर्दिष्ट करता है जो कि जॉइन इंडेक्स (तथाकथित कवरिंग क्वेरी) में परिभाषित लोगों का सटीक सबसेट है, मूल तालिकाओं और उनके इंडेक्स के अतिरिक्त जॉइन इंडेक्स का कारण बनता है, क्वेरी निष्पादन के समय परामर्श लिया जाना चाहिए।
जॉइन इंडेक्स [[ डेटाबेस सूचकांक ]] हैं जो डेटा वेयरहाउस में जॉइन क्वेरी के प्रसंस्करण की सुविधा प्रदान करते हैं: वे वर्तमान में (2012) [[ओरेकल डेटाबेस]] द्वारा कार्यान्वयन में उपलब्ध हैं<ref>Oracle Bitmap Join Index. URL: http://www.dba-oracle.com/art_builder_bitmap_join_idx.htm</ref> और [[टेराडाटा]].<ref>Teradata Join Indexes. {{cite web|url=http://www.coffingdw.com/sql/tdsqlutp/join_index.htm |title=Join Index |access-date=2012-06-14 |url-status=dead |archive-url=https://web.archive.org/web/20121216123745/http://www.coffingdw.com/sql/tdsqlutp/join_index.htm |archive-date=2012-12-16 }}</ref>
टेराडाटा कार्यान्वयन में, निर्दिष्ट कॉलम, कॉलम पर समग्र कार्य, या  या अधिक तालिकाओं से दिनांक कॉलम के घटकों को [[डेटाबेस दृश्य]] की परिभाषा के समान सिंटैक्स का उपयोग करके निर्दिष्ट किया जाता है: 64 कॉलम/कॉलम अभिव्यक्तियों को में निर्दिष्ट किया जा सकता है सूचकांक में शामिल हों. वैकल्पिक रूप से,  कॉलम जो समग्र डेटा की प्राथमिक कुंजी को परिभाषित करता है, उसे भी निर्दिष्ट किया जा सकता है: समानांतर हार्डवेयर पर, कॉलम मानों का उपयोग सूचकांक की सामग्री को कई डिस्क में विभाजित करने के लिए किया जाता है। जब स्रोत तालिकाओं को उपयोगकर्ताओं द्वारा इंटरैक्टिव रूप से अपडेट किया जाता है, तो जॉइन इंडेक्स की सामग्री स्वचालित रूप से अपडेट हो जाती है। कोई भी क्वेरी जिसका [[ कहां (एसक्यूएल) ]] कॉलम या कॉलम ्सप्रेशन के किसी भी संयोजन को निर्दिष्ट करता है जो कि जॉइन इंडेक्स (तथाकथित कवरिंग क्वेरी) में परिभाषित लोगों का सटीक सबसेट है, मूल तालिकाओं और उनके इंडेक्स के बजाय जॉइन इंडेक्स का कारण बनेगा, क्वेरी निष्पादन के दौरान परामर्श लिया जाना।


Oracle कार्यान्वयन स्वयं को [[ बिटमैप सूचकांक ]] का उपयोग करने तक सीमित रखता है। बिटमैप जॉइन इंडेक्स का उपयोग कम-कार्डिनैलिटी कॉलम के लिए किया जाता है (यानी, ओरेकल दस्तावेज़ के अनुसार 300 से कम विशिष्ट मान वाले कॉलम): यह कई संबंधित तालिकाओं से कम-कार्डिनैलिटी कॉलम को जोड़ता है। Oracle जिस उदाहरण का उपयोग करता है वह इन्वेंट्री सिस्टम का है, जहां विभिन्न आपूर्तिकर्ता अलग-अलग हिस्से प्रदान करते हैं। [[डेटाबेस स्कीमा]] में तीन लिंक्ड टेबल हैं: दो मास्टर टेबल, पार्ट और सप्लायर, और डिटेल टेबल, इन्वेंटरी। अंतिम अनेक-से-अनेक तालिका है जो आपूर्तिकर्ता को भाग से जोड़ती है, और इसमें सबसे अधिक पंक्तियाँ होती हैं। प्रत्येक भाग का भाग प्रकार होता है, और प्रत्येक आपूर्तिकर्ता अमेरिका में स्थित होता है, और उसके पास  राज्य कॉलम होता है। अमेरिका में 60 से अधिक राज्य+क्षेत्र नहीं हैं, और 300 से अधिक भाग प्रकार नहीं हैं। बिटमैप जॉइन इंडेक्स को उपरोक्त तीन तालिकाओं पर मानक तीन-टेबल जॉइन का उपयोग करके परिभाषित किया गया है, और इंडेक्स के लिए पार्ट_टाइप और सप्लायर_स्टेट कॉलम निर्दिष्ट किया गया है। हालाँकि, इसे इन्वेंटरी टेबल पर परिभाषित किया गया है, भले ही कॉलम पार्ट_टाइप और सप्लायर_स्टेट क्रमशः सप्लायर और पार्ट से उधार लिए गए हों।
ओरेकल कार्यान्वयन स्वयं को [[ बिटमैप सूचकांक |बिटमैप सूचकांक]] का उपयोग करने तक सीमित रखता है। बिटमैप जॉइन इंडेक्स का उपयोग कम-कार्डिनैलिटी कॉलम के लिए किया जाता है (जिससे, ओरेकल प्रपत्र के अनुसार 300 से कम विशिष्ट मान वाले कॉलम): यह कई संबंधित तालिकाओं से कम-कार्डिनैलिटी कॉलम को जोड़ता है। ओरेकल जिस उदाहरण का उपयोग करता है वह इन्वेंट्री सिस्टम का है, जहां विभिन्न आपूर्तिकर्ता भिन्न-भिन्न भाग प्रदान करते हैं। [[डेटाबेस स्कीमा]] में तीन लिंक्ड टेबल हैं: दो मास्टर टेबल, पार्ट और सप्लायर, और डिटेल टेबल, इन्वेंटरी आदि। अंतिम अनेक-से-अनेक टेबल है जो आपूर्तिकर्ता को भाग से जोड़ती है, और इसमें सबसे अधिक पंक्तियाँ होती हैं। प्रत्येक भाग का प्रकार होता है, और प्रत्येक आपूर्तिकर्ता युएस में स्थित होता है, और उसके निकट स्टेट कॉलम होता है। युएस में 60 से अधिक स्टेट+कॉलम नहीं हैं, और 300 से अधिक भाग प्रकार नहीं हैं। बिटमैप जॉइन इंडेक्स को उपरोक्त तीन तालिकाओं पर मानक तीन-टेबल जॉइन का उपयोग करके परिभाषित किया गया है, और इंडेक्स के लिए पार्ट_टाइप और सप्लायर_स्टेट कॉलम निर्दिष्ट किया गया है। चूँकि, इसे इन्वेंटरी टेबल पर परिभाषित किया गया है, भले ही कॉलम पार्ट_टाइप और सप्लायर_स्टेट क्रमशः सप्लायर और पार्ट से उधार लिए गए हों।


टेराडेटा के लिए, ओरेकल बिटमैप जॉइन इंडेक्स का उपयोग केवल  प्रश्न का उत्तर देने के लिए किया जाता है जब क्वेरी का व्हेयर (एसक्यूएल) उन कॉलमों तक सीमित होता है जो जॉइन इंडेक्स में शामिल होते हैं।
टेराडेटा के लिए, ओरेकल बिटमैप जॉइन इंडेक्स का उपयोग केवल  प्रश्न का उत्तर देने के लिए किया जाता है I जब क्वेरी का व्हेयर क्लॉज उन कॉलमों तक सीमित होता है जो जॉइन इंडेक्स में सम्मिलित होते हैं।


=== सीधे जुड़ें ===
=== स्ट्रैट जॉइन ===
कुछ डेटाबेस सिस्टम उपयोगकर्ता को सिस्टम को विशेष क्रम में तालिकाओं को पढ़ने के लिए बाध्य करने की अनुमति देते हैं। इसका उपयोग तब किया जाता है जब जॉइन ऑप्टिमाइज़र तालिकाओं को अकुशल क्रम में पढ़ने का विकल्प चयन किया जाता है। उदाहरण के लिए, [[MySQL]] में कमांड <code>STRAIGHT_JOIN</code> तालिकाओं को क्वेरी में सूचीबद्ध क्रम में ही पढ़ता है।<ref>{{Cite web|title = 13.2.9.2 JOIN Syntax|url = https://dev.mysql.com/doc/refman/5.7/en/join.html|website = MySQL 5.7 Reference Manual|access-date = 2015-12-03|publisher = [[Oracle Corporation]]}}</ref>
कुछ डेटाबेस सिस्टम उपयोगकर्ता को सिस्टम को विशेष क्रम में तालिकाओं को पढ़ने के लिए बाध्य करने की अनुमति प्रदान करते हैं। इसका उपयोग तब किया जाता है, जब जॉइन ऑप्टिमाइज़र तालिकाओं को अकुशल क्रम में पढ़ने का विकल्प चयन किया जाता है। उदाहरण के लिए, [[MySQL|माई एसक्यूएल]] में कमांड <code>STRAIGHT_JOIN</code> तालिकाओं को क्वेरी में सूचीबद्ध क्रम में ही पढ़ता है।<ref>{{Cite web|title = 13.2.9.2 JOIN Syntax|url = https://dev.mysql.com/doc/refman/5.7/en/join.html|website = MySQL 5.7 Reference Manual|access-date = 2015-12-03|publisher = [[Oracle Corporation]]}}</ref>


== यह भी देखें ==
== यह भी देखें ==
* जुड़ें (संबंधपरक बीजगणित)
* जॉइन (संबंधपरक बीजगणित)
* [[एंटीजॉइन]]
* [[एंटीजॉइन]]
* [[सेट ऑपरेशन (एसक्यूएल)]]
* [[सेट ऑपरेशन (एसक्यूएल)]]
Line 642: Line 656:
{{refend}}
{{refend}}


==बाहरी संबंध==
==आउटर संबंध==
* Specific to products:
* Specific to products:
** [http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug138.htm Sybase ASE 15 Joins]
** [http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug138.htm Sybase ASE 15 Joins]
** [http://dev.mysql.com/doc/refman/8.0/en/join.html MySQL 8.0 Joins]
** [http://dev.mysql.com/doc/refman/8.0/en/join.html Myएसक्यूएल 8.0 Joins]
** [https://www.postgresql.org/docs/14/tutorial-join.html PostgreSQL 14 Joins]
** [https://www.postgresql.org/docs/14/tutorial-join.html Postgreएसक्यूएल 14 Joins]
** [https://docs.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-ver15 Joins in Microsoft SQL Server]
** [https://docs.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-ver15 Joins in Microsoft एसक्यूएल Server]
** [http://maxdb.sap.com/currentdoc/45/f31c38e95511d5995d00508b5d5211/content.htm Joins in MaxDB 7.6]
** [http://maxdb.sap.com/currentdoc/45/f31c38e95511d5995d00508b5d5211/content.htm Joins in MaxDB 7.6]
** [http://docs.oracle.com/cd/E16655_01/server.121/e17209/queries006.htm Joins in Oracle 12c R1]
** [http://docs.oracle.com/cd/E16655_01/server.121/e17209/queries006.htm Joins in ओरेकल 12c R1]
** [https://oracletutorial.net/oracle-sql-joins.html Oracle SQL Joins]
** [https://oracletutorial.net/oracle-sql-joins.html ओरेकल एसक्यूएल Joins]
{{SQL}}
{{SQL}}


{{DEFAULTSORT:Join (SQL)}}[[Category: एसक्यूएल कीवर्ड]] [[Category: उदाहरण SQL कोड वाले लेख]]
{{DEFAULTSORT:Join (SQL)}}
 
 


[[Category: Machine Translated Page]]
[[Category:Articles with invalid date parameter in template|Join (SQL)]]
[[Category:Created On 26/07/2023]]
[[Category:Articles with specifically marked weasel-worded phrases from September 2022|Join (SQL)]]
[[Category:Collapse templates|Join (SQL)]]
[[Category:Created On 26/07/2023|Join (SQL)]]
[[Category:Lua-based templates|Join (SQL)]]
[[Category:Machine Translated Page|Join (SQL)]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Join (SQL)]]
[[Category:Pages with script errors|Join (SQL)]]
[[Category:Short description with empty Wikidata description|Join (SQL)]]
[[Category:Sidebars with styles needing conversion|Join (SQL)]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Join (SQL)]]
[[Category:Templates generating microformats|Join (SQL)]]
[[Category:Templates that add a tracking category|Join (SQL)]]
[[Category:Templates that are not mobile friendly|Join (SQL)]]
[[Category:Templates that generate short descriptions|Join (SQL)]]
[[Category:Templates using TemplateData|Join (SQL)]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia articles needing clarification from May 2021|Join (SQL)]]
[[Category:Wikipedia metatemplates|Join (SQL)]]
[[Category:उदाहरण SQL कोड वाले लेख|Join (SQL)]]
[[Category:एसक्यूएल कीवर्ड|Join (SQL)]]

Latest revision as of 17:20, 10 August 2023

वेन आरेख टेबल A और B के मध्य पूर्ण जॉइन एसक्यूएल कथन का प्रतिनिधित्व करता है।

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

उदाहरण तालिकाएँ

जॉइन प्रकारों को समझाने के लिए, इस आलेख का शेष भाग निम्नलिखित तालिकाओं का उपयोग करता है:

एम्प्लॉयी टेबल
लास्टनेम डिपार्टमेंटआईडी
रैफर्टी 31
जोन्स 33
हाइजेनबर्ग 33
रॉबिंसन 34
स्मिथ 34
विलियम्स NULL
डिपार्टमेंट टेबल
डिपार्टमेंटआईडी डिपार्टमेंटनेम
31 सेल्स
33 इंजीनियरिंग
34 क्लेरिकल
35 मार्केटिंग

Department.DepartmentID Department टेबल की प्राथमिक कुंजी है, जबकि Employee.DepartmentID विदेशी कुंजी है।

ध्यान दें कि Employee में, विलियम्स को अभी तक कोई डिपार्टमेंट नहीं दिया गया है। इसके अतिरिक्त, मार्केटिंग डिपार्टमेंट में किसी भी एम्प्लॉयी को नियुक्त नहीं किया गया है।

उपरोक्त तालिकाएँ बनाने के लिए ये एसक्यूएल कथन हैं:

CREATE TABLE department(
 DepartmentID INT PRIMARY KEY NOT NULL,
DepartmentName VARCHAR(20)
 );
 CREATE TABLE employee (
LastName VARCHAR(20),
DepartmentID INT REFERENCES department(DepartmentID)
);
      INSERT INTO department
     VALUES (31, 'Sales'),
 (33, 'Engineering'),
 (34, 'Clerical'),
 (35, 'Marketing');
     INSERT INTO employee 
      VALUES ('Rafferty', 31),
('Jones', 33),
('Heisenberg', 33),
('Robinson', 34),
('Smith', 34),  
('Williams', NULL);

क्रॉस जॉइन

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 में टुपल्स के सभी संयोजनों का सेट है जो उनके सामान्य विशेषता नामों पर समान हैं। उदाहरण के लिए एम्प्लॉयी और डिपार्टमेंट और उनके स्वाभाविक जॉइन तालिकाओं पर विचार करें:

एम्प्लॉयी
नेम एम्प्लॉयीआईडी  डिपार्टमेंटनेम
हैरी 3415 फाइनेंस
सैली 2241 सेल्स
जॉर्ज 3401 फाइनेंस
हेरिएट 2202 सेल्स
डिपार्टमेंट
डिपार्टमेंटनेम मैनेजर
फाइनेंस जॉर्ज
सेल्स हेरिएट
प्रोडक्शन चार्ल्स
Employee  Dept
नेम एम्प्लॉयीआईडी डिपार्टमेंटनेम मैनेजर
हैरी 3415 फाइनेंस जॉर्ज
सैली 2241 सेल्स हेरिएट
जॉर्ज 3401 फाइनेंस जॉर्ज
हेरिएट 2202 सेल्स हेरिएट

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

नेचुरल जॉइन निश्चित सबसे महत्वपूर्ण ऑपरेटरों में से है क्योंकि यह तार्किक 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]

मानक एसक्यूएल में आउटर जॉइन के लिए कोई अंतर्निहित जॉइन-नोटेशन उपस्थित नहीं है।

A Venn diagram showing the left circle and overlapping portion filled.

लेफ्ट आउटर जॉइन

टेबल ए और बी के लिए लेफ्ट आउटर जॉइन (या बस लेफ्ट जॉइन) के परिणाम में सदैव बाईं टेबल (ए) की सभी पंक्तियां सम्मिलित होती हैं, भले ही सम्मिलित होने की स्थिति को सही टेबल (बी) में कोई मिलान पंक्ति नहीं मिलती है। इसका तात्पर्य यह है कि यदि 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

A Venn diagram show the right circle and overlapping portions filled.

राइट आउटर जॉइन

राइट आउटर जॉइन (या राइट जॉइन) लेफ्ट आउटर जॉइन से अधिक इसके अतिरिक्त तालिकाओं के विपरीत व्यवहार से मिलता-जुलता है। दाहिनी टेबल (बी) से प्रत्येक पंक्ति कम से कम एक बार सम्मिलित टेबल में दिखाई देगी। यदि बाईं टेबल (ए) से कोई मिलान पंक्ति उपस्थित नहीं है, तो शून्य उन पंक्तियों के लिए ए से कॉलम में दिखाई देगा जिनका बी में कोई युग्मन नहीं है।

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

नीचे राइट आउटर जॉइन का उदाहरण दिया गया है (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

राइट और लेफ्ट आउटर जॉइन कार्यात्मक रूप से समतुल्य हैं। इनमें से कोई भी ऐसी कोई कार्यक्षमता प्रदान नहीं करता है जो दूसरा नहीं करता है, इसलिए जब तक टेबल क्रम स्विच किया जाता है तब तक राइट और लेफ्ट आउटर जॉइन -दूसरे को प्रतिस्थापित कर सकते हैं।

A Venn diagram showing the right circle, left circle, and overlapping portion filled.

पूर्ण आउटर जॉइन

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

उदाहरण के लिए, यह हमें प्रत्येक एम्प्लॉयी को देखने की अनुमति देता है जो डिपार्टमेंट में है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी है, किन्तु प्रत्येक एम्प्लॉयी को भी देख सकता है जो डिपार्टमेंट का भाग नहीं है और प्रत्येक डिपार्टमेंट जिसमें एम्प्लॉयी नहीं है।

पूर्ण आउटर जॉइन का उदाहरण (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 से अधिक या उसके बराबर है I इस नियम का प्रभाव डुप्लिकेट जॉइनियों और स्वयं-जॉइनियों को बाहर करना है। इसके अतिरिक्त, निम्नलिखित कम उपयोगी टेबल तैयार की जाएगी (नीचे दी गई टेबल परिणाम का केवल जर्मनी भाग प्रदर्शित करती है):
एम्प्लॉयीआईडी लास्टनेम एम्प्लॉयीआईडी लास्टनेम कंट्री  
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;

के रूप में भी लिखा जा सकता है I

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)

कार्यान्वयन

A query plan for the triangle query R(A, B) ⋈ S(B, C) ⋈ T(A, C) that uses binary joins. It joins S and T first, then joins the result with R.
A query plan for the triangle query R(A, B) ⋈ S(B, C) ⋈ T(A, C) that uses binary joins. It joins R and S first, then joins the result with T.
Two possible query plans for the triangle query R(A, B) ⋈ S(B, C) ⋈ T(A, C); the first joins S and T first and joins the result with R, the second joins R and S first and joins the result with T

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

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

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

कोई भी सम्मिलित होने वाली क्वेरी-योजनाओं को निम्नानुसार वर्गीकृत कर सकता है:[12]

लेफ्ट-डीप
योजना में प्रत्येक जॉइन के इनर ऑपरेंड के रूप में बेस टेबल (किसी अन्य जॉइन के बजाय) का उपयोग करना I
राइट-डीप
योजना में प्रत्येक जॉइन के आउटर ऑपरेंड के रूप में बेस टेबल का उपयोग करना I
घना
न बाएँ-गहरा, न दाएँ-गहरा; किसी जॉइन के दोनों इनपुट स्वयं जॉइन के परिणामस्वरूप हो सकते हैं I

यदि ट्री डेटा संरचना के रूप में निर्मित किया जाता है, तो ये नाम क्वेरी योजना की उपस्थिति से प्राप्त होते हैं, जिसमें बाईं ओर आउटर जॉइन संबंध और दाईं ओर इनर संबंध होता है (जैसा कि सम्मेलन तय करता है)।

एल्गोरिदम से जुड़ें

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

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

जॉइन इन्डेक्सेस

जॉइन इंडेक्स डेटाबेस सूचकांक हैं, जो डेटा वेयरहाउस में जॉइन क्वेरी के प्रसंस्करण की सुविधा प्रदान करते हैं: वे वर्तमान में (2012) ओरेकल डेटाबेस और टेराडाटा द्वारा कार्यान्वयन में उपलब्ध हैं I[14] [15]

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

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

टेराडेटा के लिए, ओरेकल बिटमैप जॉइन इंडेक्स का उपयोग केवल प्रश्न का उत्तर देने के लिए किया जाता है I जब क्वेरी का व्हेयर क्लॉज उन कॉलमों तक सीमित होता है जो जॉइन इंडेक्स में सम्मिलित होते हैं।

स्ट्रैट जॉइन

कुछ डेटाबेस सिस्टम उपयोगकर्ता को सिस्टम को विशेष क्रम में तालिकाओं को पढ़ने के लिए बाध्य करने की अनुमति प्रदान करते हैं। इसका उपयोग तब किया जाता है, जब जॉइन ऑप्टिमाइज़र तालिकाओं को अकुशल क्रम में पढ़ने का विकल्प चयन किया जाता है। उदाहरण के लिए, माई एसक्यूएल में कमांड STRAIGHT_JOIN तालिकाओं को क्वेरी में सूचीबद्ध क्रम में ही पढ़ता है।[16]

यह भी देखें

संदर्भ

उद्धरण

  1. SQL CROSS JOIN
  2. Greg Robidoux, "Avoid SQL Server functions in the WHERE clause for Performance", MSSQL Tips, 3 May 2007
  3. Patrick Wolf, "Inside Oracle APEX "Caution when using PL/SQL functions in a SQL statement", 30 November 2006
  4. Gregory A. Larsen, "T-SQL Best Practices - Don't Use Scalar Value Functions in Column List or WHERE Clauses", 29 October 2009,
  5. Simplifying Joins with the USING Keyword
  6. In Unicode, the bowtie symbol is ⋈ (U+22C8).
  7. Ask Tom "Oracle support of ANSI joins." Back to basics: inner joins » Eddie Awad's Blog Archived 2010-11-19 at the Wayback Machine
  8. Silberschatz, Abraham; Korth, Hank; Sudarshan, S. (2002). "Section 4.10.2: Join Types and Conditions". डेटाबेस सिस्टम अवधारणाएँ (4th ed.). p. 166. ISBN 0072283637.
  9. Oracle लेफ्ट आउटर जॉइन
  10. Shah 2005, p. 165
  11. Adapted from Pratt 2005, pp. 115–6
  12. Yu & Meng 1998, p. 213
  13. Wang, Yisu Remy; Willsey, Max; Suciu, Dan (2023-01-27). "Free Join: Unifying Worst-Case Optimal and Traditional Joins". arXiv:2301.10841 [cs.DB].
  14. Oracle Bitmap Join Index. URL: http://www.dba-oracle.com/art_builder_bitmap_join_idx.htm
  15. Teradata Join Indexes. "Join Index". Archived from the original on 2012-12-16. Retrieved 2012-06-14.
  16. "13.2.9.2 JOIN Syntax". MySQL 5.7 Reference Manual. Oracle Corporation. Retrieved 2015-12-03.


स्रोत

आउटर संबंध