Po odrobinie kopania mogę potwierdzić oba twoje scenariusze:
MySQL 5.1 stosuje ORDER BY
wewnątrz podzapytania.
MariaDB 5.5.39 w systemie Linux nie zastosuj ORDER BY
wewnątrz podzapytania, gdy nie ma LIMIT
jest zaopatrywany. tak jednak poprawnie zastosuj kolejność, gdy odpowiedni LIMIT
podano:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Bez tego LIMIT
, nie ma dobrego powodu, aby zastosować sortowanie w podzapytaniu. Może być równoważnie zastosowany do zewnętrznego zapytania.
Udokumentowane zachowanie:
Jak się okazuje, MariaDB udokumentowała to zachowanie i nie jest to traktowane jako błąd:
"Tabela" (i podzapytanie w FROM
również klauzula) jest - zgodnie ze standardem SQL - nieuporządkowanym zbiorem wierszy. Wiersze w tabeli (lub w podzapytaniu w FROM
klauzuli) nie występują w określonej kolejności. Dlatego optymalizator może zignorować ORDER BY
klauzula, którą określiłeś. W rzeczywistości standard SQL nie zezwala nawet na ORDER BY
klauzula do pojawienia się w tym podzapytaniu (dopuszczamy to, ponieważ ORDER BY ... LIMIT
... zmienia wynik, zestaw wierszy, a nie tylko ich kolejność).
Musisz potraktować podzapytanie w FROM
klauzulę, jako zbiór wierszy w nieokreślonej i nieokreślonej kolejności i umieść ORDER BY
na najwyższym poziomie SELECT
.
Dlatego MariaDB zaleca również zastosowanie ORDER BY
w najbardziej zewnętrznym zapytaniu lub LIMIT
jeśli to konieczne.
Uwaga:obecnie nie mam dostępu do właściwego MySQL 5.5 lub 5.6, aby potwierdzić, czy zachowanie jest tam takie samo (a SQLFiddle.com działa nieprawidłowo). Komentarze do oryginalnego zgłoszenia błędu (zamknięte jako not-a-bug) sugerują, że MySQL 5.6 prawdopodobnie zachowuje się tak samo jak MariaDB.