नहीं, कोई गारंटी नहीं है। जब तक आप ORDER BY
. का उपयोग करके कोई ऑर्डर निर्दिष्ट नहीं करते हैं खंड, आदेश पूरी तरह से आंतरिक कार्यान्वयन विवरण पर निर्भर है। अर्थात। जो भी RDBMS इंजन के लिए सबसे सुविधाजनक हो।
व्यवहार में, पंक्तियाँ हो सकता है उनके मूल सम्मिलन क्रम में लौटाया जाना चाहिए (या अधिक सटीक रूप से भौतिक भंडारण में पंक्तियों का क्रम मौजूद है), लेकिन आपको इस पर निर्भर नहीं होना चाहिए। यदि आप अपने ऐप को RDBMS के किसी अन्य ब्रांड में पोर्ट करते हैं, या यहां तक कि यदि आप MySQL के एक नए संस्करण में अपग्रेड करते हैं जो स्टोरेज को अलग तरीके से लागू कर सकता है, तो पंक्तियाँ किसी अन्य क्रम में वापस आ सकती हैं।
बाद वाला बिंदु किसी भी SQL-अनुपालक RDBMS के लिए सही है।
भंडारण में पंक्तियों के मौजूद होने के क्रम से उनके बनाए गए क्रम के मुकाबले मेरा क्या मतलब है, इसका एक प्रदर्शन यहां दिया गया है:
CREATE TABLE foo (id SERIAL PRIMARY KEY, bar CHAR(10));
-- create rows with id 1 through 10
INSERT INTO foo (bar) VALUES
('testing'), ('testing'), ('testing'), ('testing'), ('testing'),
('testing'), ('testing'), ('testing'), ('testing'), ('testing');
DELETE FROM foo WHERE id BETWEEN 4 AND 7;
+----+---------+
| id | bar |
+----+---------+
| 1 | testing |
| 2 | testing |
| 3 | testing |
| 8 | testing |
| 9 | testing |
| 10 | testing |
+----+---------+
तो अब हमारे पास छह पंक्तियाँ हैं। इस बिंदु पर भंडारण में पंक्तियों 3 और 8 के बीच का अंतर होता है, मध्य पंक्तियों को हटाने के बाद छोड़ दिया जाता है। पंक्तियों को हटाने से इन अंतरालों को डीफ़्रैग्मेन्ट नहीं किया जाता है।
-- create rows with id 11 through 20
INSERT INTO foo (bar) VALUES
('testing'), ('testing'), ('testing'), ('testing'), ('testing'),
('testing'), ('testing'), ('testing'), ('testing'), ('testing');
SELECT * FROM foo;
+----+---------+
| id | bar |
+----+---------+
| 1 | testing |
| 2 | testing |
| 3 | testing |
| 14 | testing |
| 13 | testing |
| 12 | testing |
| 11 | testing |
| 8 | testing |
| 9 | testing |
| 10 | testing |
| 15 | testing |
| 16 | testing |
| 17 | testing |
| 18 | testing |
| 19 | testing |
| 20 | testing |
+----+---------+
ध्यान दें कि तालिका के अंत में नई पंक्तियों को जोड़ने से पहले, MySQL ने पंक्तियों को हटाकर खोले गए रिक्त स्थान का पुन:उपयोग कैसे किया है। यह भी ध्यान दें कि पंक्तियों 11 से 14 को इन रिक्त स्थान में उल्टे क्रम में डाला गया था, अंत से पीछे की ओर भरते हुए।
इसलिए पंक्तियों को संग्रहीत करने का क्रम ठीक उसी क्रम में नहीं है जिसमें उन्हें डाला गया था।
अद्यतन:यह प्रदर्शन मैंने 2009 में लिखा था MyISAM के लिए। जब तक आप ORDER BY का उपयोग नहीं करते हैं, तब तक InnoDB अनुक्रमणिका क्रम में पंक्तियाँ लौटाता है। यह उत्तर की शुरुआत में बिंदु का और सबूत है कि डिफ़ॉल्ट आदेश कार्यान्वयन पर निर्भर करता है। किसी भिन्न संग्रहण इंजन का उपयोग करने का अर्थ भिन्न कार्यान्वयन है।