Sau khi đào sâu một chút, tôi có thể xác nhận cả hai tình huống của bạn:
MySQL 5.1 có áp dụng ORDER BY
bên trong truy vấn con.
MariaDB 5.5.39 trên Linux thì không áp dụng ORDER BY
bên trong truy vấn con khi không có LIMIT
được cung cấp. Nó không tuy nhiên, hãy áp dụng đúng đơn đặt hàng khi LIMIT
tương ứng được đưa ra:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Không có LIMIT
đó , không có lý do chính đáng để áp dụng kiểu sắp xếp bên trong truy vấn con. Nó có thể được áp dụng tương đương cho truy vấn bên ngoài.
Hành vi được ghi lại:
Hóa ra, MariaDB đã ghi lại hành vi này và nó không được coi là một lỗi:
Một "bảng" (và truy vấn con trong
FROM
cũng vậy) là - theo tiêu chuẩn SQL - một tập hợp các hàng không có thứ tự. Các hàng trong bảng (hoặc trong một truy vấn con trongFROM
mệnh đề) không đi theo bất kỳ thứ tự cụ thể nào. Đó là lý do tại sao trình tối ưu hóa có thể bỏ quaORDER BY
mệnh đề mà bạn đã chỉ định. Trên thực tế, tiêu chuẩn SQL thậm chí không cho phépORDER BY
mệnh đề xuất hiện trong truy vấn con này (chúng tôi cho phép nó, bởi vìORDER BY ... LIMIT
... thay đổi kết quả, tập hợp các hàng, không chỉ thứ tự của chúng).Bạn cần xử lý truy vấn con trong
FROM
, dưới dạng một tập hợp các hàng theo một số thứ tự không xác định và không xác định, và đặtORDER BY
trênSELECT
cấp cao nhất .
Vì vậy, MariaDB cũng khuyên bạn nên áp dụng ORDER BY
trong truy vấn ngoài cùng hoặc LIMIT
nếu cần thiết.
Lưu ý:Tôi hiện không có quyền truy cập vào MySQL 5.5 hoặc 5.6 thích hợp để xác nhận xem hành vi có giống nhau ở đó hay không (và SQLFiddle.com đang hoạt động sai). Nhận xét về báo cáo lỗi ban đầu (đóng lại là không phải lỗi) gợi ý rằng MySQL 5.6 có thể hoạt động giống như MariaDB.