घोषणात्मक प्रोग्रामिंग बनाम इंपीरियल प्रोग्रामिंग


24

मैं इंपीरियल प्रोग्रामिंग के साथ बहुत सहज महसूस करता हूं। मुझे कभी भी एल्गोरिदम को व्यक्त करने में परेशानी नहीं होती है कि मैं क्या चाहता हूं कि कंप्यूटर एक बार यह पता लगा ले कि वह क्या है जो मैं यह करना चाहता हूं। लेकिन जब यह SQL जैसी भाषाओं की बात आती है या मैं अक्सर अटक जाता हूं क्योंकि मेरा सिर भी इंपीरियल प्रोग्रामिंग के लिए उपयोग किया जाता है।

उदाहरण के लिए, मान लें कि आपके पास संबंध बैंड (bandName, bandCountry), स्थल (स्थल नाम, स्थल-चिह्न), नाटक (bandName, स्थल नाम) है, और मैं एक प्रश्न लिखना चाहता हूं जो कहता है: सभी स्थल नाम ऐसे हैं कि प्रत्येक bandCountry के लिए एक बैंड है। वह देश जो उस नाम के स्थान पर खेलता है।

उदाहरण: मुझे सभी स्थलनाम चाहिए, जिसमें सभी देशों के बैंड (बैंडकाउंट्री) बजाए गए। इसके अलावा, "संबंध" से मेरा मतलब एक SQL तालिका है।

मेरे मन में, मैं तुरंत प्रत्येक बैंडनामेंट के लिए प्रत्येक स्थल के लिए जाना जाता हूँ "" और प्रत्येक बैंडकाउंट्री से आने वाले बैंडों की सूची प्राप्त करें। यदि उनमें से कोई भी साइटनाम में नहीं बजता है, तो अगले स्थलनाम पर जाएँ। बैंड के अंत में एल्स। पुनरावृत्ति जोड़ें

... लेकिन आप एसक्यूएल में इस तरह की बात नहीं कर सकते हैं और मुझे वास्तव में यह सोचने की जरूरत है कि इसे कैसे तैयार किया जाए, सहज इम्पीरेटिव सॉल्यूशन के साथ लगातार मेरे सिर के पीछे के हिस्से में झनझनाहट हो। क्या किसी और को यह समस्या थी? आपने इसे कैसे पार किया? क्या आपने एक प्रतिमान बदलाव का पता लगाया? घोषणात्मक समाधानों में इंपीरियल समाधानों का अनुवाद करने के लिए इंपीरियल अवधारणाओं से एसक्यूएल अवधारणाओं तक का नक्शा बनाया? एक अच्छी पुस्तक पढ़ें?

PS मैं उपरोक्त प्रश्न का हल नहीं ढूंढ रहा हूं, मैंने इसे हल कर दिया है।


1
यह एक अच्छा सवाल है क्योंकि आप एक कमजोरी को आवाज दे रहे हैं जो कई (खुद सहित) है।
डेविड वेसर

आपके प्रश्न में "संबंध" का क्या अर्थ है, इसे परिभाषित करना उपयोगी हो सकता है। रिलेशनल मॉडल (एसक्यूएल के पीछे का गणित) में, "संबंध" मोटे तौर पर एक एसक्यूएल टेबल के अनुरूप है। बहुत सारे लोग "संबंध" कहेंगे जब वे वास्तव में "संबंध" कहने का मतलब करेंगे।
जेसन बेकर

सेट सिद्धांत जानें, और असतत गणित।

1
@ Jase21, मैं व्यक्तिगत रूप से दोनों से काफी परिचित हूं, लेकिन SQL में गैर-तुच्छ सामान अभी भी अजीब लगता है। स्वच्छ गणित उदाहरणों में से कोई भी अजीब वास्तविक दुनिया के सामान के साथ सौदा नहीं करता है। इसके अतिरिक्त, कोई LINQ का उपयोग कर सकता है, और इस तरह SQL के साथ परेशान नहीं होना चाहिए। अंत में, पूछने वाले से: आपको समय के साथ इसकी आदत हो जाएगी।
जॉब

