SQL का BETWEEN आधे-खुले के बजाय समावेशी क्यों है?


45

सेमी-ओपन (या हाफ-ओपन, हाफ-क्लोज्ड , हाफ-बाउंडेड ) अंतराल ( [a,b)जहां xअंतराल आईएफएफ से संबंधित है a <= x < b) प्रोग्रामिंग पर बहुत आम हैं, क्योंकि उनके पास कई सुविधाजनक गुण हैं।

क्या कोई औचित्य पेश कर सकता है जो बताता है कि एसक्यूएल BETWEENएक बंद अंतराल ( [a,b]) का उपयोग क्यों करता है ? यह esp है। तारीखों के लिए असुविधाजनक। आप BETWEENइस तरह का व्यवहार क्यों करेंगे ?


मैं उत्सुक हूं, उनके पास क्या सुविधाजनक गुण हैं?
फं।

2
यदि यह समावेशी नहीं था, तो आप A से D तक के सभी अंतिम नामों के लिए आसानी से कैसे क्वेरी कर सकते हैं? या W से Z नाम? 1 और 10 के बीच की संख्या के लिए आप 0 <n <11 खोज सकते हैं, लेकिन वर्णों के लिए आपको ASCII नंबर का उपयोग करना होगा? या यूनिकोड संख्या? साथ ही, इंडेक्स आपको आसानी से अपने डेटा की शुरुआत तक पहुंचा सकते हैं।
18

2
मैं आपकी हताशा को समझता हूं, (StartDate> = '2010-01-01' और StartDate <'2011-01-01'), खूबसूरती से काम करता है, बराबरी का उपयोग करने के लिए (StartDate '2010-01-01 और' के बीच शुरू करें) 2010-12-31 23:59:59 '), दोनों भारी और एक को यह जानने की जरूरत है कि दिसंबर में कितने दिन हैं।
टोड

1
@ phant0m [ए, बी) यू [सी, डी) == [ए, डी)। [a: int, b: int) में बिल्कुल बा तत्व होते हैं। टॉड की टिप्पणी से पता चलता है कि वे विशेष रूप से तिथियों के लिए कैसे काम करते हैं (जो कि मैं उन्हें सबसे ज्यादा याद करता हूं)। मूल रूप से, जब कोडिंग, अर्धविराम अंतराल सरल, उपयोग करने में आसान और मजबूत होते हैं।
एलेक्स

सबसे अच्छे उत्तर में उन लोगों से वस्तुनिष्ठ निर्णय प्रलेखन को संदर्भित किया जाना चाहिए, जिन्होंने पहले SQL के लिए BETWEEN निर्दिष्ट किया था, जिससे कि व्यक्तिपरक उत्तर के बजाय चयनित उत्तर क्यों दिया गया।
टॉड

जवाबों:


48

मुझे लगता है कि समावेशी BETWEENअधिक सहज (और जाहिरा तौर पर, एसक्यूएल डिजाइनरों ने) अर्ध-खुले अंतराल की तुलना में किया है। उदाहरण के लिए, अगर मैं कहता हूं "1 और 10 के बीच की संख्या चुनें", तो ज्यादातर लोग नंबर 1 और 10. को शामिल करेंगे। ओपन-एंडेड अंतराल वास्तव में गैर-डेवलपर्स के लिए विशेष रूप से भ्रमित है क्योंकि यह असममित है। एसक्यूएल कभी कभी गैर प्रोग्रामर द्वारा प्रयोग किया जाता है सरल प्रश्नों बनाने के लिए, और अर्द्ध खुले अर्थ विज्ञान हो गया होता बहुत अधिक उनके लिए भ्रमित।


9
आपका उदाहरण पूर्णांक पर केंद्रित है, दशमलव संख्या और अन्य सीमांकित मात्रा (जैसे दिनांक) के बीच का शब्द अस्पष्ट है। अगर मैं कहता हूं कि आपने 2012 और 2013 के बीच एक्स किया है, तो मैं 2013 (या विशेष रूप से 2013-01-01 दिन) को शामिल नहीं करता हूं
टोड

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

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


सवाल अक्सर " 1 से 10 तक की संख्या चुनें " (केवल स्पष्ट अस्पष्टता से बचने के लिए) से पूछा जाता है । अलग नोट के रूप में। आप कहते हैं "1 और 10 के बीच की संख्या चुनें"; ज्यादातर लोग शायद 1 या 10. का चयन नहीं करेंगे। यह एक मनोविज्ञान समस्या है। :) लोग अभी भी 1 और 10 को वैध विकल्प के रूप में स्वीकार करेंगे (इसके बावजूद शब्दार्थ गलत होने के बावजूद); लेकिन यह 1 और 10 मानने वाली प्रासंगिक व्याख्या का एक परिणाम है। यदि आप कहते हैं: "13 और 24 के बीच" और आपसे यह पूछे जाने की अधिक संभावना है कि क्या 13 और 24 शामिल हैं।
मोहभंग हुआ

