questions - sql software




प्राकृतिक जुड़ने और आंतरिक शामिल होने के बीच अंतर (8)

अंतर यह है कि आंतरिक (ईसीआई / डिफॉल्ट) में शामिल होने और प्राकृतिक रूप से जुड़ने के लिए, नाट्यारल में आम कॉलम जीत में शामिल होने पर एकल समय में प्रदर्शित किया जाएगा, लेकिन सामान्य कॉलम में आंतरिक / इक्की / डिफ़ॉल्ट / सरल डबल टाइम प्रदर्शित होगा।

प्राकृतिक जुड़ाव और आंतरिक शामिल होने के बीच क्या अंतर है?


आंतरिक जुड़ें, दो टेबल में शामिल हों जहां कॉलम नाम समान है।

प्राकृतिक जुड़ें, दो टेबल में शामिल हों जहां कॉलम नाम और डेटा प्रकार समान हैं।


इनर जॉइन और प्राकृतिक जॉइन के बीच एक महत्वपूर्ण अंतर वापस कॉलम की संख्या है।

विचार करें:

TableA                            TableB
Column1    Column2                Column1    Column3
1          2                      1          3

कॉलम 1 पर टेबलए और टेबलबी की INNER जॉइन वापस आ जाएगी

a.column1  a.column2  b.column1  b.column3
1          2          1          3

SELECT * FROM TableA INNER JOIN TableB USING (Column1)
SELECT * FROM TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column1

कॉलम 1 पर टेबलए और टेबलबी का प्राकृतिक जॉइन वापस आ जाएगा:

column1  column2  column3
1        2        3

SELECT * FROM TableA NATURAL JOIN TableB

दोहराया कॉलम से बचा है।

(मानक व्याकरण से AFAICT, आप प्राकृतिक शामिल होने में शामिल कॉलम निर्दिष्ट नहीं कर सकते हैं; शामिल कड़ाई से नाम-आधारित है। Wikipedia भी देखें।)

( आंतरिक भाग में आउटपुट में धोखा है; a. और b. पार्ट्स कॉलम नामों में नहीं होंगे; आपके पास कॉलम 1, कॉलम 2, कॉलम 1, कॉलम 3 column3 रूप में होगा। )


एक NATURAL INNER शामिल होने के लिए एक छोटा सा सिंटैक्स है - या "इक्वि-जॉइन" - और, सिंटैक्स अनचाहे होने के बाद, दोनों एक ही रिलेशनल बीजगणित ऑपरेशन का प्रतिनिधित्व करते हैं। यह "अलग-अलग प्रकार" शामिल नहीं है, क्योंकि OUTER ( LEFT / RIGHT ) या CROSS के मामले में शामिल हो जाता है।

विकिपीडिया पर equi-join सेक्शन देखें:

एक प्राकृतिक जुड़ाव इक्विटी-जॉइन का एक और विशेषज्ञता प्रदान करता है। जुड़ने की भविष्यवाणी उन दोनों तालिकाओं में सभी स्तंभों की तुलना करके स्पष्ट रूप से उत्पन्न होती है जिनमें शामिल तालिकाओं में समान स्तंभ-नाम होते हैं। परिणामस्वरूप शामिल तालिका में समान नाम वाले कॉलम की प्रत्येक जोड़ी के लिए केवल एक कॉलम होता है।

ज्यादातर विशेषज्ञ मानते हैं कि प्राकृतिक जॉइन खतरनाक हैं और इसलिए उनके उपयोग को दृढ़ता से हतोत्साहित करते हैं। खतरे अनजाने में एक नया कॉलम जोड़कर आता है, जिसे एक और कॉलम के समान नाम दिया जाता है ...

यही है, सभी NATURAL जोड़ों को INNER रूप में लिखा जा सकता है (लेकिन बातचीत सच नहीं है)। ऐसा करने के लिए, बस स्पष्ट रूप से भविष्यवाणी करें - उदाहरण के लिए USING या ON - और जैसा कि जोनाथन लेफ्लर ने बताया, वांछित परिणाम-सेट कॉलम का चयन करें ताकि वांछित होने पर "डुप्लिकेट" से बचें।

हैप्पी कोडिंग