जवाबों:


12

घोषित रूप से चीजों को करने के पीछे विचार यह है कि आपको यह निर्दिष्ट करना चाहिए कि क्या , कैसे नहीं ।

मेरे लिए, ऐसा लगता है कि आप सही रास्ते पर हैं। समस्या यह नहीं है कि आप चीजों के बारे में गलत तरीके से सोच रहे हैं। यह है कि आप बहुत दूर जा रहे हैं। आइए देखें कि आप क्या करने की कोशिश कर रहे हैं:

उदाहरण के लिए, मान लें कि आपके पास संबंध बैंड (bandName, bandCountry), स्थल (स्थल नाम, स्थल-चिह्न), नाटक (bandName, स्थल नाम) है, और मैं एक प्रश्न लिखना चाहता हूं जो कहता है: सभी स्थल नाम ऐसे हैं कि प्रत्येक bandCountry के लिए एक बैंड है। वह देश जो उस नाम के स्थान पर खेलता है।

अब तक, यह बहुत अच्छा है। लेकिन तब आप ऐसा करते हैं:

मेरे मन में, मैं तुरंत प्रत्येक बैंडनामेंट के लिए प्रत्येक स्थल के लिए जाना जाता हूँ "" और प्रत्येक बैंडकाउंट्री से आने वाले बैंडों की सूची प्राप्त करें। यदि उनमें से कोई भी साइटनाम में नहीं बजता है, तो अगले स्थलनाम पर जाएँ। बैंड के अंत में एल्स। पुनरावृत्ति जोड़ें

संक्षेप में, आप अनावश्यक काम कर रहे हैं। आप जानते हैं कि आपको क्या चाहिए, जो आपको वास्तव में चाहिए। लेकिन फिर आप आगे बढ़ते हैं और यह पता लगाने की कोशिश करते हैं कि इसे कैसे प्राप्त किया जाए।

अगर मैं तुम होते तो मैं निम्नलिखित आदत में शामिल होने की कोशिश करता:

  1. परिभाषित करें कि आप क्या चाहते हैं।
  2. होशपूर्वक अपने आप को परिभाषित करने से रोकें कि इसे कैसे प्राप्त करें।
  3. चित्रा बाहर कैसे प्रतिनिधित्व करने के लिए कि आप SQL में क्या चाहते हैं।

यह आपकी ओर से कुछ समय और प्रयास कर सकता है, लेकिन एक बार जब आप वास्तव में घोषित प्रोग्रामिंग को पकड़ लेते हैं, तो यह बहुत उपयोगी हो जाता है। वास्तव में, आप अपने बाकी कोड में घोषणात्मक प्रोग्रामिंग का उपयोग कर सकते हैं।

यदि आप एक पुस्तक की तलाश में हैं, तो मैं एसक्यूएल और रिलेशनल थ्योरी सुझाऊंगा । यह वास्तव में आपको SQL डेटाबेस के पीछे के सिद्धांत को समझने में मदद करता है। बस एक नमक के दाने के साथ डेट की सिफारिशें लेना याद रखें। वह बहुत अच्छी जानकारी देता है, लेकिन वह कई बार थोड़ा रायशुदा हो सकता है।


मुझे समझ नहीं आ रहा है कि कैसे पता लगाया जाए कि कुछ गलत तरीका है। इससे कोई फर्क नहीं पड़ता कि आप किस तरह की भाषा का उपयोग कर रहे हैं, आपको यह पता लगाना है कि यह कैसे करना है जो आप चाहते हैं।
davidk01

9

सेट के संदर्भ में सोचें, पुनरावृत्तियाँ नहीं; sql स्टेटमेंट वांछित आउटपुट सेट (उर्फ टेबल / रिलेशन) के गुणों को परिभाषित करता है

