2014-10-03 2 views
6

में मैं एसक्यूएल के लिए नया हूँ और मुसीबत समझ क्यों वहाँ एक JOIN बयान में एक FROM कीवर्ड अगर मैं डॉट संकेतन का उपयोग tables.columns है कि मैं चयन करने के लिए हो रहा है। क्या इससे कोई फर्क नहीं पड़ता कि मैं किस तालिका में से चुनता हूं? मुझे w3schools परिभाषा में इस के लिए कोई स्पष्टीकरण नहीं मिला है जिस पर तालिका FROM तालिका है। नीचे दिए गए उदाहरण में, मुझे कैसे पता चलेगा कि FROM के लिए कौन सी तालिका चुननी है? चूंकि मैं अनिवार्य रूप से पहले ही चुना गया है कि table.column चुनने के लिए, क्या यह हो सकता है?जो तालिका का चयन करने के बारे में बताएं "from" शामिल हों बयान

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

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers 
INNER JOIN Orders 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 
+2

उत्पन्न होगा कोड वे दोनों तालिकाओं से ..., आप आदेश से कहते हैं और ग्राहकों में शामिल होने और क्वेरी ही वापस आ जाएगी कर सकते हैं परिणाम अगर यह एक आंतरिक शामिल है। बाईं ओर शामिल होने पर, "से" तालिका बाएं टेबल है। जब मैंने एसक्यूएल का उपयोग करना शुरू किया तो यह मुझे उलझन में डाल दिया, इसलिए एक बाएं जुड़ना एक ही चीज है जो बाईं ओर एकमात्र अंतर में शामिल होता है सिंटैक्स – CSharper

+0

