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, '#', '')))
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 可读性更高。
93

被折叠的 条评论
为什么被折叠?