सभी प्रकार के नाम जैसे कि प्रत्येक बैंडकाउंट्री के लिए उस देश का एक बैंड है जो उस नाम के स्थान पर खेलता है

इसका परिणाम (यदि मैं आपके इरादों को सही ढंग से समझ गया!) उन स्थानों का समूह होगा, जिनके पास उस स्थान पर कम से कम एक बैंड है। BandCountry पर चलना अनावश्यक है, क्योंकि PLAYS संबंध में पहले से ही आपके द्वारा मांगी गई जानकारी है, आपको केवल डुप्लिकेट को समाप्त करना है

तो SQL में यह होगा:

select 
    distinct venueName
from PLAYS

संपादित करें: ठीक है, इसलिए वास्तविक सेट वांछित थोड़ा अधिक जटिल है। डेटाबेस से पूछा जा रहा सवाल यह है: सभी देशों से किन स्थानों पर बैंड की मेजबानी की गई है?

इसलिए, हम लक्ष्य के रूप में वांछित सेट के एक तत्व के लिए सदस्यता मानदंड को परिभाषित करते हैं, फिर सेट को आबाद करने के लिए पीछे की ओर काम करते हैं। एक स्थान आउटपुट सेट का एक सदस्य है यदि इसमें हर देश से कम से कम एक बैंड के लिए PLAYS पंक्ति है। हमें यह जानकारी कैसे मिली?

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

declare @BandCountryCount int
select
    @BandCountryCount = COUNT(distinct bandCountry)
from BAND

हम प्रत्येक स्थल के लिए बैंड देशों की गिनती कर सकते हैं

select
    P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
    inner join BAND B on B.bandName = P.bandName

और हम एक सबक्वेरी का उपयोग करके दोनों को एक साथ जोड़ सकते हैं

select
    venueName
from (
    select
        P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
    from PLAYS P
        inner join BAND B on B.bandName = P.bandName
) X
where X.VenueBandCountryCount = @BandCountryCount

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

ओपी का उद्देश्य यह सीखना था कि मानसिकता को अनिवार्य से घोषणात्मक में कैसे स्थानांतरित किया जाए। उस अंत तक, देखें कि वर्णित अनिवार्य समाधान क्या कर रहा था:

प्रत्येक स्थल के लिए नाम बदलें सभी बैंडकंट्री पर और प्रत्येक बैंडकाउंट्री के लिए उस बैंड की सूची प्राप्त करें जो इससे आता है। यदि उनमें से कोई भी स्थलनाम में नहीं चलता है, तो अगले स्थलनाम पर जाएं। Else, bandCountries के अंत में, अच्छे स्थल के नाम के लिए स्थलनाम जोड़ें

उपरोक्त में निर्धारित मानदंड क्या है? मुझे लगता है ऐसा है:

... अगर उनमें से कोई नहीं [किसी विशेष देश से बैंड का सेट] स्थलनाम में खेलते हैं ...

यह एक अयोग्य मानदंड है । अनिवार्य विचार प्रक्रिया एक पूर्ण बाल्टी के साथ शुरू हो रही है और उन चीजों को बाहर फेंक रही है जो मानदंडों को फिट नहीं करते हैं। हम डेटा फ़िल्टर कर रहे हैं ।

यह साधारण सामान के लिए ठीक है, लेकिन यह वांछित परिणाम सेट के निर्माण के संदर्भ में सोचने में मदद करता है; संबंधित योग्यता मानदंड क्या है जो एक को बकेट भरने के लिए अनुमति देगा?

  • डिसक्वालिफ़ायर: अगर किसी बैंडकंट्री से कोई बैंड नहीं निकलता है, जो किसी स्थान पर बजता है, तो स्थल अयोग्य हो जाता है
  • (आंशिक) क्वालीफायर: अगर किसी बैंडकंट्री से कम से कम एक बैंड एक स्थान पर खेलता है, तो स्थल ठीक हो सकता है; बाकी बैंड कॉन्ट्रीज को चेक करते रहें
  • (पूर्ण) क्वालीफायर: यदि प्रत्येक बैंड कम से कम एक बैंड एक समारोह स्थल पर खेलता है, तो वह स्थान योग्य है

