ORDER BY <column position> 可以用吗?
Is ORDER BY <column position> okay to use?
有人教我 SQL 中的 ORDER BY
子句用于排序查询。我只了解了如何使用列名或表达式,但在查看 MariaDB help
对 SELECT
的参考后,我看到了这个:
MariaDB> HELP 'SELECT';
Name: 'SELECT'
Description:
Syntax:
SELECT
…
[ORDER BY {col_name | expr | position}
…
因此,我查看了他们的在线文档,并阅读了有关向 ORDER BY
提供列的整数位置而不是其名称的信息。
You can also use a single integer as the ordering expression. If you use an integer n, the results will be ordered by the nth column in the select expression. 1
当然,它很好用,我用起来没问题,我把它分享给了同学们。后来在浏览Oracle MySQL文档的时候,发现已经弃用了:
Use of column positions is deprecated because the syntax has been removed from the SQL standard. 2
此功能是否有从 SQL 中完全删除的危险,我应该停止使用它吗?
我认为每个数据库都支持位置参数。甚至在声称弃用它们的数据库中(例如 Oracle 和 SQL Server),我怀疑它们永远不会消失。显然,自 1992 年版本以来,它们就不再是标准的一部分——取而代之的是使用列别名(这通常更有用)。
我一直认为问题是以下不一样:
order by 1 + 1
order by 2
order by coalesce(2, 1)
在第一个和第三个中,order by
是一个常数——因此不是排序。事实上,当您考虑时,它会变得更加混乱:
order by '1'
order by 1
order by '1' + 0
再一次,第一个和第三个没有进行排序,但第二个进行了排序。
更复杂的是,window 框架中的 order by 1
会将 1
解释为常量。当您在 from
子句中定义 window 框架时,这会变得更加混乱。
所有这些混淆都很好地证明了为什么不应该引入它以及为什么代码应该使用列别名。也就是说,我承认我经常使用位置数字编写代码,因为它们非常方便。
有人教我 SQL 中的 ORDER BY
子句用于排序查询。我只了解了如何使用列名或表达式,但在查看 MariaDB help
对 SELECT
的参考后,我看到了这个:
MariaDB> HELP 'SELECT';
Name: 'SELECT'
Description:
Syntax:
SELECT
…
[ORDER BY {col_name | expr | position}
…
因此,我查看了他们的在线文档,并阅读了有关向 ORDER BY
提供列的整数位置而不是其名称的信息。
You can also use a single integer as the ordering expression. If you use an integer n, the results will be ordered by the nth column in the select expression. 1
当然,它很好用,我用起来没问题,我把它分享给了同学们。后来在浏览Oracle MySQL文档的时候,发现已经弃用了:
Use of column positions is deprecated because the syntax has been removed from the SQL standard. 2
此功能是否有从 SQL 中完全删除的危险,我应该停止使用它吗?
我认为每个数据库都支持位置参数。甚至在声称弃用它们的数据库中(例如 Oracle 和 SQL Server),我怀疑它们永远不会消失。显然,自 1992 年版本以来,它们就不再是标准的一部分——取而代之的是使用列别名(这通常更有用)。
我一直认为问题是以下不一样:
order by 1 + 1
order by 2
order by coalesce(2, 1)
在第一个和第三个中,order by
是一个常数——因此不是排序。事实上,当您考虑时,它会变得更加混乱:
order by '1'
order by 1
order by '1' + 0
再一次,第一个和第三个没有进行排序,但第二个进行了排序。
更复杂的是,window 框架中的 order by 1
会将 1
解释为常量。当您在 from
子句中定义 window 框架时,这会变得更加混乱。
所有这些混淆都很好地证明了为什么不应该引入它以及为什么代码应该使用列别名。也就是说,我承认我经常使用位置数字编写代码,因为它们非常方便。