Nej, der er ingen garantier. Medmindre du angiver en ordre ved hjælp af en ORDER BY
klausul, er ordren fuldstændig afhængig af interne implementeringsdetaljer. dvs. hvad der er mest praktisk for RDBMS-motoren.
I praksis kan rækkerne blive returneret i deres oprindelige indsættelsesrækkefølge (eller mere præcist den rækkefølge, rækkerne findes i fysisk opbevaring), men du bør ikke være afhængig af dette. Hvis du porterer din app til et andet mærke af RDBMS, eller selvom du opgraderer til en nyere version af MySQL, der muligvis implementerer lagring anderledes, kan rækkerne komme tilbage i en anden rækkefølge.
Det sidste punkt gælder for enhver SQL-kompatibel RDBMS.
Her er en demonstration af, hvad jeg mener med den rækkefølge, rækkerne eksisterer på lager, i forhold til den rækkefølge, de blev oprettet:
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 |
+----+---------+
Så nu har vi seks rækker. Lageret på dette tidspunkt indeholder et hul mellem række 3 og 8, tilbage efter sletning af de midterste rækker. Sletning af rækker defragmenterer ikke disse huller.
-- 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 |
+----+---------+
Læg mærke til, hvordan MySQL har genbrugt de mellemrum, der er åbnet ved at slette rækker, før du tilføjer nye rækker til slutningen af tabellen. Bemærk også, at rækkerne 11 til 14 blev indsat i disse mellemrum i omvendt rækkefølge, idet de blev udfyldt fra enden og bagud.
Derfor er rækkefølgen, som rækkerne er gemt, ikke præcis den rækkefølge, de blev indsat i.
OPDATERING:Denne demonstration, jeg skrev i 2009, var til MyISAM. InnoDB returnerer rækker i indeksrækkefølge, medmindre du bruger ORDER BY. Dette er yderligere bevis på det punkt i starten af svaret, at standardrækkefølgen afhænger af implementeringen. Brug af en anden lagermotor betyder en anden implementering.