SQL क्वेरी में से से पहले चयन क्यों है? [बन्द है]


67

यह एक ऐसी चीज है जिसने मुझे स्कूल में बहुत परेशान किया।

पांच साल पहले, जब मैंने एसक्यूएल सीखा, तो मैंने हमेशा सोचा कि हम पहले उन क्षेत्रों को क्यों निर्दिष्ट करते हैं जो हम चाहते हैं और फिर हम उन्हें कहाँ से चाहते हैं।

मेरे विचार के अनुसार, हमें लिखना चाहिए:

From Employee e
Select e.Name

तो मानदंड निम्नलिखित क्यों कहता है?

Select e.Name -- Eeeeek, what does e mean?
From Employee e -- Ok, now I know what e is

SQL को समझने में मुझे कई हफ्ते लग गए, और मुझे पता है कि उस समय का बहुत कुछ तत्वों के गलत क्रम से भस्म हो गया था।

यह C # में लिखने जैसा है:

string name = employee.Name;
var employee = this.GetEmployee();

इसलिए, मैं मानता हूं कि इसका एक ऐतिहासिक कारण है। क्यों?


64
यह OBA बंदरों को उनकी जगह पर रखने के लिए डीबीए की साजिश है।
gbn डेस

3
दुर्भाग्य से, मुझे SEQUEL को पेश करने वाले पेपर में कोई प्रासंगिक जानकारी नहीं मिली है , और मुझे नहीं लगता कि ऐसे विशिष्ट उद्धरण हैं जो आपके प्रश्न का उत्तर देते हैं। gnat का उत्तर संभवतः सबसे अच्छा स्पष्टीकरण है - लेकिन मैं साजिश के सिद्धांत को खारिज नहीं करूंगा।
यानिस डे

2
व्यक्तिगत रूप से, मैं हमेशा कामना करता हूं Linqकि मानकीकृत SQLवाक्यविन्यास का उपयोग नहीं किया जा सकता है ।
jp2code

4
एक सेलेक्ट स्टेटमेंट में क्लॉज़ ऑपरेशन का क्रम नहीं है।
लोट

8
अच्छा प्रश्न। आप अगले एक हैं कि INSERT और UPDATE प्रश्नों के लिए अलग-अलग वाक्यविन्यास मॉडल का उपयोग क्यों किया जाना चाहिए: (फ़ील्ड 1, फ़ील्ड 2) वैल्यूज़ (एफ 1, एफ 2) बनाम (फ़ील्ड 1 = एफ 1, फ़ील्ड 2 = एफ 2)।
लार्सटेक

जवाबों:


86

मूल रूप से एसक्यूएल भाषा अगली कड़ी बुलाया गया था खड़े के लिए

  • स्ट्रक्चर्ड अंग्रेजी क्वेरी लैंग्वेज
    पर जोर के साथ अंग्रेजी , यह मानते हुए कि वर्तनी में करीब होना स्वाभाविक भाषा।

अब, इन दो कथनों को वर्तनी दें जैसे कि आप अंग्रेजी वाक्य लिखते हैं:

  1. "कर्मचारी तालिका ई सेलेक्ट कॉलम e.Name"
  2. "कर्मचारी तालिका से कॉलम e.Name चुनें"

दूसरा प्राकृतिक अंग्रेजी भाषा के करीब लगता है यही कारण है कि यह आदर्श के रूप में सेट है।

BTW एक ही तर्क Whereआदि के लिए जाता है - SQL बयान जानबूझकर प्राकृतिक भाषा के करीब ध्वनि के लिए डिज़ाइन किए गए थे।


7
बेशक माइक्रोसॉफ्ट ने नजरअंदाज कर दिया कि LINQ के साथ के रूप में पहले से आता है!

27
अंग्रेजी में लुकहेड तर्क बहुत है: /
माइकल के

15
@Digger - जो कि डिजाइन के अनुसार था: यदि वे पहले आए थे, तो वे चयन वाले भाग में इंटैलिजेंस का समर्थन नहीं कर सकते थे।
स्कॉट व्हिटलॉक

6
@Digger: LINQ OO / आधुनिक Object.Method या Object.Property को फॉलो करता है। मत भूलो SQL 40 वर्षों के लिए चारों ओर रहा है
gbn

7
मुझे इस सवाल को english.stackexchange.com पर पोस्ट करना चाहिए :)
सिरिल गैंडन

37

क्योंकि Select स्टेटमेंट में SELECT की आवश्यकता होती है और FROM नहीं है।

Select 'This String'

बेशक आपके sql स्टेटमेंट को FROM के बाद SELECT, DELETE, UPDATE देखने के लिए तैयार किया जा सकता है, लेकिन क्या वास्तव में यह एक बड़ी डील है?

याद रखें, यह सब इंटेलीजेंस से पहले किया गया था। यह उतना जटिल नहीं है।

