Setelah sedikit menggali, saya dapat mengkonfirmasi kedua skenario Anda:
MySQL 5.1 menerapkan ORDER BY
di dalam subkueri.
MariaDB 5.5.39 di Linux tidak terapkan ORDER BY
di dalam subquery ketika tidak ada LIMIT
disediakan. Itu memang namun terapkan perintah dengan benar ketika LIMIT
yang sesuai diberikan:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Tanpa LIMIT
, tidak ada alasan bagus untuk menerapkan pengurutan di dalam subquery. Ini dapat diterapkan secara setara ke kueri luar.
Perilaku yang terdokumentasi:
Ternyata, MariaDB telah mendokumentasikan perilaku ini dan itu tidak dianggap sebagai bug:
Sebuah "tabel" (dan subquery di
FROM
klausa juga) adalah - menurut standar SQL - kumpulan baris yang tidak berurutan. Baris dalam tabel (atau dalam subquery diFROM
klausa) tidak datang dalam urutan tertentu. Itu sebabnya pengoptimal dapat mengabaikanORDER BY
klausa yang telah Anda tentukan. Faktanya, standar SQL bahkan tidak mengizinkanORDER BY
klausa untuk muncul di subquery ini (kami mengizinkannya, karenaORDER BY ... LIMIT
... mengubah hasil, kumpulan baris, bukan hanya urutannya).Anda perlu memperlakukan subquery di
FROM
klausa, sebagai satu set baris dalam beberapa urutan yang tidak ditentukan dan tidak ditentukan, dan letakkanORDER BY
diSELECT
tingkat atas .
Jadi MariaDB juga merekomendasikan untuk menerapkan ORDER BY
di kueri terluar, atau LIMIT
jika perlu.
Catatan:Saat ini saya tidak memiliki akses ke MySQL 5.5 atau 5.6 yang tepat untuk mengonfirmasi apakah perilakunya sama di sana (dan SQLFiddle.com tidak berfungsi). Komentar tentang laporan bug asli (ditutup sebagai bukan-bug) menunjukkan bahwa MySQL 5.6 mungkin berperilaku dengan cara yang sama seperti MariaDB.