अंतिम क्वालीफायर को काउंट्स का उपयोग करके सरल बनाया जा सकता है: यदि एक स्थल पर कम से कम एक बैंड बजता है तो एक बैंडकंट्री 'संतुष्ट' है; किसी स्थान के लिए 'संतुष्ट' बैंड देशों की संख्या योग्य होने के लिए बैंड देशों की संख्या के बराबर होनी चाहिए।

अब हम नेविगेशन द्वारा संबंधों के संबंध में तर्क कर सकते हैं:

  • VENUE संबंध के साथ शुरू करें [हमें उत्तर के लिए इसकी आवश्यकता नहीं है, लेकिन यह संबंधपरक नेविगेशन के लिए वैचारिक प्रारंभिक बिंदु है]
  • प्लेननाम में PLAYS में शामिल हों
  • बैंडनमी पर बैंड बैंड में शामिल होने के लिए बैंडकाउंट्री में शामिल हों
  • हम बैंड के नाम की परवाह नहीं करते; केवल स्थलनाम और बैंडकाउंट्री का चयन करें
  • हम निरर्थक बैंडकाउंट्री की परवाह नहीं करते हैं; DISTRICT या GROUP BY का उपयोग करके डुप्लिकेट को समाप्त करें
  • हम केवल अलग-अलग बैंडकाउंट्स की गिनती की परवाह करते हैं, न कि नामों की
  • हम केवल वे स्थान चाहते हैं, जहाँ अलग-अलग बैंडकाउंट्स की गिनती बैंडकाउंट्स की कुल संख्या के समान हो

जो ऊपर दिए गए समाधान पर वापस जाता है (या उसके बाद एक उचित प्रतिकृति)

सारांश

  • समुच्चय सिद्धान्त
  • संबंधपरक नेविगेशन पथ
  • समावेशी बनाम अनन्य मानदंड (अर्हता बनाम अयोग्य घोषित करना)

यह वास्तव में "उन स्थानों का समूह है जो सभी देशों के बैंड (बैंडकाउंट्री = = स्थल-समूह) ने उनमें बजाए हैं"।
एप्सिलॉनवेक्टर

@ एप्सिलॉनवेक्टर: संपादन देखें
स्टीवन ए। लोव

4

घोषित शैली में सोचने और प्रोग्राम करने का तरीका सीखने का एक तरीका यह है कि APL या J. SQL जैसी सामान्य उद्देश्य सरणी भाषा सीखें, यह घोषित करने का तरीका सीखने के लिए शायद सबसे अच्छा वाहन नहीं है। एपीएल या जे में आप स्पष्ट लूपिंग या पुनरावृत्ति के बिना, पूरे ऐरे (वैक्टर, मैट्रेस या उच्च रैंक के एरे) पर काम करना सीखते हैं। यह SQL और संबंधपरक बीजगणित को बहुत आसान बनाता है। एक बहुत ही सरल उदाहरण के रूप में, एक वेक्टर V से आइटम का चयन करने के लिए जिसका मूल्य 100 से अधिक है, एपीएल में हम लिखते हैं:

(V>100)/V

यहां V> 100 वी के समान बूलियन सरणी का मूल्यांकन करता है, 1 के मान के साथ हम जो मान रखना चाहते हैं। यह अनुभवी एपीएलर के लिए नहीं होता है कि वहाँ चल रहा है, हम बस वेक्टर वी के लिए एक मुखौटा लागू कर रहे हैं, एक नया वेक्टर वापस कर रहे हैं। बेशक यह वैचारिक रूप से एक एसक्यूएल है जहां क्लॉज या संबंधपरक बीजगणित प्रतिबंधित ऑपरेशन कर रहा है।

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

