MySQL 的 order by 简化(使用列序号和列别名排序)

order by 使用列序号排序

在如下例子中的复杂 SQL,select 出来的部分列包含复杂的函数处理,当我希望按品牌、地区和车型排序,order by 部分就要把所有语句都写上,显得很冗余。

sql 复制代码
select distinct 
    'hyundaiKia_online' as analyser,
    vehicle_model as vehicle_model,
    features,
    brand as '品牌',
    area as '地区',
    CONCAT(vehicle_model, '-', TRIM(REPLACE(catalogName, '#', ''))) as '车型'
from raw_vehicle_data
where vehicle_model != ''
ORDER BY brand, area, CONCAT(vehicle_model, '-', TRIM(REPLACE(catalogName, '#', '')))

order by 语句可以使用 select 的列序号替代 select 的列完成排序工作(序号从 1 开始递增)

SQL 可以很好地被简化,通过序号直接指定按 select 出来的那一列进行排序。

sql 复制代码
select distinct 
    'hyundaiKia_online' as analyser,
    vehicle_model as vehicle_model,
    features,
    brand as '品牌',
    area as '地区',
    CONCAT(vehicle_model, '-', TRIM(REPLACE(catalogName, '#', ''))) as '车型'
from raw_vehicle_data
where vehicle_model != ''
ORDER BY 4, 5, 6

甚至还可以加上 desc 和 asc 指定某个列的升序、降序排序,默认是 asc 升序。

sql 复制代码
...
ORDER BY 4 desc, 5 asc, 6

order by 使用列别名排序

使用select 定义的列别名也可以实现简化 order by 语句

sql 复制代码
select distinct 
    'hyundaiKia_online' as analyser,
    vehicle_model as vehicle_model,
    features,
    brand as '品牌',
    area as '地区',
    CONCAT(vehicle_model, '-', TRIM(REPLACE(catalogName, '#', ''))) as '车型'
from raw_vehicle_data
where vehicle_model != ''
ORDER BY `品牌`, `地区`, `车型`

指定别名列时要用 ```````` 来括起来,否则是不生效的。

列别名、列序号还有字段名在 order by 语句上是可以混搭的,效果是完全一样的。

sql 复制代码
...
ORDER BY brand , `地区`, 6

两种方式的优缺点:

列序号这种方式虽然方便,但是存在维护成本高的问题,因为一旦 select 的字段顺序改变,order by 就一定要跟随变更,否则就按非期望字段排序导致排序失效。同时这种方式存在一定学习成本,不太熟悉该 SQL 背后业务的人,初次接触会觉得 SQL 可读性很差,纯数字难以理解,工程上建议辩证的使用。

而列别名方式比列序号更加灵活一些,select 字段变更顺序不需要调整 order by,且别名不变更的话一般都不需要对 order by 进行调整,且别名的方式其所能表达的含义比列序号的纯数字要强,SQL 可读性更高。

相关推荐
鹿导的通天塔5 小时前
99%的人都不知道Codex 的 goal 神技!完整设置及提示词模板教学
后端
ltl7 小时前
Transformer 原论文怎么训出来的:8 张 P100、12 小时、warmup 4000 步
后端
why技术7 小时前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
程序猿追8 小时前
我搭了个网页工具:输入关键词,SERP API 自动吐出比价 Excel
后端
Lee川8 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端
Lee川9 小时前
MCP 高德地图实战:当 AI 学会使用工具,一个协议如何重塑大模型的行动边界
前端·人工智能·后端
楼田莉子9 小时前
C++17新特性:__had_include/属性/求值顺序规则
开发语言·c++·后端
程序员cxuan9 小时前
Codex 把我家烂网给优化后,我 TM 直接原地起飞了。
人工智能·后端·程序员
IT_陈寒9 小时前
Redis批量删除踩了坑,原来DEL命令不是万能的
前端·人工智能·后端
叫我少年10 小时前
C# 命名空间与 using 指令 — 文件范围、全局导入、别名
后端