MySQL सीमा और ऑफसेट उदाहरण सहित

⚡ स्मार्ट सारांश

RSI MySQL LIMIT कीवर्ड क्वेरी द्वारा लौटाई जाने वाली पंक्तियों की संख्या को सीमित करता है, और OFFSET मान यह निर्धारित करता है कि परिणाम किस पंक्ति से शुरू होगा। ये दोनों मिलकर परिणाम सेट को छोटा रखते हैं, पृष्ठों को तेज़ी से लोड करते हैं, और रिकॉर्ड-दर-रिकॉर्ड पेजिंग को सक्षम बनाते हैं।

  • 🔢 मूल व्यवहार: LIMIT N अधिकतम N पंक्तियाँ लौटाता है। N से कम पंक्तियों वाली तालिका बिना किसी त्रुटि के उन सभी को लौटा देती है।
  • 0️⃣ शून्य मामले: LIMIT 0 कोई पंक्ति नहीं लौटाता है, जिससे यह कॉलम मेटाडेटा का निरीक्षण करने का एक सस्ता तरीका बन जाता है।
  • 📍 ऑफसेट सिंटैक्स: LIMIT 1, 2 एक पंक्ति को छोड़ देता है और दो पंक्तियाँ लौटाता है, इसलिए ऑफ़सेट पहले लिखा जाता है और पंक्ति गणना बाद में।
  • 📄 पृष्ठ संख्या निर्धारण सूत्र: OFFSET पृष्ठ के आकार को पृष्ठ संख्या से गुणा करने पर प्राप्त मान में से एक घटाने के बराबर होता है, जिससे परिणाम सेट क्रमांकित पृष्ठों में परिवर्तित हो जाता है।
  • क्रम निर्भरता: बिना ORDER BY के, MySQL प्रत्येक बार चलाने पर अलग-अलग पंक्तियाँ प्राप्त हो सकती हैं, इसलिए LIMIT केवल स्पष्ट सॉर्ट के साथ ही नियतात्मक होता है।
  • ⚙️ कथन का समर्थन: LIMIT, UPDATE और DELETE से प्रभावित होने वाली पंक्तियों की संख्या को भी सीमित करता है, जिससे एक बड़ी तालिका को असीमित लेखन से बचाया जा सकता है।
  • 🐢 प्रदर्शन संबंधी चेतावनी: एक बड़ा ऑफसेट बनाता है MySQL प्रत्येक छोड़ी गई पंक्ति को पढ़ें और हटा दें, जिससे गहरे पृष्ठों की गति धीमी हो जाती है।

MySQL सीमा और ऑफसेट

LIMIT कीवर्ड क्या है? MySQL?

RSI सीमा यह कीवर्ड क्वेरी परिणाम में लौटाई जाने वाली पंक्तियों की संख्या को सीमित करता है। इसका उपयोग SELECT, UPDATE और DELETE स्टेटमेंट के साथ किया जा सकता है, इसलिए यह क्वेरी द्वारा पढ़ी जाने वाली पंक्तियों के साथ-साथ राइट ऑपरेशन द्वारा प्रभावित होने वाली पंक्तियों की संख्या को भी सीमित करता है।

LIMIT कीवर्ड का सिंटैक्स इस प्रकार है।

SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;

यहाँ

  • “टेबलनाम से {फ़ील्डनाम(s) | *} चुनें” विश्व का सबसे लोकप्रिय एंव चयन कथन इसमें वे फ़ील्ड शामिल हैं जिन्हें हम अपनी क्वेरी में वापस करना चाहते हैं।
  • “[जहां स्थिति]” यह वैकल्पिक है, लेकिन प्रदान किए जाने पर यह परिणाम सेट पर एक फ़िल्टर निर्दिष्ट करता है। कहां कारण इसे LIMIT से पहले लागू किया जाता है, इसलिए फ़िल्टरिंग पहले होती है और जो बचता है उस पर सीमा लागू होती है।
  • “सीमा N” यह कीवर्ड है, और N N कोई भी संख्या हो सकती है, जो 0 से शुरू होती है। सीमा के रूप में 0 रखने पर कोई रिकॉर्ड नहीं मिलता। 5 जैसी संख्या रखने पर पाँच रिकॉर्ड मिलते हैं। यदि तालिका में N से कम रिकॉर्ड हैं, तो सभी रिकॉर्ड दिखाए जाते हैं और कोई त्रुटि नहीं आती।

वाक्य संरचना संक्षिप्त है, लेकिन उदाहरणों से पहले इसके अस्तित्व का कारण बताना आवश्यक है।

हमें LIMIT कीवर्ड का उपयोग क्यों करना चाहिए?

मान लीजिए हम विकास कर रहे हैंping यह एप्लिकेशन myflixdb के ऊपर चलता है। सिस्टम डिज़ाइनरों ने हमसे एक पेज पर प्रदर्शित होने वाले रिकॉर्ड की संख्या 20 तक सीमित करने को कहा है, ताकि पेज के धीमे लोड होने की समस्या से निपटा जा सके। हम ऐसा सिस्टम कैसे लागू करें जो इस आवश्यकता को पूरा करे?

LIMIT कीवर्ड ठीक इसी स्थिति को संभालता है। प्रत्येक सदस्य पंक्ति को एप्लिकेशन में लाने और उनमें से अधिकांश को हटाने के बजाय, क्वेरी प्रति पृष्ठ 20 रिकॉर्ड लौटाती है और डेटाबेस बाकी काम करता है। इससे तीन लाभ मिलते हैं।

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

MySQL LIMIT क्वेरी के उदाहरण

नीचे दिए गए उदाहरण myflixdb डेटाबेस की सदस्य तालिका पर चलाए गए हैं। पहला उदाहरण केवल दो पंक्तियाँ लौटाता है और कुछ नहीं।

SELECT * FROM members LIMIT 2;
सदस्यता_ संख्या पूरे नाम लिंग जन्म तिथि पंजीकरण की तिथि भौतिक_ पता डाक का पता संपर्क संख्या ईमेल क्रेडिट कार्ड नंबर
1 जेनेट जोन्स महिला 21-07-1980 नल फर्स्ट स्ट्रीट प्लॉट नं 4 निजी बैग 0759 253 542 janetjones@yagoo.cm नल
2 जेनेट स्मिथ जोन्स महिला 23-06-1980 नल मेलरोज़ 123 नल नल jj@fstreet.com नल

जैसा कि ऊपर दिए गए परिणाम से पता चलता है, केवल दो सदस्य ही वापस आए हैं।

डेटाबेस से दस (10) सदस्यों की सूची प्राप्त करना

मान लीजिए कि हमें Myflix डेटाबेस से पहले 10 पंजीकृत सदस्यों की सूची चाहिए। नीचे दी गई स्क्रिप्ट उन्हें प्राप्त करने का काम करती है।

SELECT * FROM members LIMIT 10;

स्क्रिप्ट को चलाने पर नीचे दिखाया गया परिणाम प्राप्त होता है।

सदस्यता_ संख्या पूरे नाम लिंग जन्म तिथि पंजीकरण की तिथि भौतिक_ पता डाक का पता संपर्क संख्या ईमेल क्रेडिट कार्ड नंबर
1 जेनेट जोन्स महिला 21-07-1980 नल फर्स्ट स्ट्रीट प्लॉट नं 4 निजी बैग 0759 253 542 janetjones@yagoo.cm नल
2 जेनेट स्मिथ जोन्स महिला 23-06-1980 नल मेलरोज़ 123 नल नल jj@fstreet.com नल
3 रॉबर्ट फिल नर 12-07-1989 नल तीसरी स्ट्रीट 3 नल 12345 rm@tstreet.com नल
4 ग्लोरिया विलियम्स महिला 14-02-1984 नल 2nd स्ट्रीट 23 नल नल नल नल
5 लियोनार्ड हॉफस्टैटर नर नल नल वुडक्रेस्ट नल 845738767 नल नल
6 शेल्डन कूपर नर नल नल वुडक्रेस्ट नल 976736763 नल नल
7 राजेश कुथरापाली नर नल नल वुडक्रेस्ट नल 938867763 नल नल
8 लेस्ली विंकल नर 14-02-1984 नल वुडक्रेस्ट नल 987636553 नल नल
9 हावर्ड वोलोविट्ज़ नर 24-08-1981 नल साउथ पार्क पीओ Box 4563 987786553 lwolowitz[at]email.me नल

केवल 9 सदस्य ही प्राप्त हुए हैं, क्योंकि LIMIT क्लॉज़ में N का मान तालिका में मौजूद रिकॉर्ड की संख्या से अधिक है। स्पष्ट रूप से 9 पंक्तियाँ माँगने पर भी वही परिणाम प्राप्त होता है।

SELECT * FROM members LIMIT 9;

