पिछले अनुभाग में, हमने तालिकाओं को संयोजित करने के सबसे सरल तरीकों पर विचार किया - WHERE और INNER JOIN वाक्यों का उपयोग करके। इन संयोजनों को आंतरिक संयोजन या तुल्यता संयोजन कहा जाता है। हालाँकि, SQL के शस्त्रागार में तालिकाओं को जोड़ने के लिए कई और विकल्प हैं, अर्थात्, अन्य प्रकार के जोड़ भी हैं: बाहरी जोड़, प्राकृतिक जोड़ और स्वयं-जोड़। लेकिन पहले, आइए विचार करें कि हम तालिकाओं को उपनाम कैसे निर्दिष्ट कर सकते हैं, क्योंकि बाद में हमें फ़ील्ड्स (टेबल.फ़ील्ड) के पूर्ण नामों का उपयोग करने के लिए मजबूर होना पड़ेगा, जिनकी बड़ी लंबाई के कारण संक्षिप्ताक्षरों के बिना उन्हें संचालित करना बहुत मुश्किल होगा।
पिछले अनुभाग में, हमने सीखा कि विशिष्ट तालिका फ़ील्ड या परिकलित फ़ील्ड को संदर्भित करने के लिए उपनामों का उपयोग कैसे किया जा सकता है। SQL हमें तालिका नामों के स्थान पर उपनामों का उपयोग करने की भी अनुमति देता है। इससे हमें छोटे SQL सिंटैक्स जैसे लाभ मिलते हैं और हमें SELECT स्टेटमेंट में एक ही तालिका का कई बार उपयोग करने की अनुमति मिलती है।
Run SQLSELECT Seller_name, SUM(Amount) AS Sum1
FROM Sellers AS S, Sumproduct AS SP
WHERE S.City = SP.City
GROUP BY Seller_name
हमने प्रत्येक विक्रेता के लिए बेचे गए सामान की कुल राशि प्रदर्शित की। हमारी SQL क्वेरी में, हमने निम्नलिखित उपनामों का उपयोग किया: परिकलित फ़ील्ड SUM(राशि) के लिए उपनाम Sum1, तालिका Sellers के लिए उपनाम S और Sumproduct के लिए उपनाम SP। ध्यान दें कि तालिका उपनामों का उपयोग अन्य वाक्यों में भी किया जा सकता है, जैसे ORDER BY, GROUP BY और अन्य।
आइए एक उदाहरण पर विचार करें. मान लीजिए हमें उन विक्रेताओं का पता जानना होगा जो जॉन स्मिथ के देश में व्यापार करते हैं। ऐसा करने के लिए, हम निम्नलिखित अनुरोध बनाएंगे:
Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country
FROM Sellers
WHERE Seller_name = 'John Smith')
इसके अलावा, हम निम्नलिखित कोड लिखकर स्व-कनेक्शन के माध्यम से इस समस्या को हल कर सकते हैं:
Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'
इस समस्या के समाधान के लिए छद्मशब्दों का प्रयोग किया गया। पहली बार तालिका Sellers को उपनाम S1 सौंपा गया था, दूसरी बार - उपनाम S2। फिर इन उपनामों का उपयोग तालिका नामों के रूप में किया जा सकता है। WHERE ऑपरेटर में, हम प्रत्येक फ़ील्ड के नाम में उपसर्ग S1 जोड़ते हैं, ताकि DBMS समझ सके कि किस तालिका के फ़ील्ड को आउटपुट किया जाना चाहिए (क्योंकि हमने एक तालिका से दो वर्चुअल टेबल बनाए हैं)। WHERE क्लॉज पहले तालिकाओं से जुड़ता है और फिर केवल आवश्यक मान वापस करने के लिए Seller_name फ़ील्ड द्वारा दूसरी तालिका के डेटा को फ़िल्टर करता है।
सेल्फ़-जॉइन का उपयोग अक्सर सबक्वेरीज़ को बदलने के लिए किया जाता है जो बाहरी ऑपरेटर SELECT के समान तालिका से डेटा का चयन करते हैं। हालाँकि अंतिम परिणाम समान है, कई DBMS प्रक्रियाएँ सबक्वेरीज़ की तुलना में बहुत तेजी से जुड़ती हैं। यह निर्धारित करने के लिए प्रयोग करना उचित है कि कौन सी क्वेरी तेजी से काम करती है।
नेचुरल जॉइन एक ऐसा जॉइन है जिसमें आप केवल उन कॉलमों का चयन करते हैं जो दोहराए नहीं जाते हैं। यह आमतौर पर एक तालिका के लिए (SELECT *) लिखकर और बाकी तालिकाओं के लिए फ़ील्ड की एक सूची निर्दिष्ट करके किया जाता है। उदाहरण:
Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S
WHERE SP.City = S.City
इस उदाहरण में, वाइल्डकार्ड (*) का उपयोग केवल पहली तालिका के लिए किया जाता है। अन्य सभी कॉलम स्पष्ट रूप से निर्दिष्ट हैं, इसलिए डुप्लिकेट कॉलम नहीं चुने गए हैं।
आमतौर पर, विलय करते समय, एक तालिका की पंक्तियाँ किसी अन्य तालिका की संगत पंक्तियों से जुड़ी होती हैं, हालाँकि, कुछ मामलों में, परिणामी पंक्तियों में शामिल करना आवश्यक हो सकता है जिनकी किसी अन्य तालिका में संबंधित पंक्तियाँ नहीं हैं (अर्थात, सभी एक तालिका से पंक्तियों का चयन किया जाता है और दूसरी तालिका से केवल संबंधित पंक्तियाँ जोड़ी जाती हैं)। इस प्रकार के कनेक्शन को बाहरी कहा जाता है। इसके लिए, उपसर्ग LEFT या RIGHT के साथ कीवर्ड OUTER JOIN ... ON ... का उपयोग किया जाता है।
आइए एक उदाहरण पर विचार करें, पहले एक नए विक्रेता - सेमुएल पिटर, जिसकी अभी तक बिक्री नहीं हुई है, को Sellers तालिका में जोड़ा गया है:
Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2
LEFT OUTER JOIN Sumproduct
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name
इस अनुरोध के साथ, हमने डेटाबेस में सभी विक्रेताओं की सूची निकाली और सभी महीनों के लिए उनके द्वारा बेची गई वस्तुओं की कुल मात्रा की गणना की। हम देखते हैं कि नए विक्रेता सेमुएल पिटर की कोई बिक्री नहीं हुई है। यदि हमने इनर जॉइन का उपयोग किया, तो हम नए विक्रेता को नहीं देख पाएंगे, क्योंकि उसके पास Sumproduct तालिका में कोई रिकॉर्ड नहीं है। हम सिर्फ लिखकर ही नहीं बल्कि संयोजन की दिशा भी बदल सकते हैं LEFT या RIGHT, लेकिन केवल तालिकाओं के क्रम को बदलकर (अर्थात, निम्नलिखित दो रिकॉर्ड एक ही परिणाम देंगे: Sellers LEFT OUTER JOIN Sumproduct और Sumproduct RIGHT OUTER JOIN Sellers).
साथ ही, कुछ DBMS *= और =* संकेतों का उपयोग करके सरलीकृत रिकॉर्ड पर बाहरी जुड़ाव की अनुमति देते हैं, जो क्रमशः LEFT OUTER JOIN और RIGHT OUTER JOIN से मेल खाते हैं। इस प्रकार, पिछली क्वेरी को इस प्रकार फिर से लिखा जा सकता है:
SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City
दुर्भाग्य से MS Access बाहरी जुड़ाव के लिए संक्षिप्त रिकॉर्ड का समर्थन नहीं करता है।
एक अन्य प्रकार का बाहरी जोड़ भी है - एक पूर्ण बाहरी जुड़ाव, जो दोनों तालिकाओं से सभी पंक्तियों को प्रदर्शित करता है और केवल उन लोगों को जोड़ता है जिन्हें संबंधित किया जा सकता है। संपूर्ण बाहरी जुड़ाव का सिंटैक्स इस प्रकार है:
SELECT Seller_name, Product
FROM Sellers
FULL OUTER JOIN Sumproduct
ON Sellers.City = Sumproduct.City
पुनः, पूर्ण बाहरी जुड़ाव निम्नलिखित DBMS द्वारा समर्थित नहीं है: MS Access, MySQL, SQL Server, और Sybase। इस अन्याय से कैसे निजात पाया जाए, इस पर हम अगले भाग में विचार करेंगे।