हां है। यह या तो हो सकता है। आपके उदाहरण में, दो टेबल नामों को बदल दिया जा सकता है, और पंक्तियां वापस वही होंगी। (जहां टेबल नामों का प्लेसमेंट "बाहरी" ऑपरेशन ऑपरेशन के साथ होता है, यानी "एक बाएं जॉइन बी" "बी राइट जॉइन ए" के बराबर है, लेकिन यह "एक सही जॉइन बी" से अलग है। – spencer7593

+0

'FROM' तालिका की परिभाषा के रूप में: आप वास्तव में "से" का चयन कर रहे हैं, जो ऑपरेशन से परिणाम है, एक टेबल या अन्य नहीं। एसक्यूएल क्या निर्दिष्ट कर रहा है दो टेबल पर "जुड़ें" ऑपरेशन है " ग्राहक आदेश जारी करते हैं ... '"क्वेरी शामिल होने के परिणाम से" से "चयन कर रही है। (समानता तुलना में अभिव्यक्तियों का क्रम कोई फर्क नहीं पड़ता।' A.col = b.col' है 'b.col = a.col' निर्दिष्ट करने के बराबर; समानता तुलना ऑपरेटर की एक संपत्ति।) क्वेरी में सभी * कॉलम संदर्भों को अर्हता प्राप्त करने का सर्वोत्तम अभ्यास है (जैसा कि आपके उदाहरण में दिखाया गया है।) – spencer7593

उत्तर

6

आदेश INNER JOIN में कोई फर्क नहीं पड़ता।

हालांकि, यह LEFT JOIN और RIGHT JOIN में कोई फर्क नहीं पड़ता। LEFT JOIN में, FROM खंड में तालिका प्राथमिक तालिका है; परिणाम में इस तालिका से चुनी गई प्रत्येक पंक्ति होगी, जबकि LEFT JOIN तालिका में नामित पंक्तियां गायब हो सकती हैं (परिणामस्वरूप ये कॉलम NULL होंगे)। RIGHT JOIN समान है लेकिन रिवर्स: FROM में नाम की गई तालिका में पंक्तियां गायब हो सकती हैं।

उदाहरण के लिए, यदि आप LEFT JOIN का उपयोग करने के लिए अपनी क्वेरी बदलते हैं, तो आप ग्राहकों को कोई ऑर्डर नहीं देंगे। लेकिन अगर आपने टेबल के ऑर्डर को बदल दिया है और LEFT JOIN का उपयोग किया है, तो आप इन ग्राहकों को नहीं देख पाएंगे। आप किसी ग्राहक के साथ ऑर्डर नहीं देख पाएंगे (हालांकि ऐसी पंक्तियां शायद मौजूद नहीं होनी चाहिए)।

1

एक inner join यह कोई बात नहीं जो मेज from खंड में है और जो join खंड में है। outer join एस के लिए यह निश्चित रूप से मायने रखता है, क्योंकि outer join में तालिका को "गायब" रिकॉर्ड होने की अनुमति है।

4

से कथन से तालिका में शामिल होने का संदर्भ नहीं है। तालिका में शामिल होने से एक सेट तैयार होगा जिससे आप कॉलम का चयन करेंगे।

+1

+1। क्या क्वेरी "से" का चयन कर रहा है परिणामस्वरूप ऑपरेशन द्वारा निर्दिष्ट परिणामसेट, एक टेबल या अन्य नहीं। – spencer7593

1

यह आंतरिक जुड़ने के लिए कोई फर्क नहीं पड़ता: ऑर्डर करने के लिए आपकी पसंद के बावजूद ऑप्टिमाइज़र तालिकाओं को पढ़ने का उचित अनुक्रम पता लगाएगा।

दिशात्मक बाहरी जुड़ने के लिए, इससे कोई फर्क नहीं पड़ता, क्योंकि ये सममित नहीं हैं। आप उस तालिका को चुनते हैं जिसमें आप बाएं बाहरी जुड़ने में पहले FROM तालिका के लिए सभी पंक्तियां रखना चाहते हैं; सही बाहरी शामिल होने के लिए यह दूसरी तरफ है।

पूर्ण बाहरी जुड़ने के लिए यह फिर से कोई फर्क नहीं पड़ता, क्योंकि पूर्ण बाहरी जोड़ों में तालिकाओं को एक दूसरे के साथ समरूप रूप से उपयोग किया जाता है।

ऐसी स्थितियों में जब कोई फर्क नहीं पड़ता कि आप अपने SQL कथन के पाठक को "प्राकृतिक" होने का आदेश चुनते हैं, जो आपके मॉडल के लिए जो कुछ भी है। एसक्यूएल प्रश्न बहुत जल्दी पढ़ने के लिए कठिन हो जाते हैं, इसलिए आपके प्रश्नों के मानव पाठकों के लिए आपकी तालिकाओं का उचित क्रम महत्वपूर्ण है।

0

आपके वर्तमान उदाहरण में ऑपरेटर से दोनों टेबल पर लागू किया जा सकता है।

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers,Orders 
WHERE Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 

-> अपने कोड

अल्पविराम दो तालिकाओं में शामिल हो जाएगा की तरह काम करेगा।

केवल यही अर्थ है कि आप किस तालिका से डेटा पुनर्प्राप्त कर रहे हैं।

आपके उदाहरण में, आप विभिन्न वाक्यविन्यास का उपयोग करके दो तालिकाओं में शामिल हो गए। यह भी हो सकता था:

SELECT Customers.CustomerName, Orders.OrderID 
FROM Orders 
INNER JOIN Customers 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 

सब लिखा एक ही परिणाम

+6

अच्छा एक्सपैम्प लेस, लेकिन मैं लिखने वाले प्रश्नों के खिलाफ अत्यधिक सलाह दूंगा जैसे कि आप पहले उदाहरण में करते हैं – CSharper

+0

क्या आप समझा सकते हैं? –

+1

यह मैला सिंटैक्स है और इसे अकेले पढ़ने के लिए डीबग/एन्हांस करना मुश्किल है। यदि आप 4 टेबल में शामिल हो रहे थे तो यह जल्दी गन्दा हो जाएगा। इस पोस्ट पर एक नज़र डालें, मैंने पाया कि http://stackoverflow.com/questions/11251751/which-join-syntax-is-better – CSharper

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