मैं जटिल एसक्यूएल प्रश्नों को कैसे लिख सकता हूँ? [बन्द है]


42

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

ध्यान दें कि मैं एसक्यूएल हूं जो मुझे लिखने के लिए कहा जा रहा है वह एक डेटाबेस कोर्स के लिए होमवर्क असाइनमेंट का हिस्सा है, इसलिए मुझे ऐसा सॉफ्टवेयर नहीं चाहिए जो मेरे लिए काम करे। मैं वास्तव में उस कोड को समझना चाहता हूं जो मैं लिख रहा हूं।

अधिक तकनीकी विवरण:

  • डेटाबेस को स्थानीय मशीन पर चलने वाले PostgreSQL सर्वर पर होस्ट किया जाता है।
  • डेटाबेस बहुत छोटा है: सात से अधिक टेबल नहीं हैं और सबसे बड़ी तालिका में लगभग 50 पंक्तियाँ हैं।
  • SQL क्वेरी को सर्वर से अपरिवर्तित किया जा रहा है, लिबरऑफिस बेस के माध्यम से।

अस्थायी विचार वास्तव में काफी उपयोगी है क्योंकि आप ऐसी तालिका (जैसे स्पष्ट जटिल अनुक्रमित) के लिए चीजों को कर सकते हैं जो SQL पार्सर को इंगित करने के लिए बहुत कठिन है।

निजी तौर पर, मुझे GUI (जैसे लिब्रेऑफिस बेस "क्रिएट क्वेरी इन डिज़ाइन व्यू" या ऑफिस एक्सेस "क्रिएट"> "क्वेरी डिज़ाइन") का उपयोग करके धोखा देना आसान लगता है और फिर एसक्यूएल का निर्माण करता है। कभी-कभी GUI डिज़ाइनर द्वारा दिए गए SQL को संशोधित करना आवश्यक होता है, लेकिन यह एक अच्छा शुरुआती बिंदु देता है
kurdtpage

जवाबों:


49

मैं इसे "सही" उत्तर प्राप्त करने की कोशिश कर रहा हूं, इसलिए आप सबसे अधिक आधार दे रहे हैं, इसलिए आपको पता चल सकता है कि कुछ प्रदर्शन मुद्दे हैं। गलत क्वेरी को तेज करने का कोई मतलब नहीं है।

तालिका संबंधों को समझें - अधिकांश एक से कई होंगे। "कई" तालिका को जानें। अपने जॉइन के लिए जरूरी फील्ड्स को पहचानें।

परिदृश्य से जुड़ने के बारे में सोचें - पिछले महीने से सभी कर्मचारियों और उनके पेचेक का चयन करें। अगर उन्हें पिछले महीने तनख्वाह नहीं मिली तो क्या होगा?

परिणाम सेट को जानें: 1) एक स्प्रेडशीट में, मैन्युअल रूप से अपनी क्वेरी के लिए कम से कम एक सही रिकॉर्ड दर्ज करें। 2) कितने रिकॉर्ड वापस किए जाने चाहिए, यह पहचानने के लिए सरल रूप में क्वेरी लिखें। अपनी तालिका का परीक्षण करने के लिए इन दोनों का उपयोग करके सुनिश्चित करें कि नई तालिका में शामिल होने से परिणाम में परिवर्तन नहीं होता है।

प्रबंधनीय भागों में अपनी क्वेरी को तोड़ें - आपको इसे एक बार में लिखने की ज़रूरत नहीं है। जटिल प्रश्न कभी-कभी सरल प्रश्नों का संग्रह हो सकते हैं।

एकत्रीकरण के मिश्रित स्तरों से सावधान रहें : यदि आपको एक ही परिणाम सेट में मासिक, त्रैमासिक और वर्ष-दर-वर्ष के मूल्यों को रखना है, तो आपको अलग-अलग मूल्यों पर रखे गए प्रश्नों में उन्हें अलग से गणना करने की आवश्यकता होगी।

