Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL/MariaDB - pesan dengan subquery di dalam

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 di FROM klausa) tidak datang dalam urutan tertentu. Itu sebabnya pengoptimal dapat mengabaikan ORDER BY klausa yang telah Anda tentukan. Faktanya, standar SQL bahkan tidak mengizinkan ORDER BY klausa untuk muncul di subquery ini (kami mengizinkannya, karena ORDER 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 letakkan ORDER BY di SELECT 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja tampilan MySql

  2. MySQL Foreign Key Error 1005 errno 150 primary key sebagai kunci asing

  3. Bagaimana menjadwalkan prosedur tersimpan di MySQL

  4. Apakah ada kemampuan ANY_VALUE untuk mysql 5.6?

  5. Tabel Tunggal MySql, Pilih 7 hari terakhir dan sertakan baris kosong