Dopo un po' di ricerche, posso confermare entrambi i tuoi scenari:
MySQL 5.1 applica il ORDER BY
all'interno della sottoquery.
MariaDB 5.5.39 su Linux non applica il ORDER BY
all'interno della sottoquery quando nessun LIMIT
è fornito. lo fa tuttavia applicare correttamente l'ordine quando un corrispondente LIMIT
è dato:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Senza quel LIMIT
, non c'è una buona ragione per applicare l'ordinamento all'interno della sottoquery. Può essere applicato in modo equivalente alla query esterna.
Comportamento documentato:
A quanto pare, MariaDB ha documentato questo comportamento e non è considerato un bug:
Una "tabella" (e una sottoquery nel FROM
clausola anche) è - secondo lo standard SQL - un insieme di righe non ordinato. Righe in una tabella (o in una sottoquery nel FROM
clausola) non vengono in alcun ordine specifico. Ecco perché l'ottimizzatore può ignorare ORDER BY
clausola che hai specificato. In effetti, lo standard SQL non consente nemmeno il ORDER BY
clausola di apparire in questa sottoquery (lo consentiamo, perché ORDER BY ... LIMIT
... cambia il risultato, l'insieme delle righe, non solo il loro ordine).
Devi trattare la sottoquery nel FROM
clausola, come un insieme di righe in un ordine non specificato e non definito, e inserire il ORDER BY
nel livello superiore SELECT
.
Quindi MariaDB consiglia anche di applicare il ORDER BY
nella query più esterna o un LIMIT
se necessario.
Nota:al momento non ho accesso a un MySQL 5.5 o 5.6 corretto per confermare se il comportamento è lo stesso lì (e SQLFiddle.com non funziona correttamente). Commenti sulla segnalazione di bug originale (chiuso come non un bug) suggeriscono che MySQL 5.6 probabilmente si comporta allo stesso modo di MariaDB.