Depois de pesquisar um pouco, posso confirmar os dois cenários:
MySQL 5.1 aplica o
ORDER BY
dentro da subconsulta. MariaDB 5.5.39 no Linux não aplique o
ORDER BY
dentro da subconsulta quando não há LIMIT
é fornecida. Ele faz no entanto, aplique corretamente o pedido quando um LIMIT
correspondente é dada:SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Sem esse
LIMIT
, não há um bom motivo para aplicar a classificação dentro da subconsulta. Ele pode ser aplicado de forma equivalente à consulta externa. Comportamento documentado:
Acontece que MariaDB documentou esse comportamento e não é considerado um bug:
Uma "tabela" (e subconsulta noFROM
cláusula também) é - de acordo com o padrão SQL - um conjunto não ordenado de linhas. Linhas em uma tabela (ou em uma subconsulta noFROM
cláusula) não vêm em nenhuma ordem específica. É por isso que o otimizador pode ignorar oORDER BY
cláusula que você especificou. Na verdade, o padrão SQL nem mesmo permite o comandoORDER BY
cláusula apareça nesta subconsulta (nós permitimos, porqueORDER BY ... LIMIT
... altera o resultado, o conjunto de linhas, não apenas sua ordem).
Você precisa tratar a subconsulta noFROM
cláusula, como um conjunto de linhas em alguma ordem não especificada e indefinida, e coloque oORDER BY
noSELECT
de nível superior .
Portanto, o MariaDB também recomenda aplicar o
ORDER BY
na consulta mais externa ou um LIMIT
se necessário. Nota:Atualmente, não tenho acesso a um MySQL 5.5 ou 5.6 adequado para confirmar se o comportamento é o mesmo (e o SQLFiddle.com está com defeito). Comentários sobre o relatório de bug original (fechado como não um bug) sugerem que o MySQL 5.6 provavelmente se comporta da mesma maneira que o MariaDB.