Database
 sql >> डेटाबेस >  >> RDS >> Database

मूल्यों की एक श्रृंखला के लिए स्कैन करने के लिए SQL के बीच-स्मार्ट युक्तियाँ

SQL BETWEEN एक ऑपरेटर है जिसका उपयोग परीक्षण के लिए मानों की एक श्रृंखला निर्दिष्ट करने के लिए किया जाता है। लौटाया गया मूल्य समावेशी या सीमा के भीतर हो सकता है। या यदि आप इससे पहले NOT ऑपरेटर जोड़ते हैं तो यह सीमा से बाहर हो सकता है। यह तारीखों, तारीखों के साथ समय, संख्याओं और स्ट्रिंग्स के लिए काम करता है।

आप इसे निम्नलिखित के लिए WHERE क्लॉज पर उपयोग कर सकते हैं:

  • चुनें,
  • INSERT (चयन के साथ)
  • अपडेट करें,
  • और हटाएं।

यह ग्रुप बाय के साथ HAVING क्लॉज के लिए भी काम करता है।

लेकिन अगर आप सावधान नहीं हैं, तो SQL BETWEEN इसका उपयोग करते समय आपको पागल बना सकता है, खासकर समय के साथ तिथियों के साथ।

हालांकि चिंता की कोई बात नहीं है। हमारे पास SQL ​​​​BETWEEN का उपयोग करने में गॉथस से निपटने के लिए उदाहरण हैं। लेकिन उससे पहले, मैंने जो नमूना डेटा इस्तेमाल किया वह NOAA . से आया था . आप उनसे मुफ्त में मौसम संबंधी डेटा का अनुरोध कर सकते हैं। मैंने वर्ष 2010 में संयुक्त राज्य अमेरिका के लिए प्रति घंटा तापमान रिकॉर्ड का उपयोग किया। फिर, मैंने SQL सर्वर प्रबंधन स्टूडियो का उपयोग करके SQL सर्वर में CSV डेटा आयात किया। मैंने स्तंभों का नाम बदल दिया और एक गैर-संकुल सूचकांक जोड़ा।

आइए शुरू करते हैं।

दिनांक और समय के बीच SQL का उपयोग करना

SQL के बीच व्यवहार करते समय यह सबसे अधिक खोजा जाने वाला आइटम होना चाहिए। यह कैसे काम करता है यह समझाने के लिए हम उदाहरणों का उपयोग करेंगे।

टिप #1:DATETIME कॉलम के लिए, दिनांक और समय दोनों निर्दिष्ट करें

गलत उपयोग

आइए इस बिंदु पर जोर देने के लिए गलत उपयोग से शुरू करें। DATETIME कॉलम के साथ BETWEEN का निम्नलिखित उपयोग अप्रत्याशित परिणाम देगा।


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


क्वेरी शिकागो में ओ'हारे अंतरराष्ट्रीय हवाई अड्डे के पास एक मौसम स्टेशन से 2 दिनों के लिए डेटा लौटाती है। आप निम्न मान (01/01/2010) और उच्च मान (01/02/2010) के बीच की सीमा देख सकते हैं। यहाँ चित्र 1 में सेट किया गया परिणाम है।

चित्र 1 . 2 तिथियों के बीच SQL का उपयोग करके क्वेरी का परिणाम सेट।

लेकिन समस्या कहाँ है?

यह 2 दिनों के लिए एक घंटे का रिकॉर्ड माना जाता है। उसके कारण, परिणाम सेट में 48 रिकॉर्ड होने चाहिए। लेकिन ध्यान दें कि यह केवल 24 है। समस्या DateHour के समय तत्व के साथ है। कॉलम। जब आप DATETIME कॉलम में समय निर्दिष्ट नहीं करते हैं, तो यह 00:00 या 12:00 AM मान लेता है। साथ ही, ध्यान दें कि डेटा 1 जनवरी, 2010 को सुबह 01:00 बजे शुरू हुआ, न कि 12:00 पूर्वाह्न पर।

