F851, “ORDER BY in subqueries”


BigQueryDb2 (LUW)DuckDBH2MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLite20052007200920112013201520172019202120232025✓ 3.5.7 - 3.53.0⚠ 2008R2 - 2025ab⚠ 8.3 - 18a✓ 11gR1 - 23.26.1✓ 5.0 - 9.7.0✓ 5.3 - 12.2.2c✓ 5.1 - 5.2⚠ 1.4.191 - 2.4.240a✓ 1.0.0 - 1.5.0✓ 9.7 - 12.1.4✓ 2.0+
  1. Some variants
  2. Only in combination with fetch first or the like
  3. Optimized away if meaningless

This optional SQL feature covers the order by clause in subqueries:

SELECT c
  FROM (SELECT *
          FROM (VALUES (1), (2)) t(c)
         ORDER BY c
         FETCH FIRST 1 ROW ONLY
       ) t2

Note that the only reason to use order by in subqueries is to assign meaning to the word “first” in the offset and fetch first clauses—and similar non-standard clauses like limit or top.

Variants

This feature allows the following order by keys types: ⓵ references to selected columns by name; ⓶ references to columns produced in the from clause if the query is simple0 and ⓷ expressions that contain at least one such column reference.1 Note that positional referencing by an unsigned integer value ⓸ is not standard SQL anymore. While the standard even allows nested order by clause in absences of offset and fetch first, some systems do not allow such pointless clause ⓹.

BigQuery 2026-05-12Db2 (LUW) 12.1.4DuckDB 1.5.0H2 2.4.240abMariaDB 12.2.2cMySQL 9.7.0cOracle DB 23.26.1PostgreSQL 18aSQL Server 2025adSQLite 3.53.0selected column ⓵non-selected column ⓶expressions ⓷positional reference ⓸without fetch first, … ⓹
  1. Expressions cannot contain selected names:
    select c AS x FROM (VALUES (1), (2)) t(c) ORDER BY x
  2. Also via bind parameter: order by ? • Negative parameters (but not literals) reverse the direction
  3. Also via bind parameter: order by ?
  4. Reasonable; ignored in other charts

SQL Server does not allow using order by in subqueries without such clause. MariaDB actually optimizers them away unless they are required for limit or similar clauses—and this is allowed by the SQL standard as the row-order in subqueries is not preserved in the outer query.2

Normative references

F851, “ORDER BY in subqueries” is an optional feature in ISO/IEC 9075-2:2023. It first appeared in the 2008 edition.

You can’t catch up on 20 years of SQL evolution in one day. Subscribe the newsletter via E-Mail, Bluesky or RSS to gradually catch up and to keep modern-⁠sql.com on your radar.

About the Author

Photo of Markus Winand

Markus Winand provides insights into SQL and shows how different systems support it at modern-sql.com. Previously he made use-the-index-luke.com, which is still actively maintained. Markus can be hired as trainer, speaker and consultant via winand.at.

Buy the Book

Cover of “SQL Performance Explained”: Squirrel running on grass

The essence of SQL tuning in 200 pages

Buy now!
(paperback and/or PDF)

Paperback also available at Amazon.com.

Hire Markus

Markus offers SQL training and consulting for developers working at companies of all sizes.
Learn more »

Footnotes

  1. Does not use union, except or intersect (ISO/IEC 9075-2:2023 §7.17 SR 26di1).

  2. But no subqueries and no <set function specifications>

  3. ISO/IEC 9075-2:2023 §4.17.3: “The ordering of the rows of the table specified by the <query expression> is guaranteed only for the <query expression> that immediately contains the <order by clause>”

Connect with Markus Winand

Subscribe mailinglistsSubscribe the RSS feedMarkus Winand on LinkedInMarkus Winand on XINGMarkus Winand on MastodonMarkus Winand on Bluesky
Copyright 2015-2026 Markus Winand. All righs reserved.
Legal | Contact | NO WARRANTY | Trademarks | Privacy and GDPR