为啥当我尝试基于同一列进行两次排序时 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 不会抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件