इसलिए, आंतरिक रूप से, SQL सर्वर ने DateHour . का उपयोग किया '01/01/2010 00:00:00.000′ . के बीच और '01/02/2010 00:00:00.000′ . हम कैसे जानते हैं?

तारीख वास्तव में एक स्ट्रिंग है

यह सही है।

एकल उद्धरणों में संलग्न दिनांक मान वास्तव में दिनांक नहीं बल्कि तार हैं . SQL सर्वर स्ट्रिंग को DATETIME में बदलने के लिए निहित रूपांतरण का उपयोग करता है। रूपांतरण के बाद, समय भाग को तिथि के साथ जोड़ दिया जाएगा।

आइए वास्तविक निष्पादन योजना शामिल करें . के साथ निरीक्षण करें . Ctrl-M Press दबाएं SQL सर्वर प्रबंधन स्टूडियो में, फिर पिछले उदाहरण को फिर से चलाएँ।

जब निष्पादन योजना दिखाई दे, तो अनुक्रमणिका खोज . पर राइट-क्लिक करें ऑपरेटर और गुण . चुनें . चित्र 2 देखें।

चित्र 2 . एक स्ट्रिंग का DATETIME में अंतर्निहित रूपांतरण। यह BETWEEN का उपयोग करके किसी क्वेरी की निष्पादन योजना में छिपा होता है।

फिर भविष्यवाणियों की तलाश करें . का विस्तार करें . चित्र 2 के बॉक्सिंग भाग 2 स्ट्रिंग्स के DATETIME में निहित रूपांतरण दिखाते हैं। चूंकि अंतर्निहित रूपांतरण आंतरिक रूप से किया जाता है , नए लोग भ्रमित हो जाते हैं कि परिणाम सेट में उनकी अपेक्षाएं पूरी क्यों नहीं होती हैं।

सही उपयोग

नीचे दिया गया उदाहरण 2 जनवरी, 2010 को सुबह 8:00 बजे से दोपहर 12:00 बजे के बीच प्रति घंटा रिकॉर्ड लौटाएगा।


SELECT * FROM TemperatureData
WHERE DateHour BETWEEN '01/02/2010 08:00' AND '01/02/2010 12:00'
AND Latitude = 41.995
AND Longitude = -87.9336;


आपको समय भाग निर्दिष्ट करने की आवश्यकता है, खासकर जब तिथियां समान हों। या आपके अपेक्षित परिणाम नहीं होंगे।

पूरे दिन के रिकॉर्ड वापस करने के लिए, यह काम नहीं करेगा:


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


यह केवल 1 रिकॉर्ड लौटाएगा - एक जून 1, 2010 के लिए, 12:00 पूर्वाह्न पर। लेकिन निर्दिष्ट समय के साथ BETWEEN का उपयोग करके, आप पूरे दिन के लिए प्रत्येक घंटे का रिकॉर्ड वापस कर सकते हैं। अगला उदाहरण देखें।


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


ध्यान दें कि मैंने केवल 23:00 बजे तक निर्दिष्ट किया है। यदि आपका डेटा दिन के किसी भी समय उपयोग करता है, तो सीमा के उच्च मान में 23:59 या 11:59 अपराह्न का उपयोग करें। यदि आपको इसकी आवश्यकता हो तो सेकंड भी निर्दिष्ट करें।

टिप #2:DATE डेटा प्रकार पर विचार करें

यदि आपको समय भाग की आवश्यकता नहीं है, तो इसके बजाय DATE डेटा प्रकार पर विचार करें। और आप ऊपर बताई गई परेशानी से बचेंगे।

संख्याओं के बीच SQL

आइए संख्याओं पर चलते हैं।

टिप #3:गैर-पूर्णांक मानों के लिए दशमलव भाग शामिल करें


