मुख्य सामग्री पर जाएँ

SQL Joins का परिचय

इस ट्यूटोरियल में, आप SQL में joins की कार्यप्रणाली और उनके विभिन्न प्रकारों के बारे में सीखेंगे।
· 9 मि॰ पढ़ें

AI के साथ खोजें

SQL में डेटा विश्लेषण करते समय, आपको अक्सर कई तालिकाओं को देखना और इच्छित परिणाम पाने के लिए उन्हें जोड़ना होगा। डेटा का विश्लेषण करने के लिए तालिकाओं को जोड़ना एक डेटा वैज्ञानिक के लिए भी आवश्यक कौशल है। इस ट्यूटोरियल में, आप PostgreSQL में किए जा सकने वाले विभिन्न प्रकार के joins के बारे में जानेंगे। आप पहले SQL में joins की प्रारंभिक अवधारणाओं का अध्ययन करेंगे, फिर विभिन्न प्रकार के joins और PostgreSQL में उनके syntaxes के बारे में सीखेंगे। अंत में, आप दो तालिकाओं का उपयोग करके विभिन्न प्रकार की join क्वेरीज़ चलाएंगे। साथ चलने के लिए, आपको SQL की बुनियादी जानकारी और PostgreSQL में सरल क्वेरी लिखना आता होना चाहिए। यदि आप इन्हें सीखने के संसाधन ढूंढ रहे हैं, तो निम्नलिखित उपयोगी हो सकते हैं -

आइए शुरू करें।

संक्षेप में

  • SQL joins आपको साझा कॉलम का उपयोग करके दो या अधिक तालिकाओं से डेटा संयोजित करने देते हैं।

  • INNER JOIN केवल मिलते-जुलते rows लौटाता है, जबकि OUTER JOIN के प्रकार (LEFT, RIGHT, FULL) एक या दोनों पक्षों से non-matching rows भी रखते हैं और खाली जगहों को NULL से भरते हैं।

  • CROSS JOIN rows के सभी संभावित संयोजन (कार्तीय गुणनफल) बनाता है, और SELF JOIN आपको एक तालिका को उसी से जोड़ने देता है — एक ही डेटासेट के भीतर rows की तुलना करने में उपयोगी।

  • सेमी-जॉइन और एंटी-जॉइन, जिन्हें उप-क्वेरी के रूप में IN या NOT IN के साथ लिखा जाता है, एक तालिका से rows को दूसरी तालिका में शर्तों से मेल खाने या न मिलने के आधार पर फिल्टर करते हैं।

PostgreSQL में डेटाबेस वातावरण स्थापित करना

SQL joins की मूल बातें सीखने से पहले अपने विश्लेषण के लिए कुछ तालिकाएँ बनाना उपयोगी रहेगा। आपको कम से कम दो तालिकाओं की आवश्यकता होगी जिनमें कम से कम एक साझा कॉलम हो। यद्यपि आप एक ही तालिका पर self-join क्वेरी चला सकते हैं, फिलहाल हम उसे अनदेखा करते हैं।

आप सभी SQL ऑपरेशन pgAdmin नामक टूल पर कर सकते हैं जो आमतौर पर PostgreSQL की स्थापना के साथ आता है। आइए pgAdmin खोलें और तालिकाएँ बनाने के लिए एक डेटाबेस बनाएं (इसे अपनी पसंद का नाम दें) यदि आगे बढ़ने के लिए आपके पास मौजूदा डेटाबेस नहीं है। इसके बाद आप निम्नलिखित दो तालिकाएँ इन विनिर्देशों के साथ बना सकते हैं -

  • student_name (id, name)
  • student_stream (id, stream)

ध्यान दें कि दोनों तालिकाओं में id कॉलम समान है। आप तालिकाएँ बनाने के लिए निम्नलिखित CREATE कथनों का उपयोग कर सकते हैं -

अब तालिकाओं में कुछ रिकॉर्ड डालते हैं।

  • student_name के लिए -
INSERT INTO student_name(id, name) VALUES (1, 'Sayak');

INSERT INTO student_name(id, name) VALUES (2, 'Alex');

INSERT INTO student_name(id, name) VALUES (3, 'Sameer');

INSERT INTO student_name(id, name) VALUES (4, 'Rick');
  • student_stream के लिए -
INSERT INTO student_stream(id, stream) VALUES (1, 'CS');

INSERT INTO student_stream(id, stream) VALUES (1, 'IT');

INSERT INTO student_stream(id, stream) VALUES (2, 'ECE');

INSERT INTO student_stream(id, stream) VALUES (9, 'ECE');

यदि आपने ऊपर की क्वेरीज़ बिना बदले चलायी हैं, तो तालिकाओं की प्रविष्टियाँ कुछ इस प्रकार होनी चाहिए -

