SQL को संबंध-आधारित / कार्यात्मक भाषा के रूप में क्यों जाना जाता है?


14

हम सीख रहे हैं कि अधिकांश भाषाओं को "संबंध आधारित" या "उच्च स्तर" दोनों में से एक के रूप में वर्गीकृत किया गया है। मैंने पहले कभी एसक्यूएल का उपयोग नहीं किया है, लेकिन इसके सिंटैक्स को पढ़ने से यह कार्यात्मक / संबंध-आधारित (लिस्प, हास्केल) की तुलना में अधिक जरूरी / उच्च-स्तरीय सिंटैक्स लगता है ??

या यह सिर्फ यह हो सकता है कि मेरे प्रोफेसर के लेक्चर नोट्स की मेरी व्याख्या गलत है ... लेकिन यह निश्चित रूप से SQL को संबंध-आधारित भाषाओं में से एक के रूप में सूचीबद्ध करता है (उच्च स्तर के विपरीत), और यह कार्यात्मक के साथ संबंध आधारित है ... या शायद यह है कि मुझे समझ में नहीं आता है कि संबंधपरक डेटाबेस के साथ एसक्यूएल डील एक कार्यात्मक भाषा बनाता है जिस तरह से इसे लागू किया जाना चाहिए? (और क्यों 'संबंध-आधारित' प्रोग्रामिंग भाषाओं को वर्गीकृत करते समय 'कार्यात्मक' के साथ समानता रखता है?)

धन्यवाद :)

जवाबों:


14

हम सीख रहे हैं कि अधिकांश भाषाओं को "संबंध आधारित" या "उच्च स्तर" दोनों में से एक के रूप में वर्गीकृत किया गया है।

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

वास्तव में, कई और कुल्हाड़ियाँ हैं जिनके साथ प्रोग्रामिंग (और डेटा) भाषाओं को वर्गीकृत किया जा सकता है; एक विशेष रूप से दिलचस्प एक घोषणात्मक बनाम अनिवार्य है । घोषणात्मक भाषाओं का वर्णन है कि कुछ क्या है ; जरूरी भाषाओं के तरीके का वर्णन करते कुछ। एसक्यूएल की DDL हिस्सा अनिवार्य दिखने कीवर्ड के बावजूद, ज्यादातर कथात्मक है ( " CREATE TABLE", " DROP DATABASE", आदि), और यहां तक कि डेटा हेरफेर हिस्सा ( SELECT, UPDATE, INSERT, DELETE) अभी भी बहुत कथात्मक है। SQL की एक बहुत ही दिलचस्प संपत्ति यह है कि यह ट्यूरिंग पूर्ण नहीं है: आप सादे मानक ANSI SQL में एक अनबाउंड लूप नहीं लिख सकते हैं।

कुछ मुख्य विचारों के आसपास कार्यात्मक प्रोग्रामिंग केंद्र:

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

SQL निश्चित रूप से फ़ंक्शंस के इर्द-गिर्द घूमता है, जो मॉडलिंग की चीजों के लिए मुख्य टूल के रूप में है, लेकिन यह कुछ हद तक शुद्धता के विचार को स्वीकार करता है - एक ही डेटाबेस पर चलाए जा रहे क्वेरी समान परिणाम, हर बार (ऑर्डर करने को छोड़कर) प्राप्त करेंगे। SQL को 'फंक्शनल' भाषा कहना थोड़ा खिंचाव का काम है, हालांकि IMO।


ANSI SQL ट्यूरिंग-पूर्ण है। आप CTE (SQL: 1999 में प्रस्तुत) और विंडिंग (SQL: 2003) का उपयोग करके चक्रीय टैग सिस्टम एम्बेड कर सकते हैं ।
जॉर्ग डब्ल्यू मित्तग

@ JörgWMittag: ट्रिगर्स के साथ कुछ ऐसा ही कर सकती है ...
jmoreno

"संबंध-आधारित का अर्थ है कि भाषा का शब्दार्थ एक संबंध की अवधारणा पर आधारित है, अर्थात, दो सेटों के बीच कई-से-कई संबंध (संबंध SQL तालिकाओं के पीछे गणितीय आधार हैं)" - एक संबंध, एक RDBMS में , "संबंध" शर्त डेटा सेट नहीं है, यह टुपल्स का एक सेट है। एक तालिका, एक दृश्य, या एक क्वेरी का परिणाम, सभी "संबंध" हैं।
डेविड एल्ड्रिज 14

12

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

संबंधों का उपयोग तब प्रश्नों (सेलेक्ट स्टेटमेंट्स) का उपयोग करके किया जाता है, जो इस बात में कार्यात्मक हैं कि उनके साइड इफेक्ट्स न हों।

पूरी बात संबंधपरक मॉडल के चारों ओर लिपटी हुई है ।


मुझे लगता है कि आप एक मजबूत मामला बना सकते हैं। क्वेरी सेट हैं, लेकिन वे सेट पर भी फ़ंक्शन हैं। Sql में क्वेरीज़ प्रथम श्रेणी की वस्तुएं हैं (विशेष रूप से, आप उन्हें घोंसला बना सकते हैं या उनका नाम रख सकते हैं)
nomen

5

एसक्यूएल वास्तव में उतना कार्यात्मक भाषा नहीं है जितना कि यह घोषणात्मक है। कार्यात्मक भाषा, सामान्य रूप से, साइड इफेक्ट्स को कम करने के लिए अनिवार्य पर घोषणात्मक शैली पर जोर देती है। यह एसक्यूएल को कार्यात्मक के रूप में संदर्भित करने के लिए कुछ लोगों का नेतृत्व कर सकता है, लेकिन यह सटीक नहीं है। यह प्रक्रियात्मक तत्वों के साथ घोषणात्मक है।


1
लेकिन प्रश्न (चुनिंदा कथन) (शुद्ध गणितीय) कार्य और प्रथम श्रेणी की वस्तुएं हैं। इससे भाषा क्रियाशील हो जाती है।
nomen

3

क्या यह संभव है कि आपके नोटों को तराशा जाए?

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

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


सेट / संबंधों पर क्वेरीज़ शुद्ध कार्य हैं, और भाषा में प्रथम श्रेणी की वस्तुएँ हैं। इप्सो वास्तविक।
नोम

1

एसक्यूएल एक रिलेशनल, सेट-बेस्ड लैंग्वेज है जिस पर प्रक्रियात्मक कार्यक्षमता का व्यवहार किया गया है।

मुझे नहीं पता कि मैं एसक्यूएल कार्यात्मक पर विचार करूंगा, हालांकि इसमें कार्यात्मक भाषाओं के कुछ पहलू हैं। SQL (प्रक्रियात्मक बिट्स के साथ) के आधुनिक संस्करण निश्चित रूप से कार्यात्मक नहीं हैं।


-1

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

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


-1

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

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