用order by来进行查询时排序方式有,order by的用法总结

  用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: