除了会排序,你对ORDER BY的用法可能一无所知!(二)

简介: 小伙伴们在进行SQL排序时,都能很自然的使用到ORDER BY。不管是默认ASC的升序,还是DESC降序,几乎都是信手拈来。今天给大家分享一些你可能不知道的ORDER BY用法。

5、测试ORDER BY后面使用列别名


SELECT 
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
ORDER BY City



结果如下:

47.jpg

从上面的几个测试示例的结果中,可以得出我们的结论是正确的:ORDER BY子句是唯一能重用列别名的一步。


三、谨慎使用ORDER BY 后面接数字的方式来进行排序

有些小伙伴为了图省事,喜欢在ORDER BY后面写数字,具体示例如下:


SELECT 
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
ORDER BY 1,2,3


结果如下:

48.jpg

这样写的结果,针对当前的查询是正确没有问题的,ORDER BY后面的数字1,2,3分别代表SELECT后面的第1,第2,第3个字段(也就是Name,Address,City)。

可是当查询的列发生改变,忘了修改ORDER BY列表。特别是当查询语句很长时,要找到ORDER BY与SELECT列表中的哪个列相对应会非常困难。


例如


SELECT 
客户ID AS ID,
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
ORDER BY 1,2,3


由于增加了一列“客户ID”,原本的题意还是对Name,Address,City排序,但是因为使用了ORDER BY加数字,排序后的结果如下:


49.jpg

得到的结果并不是我们想要的,所以请慎用ORDER BY加数字,尽量使用ORDER BY加列名或列别名


四、表表达式不能使用ORDER BY排序

表表达式包括视图,内联表值函数,派生表(子查询)和公用表表达式(CTE)。例如下面的视图是无效的

CREATE VIEW V_Customers AS
SELECT 
客户ID AS ID,
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
ORDER BY ID,Name,Address

结果如下:

50.jpg

这个错误是不是很熟悉?因为很多小伙伴经常喜欢在视图或子查询里面加ORDER BY,然后一执行就会报这个错。


根本原因不敢妄加断定,因为搜寻了很多文献资料也没给出一个具体的说法。
这里我猜测是因为视图,内联表值函数,派生表(子查询)和公用表表达式(CTE)等返回的结果还需要进一步的去使用,加了ORDER BY进行排序是多此一举,反而会浪费系统资源。所以数据库的开发者不希望大家使用这样不规范操作。


所以下次就不要在表表达式里添加ORDER BY了。


五、T-SQL中表表达式加了TOP可以使用ORDER BY

我们从第四点的报错信息中可以看到:在另外还指定了 TOP、OFFSET 或 FOR XML是可以使用ORDER BY的。

51.jpg

这又是为什么呢?

我们还是先举个栗子给大家看一下

SELECT 
客户ID AS ID,
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM
(SELECT TOP 3 *
FROM Customers
ORDER BY 城市) Customers
ORDER BY ID,Name,Address


结果如下:

52.jpg

因为T-SQL中带有ORDER BY的表表达式加了TOP后返回的是一个没有固定顺序的表。因此,在这种情况下,ORDER BY子句只是为TOP选项定义逻辑顺序,就是下面这个逻辑子句


SELECT TOP 3 *
FROM Customers
ORDER BY 城市

结果如下

53.jpg

而不保证结果集的排列顺序,因为表表达式外面至少还有一层才是我们最终需要的结果集。


这里的ORDER BY只对当前的子查询生效,到了主查询是不起作用的。必须在主查询末尾继续添加一个ORDER BY子句才能对结果集生效,就像我们例子中写的那样。


除非逻辑要求,一般情况下并不推荐大家这样巧妙的避开子查询中不能使用ORDER BY的限制


以上就是有关ORDER BY的一些用法,你学会了吗?有不明白或疑问的地方,欢迎在底下留言。


觉得不错,记得转发分享给更多人,谢谢啦~



                                                      ——End——


相关文章
|
16天前
排序——sort的用法
排序——sort的用法
10 0
|
4月前
|
SQL 数据库管理
SQL基础题----基本的SELECT语句、order by排序
SQL基础题----基本的SELECT语句 ambiguous 模糊
177 1
|
4月前
|
小程序
排序sort()排序用法
排序sort()排序用法
|
9月前
|
关系型数据库 MySQL
MySQL深入浅出: order by if()与order by in()之条件排序
MySQL深入浅出: order by if()与order by in()之条件排序
123 0
|
5月前
|
SQL
[已解决]使用order by 排序后的是10 6 7 8 9 而不是 6 7 8 9 10?
[已解决]使用order by 排序后的是10 6 7 8 9 而不是 6 7 8 9 10?
56 0
|
5月前
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
41 0
|
6月前
|
SQL
解决union查询order by 排序失效的问题
解决union查询order by 排序失效的问题
58 0
|
10月前
|
SQL
ORDER BY:对查询结果进行排序
ORDER BY:对查询结果进行排序
68 0
|
11月前
|
SQL Oracle 关系型数据库
SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
我们通常需要根据客户需求对于查询出来的结果给客户提供自定义的排序方式,那么我们通常sql需要实现方式都有哪些,参考更多资料总结如下(不完善的和错误望大家指出): 一、如果我们只是对于在某个程序中的应用是需要按照如下的方式排序,我们只需在SQL语句级别设置排序方式:
337 0
|
数据库
分页limit和排序order by
分页limit和排序order by