mysql别名排序没效果_除了会排序,你对ORDERBY的⽤法可
能⼀⽆所知!
导读为什么只有ORDER BY后⾯可以使⽤列别名
为什么不推荐使⽤ORDER BY后接数字来排序
为什么视图和⼦查询⾥⾯不能使⽤ORDER BY
……
⼩伙伴们在进⾏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⼦句是唯⼀能重⽤列别名的⼀步
这⾥涉及SQL语句的语法顺序和执⾏顺序了,我们常见的SQL语法顺序如下:SELECT DISTINCT
FROM [left_table]
JOIN
ON
WHERE
GROUP BY
WITH
HAVING
ORDER BY
⽽数据库引擎在执⾏SQL语句并不是从SELECT开始执⾏,⽽是从FROM开始,具体执⾏顺序如下(关键字前⾯的数字代表SQL执⾏的顺序步骤):
(8)SELECT (9)DISTINCT (11)
(1)FROM [left_table]
zeros matlab(3) JOIN
(2) ON
(4)WHERE
(5)GROUP BY
(6)WITH
(7)HAVING
(10)ORDER BY
从上⾯可以看到SELECT在HAVING后才开始执⾏,这个时候SELECT后⾯列的别名只对后续的步骤⽣效,⽽对SELECT前⾯的步骤是⽆效的。所以如果你在WHERE,GROUP BY,或HAVING后⾯使⽤列的别名均会报错。
我们举例测试⼀下。
⽰例表Customers结构及数据如下:
1、WHERE后⾯不使⽤别名的情况
SELECT
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
WHERE 城市='⼴州'
结果如下:
2、WHERE后⾯使⽤列别名的情况
SELECT
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
WHERE City='⼴州'
执⾏结果如下:
从返回的消息中我们可以看到,重命名后的City并不能被WHERE识别,所以才会报“列名'City'⽆效”的提⽰。
其他关键字⼤家也可以使⽤上述⽅法进⾏测试,下⾯我们测试GROUP BY和HAVING后⾯使⽤列别名的情况。
3、测试GROUP BY后使⽤列别名
SELECT
城市 AS City
FROM Customers
GROUP BY City
结果如下:
4、测试HAVING后使⽤列别名
SELECT
城市 AS City
FROM Customers
GROUP BY 城市
HAVING COUNT(City)>1
结果如下:
注意:本⽂是以标准SQL来测试的,MySQL的HAVING 能使⽤列别名,是因为对此做了扩展,必须开启ONLY_FULL_GROUP_BY才可以。
5、测试ORDER BY后⾯使⽤列别名
SELECT
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
ORDER BY City
结果如下:
从上⾯的⼏个测试⽰例的结果中,可以得出我们的结论是正确的:ORDER BY⼦句是唯⼀能重⽤列别名的⼀步。
三、谨慎使⽤ORDER BY 后⾯接数字的⽅式来进⾏排序
有些⼩伙伴为了图省事,喜欢在ORDER BY后⾯写数字,具体⽰例如下:
SELECT
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM Customers
ORDER BY 1,2,3
结果如下:
这样写的结果,针对当前的查询是正确没有问题的,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加数字,排序后的结果如下:
得到的结果并不是我们想要的,所以请慎⽤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
结果如下:
mysql语句顺序这个错误是不是很熟悉?因为很多⼩伙伴经常喜欢在视图或⼦查询⾥⾯加ORDER BY,然后⼀执⾏就会报这个错。
根本原因不敢妄加断定,因为搜寻了很多⽂献资料也没给出⼀个具体的说法。
这⾥我猜测是因为视图,内联表值函数,派⽣表(⼦查询)和公⽤表表达式(CTE)等返回的结果还需要进⼀步的去使⽤,加了ORDER BY进⾏排序是多此⼀举,反⽽会浪费系统资源。所以数据库的开发者不
希望⼤家使⽤这样不规范操作。
所以下次就不要在表表达式⾥添加ORDER BY了。
五、T-SQL中表表达式加了TOP可以使⽤ORDER BY
exists走索引吗我们从第四点的报错信息中可以看到:在另外还指定了 TOP、OFFSET 或 FOR XML是可以使⽤ORDER BY的。
这⼜是为什么呢?
我们还是先举个栗⼦给⼤家看⼀下
SELECT
客户ID AS ID,
姓名 AS Name,
地址 AS Address,
城市 AS City
FROM
(SELECT TOP 3 *
FROM Customers
ORDER BY 城市) Customers
ORDER BY ID,Name,Address
结果如下:
因为T-SQL中带有ORDER BY的表表达式加了TOP后返回的是⼀个没有固定顺序的表。因此,在这种情况下,ORDER BY⼦句只是为TOP 选项定义逻辑顺序,就是下⾯这个逻辑⼦句
SELECT TOP 3 *
FROM Customers
ORDER BY 城市
aspen软件有什么用结果如下:
⽽不保证结果集的排列顺序,因为表表达式外⾯⾄少还有⼀层才是我们最终需要的结果集。
hbuilder注释快捷键是什么导轨百度百科这⾥的ORDER BY只对当前的⼦查询⽣效,到了主查询是不起作⽤的。必须在主查询末尾继续添加⼀个ORDER BY⼦句才能对结果集⽣效,就像我们例⼦中写的那样。
除⾮逻辑要求,⼀般情况下并不推荐⼤家这样巧妙的避开⼦查询中不能使⽤ORDER BY的限制。
以上就是有关ORDER BY的⼀些⽤法,你学会了吗?有不明⽩或疑问的地⽅,欢迎在底下留⾔。
觉得不错,记得帮忙点个赞,谢谢啦~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论