एक प्राकृतिक जोड़ और एक आंतरिक जुड़ाव में क्या अंतर है?
एक प्राकृतिक जोड़ और एक आंतरिक जुड़ाव में क्या अंतर है?
जवाबों:
INNER JOIN और NATURAL JOIN के बीच एक महत्वपूर्ण अंतर स्तंभों की वापसी की संख्या है।
विचार करें:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
INNER JOINकॉलम 1 पर टेबलए और टेबलबी की वापसी होगी
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
NATURAL JOINकॉलम 1 पर टेबलए और टेबलबी की वापसी होगी:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
दोहराया कॉलम से बचा जाता है।
(मानक व्याकरण से AFAICT, आप एक प्राकृतिक जुड़ने में शामिल होने वाले कॉलम को निर्दिष्ट नहीं कर सकते; सम्मिलित रूप से नाम-आधारित सख्ती है। विकिपीडिया भी देखें ।)
( भीतरी में एक धोखा है उत्पादन में शामिल होने के; a.और b.भागों स्तंभ नाम में नहीं होगा, तुम सिर्फ होगा column1, column2, column1, column3शीर्षकों के रूप में। )
NATURAL JOINबर्बाद होगा, यह अप्रत्याशित क्यों है, और आप किस दुनिया में हैं?
Customersऔर Employeesपर जुड़ना है EmployeeID। Employeesएक ManagerIDमैदान भी है । सब कुछ ठीक है। फिर, किसी दिन, कोई व्यक्ति तालिका में एक ManagerIDफ़ील्ड जोड़ता है Customers। आपका जुड़ाव नहीं टूटेगा (यह एक दया होगी), इसके बजाय अब इसमें एक दूसरा क्षेत्र शामिल होगा, और गलत तरीके से काम करेगा । इस प्रकार, एक प्रतीत होता है कि हानिरहित परिवर्तन केवल दूर से संबंधित किसी चीज को तोड़ सकता है। बहुत बुरा। केवल एक प्राकृतिक जुड़ाव ही थोड़ा टाइपिंग बचा रहा है, और नकारात्मक पक्ष पर्याप्त है।
SELECT * FROM TableA INNER JOIN TableB USING (Column1)4 कॉलम देता है। यह सही नहीं है क्योंकि SELECT * FROM TableA INNER JOIN TableB USING (Column1)और SELECT * FROM TableA NATURAL JOIN TableBसमान हैं, वे दोनों 3 कॉलम देते हैं।
natural leftया तो हो सकते हैं natural right) जो दोनों मानदंड में एक समान नाम वाले कॉलम होंमैं प्लेग की तरह प्राकृतिक जोड़ों का उपयोग करने से बचता हूँ, क्योंकि प्राकृतिक जुड़ाव हैं:
NATURAL JOIN Checkouts"केवल तभी संभव है जब डेटाबेस नामकरण
idइसमें शामिल होने के लिए सर्वव्यापी और बेकार है; सामान्य विदेशी प्रमुख नाम हैं tablename_id। प्राकृतिक जुड़ाव एक बुरा, बुरा, बुरा विचार है।
एक प्राकृतिक जुड़ाव टाइपिंग से बचने के लिए सिर्फ एक शॉर्टकट है, एक अनुमान के साथ कि जुड़ना सरल है और एक ही नाम के फ़ील्ड से मेल खाता है।
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
के समान है...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
शॉर्टकट प्रारूप के साथ आप क्या नहीं कर सकते हैं, हालांकि, अधिक जटिल जोड़ है ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
NATURAL JOIN ... USING ()? मानक a NATURAL JOIN bया तो हैa JOIN b USING (c)
room_number , , जबकि आपके आंतरिक में दो कॉलम होंगे room_number।
एसक्यूएल कई मायनों में रिलेशनल मॉडल के प्रति वफादार नहीं है। SQL क्वेरी का परिणाम एक संबंध नहीं है क्योंकि इसमें डुप्लिकेट नामों के साथ कॉलम हो सकते हैं, 'अनाम' (अनाम) कॉलम, डुप्लिकेट पंक्तियों, नल, आदि। SQL तालिकाओं को संबंधों के रूप में नहीं मानता है क्योंकि यह कॉलम ऑर्डरिंग आदि पर निर्भर करता है।
NATURAL JOINएसक्यूएल के पीछे विचार यह है कि रिलेशनल मॉडल के लिए अधिक वफादार होना आसान है। NATURAL JOINदो तालिकाओं के परिणाम में नाम से कॉलम डी-डुप्लिकेट होगा, इसलिए कोई अनाम कॉलम नहीं। इसी तरह, UNION CORRESPONDINGऔर EXCEPT CORRESPONDINGविरासत UNIONसिंटैक्स में कॉलम ऑर्डरिंग पर SQL की निर्भरता को संबोधित करने के लिए प्रदान किया जाता है ।
हालांकि, सभी प्रोग्रामिंग तकनीकों के साथ इसे उपयोगी होने के लिए अनुशासन की आवश्यकता होती है। एक सफल के लिए एक आवश्यकता NATURAL JOINको लगातार स्तंभों का नाम दिया जाता है, क्योंकि एक ही नाम वाले स्तंभों पर जुड़ाव होता है (यह शर्म की बात है कि SQL में कॉलम का नाम बदलने का सिंटैक्स क्रिया है, लेकिन साइड इफेक्ट्स अनुशासन को प्रोत्साहित करने के लिए है जब बेस टेबल्स में कॉलम का नामकरण किया जाता है) VIEWs :)
ध्यान दें कि एसक्यूएल 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 सिंटैक्टिक रूप से अलग-अलग लिखा जा सकता है, लेकिन शब्दार्थ समकक्ष, तरीके और यही वह है जो SQL ऑप्टिमाइज़र को इतना कठिन बनाता है विकसित करने के लिए।
यहाँ कुछ उदाहरण क्वेरीज़ ( सामान्य भागों और आपूर्तिकर्ताओं डेटाबेस का उपयोग करके ) जो शब्दार्थ के समकक्ष हैं:
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'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** संबंधपरक प्राकृतिक जुड़ाव एक समरूप नहीं है, यह एक का एक प्रक्षेपण है। - दार्शनिक
एक NATURALज्वाइन एक विशिष्ट INNER जॉइन के लिए सिर्फ शॉर्ट सिंटैक्स है - या "इक्वि-जॉइन" - और, एक बार सिंटैक्स अलिखित होने के बाद, दोनों एक ही रिलेशनल बीजगणित ऑपरेशन का प्रतिनिधित्व करते हैं। यह OUTER( LEFT/ RIGHT) या जॉइन के मामले के साथ जुड़ने का "अलग प्रकार" नहीं है CROSS।
विकिपीडिया पर समान-जुड़ाव अनुभाग देखें :
एक प्राकृतिक जुड़ाव, इक्वी-जॉन्स के एक और विशेषज्ञता प्रदान करता है। सम्मिलित तालिकाओं में दोनों स्तंभों में सभी स्तंभों की तुलना करके अंतर्निहित रूप से उत्पन्न होता है , जिसमें शामिल तालिकाओं में समान स्तंभ-नाम होते हैं। परिणामी सम्मिलित तालिका में समान रूप से नामित कॉलम की प्रत्येक जोड़ी के लिए केवल एक कॉलम होता है।
अधिकांश विशेषज्ञ इस बात से सहमत हैं कि NATURAL JOINs खतरनाक हैं और इसलिए उनके उपयोग को दृढ़ता से हतोत्साहित करते हैं। अनजाने में एक नए कॉलम को जोड़ने से खतरा है, जिसका नाम दूसरे कॉलम के समान है ...
यही है, सभी NATURALजॉइन्स को INNERजॉइन के रूप में लिखा जा सकता है (लेकिन काफिला सच नहीं है)। ऐसा करने के लिए, बस स्पष्ट रूप से विधेय बनाएं - जैसे USINGया ON- और, जैसा कि जोनाथन लेफ़लर ने बताया, यदि वांछित हो तो "डुप्लिकेट" से बचने के लिए वांछित परिणाम-सेट कॉलम चुनें।
खुश कोडिंग।
( NATURALकीवर्ड को भी जोड़ा LEFTऔर RIGHTजोड़ा जा सकता है , और वही लागू होता है। एक NATURAL LEFT/RIGHTजॉइन एक के लिए सिर्फ एक छोटा वाक्यविन्यास है विशिष्ट LEFT/RIGHT जुड़ने के ।)
प्राकृतिक जुड़ाव: यह दो तालिकाओं में सभी स्तंभों का संयोजन या संयुक्त परिणाम है। यह पहली तालिका की सभी पंक्तियों को दूसरी तालिका के संबंध में लौटाएगा।
इनर जॉइन: यह जॉइन तब तक काम करेगा जब तक कि कॉलम नाम में से कोई भी दो टेबलों में sxame नहीं होगा
एक प्राकृतिक जुड़ाव वह जगह है जहां सभी सामान्य स्तंभों के आधार पर 2 तालिकाओं को जोड़ा जाता है।
सामान्य स्तंभ: एक स्तंभ है जिसका दोनों तालिकाओं में एक ही नाम है + दोनों तालिकाओं में संगत डेटाटाइप हैं। आप केवल = ऑपरेटर का उपयोग कर सकते हैं
इनर जॉइन वह जगह है, जहां ON क्लॉज में बताए गए सामान्य कॉलम के आधार पर 2 टेबल्स को मिलाया जाता है।
सामान्य स्तंभ: एक ऐसा स्तंभ है जिसमें दोनों तालिकाओं में संगत डेटाटाइप होते हैं, लेकिन उनका नाम समान नहीं होता है। आप की तरह ही किसी भी तुलना ऑपरेटर का उपयोग कर सकते हैं =, <=, >=, <, >,<>
अंतर यह है कि आंतरिक (इक्वी / डिफॉल्ट) सम्मिलित होते हैं और स्वाभाविक रूप से शामिल होते हैं कि प्राकृतिक कॉलम में कॉमन कॉइन जीत एक समय में प्रदर्शित होगी, लेकिन सामान्य कॉलम में इनर / इक्वी / डिफॉल्ट / सिंपल शामिल होने पर डबल समय प्रदर्शित होगा।
इनर जॉइन और नेचुरल जॉइन लगभग एक जैसे होते हैं लेकिन उनके बीच थोड़ा अंतर होता है। अंतर स्वाभाविक रूप से है शर्त को निर्दिष्ट करने की कोई आवश्यकता नहीं है, लेकिन आंतरिक जुड़ने की स्थिति अनिवार्य है। यदि हम आंतरिक जुड़ने की स्थिति को निर्दिष्ट करते हैं, तो परिणामी सारणी एक कार्टेशियन उत्पाद की तरह है।
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)
इनर जॉइन, दो टेबल से जुड़ें जहां कॉलम का नाम समान है।
प्राकृतिक जुड़ाव, दो तालिका में शामिल हों जहां कॉलम नाम और डेटा प्रकार समान हैं।