Nach ein wenig Graben kann ich Ihre beiden Szenarien bestätigen:
MySQL 5.1 wendet den ORDER BY
an innerhalb der Unterabfrage.
MariaDB 5.5.39 unter Linux nicht wenden Sie den ORDER BY
an innerhalb der Unterabfrage, wenn kein LIMIT
ist versorgt. Das tut es Allerdings gilt der Auftrag korrekt, wenn ein entsprechendes LIMIT
gegeben ist:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Ohne dieses LIMIT
, gibt es keinen guten Grund, die Sortierung innerhalb der Unterabfrage anzuwenden. Es kann äquivalent auf die äußere Abfrage angewendet werden.
Dokumentiertes Verhalten:
Wie sich herausstellt, MariaDB hat dieses Verhalten dokumentiert und es wird nicht als Fehler angesehen:
Eine "Tabelle" (und Unterabfrage im FROM
auch Klausel) ist - nach dem SQL-Standard - eine ungeordnete Menge von Zeilen. Zeilen in einer Tabelle (oder in einer Unterabfrage im FROM
Klausel) stehen in keiner bestimmten Reihenfolge. Deshalb kann der Optimierer ORDER BY
ignorieren Klausel, die Sie angegeben haben. Tatsächlich erlaubt der SQL-Standard nicht einmal den ORDER BY
-Klausel in dieser Unterabfrage erscheinen (wir erlauben es, weil ORDER BY ... LIMIT
... ändert das Ergebnis, die Menge der Zeilen, nicht nur ihre Reihenfolge).
Sie müssen die Unterabfrage im FROM
behandeln -Klausel, als Satz von Zeilen in einer nicht spezifizierten und undefinierten Reihenfolge, und setzen Sie den ORDER BY
auf der obersten Ebene SELECT
.
Daher empfiehlt MariaDB auch die Anwendung des ORDER BY
in der äußersten Abfrage oder ein LIMIT
falls nötig.
Hinweis:Ich habe derzeit keinen Zugriff auf ein geeignetes MySQL 5.5 oder 5.6, um zu bestätigen, ob das Verhalten dort dasselbe ist (und SQLFiddle.com nicht funktioniert). Kommentare zum ursprünglichen Fehlerbericht (als kein Fehler geschlossen) legen nahe, dass sich MySQL 5.6 wahrscheinlich genauso verhält wie MariaDB.