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 可读性更高。

相关推荐
Bdygsl11 小时前
MySQL(1)—— 基本概念和操作
数据库·mysql
身如柳絮随风扬12 小时前
什么是左匹配规则?
数据库·sql·mysql
jiankeljx12 小时前
mysql之如何获知版本
数据库·mysql
luom010212 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
黄俊懿12 小时前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
小李来了!13 小时前
数据库DDL、DML、DQL、DCL详解
数据库·mysql
希望永不加班13 小时前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
散峰而望13 小时前
【基础算法】从入门到实战:递归型枚举与回溯剪枝,暴力搜索的初级优化指南
数据结构·c++·后端·算法·机器学习·github·剪枝
我科绝伦(Huanhuan Zhou)13 小时前
【生产案例】MySQL InnoDB 数据损坏崩溃修复
数据库·mysql·adb
前端付豪14 小时前
Memory V1:让 AI 记住你的关键信息
前端·后端·llm