2016-01-27 6 views
5

कल्पना कीजिए मैं जैसे दो सरल टेबल, है:आंतरिक जुड़ें बनाम बनाम बनाम बनाम खंड में शामिल हों: क्या कोई फायदे हैं?

CREATE TABLE departments(dept INT PRIMARY KEY, name); 
CREATE TABLE employees(id PRIMARY KEY, fname, gname, 
    dept INT REFERENCES departments(dept)); 

(निश्चित रूप से सरल,)।

मैं निम्नलिखित बयानों में से किसी भी हो सकता है:

SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept; 
SELECT * FROM employees e NATURAL JOIN departments d; 
SELECT * FROM employees e JOIN departments d USING(dept); 

एक काम कर उदाहरण यहां पाया जा सकता: SQL Fiddle: http://sqlfiddle.com/#!15/864a5/13/10

वे सब लगभग एक ही परिणाम दे - निश्चित रूप से एक ही पंक्तियों।

मैंने हमेशा इसकी लचीलापन, पठनीयता और भविष्यवाणी की वजह से पहला फॉर्म पसंद किया है - आप स्पष्ट रूप से परिभाषित करते हैं कि क्या जुड़ा हुआ है।

अब, इस तथ्य के अलावा कि पहले फॉर्म में डुप्लीकेट कॉलम है, क्या अन्य दो रूपों का वास्तविक लाभ है? या वे सिर्फ वाक्य रचनात्मक चीनी हैं?

मैं बाद के रूपों में नुकसान देख सकता हूं कि आप अपनी प्राथमिक और विदेशी कुंजी को समान नाम देने की उम्मीद कर रहे हैं, जो हमेशा व्यावहारिक नहीं होता है।

+0

क्या आपको कॉलम की संख्या मिलती है? एनएनएसआई/आईएसओ एसक्यूएल के अनुसार प्राकृतिक जॉइन और जॉइन जॉइनिंग डुप्लीकेट कॉलम को हटाना है। बीटीडब्लू, 'प्राकृतिक जॉइन' अनुप्रयोग लिखते समय 'चयन *' के रूप में बेवकूफ है, अगर किसी तालिका में एक ही नाम के साथ एक कॉलम जोड़ा गया है तो यह टूट जाएगा ... – jarlh

+0

@jarlh पहला व्यक्ति 'डिप्टी' को डुप्लिकेट करता है कॉलम, जबकि अन्य दो नहीं करते हैं। – Manngo

उत्तर

1

अब, इस तथ्य के अलावा कि पहले फॉर्म में डुप्लिकेट कॉलम है, क्या अन्य दो रूपों का वास्तविक लाभ है? या वे सिर्फ वाक्य रचनात्मक चीनी हैं?

टी एल; डॉ प्राकृतिक शामिल हों रिलेशनल प्रोग्रामिंग की एक निश्चित शैली है कि हमेशा की तरह एसक्यूएल शैली से अधिक सरल है प्रयोग किया जाता है। (हालांकि जब एसक्यूएल में एम्बेडेड यह एसक्यूएल क्वेरी सिंटैक्स के बाकी के साथ बोझ है।) ऐसा इसलिए है क्योंकि 1. यह सीधेविधेय तर्क, इंजीनियरिंग में परिशुद्धता के भाषा की सरल ऑपरेटर का उपयोग करते है (सॉफ्टवेयर इंजीनियरिंग सहित), विज्ञान (कंप्यूटर साइंस) और गणित, और इसके अलावा 2. एक साथ और वैकल्पिक रूप से यह सहित सीधेसंबंधपरक बीजगणित की सरल ऑपरेटरों उपयोग करता है।

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

उसी शिविर से एक और संबंधित गलत कॉन्फिसिड विशिष्ट शिकायत यह है कि "NATURAL JOIN does not even take foreign key relationships into account"। लेकिन any join is there because of the table meanings, not the constraints। पूछताछ के लिए बाधाओं की आवश्यकता नहीं है।यदि एक बाधा जोड़ा जाता है तो एक क्वेरी सही बनी हुई है। एक बाधा तो एक प्रश्न गिरा दिया गया है, तो यह पर निर्भर गलत हो जाता है और एक वाक्यांश कि यह पर भरोसा नहीं है कि बदलने के लिए नहीं पड़ता था करने के लिए परिवर्तित किया जाना चाहिए। इसमें प्राकृतिक जॉइन के साथ कुछ लेना देना नहीं है।


