MySQL- 6 数据排序

本文深入讲解MySQL中的排序函数和ORDER BY子句的使用方法,包括升序(ASC)和降序(DESC)排序,以及如何对多列进行排序。特别介绍了自定义排序函数FIELD的用法,以及如何通过优化ORDER BY语法提升查询效率。文章还探讨了自然排序的概念及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考地址:http://www.manongjc.com/mysql_basic/mysql-order-by-basic.html

排序函数

当使用SELECT语句从表中查询数据时,结果集不会按任何顺序排序。要对结果集排序,请使用ORDER BY 子句。ORDER BY 子句允许您:

  • 按单列或多列对结果集排序。
  • 按升序或降序对不同列进行结果集排序。

DESC 降序 

ASC 升序(默认)

Order by columns,也可对多个栏位进行排序,同时允许对表达式结果进行排序

SELECT
 contactLastname,
 contactFirstname
FROM
 customers
ORDER BY
 contactLastname DESC,
 contactFirstname ASC;

自定义排序函数:

FIELD函数(不在排序内会出现在最前边)

SELECT 
    orderNumber, status
FROM
    orders
ORDER BY FIELD(status,
        'In Process',
        'On Hold',
        'Cancelled',
        'Resolved',
        'Disputed',
        'Shipped');

Order语法优化

可以使用索引:

    SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;
    SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
    SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

但是以下情况不使用索引。

1) order by的字段混合ASC和DESC

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

2) 用于查询行的关键字与ORDER BY中所使用的不相同

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

3)对不同的关键字使用ORDER BY

SELECT * FROM t1 ORDER BY key1, key2;

自然排序 

Mysql排序:

自然排序:

Mysql 不提供内置自然排序语法或函数,为了实现以上排序方式,需要将内容拆分为数字和字母存储为两列进行,再对其进行排序,实现方式请看参考网址 

### 在 MySQL 中先对表的数据按特定字段排序再进行更新操作 在 MySQL 中,直接通过 `UPDATE` 语句无法显式地指定排序顺序来进行更新。然而可以采用一些间接的方法来实现这一需求。 一种常见的方式是利用子查询或者临时表来处理这个问题。具体来说,当需要基于某些件或排序后的结果进行更新时,可以首先创建一个包含所需排序逻辑的结果集,然后再依据该结果集执行更新动作[^1]。 对于希望按照特定顺序(比如自定义的 status 字段值为 2, 4, 1, 3 的顺序)对记录进行某种形式的操作而言,可以通过构建带有 CASE WHEN 结构的 SQL 查询来达到目的。这种方式允许设定复杂的排序规则,并将其应用于后续的 UPDATE 操作中[^2]。 另外值得注意的是,在实际应用过程中应当考虑到并发控制以及事务管理等因素,以确保数据的一致性和准确性。例如可以在整个操作期间开启一个新的事务,完成所有必要的读取和修改之后再提交事务[^3]。 最后关于中文或其他多字节字符的支持问题,只要确保所使用的字符集和校对规则适合于目标语言即可正常工作。这通常涉及到设置正确的字符编码如 utf8mb4 并选择合适的 collation 类型[^4]。 ```sql -- 创建并填充示例表格用于演示 CREATE TEMPORARY TABLE temp_sorted_ids AS ( SELECT id FROM students ORDER BY FIELD(status, '2', '4', '1', '3') ); -- 更新原表中的数据,这里假设要给这些学生增加学分 START TRANSACTION; UPDATE students s JOIN temp_sorted_ids t ON s.id = t.id SET s.credits = s.credits + 5; COMMIT; DROP TEMPORARY TABLE IF EXISTS temp_sorted_ids; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值