संपादित करें: शायद कोई कारण नहीं है कि sql दुभाषियों को दोनों करने के लिए नहीं बनाया जा सकता है।


2
हालाँकि, आप FROM myTable;इसके बजाय भी लिख सकते हैं FROM myTable SELECT *; यह केवल एक आवश्यकता की तरह लगता है क्योंकि यह वही है जो आपका उपयोग करता है।
user606723

13
सिर्फ इसलिए कि इसकी आवश्यकता नहीं है इसका मतलब यह है कि इसे पहले आना होगा।
18

8
ANSI में SQL FROMकी आवश्यकता होती है। यही कारण है कि कई RDBMS में एक टेबल होती है जिसे DUAL अन्य एकल पंक्ति डमी टेबल
मार्टिन स्मिथ

@LarsTech - इसे पहले नहीं आना है, लेकिन इसे जटिल क्यों बनाते हैं। इसे एक चयन कथन कहा जाता है, बस शब्द का चयन शुरू करें।
जेएफओ

3
@ जेफे: ठीक है। SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber
एलन ग्रेलनक

10

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

जैसे, "सेलेक्ट एक्स फ्रॉम वाई" उत्तर देने का एक और अधिक उपयुक्त तरीका है "मैं डेटाबेस से क्या चुनना चाहूंगा", जैसा कि "फ्रॉम वाई सेलेक्ट एक्स" लिखने के विपरीत है।

इसके अलावा, SQL में, SELECT / UPDATE / INSERT आपके द्वारा किए जाने वाले ऑपरेशन के प्रकार को निर्दिष्ट करता है और FROM सिर्फ एक क्लॉज है जो डेटाबेस में राइट टेबल से चयन करने में आपकी मदद करता है। फिर, आप डेटा के साथ क्या कर रहे हैं , इस बात की पूर्वता लेता है कि आप इसे कैसे प्राप्त करने जा रहे हैं।


1
+1: यह अनिवार्य या प्रक्रियात्मक नहीं है। खंडों का क्रम अंग्रेजी के साथ केवल एक उपयुक्त है। और कुछ नहीं।
लोट

पर और कहाँ एक चुनिंदा बयान में खंड के आदेश के महत्व का बेहतर उदाहरण हो सकता है।
जेफ़ो

5

एसक्यूएल अंग्रेजी बोलने वालों को लक्षित एक संरचित क्वेरी भाषा है। चुनें, INSERT, अद्यतन और DELETE अनिवार्य आदेश हैं। अंग्रेजी में अनिवार्य आदेश वाक्य या कथन शुरू करते हैं। की तुलना करें:

West young man go!

सेवा

Go west young man!

एसक्यूएल दूसरे (अनिवार्य) प्रारूप का अनुसरण करता है। इसके अलावा चार अनिवार्य आदेशों में तीन अलग-अलग प्रारूप हैं। विचार करें:

FROM    employees a,
        accounts b
UPDATE  ...

या

INTO    customers a
SELECT  ...

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

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


7
इसलिए Yoda SQL को विकसित करने में शामिल नहीं था।
adam f

दिलचस्प है कि आप अपडाउन करते हैं। UPDATE ... FROMएक अंग्रेजी जैसी संरचना नहीं है, IMO। ऐसा नहीं है कि मेरे पास कोई बेहतर सुझाव है ...
रॉबर्ट ब्राउन

आशय यह था कि संकेत को क्रिया से मेल खाना चाहिए।
बिलचोर

3

SQL कथन क्रियाओं से शुरू होते हैं। यह भाषा डिजाइनरों की पसंद थी, और कई प्रोग्रामिंग भाषाएं उस तरह से काम करती हैं। शब्दार्थ, प्रोग्रामिंग भाषाओं को देखना असामान्य नहीं है जो इस तरह से काम करती हैं:

verb(noun, noun, noun);

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


2

मुझे लगता है कि यह पार्सिंग को काफी जटिल कर देगा, खासकर उपश्रेणियों के साथ, उदाहरण के लिए

  FROM Foo f
  JOIN (FROM Bar b
        WHERE b.ID = f.ID
        UPDATE b
           SET b.Wibble = 1) x
    ON x.ID = f.ID
SELECT f.XYZ

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

यह व्याकरण के लिए कम से कम k (लुकहेड) बढ़ाएगा और सबसे खराब रूप से इसे संदर्भ के प्रति संवेदनशील बना देगा, हालांकि यह विश्वविद्यालय से मेरे बल्कि याद किए गए संकलक डिजाइन पत्रों की सीमा को बढ़ा रहा है।


विकी लेख को देखते QUELहुए उसी समय के आसपास विकसित किया गया था जब वाक्य रचना खंड का क्रम ओपी का सुझाव है।
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.