आपने अंतर को प्रभावी रूप से वर्णित किया है: प्रत्येक सामान्य कॉलम की केवल एक प्रति वापस आती है।

Is there any rule of thumb to construct SQL query from a human-readable description? से:

ऐसा लगता है कि प्राकृतिक भाषा अभिव्यक्ति और तार्किक अभिव्यक्ति और संबंधपरक बीजगणित भाव और SQL भाव (पिछले दो का एक संकर) एक नहीं बल्कि सीधा रास्ता में अनुरूप हैं।

Codd 1970 से उदाहरण के लिए:

संबंध दर्शाया घटक कहा जाता है। [...] घटक (एक्स, y, z) के अर्थ वह हिस्सा एक्स है हिस्सा y इसके बारे में तुरंत घटक (या उप-असेंबली), और z इकाइयों की है भाग x भाग y की एक इकाई को इकट्ठा करने की आवश्यकता है।

this answer से:

हर आधार तालिका एक बयान टेम्पलेट, उर्फ ​​विधेय, स्तंभ नाम से parameterized, जिसके द्वारा हम में एक पंक्ति में कहें या इसे बाहर छोड़ दिया है।

एक विधेय में एक पंक्ति Plugging प्रस्ताव उर्फ ​​एक बयान देता है। एक पंक्ति में एक वास्तविक प्रस्ताव बनाने वाली पंक्तियां और पंक्तियां जो झूठी प्रस्ताव बनाती हैं, बाहर रहती हैं। (तो एक मेज प्रत्येक वर्तमान पंक्ति के प्रस्ताव में कहा गया है और प्रत्येक अनुपस्थित पंक्ति के प्रस्ताव नहीं कहा गया है।)

लेकिन हर तालिका अभिव्यक्ति मूल्य अपनी अभिव्यक्ति प्रति एक विधेय है। संबंधपरक मॉडल बनाया गया है ताकि अगर टेबल T और U पकड़ पंक्तियों जहां टी (...) और यू (...) (क्रमशः) तो:

  • T NATURAL JOIN U पंक्तियों रखती है जहां टी (...) और यू (...)
  • T WHEREcondition पंक्तियों को रखती है जहां टी (...) और हालत
  • T UNION CORRESPONDING U पंक्तियों जहां टी (...) या यू (...)
  • T EXCEPT CORRESPONDING U पंक्तियों धारण रखती है जहां टी (...) न कि यू (...)
  • SELECT DISTINCTcolumns to keepFROM T ड्रॉप करने पंक्तियों जहां
    वहां कॉलम मौजूद रखती ऐसी टी (...)
  • आदि
कि

जबकि एसक्यूएल के बारे में तर्क नहीं तो है ... "प्राकृतिक" नहीं:

एक एसक्यूएल SELECT कथन बीजगणित के रूप में 1. परोक्ष (संभवतः छुपा हुआ) सहसंबंध नाम TT.C के साथ एक मेज के प्रत्येक स्तंभ C RENAMEing के बारे में सोचा जा सकता है , फिर 2. क्रॉस जॉइनिंग, फिर 3. प्रति प्रवेश पर, फिर 4. फिर से प्रतिबंधित, फिर 5. प्रति चयन परियोजना, फिर 6. प्रति चयन नामांकन, T. एस छोड़कर, 7. शेष T. एस छोड़ने के लिए निहित रूप से नामांकन T. -RENAMEings बीजगणित ऑपरेटरों के बीच तर्क भविष्यवाणियों और तालिका नामों को उनके भविष्यवाणियों के रूप में भी माना जा सकता है: T JOIN ... बनाम Employee T.EMPLOYEE has name T.NAME ... AND ...। लेकिन एक चयन कथन के अंदर अवधारणात्मक रूप से कॉलम नामों के लिए T.C एस के साथ एक डबल-रेन-प्रेरण क्रॉस जॉइन टेबल है, जबकि बाहरी तालिकाओं में कॉलम नामों के लिए C एस है।