25

प्रश्न: क्यों एसक्यूएल का बीटा समावेशी है?

उत्तर: क्योंकि SQL भाषा डिजाइनरों ने एक खराब डिज़ाइन निर्णय लिया, जिसमें वे सिंटैक्स देने में विफल रहे, जो डेवलपर्स को बीटाविलेन (बंद, अर्ध-खुले-बाएं, अर्ध-खुले-दाएं, या खुले के 4 प्रकारों को निर्दिष्ट करने की अनुमति देगा) ) वे पसंद करेंगे।

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

उदाहरण के लिए, यदि आपकी क्वेरी इनपुट दिवस विनिर्देश को स्वीकार कर रही है और उस तारीख को गिने गए सभी रिकॉर्ड वापस करना चाहिए, तो आप इस रूप में कोड करेंगे:

  • WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1

BETWEEN जोखिम प्रदर्शन मुद्दों और / या छोटी गाड़ी कोड का उपयोग करके तर्क लिखने की कोशिश कर रहा है। तीन आम गलतियाँ:

1) WHERE DATE_FIELD BETWEEN :dt AND :dt+1

यह लगभग निश्चित रूप से एक बग है - उपयोगकर्ता किसी विशेष तिथि के लिए केवल रिकॉर्ड देखने की उम्मीद करता है, फिर भी एक दिन एक रिपोर्ट के साथ अगले दिन के 12:00 बजे रिकॉर्ड होगा।

2) WHERE TRUNC(DATE_FIELD) = :dt

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

3) WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60

ओरेकल गुरु असाधारण, टॉम कायटे, इस कम-से-सुरुचिपूर्ण (आईएमओ) समाधान की सिफारिश करते हैं। जब तक आप पूरा दिन व्यतीत नहीं करते तब तक काम करता है कि "1-1 / 24/06/60" एक क्वेरी में हो जो अपूर्ण परिणाम देता है ... या जब तक आप गलती से इसका उपयोग TIMESTAMP फ़ील्ड पर नहीं करते हैं। इसके अलावा, यह थोड़ा सा स्वामित्व है; Oracle के DATE डेटा प्रकार (जो दूसरे पर नज़र रखता है) के साथ संगत है, लेकिन विभिन्न डेटाबेस उत्पादों के DATE / TIME परिशुद्धता के लिए इसे समायोजित करने की आवश्यकता है।

समाधान: CLOSED / INCLUSIVE डिफ़ॉल्ट के विकल्पों के विनिर्देशन का समर्थन करने के लिए BETWEEN वाक्यविन्यास को संशोधित करके SQL भाषा ऐनक को बढ़ाने के लिए ANSI SQL समिति को याचिका। कुछ इस तरह से करेंगी ट्रिक:

expr1 बीच expr2 [ INCL [usive] | EXCL [usive]] और expr3 [ INCL [usive] | EXCL [USIVE]]

विचार करें कि व्यक्त करना कितना आसान है WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE(या सिर्फ WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL)

शायद ANSI SQL: 2015?


यह जवाब ऋषि सलाह है।
बेसिल बोर्के

@KevinKirkPatrick - शानदार जवाब! मेरा सुझाव है कि आप मूल दस्तावेज़ीकरण के वस्तुनिष्ठ साक्ष्य के रूप में निर्णय प्रलेखन को खोजने का प्रयास करें।
टॉड

3
मुझे व्यक्तिगत रूप से exp1 BETWEEN exp2 AND exp3 AND exp1 != exp3वह तरीका पसंद है जो आपको ऑपरेटर के बीच रखने के लिए मिलता है ताकि आप जान सकें कि यह एक बजता हुआ विधेय है, और असमानता की भविष्यवाणी यह ​​सुनिश्चित करती है कि यह अर्ध खुला है।
प्रहरी

