用order by来进行查询时排序方式有,order by的用法总结
指导阅读
为什么只能在order by之后使用列别名为什么不建议使用ORDER BY后跟数字进行排序为什么不能在视图和子查询中使用ORDER BY.
朋友们在对SQL进行排序时自然可以使用ORDER BY。无论是默认ASC的升序还是DESC的降序,几乎都是得心应手。
今天,我将和你分享一些你可能不知道的ORDER BY的用法。
1.ORDER BY返回游标而不是集合。
SQL的理论其实就是集合论,像数据的交、并、差这样的常见问题都可以用集合论的思想来解决。
集合中的行之间没有预定义的顺序,它只是成员的逻辑组合,成员之间的顺序无关紧要。
如下图,每个括号中的内容是一条记录。排序之前,都是随机分布在集合中的。
学生(身份证、姓名、年龄)
学生集
但是,对于带有ORDER BY子句的查询,它返回一个对象,其中的行按特定顺序组织。我们称这个对象为光标。
如下图,学生表的ID按顺序排序后,学生表就变成了有序对象,也就是我们上面说的游标。
学生(身份证、姓名、年龄)
学生对象
其次,ORDER BY子句是唯一可以重用列别名的步骤。
这涉及到SQL语句的语法顺序和执行顺序。我们常见的SQL语法顺序如下:
选择非重复顶层编号选择列表
来自[左_表]
join_type连接右表
在连接条件下
哪里哪里条件
GROUP BY group_by_list
使用多维数据集汇总
拥有拥有条件
当数据库引擎执行SQL语句时,它不是从SELECT开始,而是从。具体执行顺序如下(关键字前面的数字代表SQL执行的顺序步骤):
(8)选择(9)非重复(11)顶部数字选择列表
(1)来自[left_table]
(3) join_type连接右表
(2)在连接条件下
(4)WHERE where_condition
(5)分组列表
(6)使用多维数据集汇总
(7)具备具备条件
(10)按order_by_list排序
从上面可以看出,SELECT直到。此时,SELECT之后的列的别名仅对后续步骤有效,对SELECT之前的步骤无效。因此,如果在WHERE、GROUP BY或HAVING之后使用列的别名,将会报告错误。
我们举个例子来测试一下。
示例客户表的结构和数据如下:
1.当WHERE后没有使用别名时。
挑选
名字作为名字,
地址为地址,
作为城市的城市
来自客户
其中=广州结果如下:
2.当在WHERE之后使用列别名时。
挑选
名字作为名字,
地址为地址,
作为城市的城市
来自客户
城市=广州
执行结果如下:
从返回的消息中我们可以看到,重命名的城市无法被WHERE识别,因此会报告“列名‘城市’无效”的消息。
其他关键词也可以用上面的方法测试。让我们在GROUP BY和HAVING之后测试列别名的使用。
3.测试分组依据后使用列别名
挑选
作为城市的城市
来自客户
按城市分组
结果如下:
4.测试HAVING后使用列别名。
挑选
作为城市的城市
来自客户
集团城市
有计数(城市)1
结果如下:
5.测试ORDER BY之后使用的列别名。
挑选
名字作为名字,
地址为地址,
作为城市的城市
来自客户
按城市排序
结果如下:
从上述测试示例的结果来看,我们可以断定我们的结论是正确的:ORDER BY子句是唯一可以重用列别名的步骤。
第三,小心地使用ORDER BY后跟数字进行排序。
有些朋友为了省事,喜欢把数字写在ORDER BY之后。具体例子如下:
挑选
名字作为名字,
地址为地址,
作为城市的城市
来自客户
按1,2,3排序
结果如下:
写出来的结果对于当前查询是正确的,没有问题。ORDER BY之后的数字1、2和3分别表示SELECT之后的第一、第二和第三个字段(即姓名、地址和城市)。
但是,当查询的列发生变化时,我忘记了修改ORDER BY列表。尤其是当查询语句非常长时,很难找到选择列表中的哪一列对应于ORDER BY。
例如
挑选
客户端ID作为ID,
名字作为名字,
地址为地址,
作为城市的城市
来自客户
按1,2,3排序
由于增加了一列“客户ID”,标题的原意仍然是对姓名、地址和城市进行排序,但由于使用了ORDER BY加数字,排序后的结果如下:
结果不是我们想要的,所以请注意通过添加数字来排序,并尝试通过添加列名或列别名来使用排序。
四。表表达式不能按ORDER BY排序。
表表达式包括视图、内联表值函数、派生表(子查询)和公用表表达式(CTE)。
例如,下面的视图是无效的。
创建视图V_Customers为
挑选
客户端ID作为ID,
名字作为名字,
地址为地址,
作为城市的城市
来自客户
订单id,名称,地址结果如下:
这个错误是不是很熟悉?因为很多朋友经常喜欢给视图或者子查询添加ORDER BY,然后一执行就报错。
我不敢判断根本原因,因为我查了很多文件资料,没有给出一个具体的说法。
我猜是因为视图、内联表值函数、派生表(子查询)和常用表表达式(CTE)返回的结果需要进一步使用。添加ORDER BY进行排序是多余的,但是会浪费系统资源。所以数据库开发人员不希望大家都用这种不规范的操作。
所以下次不要在表表达式中添加ORDER BY。
5.当TOP被添加到T-SQL中的表表达式时,可以使用ORDER BY
我们从第四点的错误信息可以看出:另外指定了TOP、OFFSET或者FOR XML,可以使用ORDER BY。
这是为什么呢?
先给你举个栗子。
挑选
客户端ID作为ID,
名字作为名字,
地址为地址,
作为城市的城市
从
(选择前3名*
来自客户
订单城市)客户
按ID、姓名、地址排序
结果如下:
因为T-SQL中ORDER BY的表表达式在添加TOP后返回一个没有固定顺序的表。因此,在这种情况下,ORDER BY子句只定义TOP选项的逻辑顺序,即下面的逻辑子句。
选择前3名*
来自客户
按城市结果如下:
但是,结果集的顺序不能保证,因为在表表达式之外至少有一层是我们需要的最终结果集。
ORDER BY在这里只对当前子查询有效,但在主查询中不起作用。您必须继续在主查询的末尾添加一个ORDER BY子句,以便对结果集生效,正如我们的示例中所写的那样。
除非逻辑需要,一般情况下,不建议避开ORDER BY不能用于子查询的限制。
这是ORDER BY的一些用法。你学会了吗?如果不了解或者有疑问,请在底部留言。
感觉不错,记得转发分享给更多人,谢谢~
——端——
版权归作者所有:博主SQL数据库开发的原创作品,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。