वैकल्पिक रूप से एक SQL SELECT कथन T.C का उपयोग कर का उल्लेख करने से तार्किक 1. के रूप में, तो 2. मात्रा निर्धारित T का मूल्य की चर्चा करते हुए प्रति सहसंबंध नाम T और आधार का नाम या सबक्वेरी E पूरे बयान के आसपास FORSOME T IN E शुरू करने के बारे में सोचा जा सकता है इसके C भाग, फिर 3. T.C से प्रति परिणाम परिणाम पंक्तियों का निर्माण, फिर 4. चयन खंड के अनुसार परिणाम पंक्ति कॉलम नामकरण, फिर 4. FORSOME एस के दायरे को छोड़कर। फिर बीजगणित ऑपरेटरों को उनके भविष्यवाणियों के रूप में तर्क ऑपरेटर और तालिका के नाम के रूप में सोचा जा रहा है। फिर भी, इस अवधारणा में T.C SELECT के अंदर है लेकिन C सहसंबंध नाम आने और जाने के साथ बाहर है।

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

उपयोग करना है प्राकृतिक जॉइन शिविर में एक पैर के साथ एक मध्यम मध्य अनाथ और क्रॉस जॉइन में से एक। पूर्व में इसकी कोई वास्तविक भूमिका नहीं है क्योंकि वहां कोई डुप्लिकेट कॉलम नाम नहीं हैं। उत्तरार्द्ध में यह जॉइन स्थितियों और चयन खंडों को संक्षेप में संक्षिप्त या कम करता है।

मैं बाद के रूपों में नुकसान देख सकता हूं कि आप अपनी प्राथमिक और विदेशी कुंजी को समान नाम देने की उम्मीद कर रहे हैं, जो हमेशा व्यावहारिक नहीं होता है।

पीके (प्राथमिक कुंजी), एफके (विदेशी कुंजी) & पूछताछ के लिए अन्य बाधाओं की आवश्यकता नहीं है। (कॉलम को जानना दूसरों का एक कार्य स्केलर सबक्वायरीज़ की अनुमति देता है, लेकिन आप बिना वाक्यांश के हमेशा वाक्यांश कर सकते हैं।) इसके अलावा किसी भी दो टेबल का अर्थपूर्ण रूप से शामिल हो सकता है। यदि आपको प्राकृतिक कॉल के साथ एक ही नाम रखने के लिए दो कॉलम चाहिए तो आप SELECT AS के माध्यम से नाम बदलें।

+0

इसे अवशोषित करने के लिए मुझे एक दिन या तो दें। आप जो कहते हैं, उससे ऐसा लगता है कि 'जॉइन' ... ओएन सामान्य अभ्यास हो सकता है, 'प्राकृतिक जॉइन' स्वाभाविक रूप से संबंधपरक डेटाबेस के पीछे बीजगणितीय प्रिंसिपल को प्रतिबिंबित करता है ...? – Manngo

+0

आपके व्यापक, अगर भारी, उत्तर के लिए धन्यवाद। मैं इस से निष्कर्ष निकाला हूं कि सामान्य 'इनर जॉइन' वाक्यविन्यास शायद एसक्यूएल पॉइंट व्यू से अधिक उपयोगी है (सादगी के खर्च पर इसकी लचीलापन दिया गया है), और यही वह है जो मैं सामान्य तालिकाओं के लिए उपयोग और शिक्षण रखता हूं। 'प्राकृतिक जॉइन' संबंधपरक डेटाबेस के गणित और तर्क को ध्यान में रखते हुए अधिक है। यह याद रखने में मदद करता है कि यद्यपि एसक्यूएल संबंधपरक डेटाबेस की _de facto_ मानक भाषा है, लेकिन यह समानार्थी नहीं है। – Manngo

+0