@ सेंटिनल, अच्छा लगा! मैं खुद को समय से पहले रूपांतरित करने की घोषणा नहीं करने जा रहा हूं, लेकिन जब मैं अगली बार कोड-श्रेणी की शर्तों के लिए इस संस्करण को ध्यान में रखूंगा। पहले ब्लश में, यह exp1> = exp2 और exp1 <exp3 की तुलना में अधिक भाषाई अपील करता है; और जाहिर है कि बराबर के साथ मुद्दों को भी समान रूप से हल करता है। यदि कोई भी अनुकूलनकर्ता दूसरे पर एक भिन्नता की "समझ" दिखाता है तो मुझे दिलचस्पी होगी; निश्चित रूप से, यह प्रशंसनीय लगता है कि आपका उस संबंध में भी बेहतर परिणाम मिल सकता है (हालांकि स्पष्ट रूप से, मैं
आशावादी

@KevinKirkpatrick मैंने कभी भी यह पता लगाने के लिए उन्हें प्रोफाइल नहीं किया है कि क्या कोई मतभेद हैं, और अगर वहाँ थे, तो मुझे भी निराशा होगी।
प्रहरी

8

दोनों समावेशी ( a <= x <= b) और अनन्य ( a < x < b) समान रूप से सामान्य हैं, इसलिए मानकों को बनाते समय उन्हें बस एक चुनना था। "आम अंग्रेजी में" आम तौर पर समावेशी होता है, और एक SQL कथन अंग्रेजी वाक्य के समान पढ़ने के लिए होता है, इसलिए समावेशी एक समझदार विकल्प था।


4
वास्तव में अंग्रेजी में उपयोग और भी मिश्रित है क्योंकि आपने हाफ-ओपन को छोड़ दिया है। जब हम कहते हैं कि "दोपहर का भोजन दोपहर और 1 बजे के बीच होता है" तो हमारा मतलब है कि आप आधे-खुले हैं कि आपसे 13/00: 00.000 के क्षण में कक्षा / काम पर वापस जाने की उम्मीद है, ब्रेक के साथ, लेकिन पहले क्षण में शामिल नहीं एक-घंटा घड़ी। a <= x < bहाफ-ओपन है।
तुलसी बॉर्क

1
@ बासिलबोर्क: यह अनंत परिशुद्धता के कारण हो सकता है - जैसे दोपहर का भोजन दोपहर 12 से 59: 99.9999999999999 के बीच ....
ब्रेंडन

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

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

5

ऑपरेटर को बुलाया नहीं जाता है ∩[a,b), इसे बुलाया जाता है BETWEEN, इसलिए इसके शब्दार्थों के लिए अंग्रेजी मुहावरों के बीच "गणितीय गणितीय विधेयकों की तुलना में" अर्ध-खुले अंतराल में है "।


सभी अनुप्रयोगों पर विचार करने की आवश्यकता है, न कि केवल अंग्रेजी अनुप्रयोगों के लिए इंटेगर सेट। "1 से 10 के बीच", "दोपहर और 1 बजे के बीच", "1.0 और 5.0 के बीच" (ग्राम)। "5.50 और 10.30 के बीच" (डॉलर)। सतत मात्रा को तार्किक (अंग्रेजी में) अनन्य माना जाएगा।
टॉड

1
समस्या यह है कि BETWEENऑपरेटर अंग्रेजी वाक्यांश "के बीच है" के शब्दार्थ का उपयोग नहीं करता है । अंग्रेजी में "बीच" वह समय, स्थान या अंतराल है जो चीजों को अलग करता है (यानी यह अनन्य है )। यदि आप एक गोल मारने की कोशिश करते हैं, तो गेंद को स्कोर करने के लिए पदों के बीच जाना पड़ता है। यदि आप उनके बीच से गुजरने में विफल होने वाले पोस्ट को हिट करते हैं - तो आपके लिए कोई स्कोर नहीं।
मोहभंग हुआ

1
@CraigYoung स्वीकार किए गए उत्तर के रूप में सुझाव देता है (और मैं सहमत हूं), "अगर मैं कहता हूं" 1 और 10 के बीच एक संख्या उठाओ ", तो ज्यादातर लोग 1 और 10 [संख्याओं को अपने संभावित उत्तरों में शामिल करेंगे]। एक स्थानिक डोमेन में मैं आपसे सहमत हूं, लेकिन संख्याओं के लिए मैं कहूंगा कि यह अलग है। अंग्रेजी भाषा और उपयोग के लिए बेहतर हालांकि यहाँ से!
आकाशवाणी

@ आकाशवाणी मेरा कहना है कि आपने अंग्रेजी भाषा के बारे में एक दावा किया है, जो प्रोग्रामिंग शब्दार्थों को सही ठहराने के लिए "बीच में" शब्द की परिभाषा से झूठा है। यह तथ्य कि "1 और 10 के बीच" वाक्यांश की आम समझ है, "दशमलव" के अर्थ के साथ कम और दशमलव 1 प्रणाली में 1 और 10 पदों के साथ करने के लिए अधिक है। मानव मस्तिष्क के "ऑटो-सही" इस बात को अनदेखा करते हैं कि "इस मामले में अंतिम बिंदुओं को छोड़कर" क्योंकि यह 2 से 9 तक का अर्थ "हास्यास्पद" लगता है। "13 और 24 के बीच" के साथ ही प्रयास करें। या यहां तक ​​कि "0 और 11 के बीच"।
मोहभंग हुआ

आपके और मेरे बीच, प्राकृतिक भाषाओं के बारे में श्रेणीबद्ध दावे आमतौर पर असुरक्षित हैं।
आकाशवाणी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.