Ответ 1
После небольшого копания я могу подтвердить оба ваших сценария:
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
в виде набора строк в некотором неуказанном и undefined порядке и поместитьORDER BY
на верхний уровеньSELECT
.
Поэтому MariaDB также рекомендует применять ORDER BY
в самом внешнем запросе или при необходимости LIMIT
.
Примечание. В настоящее время у меня нет доступа к надлежащим MySQL 5.5 или 5.6, чтобы подтвердить, что поведение там же (и SQLFiddle.com работает неправильно). Комментарии к исходному отчету об ошибках (закрыто как не-ошибка) показывают, что MySQL 5.6, вероятно, ведет себя так же, как MariaDB.