student_name और student_stream तालिकाएँ

अब आपके पास दो सरल तालिकाएँ तैयार हैं। आइए अब SQL joins की मूल बातें पढ़ते हैं।

SQL Joins - मूल बातें

SQL Joins आपको सामान्य पहचानकर्ताओं का उपयोग करके दो या अधिक (कभी-कभी केवल एक) तालिकाओं को समेकित करने देते हैं। ऊपर बनाई गई दो तालिकाओं का उदाहरण लें — दोनों तालिकाओं में id कॉलम समान है। आप SQL में joining की आवश्यकता पर सवाल कर सकते हैं। आइए संक्षेप में इस पर चर्चा करें।

Normalization प्रतिबंधों के कारण, आवश्यक सभी जानकारी एक ही तालिका में उपलब्ध न हो सकती है। स्थिरता बनाए रखने, अनावश्यकता कम करने और विभिन्न insertion व update विसंगतियों से बचने के लिए normalization न केवल वांछनीय बल्कि आवश्यक है। ऊपर की दो तालिकाओं पर फिर से विचार करें। मान लें कि आप यह जानना चाहते हैं कि Sayak ने किन streams में नामांकन किया है। इस प्रश्न का उत्तर पाने के लिए आपको दोनों तालिकाओं को जोड़ना होगा (उप-क्वेरी भी उपयोग की जा सकती हैं, पर अभी हम उसे नहीं देखते) और फिर तदनुसार आगे बढ़ना होगा।

दो तालिकाओं को जोड़ने के लिए दोनों के बीच कुछ न कुछ समान होना चाहिए। क्या इसका मतलब है कि दोनों तालिकाओं में कम से कम एक कॉलम का नाम एक जैसा होना चाहिए? या सटीक शर्त क्या है?

जिन तालिकाओं को आप जोड़ना चाहते हैं, उनमें ज़रूरी नहीं कि एक ही नाम का कॉलम हो, लेकिन तार्किक रूप से वे समान होने चाहिए, यानी उनके data-types समान होने चाहिए। आप ऐसी दो तालिकाओं को नहीं जोड़ सकते जिनमें कॉलम का नाम समान है लेकिन data-types अलग हैं। अब विभिन्न प्रकार के SQL joins का अध्ययन करते हैं।

SQL Joins के विभिन्न प्रकार

इस अनुभाग में, आप SQL Joins के कई प्रकारों का अध्ययन करेंगे -

  • INNER JOIN
    • Self-join
  • OUTER JOIN
    • LEFT JOIN
    • RIGHT JOIN
    • FULL JOIN
  • CROSS JOIN
  • Semi-join और Anti-join

PostgreSQL उपरोक्त सभी प्रकारों के लिए अलग-अलग कीवर्ड प्रदान करता है (सभी बड़े अक्षरों में लिखे गए)। आइए इन्हें एक-एक करके पढ़ते हैं। इसके लिए, आप पहले joins को दृश्य रूप में समझेंगे, और फिर PostgreSQL में संबंधित join क्वेरी चलाएँगे।

INNER JOIN

INNER JOIN को दृश्य रूप में समझने के लिए निम्नलिखित आरेख देखें -

Inner join आरेख

ऊपर के उदाहरण में विचाराधीन कॉलम id है। INNER JOIN उन बाकी कॉलमों को अनदेखा करेगा जिनके मान दोनों तालिकाओं में सामान्य नहीं हैं। अब PostgreSQL में एक क्वेरी चलाते हैं जो student_name और student_stream — इन दो तालिकाओं के बीच INNER JOIN करती है।

निम्नलिखित क्वेरी चलाने पर, आपको ऊपर के चित्र जैसा परिणाम मिलता है -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
ON s1.id = s2.id;

s1 और s2 दोनों तालिकाओं के उपनाम (aliases) हैं। आपने INNER JOIN के साथ ON कीवर्ड का उपयोग किया। क्वेरी को USING कीवर्ड का उपयोग करके भी चलाया जा सकता है -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
USING (id);

Self Join आपको एक ही तालिका पर join करने देता है। लेकिन यह कहाँ अच्छा विकल्प हो सकता है? मान लें आपके पास निम्नलिखित कॉलम वाली एक तालिका है -

  • Country
  • Continent

अब आप ऐसे दो देशों की सूची बनाना चाहते हैं जिनके महाद्वीप समान हों। निम्नलिखित चित्र अपेक्षित परिणाम का आभास देता है -

self join परिणाम (तालिका रूप)

OUTER JOIN

OUTER JOIN आगे तीन प्रकारों में बाँटा जा सकता है -

LEFT JOIN या Left Outer JOIN: निम्न आरेख SQL में LEFT JOIN का अच्छा विचार देता है -