जानिए कब करें UNION कभी-कभी उपसमूहों को अपने स्वयं के चुनिंदा बयानों में तोड़ना आसान होता है। यदि आपके पास प्रबंधकों और अन्य कर्मचारियों के साथ मिली-जुली एक तालिका है, और प्रत्येक स्तंभ पर आपको इनमें से किसी एक समूह में सदस्यता के आधार पर केस स्टेटमेंट करना है, तो एक कर्मचारी क्वेरी के लिए प्रबंधक क्वेरी और यूनियन लिखना आसान हो सकता है। हर एक का अपना तर्क होगा। विभिन्न तालिकाओं में विभिन्न तालिकाओं से आइटम शामिल करना एक स्पष्ट उपयोग है।

कॉम्प्लेक्स / नेस्टेड फॉर्मूले - लगातार इंडेंट करने की कोशिश करें और कई लाइनों का इस्तेमाल करने से न डरें। "जब भी आपको पता चल जाता है, तो आपको पागल कर देगा।" इन के माध्यम से सोचने का समय निकालें। पिछले के लिए जटिल बछड़ों को बचाओ। सबसे पहले सही रिकॉर्ड प्राप्त करें। फिर आप जटिल सूत्रों पर हमला करते हुए जानते हैं कि आप सही मूल्यों के साथ काम कर रहे हैं। फ़ार्मुलों में उपयोग किए गए मानों को देखने से आपको उन क्षेत्रों को देखने में मदद मिलेगी, जहाँ आपको NULL मानों के लिए और जहाँ शून्य त्रुटि के लिए डिवाइड को हैंडल करना है।

यह सुनिश्चित करने के लिए कि आप अभी भी वांछित परिणाम सेट प्राप्त कर रहे हैं और यह जानना कि कौन-सी जॉइन या क्लॉज है, अपराधी बनाने के लिए नए टेबल जोड़ते हैं।


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

@CodexArcanum - और जब आप बड़े डेटा पर प्रश्नों को चलाते हैं, तो यह TOP का उपयोग करने के लिए चोट नहीं
पहुंचाता है

मैं आपके सुझाव के हर कथन पर सहमत हूं
एलेसेंड्रो रॉसी

