Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL/MariaDB - ordine per sottoquery interna

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.