💡टिप: LIMIT सर्वर द्वारा उत्पन्न किसी भी क्रम में पंक्तियों का चयन करता है। एक जोड़ें द्वारा आदेश जब भी पंक्तियों की पहचान मायने रखती है, तब इस खंड का प्रयोग करें, अन्यथा "पहले 10 सदस्य" का अर्थ दो बार वही नौ लोग होना निश्चित नहीं है।

पंक्तियों की संख्या सीमित करना इस फीचर का पहला भाग है। विंडो कहाँ से शुरू होगी, यह चुनना दूसरा भाग है।

LIMIT क्वेरी में OFFSET मान का उपयोग करना

RSI ऑफसेट value का प्रयोग अक्सर LIMIT कीवर्ड के साथ किया जाता है। यह निर्दिष्ट करता है कि सर्वर किस पंक्ति से डेटा प्राप्त करना शुरू करेगा, इसलिए उस बिंदु से पहले की पंक्तियों को छोड़ दिया जाता है।

मान लीजिए कि हम तालिका के मध्य से शुरू करते हुए सीमित संख्या में सदस्यों को चाहते हैं। नीचे दिया गया स्क्रिप्ट दूसरी पंक्ति से शुरू होता है और परिणाम को दो रिकॉर्ड तक सीमित कर देता है।

SELECT * FROM `members` LIMIT 1, 2;

इसे निष्पादित करना MySQL कार्यक्षेत्र myflixdb के विरुद्ध परीक्षण करने पर निम्नलिखित परिणाम प्राप्त होता है।

सदस्यता_ संख्या पूरे नाम लिंग जन्म तिथि पंजीकरण की तिथि भौतिक_ पता डाक का पता संपर्क संख्या ईमेल क्रेडिट कार्ड नंबर
2 जेनेट स्मिथ जोन्स महिला 23-06-1980 नल मेलरोज़ 123 नल नल jj@fstreet.com नल
3 रॉबर्ट फिल नर 12-07-1989 नल तीसरी स्ट्रीट 3 नल 12345 rm@tstreet.com नल

ध्यान दें कि यहाँ ऑफसेट = 1इसलिए पंक्ति #2 पहली पंक्ति है जिसे लौटाया जाता है, और सीमा = 2इसलिए केवल 2 रिकॉर्ड ही वापस आते हैं।

दो-तर्क वाले प्रारूप में, ऑफ़सेट पहले लिखा जाता है और पंक्ति गणना दूसरे स्थान पर, जिसे गलती से उलट देना आसान है। MySQL यह एक स्पष्ट रूप को भी स्वीकार करता है जो अस्पष्टता को दूर करता है, और नए कोड में इसी को प्राथमिकता दी जानी चाहिए।

SELECT * FROM `members` LIMIT 2 OFFSET 1;

दोनों कथन समान दो पंक्तियाँ लौटाते हैं। ऑफ़सेट को समझने के बाद, प्रत्येक लिस्टिंग स्क्रीन जिस पेजिंग पैटर्न पर निर्भर करती है, वह सीधे तौर पर इससे प्राप्त हो जाता है।

LIMIT और OFFSET का उपयोग करके क्वेरी परिणामों को पेज में कैसे विभाजित करें

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

ऑफसेट को एक ही सूत्र से इनसे प्राप्त किया जाता है।

-- OFFSET = page_size * (page_number - 1)
SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 0;   -- page 1

पेज 2 में वही सीमा बरकरार रखी गई है और ऑफसेट को एक पेज साइज आगे बढ़ा दिया गया है।

SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 20;  -- page 2

तीन नियम पृष्ठबद्ध सूची को सही और त्वरित बनाए रखते हैं।

  1. हमेशा क्रमबद्ध करें: ORDER BY का उपयोग किए बिना एक पेज वाली क्वेरी एक ही रिकॉर्ड को दो अलग-अलग पेजों पर दिखा सकती है और दूसरे को पूरी तरह से छिपा सकती है, क्योंकि सर्वर कॉल के बीच पंक्ति क्रम को बदलने के लिए स्वतंत्र है।
  2. किसी विशिष्ट कॉलम के आधार पर क्रमबद्ध करें: सॉर्ट कॉलम में टाई होने पर, टाई वाली पंक्तियों का क्रम अनिश्चित रहता है। प्राथमिक कुंजी के आधार पर सॉर्ट करने या उसे टाई-ब्रेकर के रूप में जोड़ने से यह समस्या दूर हो जाती है।
  3. गहरे पृष्ठों को देखें: ऑफसेट 100000 फ़ोर्स MySQL एक लाख पंक्तियों को पढ़कर उन्हें हटा देना और फिर अगली बीस पंक्तियाँ लौटाना। पृष्ठ संख्या बढ़ने के साथ प्रतिक्रिया समय भी बढ़ता है।

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

