小伙伴们在进行SQL排序时,都能很自然的使用到ORDER BY。不管是默认ASC的升序,还是DESC降序,几乎都是信手拈来。
今天给大家分享一些你可能不知道的ORDER BY用法。
一、ORDER BY返回的是游标而不是集合
SQL的理论其实是集合论,常见的类似求数据的交集、并集、差集都可以使用集合的思维来求解。
集合中的行之间没有预先定义的顺序,它只是成员的一种逻辑组合,成员之间的顺序无关紧要。
如下图,每一个括号里的内容就是一条记录,在没排序前,他们都是随机分布在集合中。
Student(ID,Name,Age)
Student集合
但是对于带有排序作用的ORDER BY子句的查询,它返回的是一个对象,其中的行按特定的顺序组织在一起,我们把这种对象称为游标。
如下图,经过对Student表的ID进行ORDER BY排序后,Student表变成了有序对象,也就是我们上面说的游标。
Student(ID,Name,Age)
Student对象
二、ORDER BY子句是唯一能重用列别名的一步
注:markdown对代码块的语法是开始和结束行都要添加:```,其中 ` 为windows键盘左上角那
这里涉及SQL语句的语法顺序和执行顺序了,我们常见的SQL语法顺序如下:
SELECTDISTINCT<TopNum><selectlist>FROM[left_table]<join_type>JOIN<right_table>ON<join_condition>WHERE<where_condition>GROUPBY<group_by_list>WITH<CUBE|RollUP>having<having_condition>ORDERBY<order_by_list>
而数据库引擎在执行SQL语句并不是从select开始执行,而是从FROM开始,具体执行顺序如下(关键字前面的数字代表SQL执行的顺序步骤):
(8)select(9)DISTINCT(11)<TopNum><selectlist>(1)FROM[left_table](3)<join_type>JOIN<right_table>(2)ON<join_condition>(4)WHERE<where_condition>(5)GROUPBY<group_by_list>(6)WITH<CUBE|RollUP>(7)HAVING<having_condition>(10)ORDERBY<order_by_list>
从上面可以看到select在HAVING后才开始执行,这个时候select后面列的别名只对后续的步骤生效,而对select前面的步骤是无效的。所以如果你在WHERE,group by,或HAVING后面使用列的别名均会报错。
我们举例测试一下。
示例表Customers结构及数据如下:
1、WHERE后面不使用别名的情况
select姓名ASName,地址ASAddress,城市ASCityFROMCustomersWHERE城市='广州'
结果如下:
2、WHERE后面使用列别名的情况
select姓名ASName,地址ASAddress,城市ASCityFROMCustomersWHERECity='广州'
执行结果如下:
从返回的消息中我们可以看到,重命名后的City并不能被WHERE识别,所以才会报“列名'City'无效”的提示。
其他关键字大家也可以使用上述方法进行测试,下面我们测试GROUP BY和HAVING后面使用列别名的情况。
3、测试GROUP BY后使用列别名
select城市ASCityFROMCustomersGROUPBYCity
结果如下:
4、测试HAVING后使用列别名
select城市ASCityFROMCustomersGROUPBY城市HAVINGCOUNT(City)>1
结果如下:
5、测试ORDER BY后面使用列别名
select姓名ASName,地址ASAddress,城市ASCityFROMCustomersORDERBYCity
结果如下:
从上面的几个测试示例的结果中,可以得出我们的结论是正确的:ORDER BY子句是唯一能重用列别名的一步。
三、谨慎使用ORDER BY 后面接数字的方式来进行排序
有些小伙伴为了图省事,喜欢在ORDER BY后面写数字,具体示例如下:
select姓名ASName,地址ASAddress,城市ASCityFROMCustomersORDERBY1,2,3
结果如下:
这样写的结果,针对当前的查询是正确没有问题的,ORDER BY后面的数字1,2,3分别代表select后面的第1,第2,第3个字段(也就是Name,Address,City)。
可是当查询的列发生改变,忘了修改ORDER BY列表。特别是当查询语句很长时,要找到ORDER BY与select列表中的哪个列相对应会非常困难。
例如:
select客户IDASID,姓名ASName,地址ASAddress,城市ASCityFROMCustomersORDERBY1,2,3
由于增加了一列“客户ID”,原本的题意还是对Name,Address,City排序,但是因为使用了ORDER BY加数字,排序后的结果如下:
得到的结果并不是我们想要的,所以请慎用ORDER BY加数字,尽量使用ORDER BY加列名或列别名。
四、表达式不能使用ORDER BY排序
表表达式包括视图,内联表值函数,派生表(子查询)和公用表表达式(CTE)。
例如下面的视图是无效的
CREATEVIEWV_CustomersASSELECT客户IDASID,姓名ASName,地址ASAddress,城市ASCityFROMCustomersORDERBYID,Name,Address
结果如下:
这个错误是不是很熟悉?因为很多小伙伴经常喜欢在视图或子查询里面加ORDER BY,然后一执行就会报这个错。
根本原因不敢妄加断定,因为搜寻了很多文献资料也没给出一个具体的说法。
这里我猜测是因为视图,内联表值函数,派生表(子查询)和公用表表达式(CTE)等返回的结果还需要进一步的去使用,加了ORDER BY进行排序是多此一举,反而会浪费系统资源。所以数据库的开发者不希望大家使用这样不规范操作。
所以下次就不要在表表达式里添加ORDER BY了。
五、T-SQL中表表达式加了TOP可以使用ORDER BY
我们从第四点的报错信息中可以看到:在另外还指定了 TOP、OFFSET 或 FOR XML是可以使用ORDER BY的。
这又是为什么呢?
我们还是先举个栗子给大家看一下
select客户IDASID,姓名ASName,地址ASAddress,城市ASCityFROM(SELECTTOP3*FROMCustomersORDERBY城市)CustomersORDERBYID,Name,Address
结果如下:
因为T-SQL中带有ORDER BY的表表达式加了TOP后返回的是一个没有固定顺序的表。因此,在这种情况下,ORDER BY子句只是为TOP选项定义逻辑顺序,就是下面这个逻辑子句
SELECTTOP3*FROMCustomersORDERBY城市
结果如下:
而不保证结果集的排列顺序,因为表表达式外面至少还有一层才是我们最终需要的结果集。
这里的ORDER BY只对当前的子查询生效,到了主查询是不起作用的。必须在主查询末尾继续添加一个ORDER BY子句才能对结果集生效,就像我们例子中写的那样。
除非逻辑要求,一般情况下并不推荐大家这样巧妙的避开子查询中不能使用ORDER BY的限制。
看完上述内容,你们对ORDER BY的用法都有哪些有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注本站行业资讯频道,感谢大家的支持。
本文由 贵州做网站公司 整理发布,部分图文来源于网络,如有侵权,请联系我们删除,谢谢!
一、功能介绍各版本的凡科企业邮箱用户,支持设置到Foxmail或Outlook等其他第三方邮箱软件登录管理企业邮箱。下面是如何使用Foxmail的设置方法。...
免费主页空间申请建网站服务平台 高端免费主页空间申请系统平台值得您免费注册使用 ▶ 网站模板免费使...
一、功能效果填写公众号Appsecret有什么用呢?公众号Appsecret可用于微信支付、自定义微信分享样式、微信登录等功能的设置。二、获取AppSecret...
都知道如今我国的房价可谓是越来越高的,尤其是对于有些一线城市而言,房子的价格甚至高达上万元。很多人都希望房价可以下跌,但是网友们知道房价下跌银行危险吗?据悉,当房产价值发生减少,比如房屋倒塌,房价下跌等情况,你按揭的这套房产自身价值已不够偿还银行的欠款,此时,银行有权利要求购房者提供新的抵押物或者弥补银行的损失。所以说,房价下跌一般不会影响银行的利益。房价下跌的危害:房价下跌的城市纷纷上演房闹戏码...
利息调整怎么理解?通常情况下,我们说的利息调整指的是,按实际本金和实际利率计算的利息与按票面面值和票面利率计算的利息的差额。通俗的来说就是,实际利率和票面利率之前的差额。简单来说,利息调整的计算依据就是根据实际利率下的摊余成本法来计算的。利息变动调整方式在降息或者加息的情况下,房贷利率调整有三种方式:1、一种是次年调,银行利率调整后,次年1月1日开始执行新利率;2、一种是按年度调,从贷款人的贷款日...
欢迎观看本篇文章,小勉来为大家解答以上问题。微信头像上的国旗标志怎么弄的,教你如何在微信头像加上国旗标志很多人还不知道,现在让我们一起来看看吧!【资料图】1、最近很多微信好友的头像都加了红旗。国庆来真的很好。这是怎么发生的?下面给大家介绍一下。2、首先打开微信,点击右上角的【搜索】选项。3、在搜索界面中搜索,然后点击打开。4、进入后回复【红旗】,然后打开生成的链接。5、进入后点击【微信头像红旗】。...