ऐसी अन्य कार्यात्मक भाषाएँ हो सकती हैं जो इस तरह से सोचने में मदद करती हैं, लेकिन सरणी भाषाएँ SQL के बहुत करीब हैं।


+1 के लिए "[आप नहीं कर सकते] एक अच्छी पकड़ ... बहुत कुछ किए बिना"। a = a + 1रातोरात या तो किसी ने भी अनिवार्य प्रोग्रामिंग नहीं सीखी । तर्कशील, कार्यात्मक, एट अल जैसी घोषणात्मक शैलियों को सीखने में समय लगता है, जैसे कि अनिवार्य प्रोग्रामिंग सीखने में समय लगता है।
बस मेरी सही घोषणा

1

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


1

आप घोषित रूप से सोचने के लिए सीखते हैं जैसे कि आपने अनिवार्य रूप से सोचना सीखा: अभ्यास से सरल समस्याओं के साथ शुरू करना और काम करना जैसे कि आप "प्राप्त" करते हैं।

अनिवार्य प्रोग्रामिंग के साथ आपके पहले अनुभवों में "सहज" (और वास्तव में, बिल्कुल हास्यास्पद) कथनों का एक पूरा गुच्छा शामिल था a = a + 1। आपने अपने दिमाग को उस बिंदु पर लपेट लिया है कि अब आप संभवतः बयान के स्पष्ट असत्य से पुनरावृत्ति को भी याद नहीं करते हैं। घोषणात्मक शैलियों के साथ आपकी समस्या यह है कि जब आप पहली बार अनिवार्य शैलियों से शुरू हुए थे तो आप वापस आ गए थे: "क्लूलेस न्यूब"। इससे भी बदतर, आपने एक शैली के साथ वर्षों का अभ्यास किया है जो इस नई शैली के साथ बहुत कम है और पूर्ववत करने की आदतें हैं - जैसे "हर कीमत पर नियंत्रण" करने की आदत।

घोषणात्मक शैलियाँ एक अलग दृष्टिकोण के साथ काम करती हैं, जो आपके लिए अब अंतर्ज्ञान की कमी है (जब तक कि आपने अपने गणित कौशल को वर्षों में बहुत तेज नहीं रखा है - जो ज्यादातर लोग नहीं करते हैं)। आपको यह सोचना होगा कि कैसे सोचना है और इसे फिर से तैयार करने का एकमात्र तरीका है, एक समय में एक सरल कदम।

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

इन अन्य भाषाओं को सीखना आपको बेहतर जानकारी देगा, मेरी राय में, कुछ कारणों के लिए घोषणात्मक प्रोग्रामिंग कैसे काम करती है:

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

  2. वे प्रत्येक आपको घोषणात्मक प्रोग्रामिंग पर एक अलग तिरछा संकेत देते हैं जो आपको अंततः "प्राप्त" करने के लिए अलग-अलग सड़कें दे सकता है।

  3. वे भी आपको सामान्य रूप से प्रोग्रामिंग के बारे में सोचने पर एक अलग तिरछा प्रदान करते हैं। वे समस्याओं के बारे में तर्क करने की आपकी क्षमता में सुधार लाएंगे और कोडिंग करेंगे भले ही आप सीधे उन्हें स्वयं उपयोग न करें।

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

मैं विशेष रूप से कार्यात्मक भाषाओं में से एक सीख था सलाह देते हैं ( Clojure , Lisps में से एक के रूप में, शायद एक अच्छा विकल्प यहाँ है) और तर्क भाषाओं में से एक (बुध सबसे अच्छा है कि मैं, लेकिन Prolog एक है बहुत कुछ सीखने के लिए और अधिक उपयोगी सामग्री) अधिकतम विचार प्रक्रिया विस्तार के लिए।