हां, विनिर्देश, डिज़ाइन और पूछताछ की एक शैली है जो एक साथ जाने पर एसक्यूएल की नींव से अच्छी तरह से suported नहीं है। पीएस एसक्यूएल के साथ काम करते समय यह दृष्टिकोण एक उपयोगी उपकरण है। जैसे "तर्क और एसक्यूएल" पर क्रिस डेट के अध्याय देखें और "एसक्यूएल एक्सप्रेशन बनाने के लिए तर्क का प्रयोग करें"। – philipxy

0

Oracle documentation से:

एक प्राकृतिक शामिल हों एक आपरेशन में शामिल हों कि एक अंतर्निहित में शामिल होने के खंड दो तालिकाओं में आम स्तंभों के आधार पर आप जुड़े हुए जा रहा के लिए बनाता है। सामान्य कॉलम कॉलम होते हैं जिनके नाम दोनों सारणी में समान नाम होते हैं।

एक प्राकृतिक जॉइन एक INNER शामिल हो सकता है, एक बाएं बाहरी शामिल हो सकता है, या एक दाएं बाहरी शामिल हो सकता है। डिफ़ॉल्ट INNER शामिल है।

खंड

TableA JOIN tableB USING(column) 

TableA JOIN tableB ON tableA.column = tableB.column 
+0

सिवाय इसके कि केवल एक बार रिटर्न कॉलम का उपयोग करने में शामिल हों, लेकिन जॉइन दोनों tableA.column और tableB.column ... – jarlh

1

टाइपिंग के लिए शामिल हों प्रदर्शन करती एक अंदरूनी डिफ़ॉल्ट रूप से शामिल होने के रूप में आप का उल्लेख किया, है, बस वाक्यात्मक चीनी। तो:

SELECT * FROM employees e INNER JOIN departments d USING(dept); 

SELECT * FROM employees e JOIN departments d USING(dept); 

के बराबर है और आप परिणाम में केवल एक ही विभाग स्तंभ होगा।

उसी तरह

SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept; 

में

SELECT * FROM employees e JOIN departments d ON e.dept=d.dept; 

के बराबर है, लेकिन आप परिणाम में एक नकली विभाग कॉलम होगा।

INNER JOIN पढ़ने के लिए आसान है, खासकर यदि आपकी क्वेरी में अन्य शामिल प्रकार हैं (बाएं या दाएं या ..) इसमें शामिल है।

NATURAL JOIN दोनों तालिका मिलान में समान नाम वाले कॉलम मानते हैं। तो तुम कर्मचारियों तालिका अपने में शामिल होने के कॉलम "विभाग" नाम दिया गया है में और अपने विभागों तालिका में अपने शामिल होने के कॉलम "विभाग" नाम दिया गया है

+0

प्राकृतिक जॉइन और एक डिप्टी कॉलम लौटने में शामिल हों, नियमित जॉइन दो डिप्टी कॉलम लौटाता है। – jarlh

0

NATURAL JOIN के रूप में व्यापक रूप से समर्थित नहीं है एक NATURAL JOIN उदाहरण के लिए अगर ऐसा नहीं कर सकते और न JOIN USING (यानी नहीं है एसक्यूएल सर्वर में)

प्राकृतिक जॉइन के लिए कई तर्क हैं जो एक बुरा विचार है। व्यक्तिगत रूप से मुझे लगता है कि शामिल होने जैसी चीज़ों का स्पष्ट रूप से नामकरण करना आपदा को आमंत्रित नहीं कर रहा है।

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

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

उन कारणों से, यदि आप अभी एसक्यूएल सीख रहे हैं, तो इनका उपयोग करने की आदत के प्राप्त करें।

+0

मैं मानता हूं कि जॉइन पर नियंत्रण नहीं लेना समस्याएं आमंत्रित कर रहा है। निजी तौर पर, मैंने हमेशा बनाए रखा है कि एक तालिका में कॉलम नाम किसी अन्य तालिका में उन लोगों से स्वतंत्र होना चाहिए। यह एक प्राकृतिक जॉइन को सबसे अच्छा जोखिम भरा बना देगा। – Manngo

संबंधित मुद्दे