28
  1. इंडेंटेशन पहली चीज होगी, अगर आप इसे पहले से नहीं कर रहे हैं। न केवल सरल प्रश्नों के साथ यह उपयोगी है, लेकिन जब यह जुड़ता है और प्रश्नों की तुलना में थोड़ा अधिक जटिल होता है, तो यह महत्वपूर्ण है select top 1 [ColumnName] from [TableName]

  2. एक बार ठीक से इंडेंट करने के बाद , जब उचित हो, क्वेरी के अंदर टिप्पणी जोड़ने के लिए कुछ भी मना नहीं करता है । इनका अधिक उपयोग न करें: यदि कोड पर्याप्त स्पष्ट है, तो टिप्पणियां जोड़ने से कोड की स्पष्टता को नुकसान होगा। लेकिन वे क्वेरी के कम स्पष्ट भागों के लिए अभी भी स्वागत करते हैं।

    ध्यान दें कि लंबे समय तक क्वेरीज़ (टिप्पणियों के साथ प्रश्नों सहित) का अर्थ आपके एप्लिकेशन सर्वर और आपके डेटाबेस सर्वर के बीच बड़े बैंडविड्थ उपयोग से होगा। यह भी ध्यान दें कि जब तक आप Google-उत्पाद पर प्रति सेकंड भारी मात्रा में अनुरोधों के साथ काम नहीं कर रहे हों, असाधारण प्रदर्शन और संसाधनों के उपयोग की आवश्यकता होती है, तो टिप्पणियों द्वारा जोड़ा गया आकार प्रदर्शन के मामले में आपके लिए कुछ भी नहीं बदल सकता है।

  3. तालिकाओं, स्तंभों आदि पर समान शैली लागू करने से पठनीयता को बहुत मदद मिलती है। एक विरासत डेटाबेस तालिकाओं है जब PRODUCT, users, USERS_ObsoleteDONT_USE, PR_SHIPMENTSऔर HRhbYd_UU, किसी को कुछ बहुत गलत कर रही है।

  4. प्रश्नों पर एक ही शैली लागू करना भी महत्वपूर्ण है। उदाहरण के लिए यदि आप Microsoft SQL सर्वर के लिए क्वेरी लिख रहे हैं और आपने [TableName]इसके बजाय उपयोग करने का निर्णय लिया है TableName, तो इसके साथ रहें। यदि आप एक के बाद एक नई लाइन पर जाते हैं select, तो इसे केवल अपने आधे प्रश्नों में न करें, लेकिन उनमें से सभी।

  5. इसका उपयोग न करें* , जब तक कि इसे करने के मजबूत कारण न हों (जैसे if exists(select * from [TableName] where ...)Microsoft SQL सर्वर में)। न केवल *कुछ (यदि अधिकांश नहीं) डेटाबेस में नकारात्मक प्रदर्शन प्रभाव पड़ता है, लेकिन यह डेवलपर के लिए भी उपयोगी नहीं है जो आपकी क्वेरी का उपयोग करता है। उसी तरह, एक डेवलपर को नाम द्वारा मानों का उपयोग करना चाहिए, कभी भी सूचकांक द्वारा नहीं।

  6. अंत में, चयन के लिए, एक दृश्य प्रदान करने में कुछ भी गलत नहीं है । किसी और चीज़ के लिए, संग्रहीत कार्यविधियाँ परियोजना और उन लोगों के आधार पर भी उपयोग की जा सकती हैं, जिनके साथ आप काम कर रहे हैं।


Stored कुछ लोग संग्रहीत प्रक्रियाओं से नफरत करते हैं। अन्य उन्हें कई के लिए पसंद नहीं करते हैं (पूरी तरह से वैध, कम से कम उनके लिए) कारण।

The आपके सहकर्मी, अन्य छात्र, आपके शिक्षक आदि।


9

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

इसलिए, तालिका A से अस्थायी दृश्य B में शामिल होने के बजाय, आप तालिका A से उस क्वेरी में शामिल हो सकते हैं जिसे आप अस्थायी दृश्य B के रूप में उपयोग कर रहे हैं। उदाहरण के लिए:

    SELECT A.Col1, A.Col2, B.Col1,B.Col2
      FROM (SELECT RealTableZ.Col1, RealTableY.Col2, RealTableY.ID as ID
              FROM RealTableZ 
   LEFT OUTER JOIN RealTableY
                ON RealTableZ.ForeignKeyY=RealTableY.ID
             WHERE RealTableY.Col11>14
            ) As B
        INNER JOIN A
                ON A.ForeignKeyY=B.ID

यह उदाहरण बल्कि व्यर्थ है, लेकिन वाक्यविन्यास को स्पष्ट करना चाहिए।

उन विचारों के लिए जो "विशेष" (अनुक्रमित, विभाजित) नहीं हैं, इसका परिणाम उसी क्वेरी योजना के रूप में होना चाहिए जैसे कि आपने एक दृश्य का उपयोग किया है।

जहाँ तक यह लिखना आसान है, आप पूरी क्वेरी को लिखने से पहले यह सुनिश्चित करने के लिए प्रत्येक टुकड़े को सत्यापित कर सकते हैं कि आपको क्या मिल रहा है।

अगर यह पहले से ही आपके लिए पुरानी टोपी है तो मेरी माफी।


