SQL点滴(排序篇):数据常规排序查询实战示例

xiaopang 2020-01-05

导引

本文主要是针对在微头条上发布关于SQL查询排序的常规实操案例的汇总,以便收藏在线查阅。

SQL点滴(排序篇):数据常规排序查询实战示例

关于查询排序的参考示例主要有:

1.如何实现以指定的次序返回查询结果?


比如我们要对部门编号为3的员工工资的按升序排列结果,可以这样进行SQL语句的编写:
select ename,job,salary,comm from employee where departid = 2 order by salary asc
这样即可。
这类需要注意的是排序关键字,然后指明排序的字段名(或者字段位置编号,从1开始,这里可以替换为order by 3);另外,asc是可选的,若不显示指出,即为升序(最小的在第一行),若要降序,则改为order by columnname desc即可。若这样,本查询中salary具有最大值的在第一行。

2.对多个字段排序及注意事项


假设有这样的场景需求,即根据雇佣日期降序排序,再对部门员工的薪资进行升序排序,如何实现?我们可以这样来进行SQL语句的编写:

select * from employee order by hiredate desc ,salary asc


这里排序是要注意的语法写法,即order by后可以逗号分隔多个字段进行排序,字段也可用列的位置编号进行,并指定相应的排序方式:asc 或desc。

注意点:1)order by 的优先次序是从左到右的;

2)可以以select字段列表中没出现的列来排序,但必须给出列名;

3)如果使用了group by 或distinct,则不能按照select列表中没有的列来排序。

比如,你要写SQL:
select departid,sum(salary) sm from employee group by departid order by departid desc

这样可以的,但若departid换成hiredate就错了。

3.如何实现基于字段列值的子串排序?


要实现按字段值的子串排序,只要用substr函数即可(MS SQL用substring函数),实例如下:


select ename,job,salary from employee order by substr(job,length(job)-2) 。

也就是说,可使用DBMS内置的子串函数,很容易做到根据一部分值来排序。上面的SQL意思即为按照job最后两个字符排序后返回结果。

若是SQL Server,则需要改为substring(job,len(job)-2,2),其子串函数需要指定获取的字符数。

另外,也要注意各自内置函数名的写法或区别,以免运行出错。

4.如何在order by中用动态指定排序列?


在写SQL语句时,我们是可在排序子句中应用case语句动态指定排序字段的。具体实现如下:


select ename,salary.job,comm

from employee order by case

when job='经理' then salary

else comm

end


这样就可以使用case表达式来动态改变如何对结果排序了。上面是直接在order by子句中实现的。其实这相于于在select字段列表中增加了一列,然后按照新增列排序。如果在select列中增加一列,在结合order by 的按列位置排序,其完整的句子参考如下:
select ename ,salary,job,comm,case when job ='经理' then comm else salary end as ordercolumn from employee order by 5
当然,你可以把5换为case列别名ordercoulumn。就这样了,试试吧。

常用的关于单表排序操作,基本上就这些。后面还会继续讲些SQL的看了能用的实例SQL写法。下一篇将是关注多表的操作。本篇就想到这里了。转发出去吧

相关推荐