Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL/MariaDB - ordem por subconsulta interna


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 no FROM 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 no FROM cláusula) não vêm em nenhuma ordem específica. É por isso que o otimizador pode ignorar o ORDER BY cláusula que você especificou. Na verdade, o padrão SQL nem mesmo permite o comando ORDER BY cláusula apareça nesta subconsulta (nós permitimos, porque ORDER BY ... LIMIT ... altera o resultado, o conjunto de linhas, não apenas sua ordem).

Você precisa tratar a subconsulta no FROM cláusula, como um conjunto de linhas em alguma ordem não especificada e indefinida, e coloque o ORDER BY no SELECT 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.