Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL/MariaDB - uporządkuj według podzapytania wewnątrz

Po odrobinie kopania mogę potwierdzić oba twoje scenariusze:

MySQL 5.1 stosuje ORDER BY wewnątrz podzapytania.

MariaDB 5.5.39 w systemie Linux nie zastosuj ORDER BY wewnątrz podzapytania, gdy nie ma LIMIT jest zaopatrywany. tak jednak poprawnie zastosuj kolejność, gdy odpowiedni LIMIT podano:

SELECT t2.Code 
FROM (
  SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;

Bez tego LIMIT , nie ma dobrego powodu, aby zastosować sortowanie w podzapytaniu. Może być równoważnie zastosowany do zewnętrznego zapytania.

Udokumentowane zachowanie:

Jak się okazuje, MariaDB udokumentowała to zachowanie i nie jest to traktowane jako błąd:

"Tabela" (i podzapytanie w FROM również klauzula) jest - zgodnie ze standardem SQL - nieuporządkowanym zbiorem wierszy. Wiersze w tabeli (lub w podzapytaniu w FROM klauzuli) nie występują w określonej kolejności. Dlatego optymalizator może zignorować ORDER BY klauzula, którą określiłeś. W rzeczywistości standard SQL nie zezwala nawet na ORDER BY klauzula do pojawienia się w tym podzapytaniu (dopuszczamy to, ponieważ ORDER BY ... LIMIT ... zmienia wynik, zestaw wierszy, a nie tylko ich kolejność).

Musisz potraktować podzapytanie w FROM klauzulę, jako zbiór wierszy w nieokreślonej i nieokreślonej kolejności i umieść ORDER BY na najwyższym poziomie SELECT .

Dlatego MariaDB zaleca również zastosowanie ORDER BY w najbardziej zewnętrznym zapytaniu lub LIMIT jeśli to konieczne.

Uwaga:obecnie nie mam dostępu do właściwego MySQL 5.5 lub 5.6, aby potwierdzić, czy zachowanie jest tam takie samo (a SQLFiddle.com działa nieprawidłowo). Komentarze do oryginalnego zgłoszenia błędu (zamknięte jako not-a-bug) sugerują, że MySQL 5.6 prawdopodobnie zachowuje się tak samo jak 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. Nie można utworzyć modelu danych encji — przy użyciu MySql i EF6

  2. Grupuj według daty tylko w kolumnie Datetime

  3. Czy Mysql ma odpowiednik @@ROWCOUNT jak w mssql?

  4. Przewodnik po projektowaniu bazy danych dla systemu zamówień restauracji w MySQL

  5. Maksymalne użycie pamięci MySQL