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写法。下一篇将是关注多表的操作。本篇就想到这里了。转发出去吧