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

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
तीन नियम पृष्ठबद्ध सूची को सही और त्वरित बनाए रखते हैं।
- हमेशा क्रमबद्ध करें: ORDER BY का उपयोग किए बिना एक पेज वाली क्वेरी एक ही रिकॉर्ड को दो अलग-अलग पेजों पर दिखा सकती है और दूसरे को पूरी तरह से छिपा सकती है, क्योंकि सर्वर कॉल के बीच पंक्ति क्रम को बदलने के लिए स्वतंत्र है।
- किसी विशिष्ट कॉलम के आधार पर क्रमबद्ध करें: सॉर्ट कॉलम में टाई होने पर, टाई वाली पंक्तियों का क्रम अनिश्चित रहता है। प्राथमिक कुंजी के आधार पर सॉर्ट करने या उसे टाई-ब्रेकर के रूप में जोड़ने से यह समस्या दूर हो जाती है।
- गहरे पृष्ठों को देखें: ऑफसेट 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; | हां, ऑफसेट के साथ… पंक्तियाँ |
प्रत्येक मामले में व्यवहार एक जैसा ही है: पंक्तियों की संख्या सीमित करें और, वैकल्पिक रूप से, पहले कुछ पंक्तियों को छोड़ दें। केवल वर्तनी बदलती है। इसलिए, एक क्वेरी जिसे एक से अधिक इंजन पर चलाना है, उसे पंक्ति-सीमित करने वाले खंड को कोडबेस में बिखेरने के बजाय अलग रखना चाहिए।
