След малко ровене мога да потвърдя и двата ви сценария:
MySQL 5.1 прилага ORDER BY
вътре в подзаявката.
MariaDB 5.5.39 на Linux не приложете ORDER BY
вътре в подзаявката, когато няма LIMIT
се доставя. Това прави обаче правилно приложете реда при съответен LIMIT
се дава:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Без този LIMIT
, няма основателна причина да се прилага сортирането в подзаявката. Може да се приложи еквивалентно към външната заявка.
Документирано поведение:
Както се оказа, MariaDB е документирала това поведение и не се счита за грешка:
„Таблица“ (и подзаявка в
FROM
клауза също) е - според стандарта SQL - неподреден набор от редове. Редове в таблица (или в подзаявка вFROM
). клауза) не идват в конкретен ред. Ето защо оптимизаторът може да игнорираORDER BY
клауза, която сте посочили. Всъщност стандартът на SQL дори не позволяваORDER BY
клауза да се появи в тази подзаявка (позволяваме го, защотоORDER BY ... LIMIT
... променя резултата, набора от редове, а не само техния ред).Трябва да третирате подзаявката в
FROM
клауза, като набор от редове в някакъв неопределен и недефиниран ред и поставетеORDER BY
на най-високо нивоSELECT
.
Така че MariaDB също препоръчва прилагането на ORDER BY
в най-външната заявка или LIMIT
ако е необходимо.
Забележка:В момента нямам достъп до подходящ MySQL 5.5 или 5.6, за да потвърдя дали поведението е същото там (и SQLFiddle.com работи неправилно). Коментари на оригиналния доклад за грешка (затворен като не-бъг) предполагат, че MySQL 5.6 вероятно се държи по същия начин като MariaDB.