( NATURAL कीवर्ड को LEFT और RIGHT जुड़ने पर भी लागू किया जा सकता है, और यह भी लागू होता है। एक NATURAL LEFT/RIGHT जुड़ना एक विशिष्ट LEFT/RIGHT शामिल होने के लिए सिर्फ एक छोटा वाक्यविन्यास है।)


एक प्राकृतिक जुड़ाव है जहां सभी सामान्य स्तंभों के आधार पर 2 टेबल शामिल होते हैं।

सामान्य कॉलम: एक कॉलम है जिसमें दोनों टेबलों में समान नाम है + दोनों टेबलों में संगत डेटाटाइप हैं। आप केवल = ऑपरेटर का उपयोग कर सकते हैं

एक आंतरिक जुड़ाव है जहां ऑन टेबल में उल्लिखित सामान्य कॉलम के आधार पर 2 टेबल शामिल हो जाते हैं।

सामान्य कॉलम: एक कॉलम है जिसमें दोनों टेबलों में संगत डेटाटाइप हैं लेकिन समान नाम नहीं होना चाहिए। आप केवल किसी भी तुलना ऑपरेटर का उपयोग कर सकते हैं जैसे = , <= , >= , < , > , <>


एसक्यूएल कई तरीकों से संबंधपरक मॉडल के प्रति वफादार नहीं है। एसक्यूएल क्वेरी का नतीजा एक संबंध नहीं है क्योंकि इसमें डुप्लिकेट नाम, 'अज्ञात' (अनामित) कॉलम, डुप्लिकेट पंक्तियां, नल इत्यादि वाले कॉलम हो सकते हैं। एसक्यूएल तालिकाओं को संबंधों के रूप में नहीं मानता है क्योंकि यह कॉलम ऑर्डरिंग आदि पर निर्भर करता है।

एसक्यूएल में NATURAL JOIN पीछे विचार संबंधपरक मॉडल के प्रति अधिक वफादार होना आसान बनाना है। दो तालिकाओं के NATURAL JOIN के नतीजे कॉलम को नाम से डुप्लिकेट करेंगे, इसलिए कोई अनाम कॉलम नहीं होगा। इसी प्रकार, UNION CORRESPONDING और EXCEPT CORRESPONDING को विरासत UNION सिंटैक्स में कॉलम ऑर्डरिंग पर एसक्यूएल की निर्भरता को संबोधित करने के लिए प्रदान किया जाता है।

हालांकि, सभी प्रोग्रामिंग तकनीकों के साथ ही अनुशासन को उपयोगी होने की आवश्यकता होती है। एक सफल NATURAL JOIN लिए एक आवश्यकता लगातार कॉलम नामित की जाती है, क्योंकि समान नाम वाले स्तंभों पर शामिल होते हैं (यह एक शर्म की बात है कि एसक्यूएल में कॉलम का नाम बदलने के लिए वाक्यविन्यास वर्बोज़ है लेकिन आधार प्रभाव कॉलम नामकरण करते समय अनुशासन को प्रोत्साहित करना है टेबल और VIEW एस :)

ध्यान दें कि एक NATURAL JOIN एक इक्विटी-जॉइन है, हालांकि यह उपयोगिता के लिए कोई बार नहीं है। गौर करें कि अगर मूल NATURAL JOIN एसक्यूएल में समर्थित एकमात्र प्रकार का प्रकार था तो यह अभी भी संबंधपरक रूप से पूरा हो जाएगा।

हालांकि यह वास्तव में सच है कि किसी भी NATURAL JOIN को INNER JOIN और प्रक्षेपण ( SELECT ) का उपयोग करके लिखा जा सकता है, यह भी सच है कि किसी भी INNER JOIN को उत्पाद ( CROSS JOIN ) और प्रतिबंध ( WHERE ) का उपयोग करके लिखा जा सकता है; आगे ध्यान दें कि सामान्य रूप से कोई कॉलम नाम वाले टेबल के बीच एक NATURAL JOIN CROSS JOIN के समान परिणाम देगा। तो यदि आप केवल उन परिणामों में रूचि रखते हैं जो संबंध हैं (और क्यों नहीं ?!) तो NATURAL JOIN एकमात्र शामिल प्रकार है जो आपको चाहिए। निश्चित रूप से, यह सच है कि एक भाषा डिजाइन परिप्रेक्ष्य से शॉर्टैंड्स जैसे INNER JOIN और CROSS JOIN पास उनका मूल्य होता है, लेकिन यह भी मानते हैं कि लगभग किसी भी SQL क्वेरी को 10 वाक्य रचनात्मक रूप से अलग-अलग, लेकिन अर्थात् समकक्ष, तरीकों से लिखा जा सकता है और यह एसक्यूएल बनाता है अनुकूलक विकसित करने के लिए बहुत मुश्किल है।

