Order by 原来可以这样用,涨姿势啦

昨天遇到一个奇葩的order 排序问题,不过真让我大开眼界:

    查询Students表, 对Gender字段进行排序。(Gender类型修改为smallint,允许值0-3)

    要求: Gender=1优先排序,其余按照出生日期:Birthday降序排列

常用的只有 order by col-name [asc/desc]. 优先排序,这不是非要在order中插入条件判断,怎么可能?? But Nothing is Impossible!

1、插入测试数据:(DataAdd 参考: http://technet.microsoft.com/zh-cn/library/ms186819.aspx

1 -- Insert some samples
2 --select FLOOR(RAND()*10)  -- a random number, ranging from 0 to 9
3 Declare @randNum varchar(1), @date varchar(10)
4 Set @randNum = FLOOR(RAND()*10) 
5 Set @date = '199' + @randNum + '-01-01'
6 
7 insert into Students
8 values('Tom_'+@randNum, FLOOR(RAND()*4) ,DATEADD(m,  FLOOR(RAND()*10)  + 1,@date))
9 go 50

2、自定义order by 条件判断实现排序:(参考: http://www.tutorialspoint.com/sql/sql-sorting-results.htm

1 select * from Students
2 order by (Case Gender When 1 Then 0 Else 1 End) asc, Birthday desc

数据显示为:
条件排序后的数据

结果刚刚好。虽然符合了需求,但第一次这样用,万分不理解。条件指定为0,1就可以,那其他的数字呢,还是说有什么默认的限制?经过不断的测试,算是有点小眉目啦。

Order by 中的 Case 语句,相当于是自定义排序的实现方法。 用’冒泡’想想,就很容易理解了。

如果要实现升序排列,两个数的比较,越小的,排列的位置越靠前,所以只需要给优先排序的字段最低的’权值’, 其他的依次排列。

同理就可以实现新的需求: Gender=1 优先, 3 其次, 其他 Birth 降序

1 select * from Students
2 order by (
3     Case Gender            -- set the priority: (asc - lower)
4         When 1 Then -1 
5         When 3 Then 1  
6         Else 2 
7     End) asc, Birthday desc

当时又突然冒出了另一个问题,直接用order by num. 是个什么效果?恕我孤陋寡闻,以前真的不知道还有 order by [col-index], 现在才明白数字是列索引, 可以在一般意义上等价于列名称。

参考:http://www.cnblogs.com/cuimingda/archive/2007/04/10/707237.html

[既然把多行给union了,把每列叫成什么名字都是不妥当的。。。只要采用列的序号即可, 序号从1开始。]

参考: http://technet.microsoft.com/zh-c·n/library/ms188723(v=sql.105).aspx

[如果列名已在 SELECT 列表中有了别名,则 ORDER BY 子句中只能使用别名。]

1 select StuID, StuName, Gender as Sex from Students
2 order by Sex  -- equal to  col index:  3  or the original col : Gender 

但下面的这个,使用列名做为排序条件,仍然可以查询?

1 select StuID, StuName from Students  -- ok, the right data
2 order by Birthday desc
3 
4 select * from Students
5 order by Birthday desc
6 
7 --select StuID, StuName from Students
8 --order by 4 desc  --- Error: ORDER BY 位置号 4 超出了选择列表中项数的范围

后来后来才找到真正重量级的解释:http://msdn.microsoft.com/en-us/library/e9zc0283(v=vs.80).aspx

order by 参数说明

 

 

转载于:https://www.cnblogs.com/ceeekor/p/3675224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,可以使用别名来对查询结果进行排序。下面是一个示例: ``` SELECT column1 AS alias1, column2 AS alias2 FROM table ORDER BY alias1 ASC; ``` 这个查询将会返回一个包含column1和column2的结果集,并且会根据alias1的值进行升序排序。 ### 回答2: 在SQL语句中,可以使用别名对查询结果进行排序,即使用ORDER BY子句中的别名进行排序。别名是为查询结果中的某一列或表达式指定的一个临时名称。通过使用别名,可以对查询结果进行排序,而无需重复编写表达式。 例如,假设有一个名为"students"的表,包含"student_id"和"name"两列。我们可以通过以下SQL语句查询所有学生的信息,并使用别名对"student_id"和"name"进行排序: SELECT student_id AS "学生ID", name AS "姓名" FROM students ORDER BY "学生ID" ASC; 上述SQL语句中,我们使用AS关键字为"student_id"列和"name"列指定了别名,分别为"学生ID"和"姓名"。然后,我们在ORDER BY子句中使用了这些别名进行升序排序。 需要注意的是,在ORDER BY子句中使用别名进行排序时,我们必须在别名前加上引号" ",以表示它们是别名而不是列名。 总之,使用别名进行排序是可以的,并且能够提高SQL语句的可读性和维护性。 ### 回答3: Order by 语句用于对查询结果进行排序。它可以使用列名来指定排序的字段,也可以使用别名来指定排序的字段。 但需要注意的是,别名在排序过程中是不能直接使用的。也就是说,在 Order by 语句中不能直接使用别名来指定排序字段。因为 Order by 是在执行 select 查询之后进行的,而别名是在 select 查询中创建的,所以在 Order by 中无法直接使用别名。 如果想要在 Order by 中使用别名进行排序,需要使用子查询的方式来实现。具体做法是,在子查询中使用别名来创建一个临时表,然后在外层查询中使用这个临时表,并在 Order by 中按照别名进行排序。 例如,假设我们有一个查询语句如下: SELECT column1 AS alias_name FROM table_name ORDER BY alias_name; 这样的查询是不合法的,因为在 Order by 中不能直接使用别名。 要使用别名进行排序,可以使用以下方式: SELECT * FROM (SELECT column1 AS alias_name FROM table_name) AS temp_table ORDER BY alias_name; 在这个例子中,我们先将原始查询语句作为子查询,在其外层使用别名创建了一个临时表 temp_table,然后在 Order by 中使用了这个别名 alias_name 来进行排序。 总结起来,Order by 不能直接使用别名进行排序,但可以通过使用子查询来间接使用别名进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值