ORDER BY
Contexts
Section titled “Contexts”The clauses in a SELECT have a specific order:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... -- goes here LIMIT ... OFFSET ...;
( SELECT ... ) UNION ( SELECT ... ) ORDER BY ... -- for ordering the result of the UNION.
SELECT ... GROUP_CONCAT(DISTINCT x ORDER BY ... SEPARATOR ...) ...
ALTER TABLE ... ORDER BY ... -- probably useful only for MyISAM; not for InnoDBORDER BY x
x can be any datatype.
NULLsprecede non-NULLs.- The default is
ASC(lowest to highest) - Strings (
VARCHAR, etc) are ordered according theCOLLATIONof the declaration ENUMsare ordered by the declaration order of its strings.
ASCending / DESCending
Section titled “ASCending / DESCending”ORDER BY x ASC -- same as defaultORDER BY x DESC -- highest to lowestORDER BY lastname, firstname -- typical name sorting; using two columnsORDER BY submit_date DESC -- latest firstORDER BY submit_date DESC, id ASC -- latest first, but fully specifying order.ASC=ASCENDING,DESC=DESCENDINGNULLscome first even forDESC.- In the above examples,
INDEX(x),INDEX(lastname, firstname),INDEX(submit_date)may significantly improve performance.
But… Mixing ASC and DESC, as in the last example, cannot use a composite index to benefit. Nor will INDEX(submit_date DESC, id ASC) help — “DESC” is recognized syntactically in the INDEX declaration, but ignored.
Some tricks
Section titled “Some tricks”ORDER BY FIND_IN_SET(card_type, "MASTER-CARD,VISA,DISCOVER") -- sort 'MASTER-CARD' first.ORDER BY x IS NULL, x -- order by `x`, but put `NULLs` last.Custom ordering
SELECT * FROM some_table WHERE id IN (118, 17, 113, 23, 72)ORDER BY FIELD(id, 118, 17, 113, 23, 72);Returns the result in the specified order of ids.
|id|… |---|---|---|--- |118|… |17|… |113|… |23|… |72|…
Useful if the ids are already sorted and you just need to retrieve the rows.