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 为次键的排序效果。

相关推荐
翔云1234561 小时前
RocksDB中,客户端每写入一次数据,需要访问几次磁盘
运维·数据库·mysql
DevOpenClub1 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
GeW2 小时前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
在多学一点4 小时前
MYSQL第二次作业
android·数据库·mysql
Risehuxyc4 小时前
Microsoft.Data.Sqlite体验
数据库·sqlite
骑着蜗牛撵大象3274 小时前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划
ZENERGY-众壹6 小时前
告警风暴怎么压?100MW 电站监控平台告警引擎架构复盘
数据库·架构·iot·电站监控
zhengfei6117 小时前
Go-fastdfs /reload 未授权访问: 有效PoC
数据库·sql
DevOpenClub7 小时前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
yuanyuan3347 小时前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门