MySQL中用order by排序的字段不一定要在select语句中

说明:本文测试时使用的MySQL版本是5.7.22

对于5.7.22版本的MySQL,用order by排序的字段不一定要在select语句中,即使是select distinct与order by同时使用。

示例:

现有一张记录学生成绩的grade表:

+------+--------+-------+
| id   | name   | score |
+------+--------+-------+
|    1 | 张无忌 |    85 |
|    2 | 李隆基 |    59 |
|    3 | 王五     |    60 |
|    4 | 曹操     |    79 |
|    5 | 小明     |    90 |
|    6 | 如花     |    60 |
|    7 | 尉迟恭 |  100 |
|    8 | 欧阳风 |    90 |
|    9 | 刘备     |    90 |
|   10 | 董永    |    99 |
|   11 | 冯钰    |    83 |
|   12 | 孙殿英 |   82 |
|    2 | 李隆基  |    59 |
+------+--------+-------+

从grade表中查询出学生的id,姓名信息,并且按照score降序排序:

从图中可以看出查询结果是正确的。

从grade表中查询出不同学生的id,姓名信息,并且按照score降序排序:

从上图可以看出即使select distinct与order by同时使用,查询结果也是正确的,没有出现任何报错。

官方文档中的说明:

MySQL 5.7.5 and up implements detection of functional dependence. If the ONLY_FULL_GROUP_BY SQL mode is enabled (which it is by default), MySQL rejects queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on them. (Before 5.7.5, MySQL does not detect functional dependency and ONLY_FULL_GROUP_BY is not enabled by default.

If ONLY_FULL_GROUP_BY is disabled, a MySQL extension to the standard SQL use of GROUP BY permits the select list, HAVINGcondition, or ORDER BY list to refer to nonaggregated columns even if the columns are not functionally dependent on GROUP BYcolumns. This causes MySQL to accept the preceding query. In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are nondeterministic, which is probably not what you want. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Result set sorting occurs after values have been chosen, and ORDER BY does not affect which value within each group the server chooses. Disabling ONLY_FULL_GROUP_BY is useful primarily when you know that, due to some property of the data, all values in each nonaggregated column not named in the GROUP BY are the same for each group.

在MySQL5.7.22的配置文件中,SQL mode的默认值为:

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

参考:

https://dev.mysql.com/doc/refman/5.7/en/distinct-optimization.html

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQLorder by语句可以用于对查询结果集进行排序,常常需要使用多个字段来进行排序。在多字段排序时,遵循以下规则: 1. 排序字段的顺序按照order by语句的先后顺序进行,先根据第一个排序字段排序,如果有相同的值,则根据第二个排序字段排序,以此类推。 2. 对于数字类型的字段排序是根据数值大小进行的。对于文本类型的字段排序则根据字面的字符顺序进行,即按照字典顺序排序。 3. 对于字符串类型的字段,如果希望进行不区分大小写的排序,则可以使用lower或upper函数进行转换,例如:order by lower(name)。 4. 可以在排序规则指定升序(asc)或降序(desc),默认是升序。如果需要使用降序排序,则需要在字段后加上desc。 5. 如果存在NULL值,排序结果可能不稳定。可以使用order by字段1,字段2,coalesce(字段3,0)来指定NULL值排序规则。 总之,MySQLorder by语句可以很灵活地进行多字段排序,并且可以指定不同字段排序规则,需要根据实际情况进行灵活运用。 ### 回答2: 在MySQLORDER BY多字段排序规则分为以下三种: 1. 升序排序(ASC):使用ASC来排序,将会按照指定的字段按照从小到大的顺序进行排列。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `age` ASC, `name` ASC; ``` 2. 降序排序(DESC):使用DESC来排序,将会按照指定的字段按照从大到小的顺序进行排列。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `age` DESC, `name` DESC; ``` 3. 混合排序:在使用多个字段进行排序时,有时需要将一个字段按照升序排序,另一个字段按照降序排序。这时需要使用升序排序和降序排序的组合。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `age` ASC, `name` DESC; ``` 在混合排序,将按照`age`字段进行升序排序,如果`age`相同则按照`name`字段进行降序排序。 需要注意的是,当使用多个字段进行排序时,排序字段的顺序将会影响结果。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `name` ASC, `age` DESC; ``` 在这个例子,首先将按照`name`进行升序排序,如果`name`相同则按照`age`进行降序排序。如果将`name`和`age`的顺序颠倒,则会按照`age`进行降序排序,如果`age`相同则按照`name`进行升序排序。因此,在使用多个字段进行排序时,需要根据实际需求确定排序字段的顺序。 ### 回答3: 在 MySQL ORDER BY 子句用于指定排序的规则。对于多字段排序,可以使用多个排序字段来定义排序规则。一般来说,多字段排序是根据所需的字段的第一个字段进行排序,并且在第一个字段具有相同值的记录使用第二个字段进行排序,以此类推。 例如,假设有一个包含以下字段的表: id | name | age | gender 如果我们想按照年龄和性别来对记录进行排序,我们可以使用以下SQL语句SELECT * FROM table_name ORDER BY age DESC, gender ASC; 在上面的SQL语句,我们首先根据年龄字段进行降序排序,这意味着年龄最大的记录将会排在前面。如果某些记录拥有相同的年龄值,则这些记录将按照性别字段进行升序排序,这意味着男性记录将排在女性记录之前。 此外,还可以使用 ORDER BY 子句的一个特殊关键字,即 NULLS FIRST 或 NULLS LAST,来控制空值的排序。例如,我们可以使用以下 SQL 语句来将空值排在最前面: SELECT * FROM table_name ORDER BY age DESC NULLS FIRST; 总之,在 MySQL ORDER BY 子句可用于根据一个或多个字段对记录排序。多字段排序时,第一个排序字段是最重要的,随后的字段是副要素,可以用来细化排序规则。同时,还可以使用 NULLS FIRST 或 NULLS LAST 来控制空值在排序的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值