PostgreSQL 的 ORDER BY 多列排序

PostgreSQL 的多列排序,核心要点如下:

1. 排序语义

sql 复制代码
SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;
  • ORDER BY 按从左到右 依次排序:先按 NAME 排,遇到 NAME 相同时再按 SALARY 排。
  • 关键点:ASC 只修饰它紧跟的前一列 SALARY ,而 NAME 没有显式指定,但 ASC(升序)本来就是默认值,所以两列实际都是升序。

2. 为什么结果看起来"只按姓名排"

看结果:

name salary
Allen 15000
David 85000
James 10000
Kim 45000
Mark 65000
Paul 20000
Teddy 20000
  • 名字严格按字母升序:Allen → David → James → Kim → Mark → Paul → Teddy。
  • 因为表中没有重名 ,第二关键字 SALARY 根本没有机会参与排序,所以 salary 看起来毫无规律(不是全局升序)------这是符合预期的,salary 只在名字相同时才起作用。

3. 常见易错点

写法 效果
ORDER BY NAME, SALARY 两列都升序(默认)
ORDER BY NAME, SALARY ASC 同上一行,ASC 只作用于 SALARY
ORDER BY NAME DESC, SALARY NAME 降序,SALARY 升序
ORDER BY NAME, SALARY DESC NAME 升序,SALARY 降序(注意 ASC/DESC 要逐列写)

4. 验证建议

想看第二关键字真正生效,可以给表里插入重名数据,例如:

sql 复制代码
INSERT INTO COMPANY (name, salary) VALUES ('Paul', 50000);
SELECT * FROM COMPANY ORDER BY NAME, SALARY;

此时两个 Paul 会按 salary 升序排列(20000 在前,50000 在后),就能直观看到 NAME 为主键、SALARY 为次键的排序效果。

相关推荐
IT枫斗者枫哥3 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
柒和远方3 小时前
NestJS + TypeORM 学习笔记:语法和类型不绕了
postgresql·orm·nestjs
Y003 小时前
PostgreSQL 的锁:为什么你的 ALTER TABLE 会卡住,以及怎么查
数据库·postgresql
灰原喜欢柯南4 小时前
OceanBase 运维管理知识点——OCP 监控、诊断与变更控制
数据库·oceanbase
码农-0044 小时前
Springboot 集成 Ehcache操作数据库显示SQL语句设置
数据库·spring boot·sql
仍然.4 小时前
Redis---事务
数据库·redis
oradh4 小时前
Oracle 执行计划的阅读方法(二叉树结构来理解和阅读)
数据库·oracle·执行计划的阅读方法
SelectDB4 小时前
Doris 向量检索上线踩坑记录:七个排查现场与可直接复制的命令
大数据·数据库·数据分析
数据库小学妹4 小时前
MySQL深分页优化:LIMIT大偏移的根因分析与五种解法对比
数据库·mysql·性能优化
SelectDB4 小时前
一条大查询把集群打挂之后:Apache Doris 稳定性处置与资源隔离速查
大数据·数据库·数据分析