SELECT
 DateHour
,[Hourly_Heating_Degree_Hours]
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND '06/5/2010 23:00'
AND [Hourly_Heating_Degree_Hours] BETWEEN 5.0 AND 7.0
AND Latitude = 41.995
AND Longitude = -87.9336;


संख्याओं को शामिल करते हुए एक और शर्त जोड़ने पर ध्यान दें। परिणाम आगे 5 और 7 डिग्री तक सीमित रहेंगे।

DECIMAL, MONEY, या FLOAT डेटा प्रकारों का उपयोग करते समय, दशमलव भाग निर्दिष्ट करें, भले ही वह शून्य हो, जैसे 52.00 या 10.000। इस तरह, आप निहित रूपांतरण से बचते हैं लक्ष्य DECIMAL, MONEY, या FLOAT डेटा प्रकारों के लिए।

स्ट्रिंग्स के बीच SQL

टिप #4:स्ट्रिंग्स के लिए, रेंज कोलेशन पर आधारित है

स्ट्रिंग्स के साथ, BETWEEN वर्णानुक्रम के आधार पर मानों का मूल्यांकन करता है। 'ए' सबसे छोटा है और 'जेड' सबसे बड़ा है। आप यह भी कह सकते हैं कि सामान्य तौर पर मूल्यांकन मिलान पर आधारित होता है। क्योंकि अंग्रेजी एकमात्र ऐसी भाषा नहीं है जो SQL सर्वर का समर्थन करता है। संयोजन छँटाई नियम, मामला और उच्चारण संवेदनशीलता प्रदान करता है। आइए AdventureWorks . का उपयोग करें इस उदाहरण के लिए डेटाबेस। नीचे दिए गए कोड और चित्र 3 में परिणाम देखें।


USE AdventureWorks
GO

SELECT 
 LastName
,FirstName
,MiddleName
FROM Person.Person
WHERE Lastname BETWEEN 'Spanaway' AND 'Splane'
ORDER BY LastName;

चित्र 3 . स्ट्रिंग के साथ BETWEEN का उपयोग करके क्वेरी का परिणाम सेट।

इस श्रेणी में अंतिम नाम शामिल है स्पैनवे . लेकिन विमान कहां है ? यह डेटाबेस में मौजूद नहीं है। तो, परिणाम केवल स्पाइसर . तक पहुंच गया ।

सभी समर्थित डेटा प्रकारों के लिए युक्तियों के बीच SQL

चाहे आप तिथियों, संख्याओं या स्ट्रिंग्स के लिए BETWEEN का उपयोग कर रहे हों, ऐसी सामान्य बातें हैं जिनसे आपको अवगत होना चाहिए। यह सामान्य ज्ञान हो सकता है, लेकिन यह फिर भी गलती से होता है। पढ़ें कि यह कैसे हो सकता है।

टिप #5:प्रारंभ और समाप्ति दोनों मान शून्य नहीं हो सकते

BETWEEN को श्रेणी के लिए प्रारंभ और समाप्ति मानों की आवश्यकता है। प्रत्येक का एक मान होना चाहिए जो NULL नहीं है। नीचे एक NULL अंतिम मान वाला एक उदाहरण है।


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


ऐसा तब हो सकता है जब आप किसी ऐप या संग्रहीत प्रक्रिया से SELECT स्टेटमेंट को कॉल करते हैं, और आपने इसे ठीक से मान्य नहीं किया है।

टिप #6:प्रारंभ मान अंतिम मूल्य से अधिक नहीं हो सकता

यदि दोनों मान NULL नहीं हैं, तो भी कुछ भी वापस नहीं किया जाएगा, लेकिन सीमा उलट दी गई है। यहाँ एक उदाहरण है।


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


तिथियों के अलावा, निम्नलिखित भाव भी परिणाम नहीं देंगे:

  • 100 और -200 के बीच मान। क्योंकि -200 100 से कम है।
  • 'ज़ूकीपर' और 'अकाउंटेंट' के बीच काम करें। क्योंकि 'Z' 'A' से बड़ा है।

