为啥当我尝试基于同一列进行两次排序时 SQL 不会抛出错误?

Posted

技术标签:

【中文标题】为啥当我尝试基于同一列进行两次排序时 SQL 不会抛出错误?【英文标题】:Why SQL does not throw error when I try to sort based on same column twice?为什么当我尝试基于同一列进行两次排序时 SQL 不会抛出错误? 【发布时间】:2019-12-17 11:07:17 【问题描述】:

我在 5.7.22 版本的 mysql 数据库中有一个表 EMPLOYEE。我写了一个选择查询:

SELECT * from EMPLOYEE ORDER BY NAME ASC, SALARY DESC, NAME ASC; 

这个结果和

一样
SELECT * from EMPLOYEE ORDER BY NAME ASC, SALARY DESC; 

类似的结果

SELECT * from EMPLOYEE ORDER BY NAME ASC, SALARY DESC, NAME DESC; 

相同
SELECT * from EMPLOYEE ORDER BY NAME ASC, SALARY DESC;

在这种情况下,NAME ASC 第二次是多余的。为什么在这种情况下 SQL 不抛出错误/警告?

【问题讨论】:

有时,表面上相似的东西实际上并不相同。它会发出什么警告?也许它不同意你对什么是冗余的看法? 为什么要这样?按同一列排序两次并没有错。这只是多余的,对您的情况没有影响。无论如何,它可能已经被优化器丢弃了。 【参考方案1】:

您的问题是“当有多余的ORDER BY 键时,为什么 MySQL(或任何其他数据库)不返回警告或错误?”

在编写语言或编译器时,设计人员必须决定要做什么。

关于所有示例的第一个观察结果是它们都是有效的 SQL。标准对冗余的ORDER BY 键没有任何规定,那么为什么要这样做呢?

第二个观察是附加键对结果集没有影响,对结果的影响最小。这甚至会使警告的优先级很低。

第三个是停在哪里?编译器是否有以下错误或警告:

+ 0? * 1 ? WHERE 1=1? 等。等等等等。

既然努力可以让引擎更好地为每个人工作,为什么还要努力修复“坏”代码?

【讨论】:

“那为什么要这么做?” - 编写的代码完全有效并且可能没有按照用户的意图进行(实际上是多余的)。在大多数语言中,这通常是一个很好的警告理由。【参考方案2】:

    语法正确,所以没有错误

    同样的结果,因为 Order By work Orderly 如下

SELECT * from EMPLOYEE ORDER BY NAME(1) ASC, SALARY(2) DESC, NAME(3) ASC;

结果没问题,放松一下再检查

【讨论】:

以上是关于为啥当我尝试基于同一列进行两次排序时 SQL 不会抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章

基于单击列标题在WPF中对数据网格进行排序

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件

是否可以使用 SQL Server 使用相同的数据透视列进行多个数据透视

SQL 查询 - 在不同条件下两次显示同一列

检查为啥记录在 SQL 中返回两次

Jquery 可排序列表不会序列化,为啥?