यहां कुछ उदाहरण प्रश्न हैं ( सामान्य भागों और आपूर्तिकर्ताओं डेटाबेस का उपयोग करके) जो अर्थात् समकक्ष हैं:

SELECT *
  FROM S NATURAL JOIN SP;

-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
  FROM S INNER JOIN SP 
          USING (SNO);                        

-- Alternative projection
SELECT S.*, PNO, QTY
  FROM S INNER JOIN SP 
          ON S.SNO = SP.SNO;

-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
  FROM S INNER JOIN SP 
      ON S.SNO = SP.SNO;

-- 'Old school' style
SELECT *
  FROM S, SP 
 WHERE S.SNO = SP.SNO;

mysql> SELECT  * FROM tb1 ;
+----+------+
| id | num  |
+----+------+
|  6 |   60 |
|  7 |   70 |
|  8 |   80 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
6 rows in set (0.00 sec)

mysql> SELECT  * FROM tb2 ;
+----+------+
| id | num  |
+----+------+
|  4 |   40 |
|  5 |   50 |
|  9 |   90 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
6 rows in set (0.00 sec)

आंतरिक रूप से जुड़ा :

mysql> SELECT  * FROM tb1 JOIN tb2 ; 
+----+------+----+------+
| id | num  | id | num  |
+----+------+----+------+
|  6 |   60 |  4 |   40 |
|  7 |   70 |  4 |   40 |
|  8 |   80 |  4 |   40 |
|  1 |    1 |  4 |   40 |
|  2 |    2 |  4 |   40 |
|  3 |    3 |  4 |   40 |
|  6 |   60 |  5 |   50 |
|  7 |   70 |  5 |   50 |
|  8 |   80 |  5 |   50 |
.......more......
return 36 rows in set (0.01 sec) 
AND NATURAL JOIN :

    mysql> SELECT  * FROM tb1 NATURAL JOIN tb2 ;
    +----+------+
    | id | num  |
    +----+------+
    |  1 |    1 |
    |  2 |    2 |
    |  3 |    3 |
    +----+------+
    3 rows in set (0.01 sec)

  • एक आंतरिक जुड़ाव वह होता है जहां पहली तालिका से पंक्ति के लिए जुड़ने वाली तालिका में मिलान पंक्ति आवश्यक होती है
  • एक बाहरी जुड़ाव वह है जहां पहली तालिका से पंक्ति के लिए जुड़ने वाली तालिका में मिलान करने वाली पंक्ति की आवश्यकता नहीं होती है
  • एक प्राकृतिक जुड़ाव एक जुड़ाव है (आप या तो natural left या natural right ) जो शामिल मानदंड मानते हैं जहां दोनों तालिका मिलान में समान नामित कॉलम

मैं प्लेग जैसे प्राकृतिक जुड़ने का उपयोग करने से बचूंगा, क्योंकि प्राकृतिक जुड़ने हैं:

  • मानक एसक्यूएल नहीं है और इसलिए पोर्टेबल नहीं है, विशेष रूप से पठनीय नहीं (अधिकांश एसक्यूएल कोडर्स द्वारा) और संभवतः विभिन्न टूल्स / पुस्तकालयों द्वारा समर्थित नहीं है
  • जानकारीपूर्ण नहीं; आप यह नहीं बता सकते कि स्कीमा का जिक्र किए बिना कौन से कॉलम शामिल हो रहे हैं
  • आपकी जुड़ने की स्थितियां स्कीमा परिवर्तनों के लिए अनावश्यक रूप से कमजोर हैं - यदि कई प्राकृतिक कॉलम कॉलम हैं और एक ऐसे कॉलम को किसी तालिका से हटा दिया गया है, तो क्वेरी अभी भी निष्पादित होगी, लेकिन शायद सही नहीं है और व्यवहार में यह परिवर्तन चुप हो जाएगा
  • शायद ही प्रयास के लायक है; आप केवल टाइपिंग के लगभग 10 सेकंड बचा रहे हैं




sql