3
मैं SQL के बारे में काफी विशेषज्ञ हूं और मुझे वास्तव में इस इंडेंटेशन से नफरत है: यह अच्छा लग सकता है लेकिन यह पूरी तरह से बेकार है "मेरी राय में"। दो कारण: मैं स्पष्ट रूप से समझ नहीं पा रहा हूं कि अगर बायाँ बाहरी जुड़ाव मुख्य क्वेरी का हिस्सा है या किसी सबक्वेरी का हिस्सा है, तो उसे कोड ब्यूटिफायर की जरूरत है और किसी भी समय आप कुछ लाइन जोड़ना चाहते हैं जो आपको सभी पाठ को फिर से सुशोभित करने की आवश्यकता है । योजना इंडेंटेशन कि सिर्फ TABS की जरूरत है और अधिक लचीला है। मैंने आपके उत्तर को वोट नहीं दिया, लेकिन मैं वास्तव में इस शैली का उपयोग करके किसी को भी हतोत्साहित करता हूं ... खासकर जब उन्हें मेरी मदद की आवश्यकता होती है।
एलेसेंड्रो रॉसी

7

अस्थायी विचारों के बजाय, विराम वाले खंड का उपयोग करें । इससे बड़े प्रश्नों को अधिक पठनीय छोटे भागों में तोड़ना बहुत आसान हो जाता है।


1
यदि आप एक cte का उपयोग करते हैं, तो अवगत रहें कि क्वेरी केवल तब तक बनी रहती है जब तक कि अगली क्वेरी नहीं चलती है, इसलिए कुछ मामलों में जहां आप कई प्रश्नों में cte का उपयोग कर रहे हैं, प्रदर्शन के लिए बेहतर हो सकता है कि वह टेम्‍प टेबल का उपयोग करें।
राहेल

3
  1. यदि आप पहले से ही सेट थ्योरी से अधिक परिचित नहीं हैं। एसक्यूएल सेट थ्योरी में आधारित है और सेट के बारे में अधिक समझ आपको एसक्यूएल के काम करने के तरीके से अधिक परिचित होने में मदद करेगी।
  2. अधिक एसक्यूएल का अभ्यास करें, यदि आप एसक्यूएल सीख रहे हैं, तो यह समझने के लिए समय ले रहा है कि सब कुछ कैसे किया जाए, कुछ समय पहले जब आप वास्तव में उन्हें समझने से पहले समय लेते हैं, तो जोड़ियां एक महान उदाहरण हैं जितना अधिक आप उनका उपयोग करेंगे उतना बेहतर होगा कि आप इसे प्राप्त करेंगे।
  3. सुनिश्चित करें कि आपके द्वारा क्वेरी की जा रही तालिकाओं को ठीक से डिज़ाइन किया गया है
  4. चुनिंदा प्रश्नों पर विचारों का उपयोग करने से डरो मत, खासकर यदि आपके पास एक सामान्य सेट है जिसे कई अलग-अलग तरीकों से परिष्कृत करने की आवश्यकता है

1

किसी और चीज की तरह, आप समस्या को प्रबंधनीय भागों में तोड़ना चाहते हैं।

यह वास्तव में है कि आप जटिल समस्याओं को कैसे हल करते हैं।

इसलिए: आप यह देखने के लिए कि आप वास्तव में क्या चाहते हैं, उस पर एक बाहरी क्वेरी चलाने से पहले उप-परीक्षा को देखना चाहते हैं। आप प्रत्येक तालिका में शामिल होने की न्यूनतम कोशिश करना चाहते हैं ताकि आप देख सकें कि आप वास्तव में इसे ठीक से सोच रहे हैं। इस तरह बातें। यह सब टाइप करने की उम्मीद करना और एक झटके में आप जो चाहते हैं, ठीक वैसा ही निकलना।

एक एसक्यूएल स्टेटमेंट, एक बार जब यह जटिलता के एक निश्चित स्तर तक पहुंच जाता है, तो मूल रूप से अपने आप में एक छोटा सा कार्यक्रम है। यह वास्तव में समझने के लिए एक बड़ा अंतर बनाता है कि डेटा कैसे संयुक्त, चयनित, फ़िल्टर और आउटपुट है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.