1

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

  • यहां मेरे लिए आवश्यक टुकड़े हैं।
  • मैं उन्हें इस तरह से एक साथ रखने जा रहा हूं।
  • मैं यह जानने के लिए कि मैं वास्तव में क्या देख रहा हूँ, पाने के लिए निम्नलिखित विधेय के साथ प्राप्त किया जा रहा हूँ।

ऊपर एक उच्च स्तर की अनिवार्य एल्गोरिथ्म है और यह SQL सेटिंग में मेरे लिए बहुत अच्छा काम करता है। मुझे लगता है कि यह एक टॉप-डाउन अप्रोच माना जाता है और स्टीवन ए। लोवे काफी अच्छे बॉटम-अप अप्रोच का वर्णन करते हैं ।


1

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

उस ने कहा, विदेशी भाषा सीखने का सबसे अच्छा तरीका क्या है? आपको स्पष्ट रूप से व्याकरण और शब्दावली सीखना होगा, जिसे आप अपने एसक्यूएल प्रलेखन से प्राप्त कर सकते हैं। सबसे महत्वपूर्ण बात अभ्यास है। आपको जितना हो सके उतना SQL पढ़ना और लिखना चाहिए, और यह महसूस नहीं करना चाहिए कि आपको पहले सिंटैक्स को अच्छी तरह से जानना है; आप कर सकते हैं, और चाहिए, आप के साथ जाने के रूप में चीजों को देखना चाहिए। आपको पता होगा कि जब आप SQL में अंग्रेजी की तुलना में क्या डेटा चाहते हैं, यह वर्णन करना आसान है।


1

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

मैंने पाया कि मैं धीरे-धीरे सरल लिपियों के संग्रह का निर्माण करके अपनी शिक्षा में तेजी लाने में सक्षम था, जो यह दर्शाता था कि प्रत्येक भाषा की सुविधा का उपयोग कैसे किया जाए और किसी ज्ञात तालिका पर कुछ परिणाम कैसे प्राप्त करें (संदर्भ के लिए शामिल तालिका परिभाषाएँ)।

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

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


0

जब आप एक समस्या का सामना करते हैं तो आप आमतौर पर सोचते हैं कि इसे कैसे हल किया जाए। लेकिन अगर आप जानते हैं कि कंप्यूटर आपके लिए इसे कैसे हल करता है! फिर आप इस बारे में चिंतित हैं कि कैसे समाप्त किया जाएगा।

मैं यह कहने की कोशिश करता हूं कि यह कैसे होता है।

आप पहले से ही पुनरावर्ती कार्यक्रमों से परिचित हो सकते हैं, पुनरावर्ती कार्यक्रमों में, आप यह कहने के बजाय समस्या को परिभाषित करते हैं कि यह कैसे हल किया जाता है। आप को परिभाषित आधार है, और परिभाषित n के आधार पर n-1 । (उदाहरण के लिए factorial(n) = n * factorial(n-1)) लेकिन आप पहले से ही जान सकते हैं कि कंप्यूटर इसे कैसे हल करता है। यह फ़ंक्शन से शुरू होता है और फ़ंक्शन को पुनरावर्ती रूप से कॉल करता है जब तक कि यह एक आधार परिभाषा तक नहीं पहुंचता है, तब आधार मूल्य के आधार पर अन्य सभी कार्यों का मूल्यांकन करें।

यह घोषणात्मक प्रोग्रामिंग में होता है। आप मौजूदा परिभाषाओं के आधार पर सब कुछ परिभाषित करते हैं। और कंप्यूटर जानता है कि मूल कार्यों के आधार पर आपके लिए उत्तर कैसे प्राप्त करें।

SQL में आप एक दूसरे से परिभाषाएँ नहीं जोड़ सकते हैं, लेकिन आप वस्तुओं या सूचनाओं को एक दूसरे से संबंधित करते हैं, आप निर्दिष्ट करते हैं कि आप क्या चाहते हैं और कंप्यूटर आपके द्वारा प्रदान किए गए संबंधों के आधार पर कुछ (वस्तु, जानकारी) खोजते हैं।

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