sql >> Database teknologi >  >> RDS >> Mysql

MySQL/MariaDB - bestil efter indvendig underforespørgsel

Efter lidt gravearbejde kan jeg bekræfte begge dine scenarier:

MySQL 5.1 anvender ORDER BY inde i underforespørgslen.

MariaDB 5.5.39 på Linux gør ikke anvende ORDER BY inde i underforespørgslen, når ingen LIMIT er leveret. Det gør Anvend dog ordren korrekt, når en tilsvarende LIMIT er givet:

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

Uden den LIMIT , er der ikke en god grund til at anvende sorteringen i underforespørgslen. Det kan anvendes tilsvarende på den ydre forespørgsel.

Dokumenteret adfærd:

Som det viser sig, MariaDB har dokumenteret denne adfærd og det betragtes ikke som en fejl:

En "tabel" (og underforespørgsel i FROM). klausul også) er - ifølge SQL-standarden - et uordnet sæt rækker. Rækker i en tabel (eller i en underforespørgsel i FROM). klausul) kommer ikke i nogen bestemt rækkefølge. Det er derfor, optimeringsværktøjet kan ignorere ORDER BY klausul, som du har angivet. Faktisk tillader SQL-standarden ikke engang ORDER BY klausul skal vises i denne underforespørgsel (vi tillader det, fordi ORDER BY ... LIMIT ... ændrer resultatet, rækkesættet, ikke kun deres rækkefølge).

Du skal behandle underforespørgslen i FROM klausul, som et sæt rækker i en eller anden uspecificeret og udefineret rækkefølge, og sæt ORDER BY på øverste niveau SELECT .

Så MariaDB anbefaler også at anvende ORDER BY i den yderste forespørgsel eller en LIMIT hvis det er nødvendigt.

Bemærk:Jeg har i øjeblikket ikke adgang til en ordentlig MySQL 5.5 eller 5.6 for at bekræfte, om adfærden er den samme der (og SQLFiddle.com fungerer ikke). Kommentarer til den originale fejlrapport (lukket som ikke-en-bug) tyder på, at MySQL 5.6 sandsynligvis opfører sig på samme måde som MariaDB.



  1. Sådan opretter du et databasediagram i Access

  2. Få forrige og næste række fra rækker valgt med (WHERE) betingelser

  3. Hvad er en skalær UDF i SQL Server?

  4. MariaDB SYSTEM_USER() Forklaret