SELECT membership_number, full_names
FROM members
WHERE membership_number > 20      -- last id from the previous page
ORDER BY membership_number ASC
LIMIT 20;

यह फ़ॉर्म किसी भी गहराई पर तेज़ रहता है, क्योंकि इंडेक्स सीधे शुरुआती कुंजी पर जाता है, न कि उसके आगे की पंक्तियों में जाता है। इसका नुकसान यह है कि पृष्ठों को क्रम से देखना पड़ता है, इसलिए जंप करना मुश्किल हो जाता है।ping अब सीधे पेज 500 पर जाना संभव नहीं है।

सीमा में MySQL बनाम शीर्ष और पहले प्राप्त करें

LIMIT हर SQL डायलेक्ट का हिस्सा नहीं है, जो तब मायने रखता है जब किसी क्वेरी को डेटाबेस इंजन के बीच स्थानांतरित करना होता है। MySQL, PostgreSQL, तथा SQLite LIMIT कीवर्ड साझा करें। SQL सर्वर TOP का उपयोग करता है, और Oracle यह मानक FETCH FIRST क्लॉज़ का उपयोग करता है। नीचे दी गई तालिका तीनों की तुलना करती है।

धारा इंजन उदाहरण पंक्तियों को छोड़ देता है
सीमा … ऑफ़सेट MySQL, PostgreSQL, SQLite SELECT * FROM members LIMIT 20 OFFSET 40; हां, ऑफसेट के साथ
टॉप SQL सर्वर सदस्यों में से शीर्ष 20 का चयन करें; नहीं, OFFET … FETCH आवश्यक है
पहले प्राप्त करें Oracle, डीबी2, मानक एसक्यूएल SELECT * FROM members FETCH FIRST 20 ROWS ONLY; हां, ऑफसेट के साथ… पंक्तियाँ

प्रत्येक मामले में व्यवहार एक जैसा ही है: पंक्तियों की संख्या सीमित करें और, वैकल्पिक रूप से, पहले कुछ पंक्तियों को छोड़ दें। केवल वर्तनी बदलती है। इसलिए, एक क्वेरी जिसे एक से अधिक इंजन पर चलाना है, उसे पंक्ति-सीमित करने वाले खंड को कोडबेस में बिखेरने के बजाय अलग रखना चाहिए।

अक्सर पूछे जाने वाले प्रश्न

हाँ। दोनों ही साधारण पंक्ति गणना स्वीकार करते हैं, जैसे कि हटाएँ सदस्यों की सीमा 10 है। दो-तर्क वाला ऑफ़सेट फ़ॉर्म वहां मान्य नहीं है, इसलिए केवल प्रभावित पंक्तियों की संख्या को ही सीमित किया जा सकता है।

ऑफ़सेट की गणना शून्य से शुरू होती है, इसलिए ऑफ़सेट 0 पहली पंक्ति से और ऑफ़सेट 1 दूसरी पंक्ति से शुरू होता है। पंक्तियों की संख्या एक सामान्य मात्रा है और इसे एक सामान्य संख्या के रूप में पढ़ा जाता है।

एक अलग SELECT COUNT(*) क्वेरी चलाएँ जिसमें वही WHERE क्लॉज़ हो लेकिन LIMIT न हो। काउंट से एप्लिकेशन को पता चलता है कि कितने पेज मौजूद हैं, जबकि LIMIT वाली क्वेरी मौजूदा पेज की पंक्तियों की संख्या लौटाती है।

अक्सर, हाँ। ग्राहकों के भीतर एआई सहायक जैसे MySQL कार्यक्षेत्र OFFSET क्वेरी को अंतिम बार देखी गई कुंजी पर आधारित WHERE क्लॉज़ में बदलें। पुनः लिखे गए कोड पर भरोसा करने से पहले सुनिश्चित करें कि सॉर्ट कॉलम अद्वितीय और अनुक्रमित है।

क्योंकि उत्पन्न स्टेटमेंट में आमतौर पर ORDER BY शामिल नहीं होता है। स्पष्ट सॉर्ट के बिना, MySQL यह पंक्तियों को किसी भी क्रम में लौटा सकता है, इसलिए एक ही LIMIT प्रत्येक रन पर एक अलग नमूना उत्पन्न कर सकता है। सॉर्टिंग स्वयं जोड़ें।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: