Efter lidt gravearbejde kan jeg bekræfte begge dine scenarier:
MySQL 5.1 anvender ORDER BY
inde i underforespørgslen.
MariaDB 5.5.39 på Linux gør ikke anvende ORDER BY
inde i underforespørgslen, når ingen LIMIT
er leveret. Det gør Anvend dog ordren korrekt, når en tilsvarende LIMIT
er givet:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Uden den LIMIT
, er der ikke en god grund til at anvende sorteringen i underforespørgslen. Det kan anvendes tilsvarende på den ydre forespørgsel.
Dokumenteret adfærd:
Som det viser sig, MariaDB har dokumenteret denne adfærd og det betragtes ikke som en fejl:
En "tabel" (og underforespørgsel i FROM
). klausul også) er - ifølge SQL-standarden - et uordnet sæt rækker. Rækker i en tabel (eller i en underforespørgsel i FROM
). klausul) kommer ikke i nogen bestemt rækkefølge. Det er derfor, optimeringsværktøjet kan ignorere ORDER BY
klausul, som du har angivet. Faktisk tillader SQL-standarden ikke engang ORDER BY
klausul skal vises i denne underforespørgsel (vi tillader det, fordi ORDER BY ... LIMIT
... ændrer resultatet, rækkesættet, ikke kun deres rækkefølge).
Du skal behandle underforespørgslen i FROM
klausul, som et sæt rækker i en eller anden uspecificeret og udefineret rækkefølge, og sæt ORDER BY
på øverste niveau SELECT
.
Så MariaDB anbefaler også at anvende ORDER BY
i den yderste forespørgsel eller en LIMIT
hvis det er nødvendigt.
Bemærk:Jeg har i øjeblikket ikke adgang til en ordentlig MySQL 5.5 eller 5.6 for at bekræfte, om adfærden er den samme der (og SQLFiddle.com fungerer ikke). Kommentarer til den originale fejlrapport (lukket som ikke-en-bug) tyder på, at MySQL 5.6 sandsynligvis opfører sig på samme måde som MariaDB.