可以用吗?,mysql,sql,mariadb,sql-standards"/>

首页 > 解决方案 > 订购方式可以用吗?

问题描述

我被教导了ORDER BYSQL 中用于排序查询的子句。我只了解了使用列名或表达式,但在查看 MariaDBhelp参考后SELECT,我看到了:

MariaDB> HELP 'SELECT';

Name: 'SELECT'
Description:
Syntax:
SELECT
  …
    [ORDER BY {col_name | expr | position}
  …

因此,我查看了他们的在线文档,并阅读了有关将列的整数位置提供给ORDER BY,而不是其名称的信息。

您还可以使用单个整数作为排序表达式。如果使用整数 n,则结果将按选择表达式中的第 n 列排序。1

当然,它很好用,我使用它也没问题,我和我的同学分享了它。后来,在浏览 Oracle MySQL 文档时,我发现它已被弃用:

不推荐使用列位置,因为该语法已从 SQL 标准中删除。2

这个特性是否有被完全从 SQL 中删除的危险,我应该停止使用它吗?

标签: mysqlsqlmariadbsql-standards

解决方案


我认为每个数据库都支持位置参数。即使在声称弃用它们的数据库中(例如 Oracle 和 SQL Server),我也怀疑它们永远不会消失。显然,自 1992 年版本以来,它们就不再是标准的一部分——而是被列别名的使用所取代(这通常更有用)。

我一直认为这个问题是不一样的:

order by 1 + 1
order by 2
order by coalesce(2, 1)

在第一个和第三个中, theorder by是一个常数——因此不是排序的。事实上,当您考虑时,它变得更加混乱:

order by '1'
order by 1
order by '1' + 0

再一次,第一个和第三个没有排序,但第二个做了。

更复杂的是,order by 1在窗口框架中会将 解释1为常数。from当您在子句中定义窗口框架时,这会变得更加混乱。

所有这些混淆都是一个很好的论据,说明为什么不应该引入它以及为什么代码应该使用列别名。也就是说,我坦率地承认我经常使用位置数字编写代码,因为它们非常方便。


推荐阅读