अब, इस तथ्य के अलावा कि पहले फॉर्म में डुप्लिकेट कॉलम है, क्या अन्य दो रूपों का वास्तविक लाभ है? या वे सिर्फ वाक्य रचनात्मक चीनी हैं?
टी एल; डॉ प्राकृतिक शामिल हों रिलेशनल प्रोग्रामिंग की एक निश्चित शैली है कि हमेशा की तरह एसक्यूएल शैली से अधिक सरल है प्रयोग किया जाता है। (हालांकि जब एसक्यूएल में एम्बेडेड यह एसक्यूएल क्वेरी सिंटैक्स के बाकी के साथ बोझ है।) ऐसा इसलिए है क्योंकि 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 WHERE
condition
पंक्तियों को रखती है जहां टी (...) और हालत
T UNION CORRESPONDING U
पंक्तियों जहां टी (...) या यू (...)
T EXCEPT CORRESPONDING U
पंक्तियों धारण रखती है जहां टी (...) न कि यू (...)
SELECT DISTINCT
columns to keep
FROM T
ड्रॉप करने पंक्तियों जहां
वहां कॉलम मौजूद रखती ऐसी टी (...)
- आदि
कि
जबकि एसक्यूएल के बारे में तर्क नहीं तो है ... "प्राकृतिक" नहीं:
एक एसक्यूएल SELECT कथन बीजगणित के रूप में 1. परोक्ष (संभवतः छुपा हुआ) सहसंबंध नाम T
T.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 के माध्यम से नाम बदलें।
क्या आपको कॉलम की संख्या मिलती है? एनएनएसआई/आईएसओ एसक्यूएल के अनुसार प्राकृतिक जॉइन और जॉइन जॉइनिंग डुप्लीकेट कॉलम को हटाना है। बीटीडब्लू, 'प्राकृतिक जॉइन' अनुप्रयोग लिखते समय 'चयन *' के रूप में बेवकूफ है, अगर किसी तालिका में एक ही नाम के साथ एक कॉलम जोड़ा गया है तो यह टूट जाएगा ... – jarlh
@jarlh पहला व्यक्ति 'डिप्टी' को डुप्लिकेट करता है कॉलम, जबकि अन्य दो नहीं करते हैं। – Manngo