A documentação do MariaDB está mencionando que a ORDER BY
cláusula nas subconsultas (tabela derivada) nunca é permitida pelos padrões SQL.
Significando a consulta SQL
SELECT
field1
, field2
FROM (
SELECT
field1
, field2
FROM
table1
ORDER BY field2
) alias
nunca é permitido pelos padrões SQL
Uma "tabela" (e subconsulta na cláusula FROM também) é - de acordo com o padrão SQL - um conjunto não ordenado de linhas. As linhas em uma tabela (ou em uma subconsulta na cláusula FROM) não vêm em nenhuma ordem específica. É por isso que o otimizador pode ignorar a cláusula ORDER BY que você especificou. Na verdade, o padrão SQL nem permite que a cláusula ORDER BY apareça nesta subconsulta
ver fonte
Mas quando eu olho para o padrão SQL 92. (eu sei que é antigo)
4.9 Tabelas
...
...
Uma tabela é uma tabela base, uma tabela visualizada ou uma tabela derivada. Uma tabela base é uma tabela base persistente, uma tabela temporária global, uma tabela temporária local criada ou uma tabela temporária local declarada.
...
...
Uma tabela derivada é uma tabela derivada direta ou indiretamente de uma ou mais outras tabelas pela avaliação de um arquivo<query expression>
. Os valores de uma tabela derivada são derivados dos valores das tabelas subjacentes quando o<query expression>
é avaliado.
...
...As tabelas simplesmente subjacentes de tabelas derivadas e cursores são definidas na Subcláusula 7.9,
"<query specification>"
, Subcláusula 7.10,"<query expression>"
, e Subcláusula 13.1,"<declare cursor>"
. Uma tabela visualizada não possui tabelas simplesmente subjacentes.
Eles mencionam cursores para ver o que eles dizem sobre cursores e o que são.
4.21 Cursores
...
...Um cursor no estado aberto identifica uma tabela , uma ordenação das linhas dessa tabela e uma posição relativa a essa ordenação. Se o
<declare cursor>
não incluir um<order by clause>
, ou incluir um<order by clause>
que não especifica a ordem das linhas completamente, então as linhas da tabela terão uma ordem que é definida apenas na medida em que<order by clause>
especifica uma ordem e depende da implementação.
Então eles mencionam aqui que um cursor em estado aberto pode ser uma tabela ou uma tabela base, uma tabela visualizada ou uma tabela derivada. se você observar como eles definem o que é uma tabela na seção 4.9 Tabelas
Se eu ler isso, poderia estar interpretando-o como usando ORDER BY
uma tabela derivada (como a consulta SQL acima) é perfeitamente válido pelos padrões SQL e cabe aos fornecedores se eles permitirem ORDER BY
como opção.
Mas eu estaria interpretando errado inglês não é minha mãe laungauge, então a questão é estou interpretando corretamente?
Um cursor não é uma tabela, ele se refere a uma tabela ou a uma visão dessa tabela. O cursor tem uma ordem apenas na medida em que a consulta que define o cursor tem uma ordem por. Uma subconsulta dentro dessa consulta maior não definiria a ordem, e o fato de a consulta estar sendo usada para um cursor não faz uma ordem na sintaxe legal da subconsulta.
Basicamente, como em qualquer outra consulta, se você não tiver uma ordem na camada mais externa, o otimizador estará livre para retornar os resultados da maneira que julgar mais fácil/rápida. Ele pode tirar proveito de índices ou caches ou qualquer outra coisa que permita produzir o resultado correto, mas não está limitado a isso.