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

相关推荐
FluxDB10 分钟前
《用 Rust + GPUI 做了一个开源数据库客户端:FluxDB》
数据库
roman_日积跬步-终至千里10 分钟前
【数据Agent论文·查询与语义|09】Spider 2.0:从生成SQL走向完成企业工作流
数据库·sql·数据分析
曦夜日长11 分钟前
MySQL系统篇,数据库基础(二):数据库概念、SQL 分类与存储引擎
数据库·sql·mysql
泡海椒12 分钟前
JQuick-SQL AST 解析:从 SQL 文本到强类型节点
数据库·sql
要开心吖ZSH16 分钟前
SeaTunnel + Doris + MySQL-CDC 数据同步故障排查个人笔记
数据库·mysql·doris·seatunnel·mysql cdc
data analyse 45625 分钟前
Session数怎么计算?明确会话切分、超时与跨页规则
java·服务器·数据库
骑着蜗牛撵大象32731 分钟前
ToolJet + PostgreSQL:后台表格、查询和流程,一次搭成可远程访问的业务系统
数据库·低代码·docker·postgresql·内部工具·tooljet
先知后行。40 分钟前
各种文件系统
linux·服务器·数据库
风若寒891 小时前
MySQL 主从同步,从库中断时间过长,需要主库全量进行覆盖一次
数据库·mysql·主从