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