mysql - 订购方式可以用吗?
问题描述
我被教导了ORDER BY
SQL 中用于排序查询的子句。我只了解了使用列名或表达式,但在查看 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 中删除的危险,我应该停止使用它吗?
解决方案
我认为每个数据库都支持位置参数。即使在声称弃用它们的数据库中(例如 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
当您在子句中定义窗口框架时,这会变得更加混乱。
所有这些混淆都是一个很好的论据,说明为什么不应该引入它以及为什么代码应该使用列别名。也就是说,我坦率地承认我经常使用位置数字编写代码,因为它们非常方便。
推荐阅读
- python - 如何抓取网站“检查”元素中“网络”选项卡中显示的文件的响应?
- sql - 自动插入
- browser - 为什么浏览器不能完全通过 API 控制来自 JavaScript 的 HTTP2 帧?
- java - 已编译的 jar 文件中的 Java 资源路径
- reactjs - 如何检测 Next.js 中 URL 哈希的变化?
- linux - 运行 git clone 时出现错误:errno 10054
- django - Django + Angular = 全局变量
- php - 尝试有条件地实现 ElasticSearch 排序
- android - 如何构建指纹识别应用程序
- c# - 是否可以初始化属性更改值?