SQL में left join का आरेख

ध्यान दें कि INNER JOIN के विपरीत, LEFT JOIN बाएँ (आपकी क्वेरी में निर्दिष्ट क्रम के सापेक्ष) तालिका से वे रिकॉर्ड भी लाता है जिनके लिए दाएँ तालिका में कोई matching प्रविष्टि नहीं है। इससे आपको पता चलता है कि Sameer और Rick ने किसी भी stream में नामांकन नहीं किया है। इसके लिए संबंधित क्वेरी होगी -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
LEFT JOIN student_stream AS s2
ON s1.id = s2.id;

RIGHT JOIN या Right Outer JOIN: RIGHT JOIN, LEFT JOIN का ठीक उल्टा है -

SQL में right join का आरेख

RIGHT JOIN आपको उन stream(s) को खोजने में मदद करता है जिनके लिए किसी छात्र ने नामांकन नहीं किया है। इसकी क्वेरी होगी -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
RIGHT JOIN student_stream AS s2
ON s1.id = s2.id;

FULL JOIN या Full Outer JOIN: FULL JOIN आपको LEFT JOIN और RIGHT JOIN दोनों को एक ही समेकन में जोड़ने देता है -

SQL में full join का आरेख

संबंधित क्वेरी होगी -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
FULL JOIN student_stream AS s2
ON s1.id = s2.id;

ध्यान दें कि आप उपरोक्त सभी OUTER JOIN क्वेरीज़ USING कीवर्ड का उपयोग करके भी चला सकते हैं। अब CROSS JOIN का अध्ययन करते हैं।

CROSS JOIN

CROSS JOIN मूलतः दो तत्वों के बीच कार्तीय गुणनफल को SQL में अभिव्यक्त करता है। मान लें, आपको दो तालिकाओं या यहाँ तक कि एक ही तालिका के बीच सभी संभावित संयोजन चाहिए। इसे करने के लिए आपको CROSS JOIN की आवश्यकता होगी। निम्नलिखित चित्र इस अवधारणा को दृश्य रूप में प्रस्तुत करता है -

cross join का आरेख

आपके पास इसे आज़माने के लिए दो तालिकाएँ पहले से हैं। student_name और student_stream तालिकाओं के id कॉलमों के बीच सभी संभावित संयोजन पाने के लिए, आप निम्नलिखित क्वेरी चला सकते हैं -

SELECT s1.id, s2.id
FROM student_name AS s1
CROSS JOIN student_stream AS s2;

और आपको निम्नलिखित परिणाम मिलता है -

सभी संभावित संयोजनों की तालिका

अब उन दो अन्य प्रकार के joins देखते हैं जिनके लिए PostgreSQL सीधे कीवर्ड प्रदान नहीं करता।

Semi-join और Anti-join

आइए ट्यूटोरियल में पहले बनाई गई तालिकाओं पर विचार करें:

मूल तालिका

Semi Join क्वेरी सामान्यतः उप-क्वेरी के रूप में चलाई जाती हैं, जहाँ rows पहली तालिका से उस शर्त (या शर्तों के समूह) के अनुरूप चुनी जाती हैं जो दूसरी तालिका में मेल खाती हैं। मान लें बाएँ तालिका पहली तालिका है, और दाएँ तालिका दूसरी तालिका।

Anti Join क्वेरी इसका ठीक उल्टा है। Anti Join में, rows पहली तालिका से उस शर्त (या शर्तों के समूह) के अनुरूप चुनी जाती हैं जो दूसरी तालिका में मेल नहीं खाती। इसे दृश्य रूप में समझने के लिए यहाँ एक आरेख है -

सेमी जॉइन और एंटी जॉइन के आरेख

Semi Join को साकार करने की क्वेरी होगी -

select id, name
from student_name
where id IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));

इसी प्रकार, इस मामले में Anti Join को साकार करने वाली क्वेरी होगी -

select id, name
from student_name
where id NOT IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));

ध्यान दें कि ऊपर की क्वेरी में NOT का उपयोग किया गया है।

अपनी SQL Join महारत को अगले स्तर पर ले जाएँ

इस ट्यूटोरियल के लिए बस इतना ही। आपने इस ट्यूटोरियल में SQL Joins के कई प्रकारों के बारे में पढ़ा और उनके PostgreSQL syntaxes से भी परिचित हुए। यदि आप SQL Join पर कुछ चुनौतीपूर्ण अभ्यास करना चाहते हैं, तो आपको DataCamp का Joining Data in SQL कोर्स करना चाहिए। वास्तव में, इस ट्यूटोरियल को बनाने में कोर्स की सामग्रियों का संदर्भ लिया गया है।

अपने प्रश्न मुझे Comments सेक्शन में बताएं।

विषय