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

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

一、ORDER BY返回的是游标而不是集合

SQL的理论其实是集合论,常见的类似求数据的交集、并集、差集都可以使用集合的思维来求解。


集合中的行之间没有预先定义的顺序,它只是成员的一种逻辑组合,成员之间的顺序无关紧要。


如下图,每一个括号里的内容就是一条记录,在没排序前,他们都是随机分布在集合中。

40.jpg

                      Student集合


但是对于带有排序作用的ORDER BY子句的查询,它返回的是一个对象,其中的行按特定的顺序组织在一起,我们把这种对象称为游标。
如下图,经过对Student表的ID进行ORDER BY排序后,Student表变成了有序对象,也就是我们上面说的游标。


41.jpg

   Student对象




二、ORDER BY子句是唯一能重用列别名的一步

这里涉及SQL语句的语法顺序和执行顺序了,我们常见的SQL语法顺序如下:

SELECT DISTINCT  < Top Num> <select list>
FROM  [left_table]
<join_type> 
JOIN  <right_table>
ON  <join_condition>
WHERE  <where_condition>
GROUP BY  <group_by_list>
WITH  <CUBE | RollUP>
HAVING  <having_condition>
ORDER BY  <order_by_list>

而数据库引擎在执行SQL语句并不是从SELECT开始执行,而是从FROM开始,具体执行顺序如下(关键字前面的数字代表SQL执行的顺序步骤):


( 8 ) SELECT   ( 9 ) DISTINCT  ( 11 )< Top Num> <select list>
(
1 ) FROM  [left_table]
(
3 )<join_type>  JOIN  <right_table>
(
2 )         ON  <join_condition>
(
4 ) WHERE  <where_condition>
(
5 ) GROUP BY  <group_by_list>
(
6 ) WITH  <CUBE | RollUP>
(
7 ) HAVING  <having_condition>
(
10 ) ORDER BY  <order_by_list>


从上面可以看到SELECT在HAVING后才开始执行,这个时候SELECT后面列的别名只对后续的步骤生效,而对SELECT前面的步骤是无效的。所以如果你在WHERE,GROUP BY,或HAVING后面使用列的别名均会报错。


我们举例测试一下。


示例表Customers结构及数据如下:


42.jpg

1、WHERE后面不使用别名的情况


SELECT 
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
WHERE 城市='广州'

结果如下:

43.jpg

2、WHERE后面使用列别名的情况

SELECT 
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
WHERE City='广州'


执行结果如下:

44.jpg

从返回的消息中我们可以看到,重命名后的City并不能被WHERE识别,所以才会报“列名'City'无效”的提示。


其他关键字大家也可以使用上述方法进行测试,下面我们测试GROUP BY和HAVING后面使用列别名的情况。


3、测试GROUP BY后使用列别名

SELECT 
城市 AS City
FROM Customers
GROUP BY City


结果如下:

45.jpg

4、测试HAVING后使用列别名


SELECT 
城市 AS City
FROM Customers
GROUP BY 城市
HAVING COUNT(City)>1


结果如下:


46.jpg



相关文章
|
7月前
|
SQL XML Java
Mybatis中选择语句的使用:<choose>标签、分区排序 Row_num() over ()函数的使用呢
Mybatis中选择语句的使用:<choose>标签、分区排序 Row_num() over ()函数的使用呢
62 0
|
4月前
|
SQL 数据挖掘 数据库
|
7月前
排序——sort的用法
排序——sort的用法
59 0
|
7月前
|
SQL 数据库管理
sqlite语句order by两个字段同时排序处理
sqlite语句order by两个字段同时排序处理
73 0
|
7月前
|
小程序
排序sort()排序用法
排序sort()排序用法
|
7月前
|
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?
111 0
|
7月前
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
114 0
|
SQL
解决union查询order by 排序失效的问题
解决union查询order by 排序失效的问题
238 0
|
SQL
ORDER BY:对查询结果进行排序
ORDER BY:对查询结果进行排序
111 0
|
SQL Oracle 关系型数据库
SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
我们通常需要根据客户需求对于查询出来的结果给客户提供自定义的排序方式,那么我们通常sql需要实现方式都有哪些,参考更多资料总结如下(不完善的和错误望大家指出): 一、如果我们只是对于在某个程序中的应用是需要按照如下的方式排序,我们只需在SQL语句级别设置排序方式:
720 0