टिप #7:श्रेणी मान समान डेटा प्रकार होने चाहिए

कभी-कभी, उपयोगकर्ता इंटरफ़ेस नियंत्रणों में अनपेक्षित आउटपुट होता है। या हमने अभी गलत संपत्ति उठाई है। और अगर हम इसे SQL सर्वर पर भेजने से पहले इसकी जाँच नहीं करते हैं, तो ऐसी स्थिति हो सकती है:


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;

एक वर्ण स्ट्रिंग से किसी दिनांक में रूपांतरण त्रुटि उत्पन्न होगी।

इसलिए, युक्ति #5 से #7 तक का पाठ श्रेणी के प्रारंभ और समाप्ति मानों को सत्यापित करना है ।

टिप #8:मान बहिष्कृत करने के लिए NOT BETWEEN का उपयोग करें

एक अन्य उदाहरण पर विचार करें।


SELECT
 MONTH(DateHour) AS [Month] 
,round(AVG([Hourly_Heating_Degree_Hours]),2) AS AverageTemperature
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010 00:00' AND '06/30/2010 23:00'
AND DateHour NOT BETWEEN '05/01/2010 00:00' AND '05/31/2010 23:00'
AND Latitude = 41.995
AND Longitude = -87.9336
GROUP BY MONTH(DateHour);


यह जनवरी से जून तक मासिक औसत लौटाएगा लेकिन मई को बाहर कर देगा। मई 2010 के रिकॉर्ड को छोड़कर NOT BETWEEN द्वारा संभव बनाया गया है। यहां चित्र 4 में सेट किया गया परिणाम है।

चित्र 4 . NOTWEEN का उपयोग करके क्वेरी का परिणाम सेट।

अन्य ऑपरेटरों की तुलना में SQL के बीच

टिप #9:अगर आपको सूची चाहिए, रेंज नहीं तो IN का उपयोग करें

IN ऑपरेटर यह निर्धारित करता है कि कोई मान किसी सूची या सबक्वेरी में किसी मान से मेल खाता है या नहीं। इस बीच, NOT IN का उपयोग यह जांचता है कि कोई मान मेल नहीं खाता है या नहीं।

BETWEEN और IN दोनों ऑपरेटर कई मानों के आधार पर डेटा फ़िल्टर करते हैं। लेकिन अंतर मिलान किए जा रहे मूल्यों के सेट में है। के बीच एक सीमा का उपयोग करता है। लेकिन IN किसी सूची या उप-क्वेरी में पंक्तियों में अल्पविराम से अलग किए गए मानों का उपयोग करता है।

नीचे दिए गए उदाहरण की जाँच करें।

SELECT
 DateHour
,[Hourly_Heating_Degree_Hours]
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND '06/5/2010 23:00'
AND [Hourly_Heating_Degree_Hours] IN (5.2, 6, 7, 3.7)
AND Latitude = 41.995
AND Longitude = -87.9336;


IN द्वारा उपयोग किए गए मानों की सूची देखें। इसे बढ़ते मूल्यों की सूची होने की आवश्यकता नहीं है। सूची में अंतिम मान (3.7) भी संख्याओं में सबसे छोटा है।

टिप #10:बीच में से चुनें या>=के साथ <=

रनटाइम पर, SQL सर्वर <=ऑपरेटरों के साथ BETWEEN को>=में कनवर्ट करता है। हम कैसे जानते हैं?

नीचे दिए गए कोड को देखें।


SELECT
 DateHour
,AVG(Hourly_Heating_Degree_Hours) AS AverageTemp
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010 08:00' AND '01/01/2010 12:00'
GROUP BY DateHour;

SELECT
 DateHour
,AVG(Hourly_Heating_Degree_Hours) AS AverageTemp
FROM TemperatureData
WHERE DateHour >= '01/01/2010 08:00' 
AND DateHour <= '01/01/2010 12:00'
GROUP BY DateHour;


दोनों प्रश्नों का वही परिणाम होगा जो चित्र 5 में दिया गया है।

चित्र 5 . परिणाम या तो BETWEEN या>=के साथ <=. का उपयोग करके सेट किया गया है

उनके पास भी वही निष्पादन योजना है, जैसा कि चित्र 6 में देखा गया है।

चित्र 6 . बीटवेन, और>=और <=ऑपरेटरों के उपयोग की तुलना करते हुए 2 प्रश्नों की निष्पादन योजना।

लेकिन ये रही बात।

पहले सूचकांक . पर ध्यान दें खोजें चित्र 6 में संचालिका। फिर, भविष्यवाणियों की तलाश करें . देखें . क्या आप कीवर्ड के बीच देखते हैं? कोई नहीं है, है ना? क्योंकि इसे <=ऑपरेटरों के साथ>=में बदल दिया जाता है। वे ऑपरेटर हैं जो सीक प्रेडिकेट्स . में मौजूद हैं ।

लेकिन और भी बहुत कुछ है।

यदि आप अपने माउस को दूसरी अनुक्रमणिका खोज . पर घुमाते हैं ऑपरेटर, आपको वही गुण दिखाई देंगे जो पहले इंडेक्स सीक

तो, ऐसा लगता है कि BETWEEN ऑपरेटर <=ऑपरेटरों के साथ>=का शॉर्टकट है . यदि आप बाद वाले का उपयोग करते हैं तो आप अधिक टाइप करेंगे। आप देखेंगे कि वही रूपांतरण तब होता है जब संख्याओं और स्ट्रिंग्स में BETWEEN का उपयोग किया जाता है।

अंत में, यह आप पर निर्भर है कि आप BETWEEN या>=और <=ऑपरेटरों का उपयोग करते हैं। BETWEEN में परिवर्तित होने में लगने वाला रूपांतरण समय नगण्य है। लेकिन अगर आप अभी भी वह अतिरिक्त, नगण्य समय नहीं चाहते हैं, तो>=और <=ऑपरेटरों का उपयोग करें।

नीचे की रेखा

SQL BETWEEN श्रेणी सहित डेटा लाने के लिए अच्छा है। और इसका उपयोग करना इतना कठिन नहीं है। यहां तक ​​​​कि DATETIME मान भी BETWEEN के साथ प्रबंधनीय हैं। बस सुनिश्चित करें कि आपने समय भाग को ठीक से कवर किया है। यह <=के साथ>=का उपयोग करने के बराबर भी है। यह आप पर निर्भर करता है कि आप किसका उपयोग करना पसंद करते हैं।

जब आपको आवश्यकता हो, दिनांक, संख्या और स्ट्रिंग के लिए युक्तियों के बीच SQL प्राप्त करने के लिए आप इस पृष्ठ को बुकमार्क कर सकते हैं।

यदि आपके पास BETWEEN का उपयोग करने वाली कुछ तरकीबें हैं जिन्हें हमने कवर नहीं किया है, तो आप उन्हें हमारे साथ टिप्पणी अनुभाग में साझा कर सकते हैं। और अगर आपको यह लेख पसंद आया हो, तो कृपया इसे सोशल मीडिया बटन दबाकर शेयर करें।

सभी को हैप्पी कोडिंग!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक पुस्तकालय डेटा मॉडल

  2. मूल्यों की एक श्रृंखला के लिए स्कैन करने के लिए SQL के बीच-स्मार्ट युक्तियाँ

  3. एक हजार कटौती कार्यभार से मौत का विश्लेषण

  4. एसक्यूएल में क्लॉज द्वारा ऑर्डर का उपयोग कैसे करें?

  5. MMO खेल और डेटाबेस डिजाइन