1.结果集分页1.1.只有做过了排序,才有可能准确地从结果集中返回指定区间的记录1.2.DB21.3.Oracle1.4.SQL Server1.5.sql
select sal from (select row_number() over (order by sal) as rn, sal from emp ) x where rn between 1 and 5SAL---- 800950110012501250
1.5.2.sql
select sal from (select row_number() over (order by sal) as rn, sal from emp ) x where rn between 6 and 10SAL----- 1300 1500 1600 2450 2850
1.6.PostgreSQL1.7.MySQL1.8.sql
select sal from emp order by sal limit 5 offset 0SAL------ 800 950 1100 1250 1250
1.8.2.sql
select sal from emp order by sal limit 5 offset 5SAL----- 1300 1500 1600 2450 2850
2.跳过n行记录2.1.获得第一个员工、第三个员工,等等2.2.DB22.3.Oracle2.4.SQL Server2.5.使用窗口函数ROW_NUMBER OVER为每一行分配一个序号
select ename from ( select row_number() over (order by ename) rn, ename from emp ) x where mod(rn,2) = 1
2.6.PostgreSQL2.7.MySQL2.8.使用标量子查询
select x.ename from ( select a.ename, (select count(*) from emp b where b.ename <= a.ename) as rn from emp a )x where mod(x.rn,2) = 1
3.提取最靠前的n行记录3.1.基于某种排序方式从结果集中提取出限定数目的记录3.2.DB23.3.Oracle3.4.SQL Server3.5.DENSE_RANK函数
select ename,sal from ( select ename, sal, dense_rank() over (order by sal desc) dr from emp ) x where dr <= 5
3.6.PostgreSQL3.7.MySQL3.8.使用标量子查询
select ename,sal from ( select (select count(distinct b.sal) from emp b where a.sal <= b.sal) as rnk, a.sal, a.ename from emp a ) where rnk <= 5
4.对结果排序4.1.DB24.2.Oracle4.3.SQL Server4.4.窗口函数DENSE_RANK OVER
select dense_rank() over(order by sal) rnk, sal from emp
4.5.PostgreSQL4.6.MySQL4.7.标量子查询
select (select count(distinct b.sal) from emp b where b.sal <= a.sal) as rnk, a.sal from emp a
5.删除重复项5.1.DB25.2.Oracle5.3.SQL Server5.4.窗口函数ROW_NUMBER OVER
select job from ( select job, row_number()over(partition by job order by job) rn from emp )x where rn = 1
5.5.PostgreSQL5.6.MySQL5.7.sql
select distinct job from empselect job from emp group by job
5.7.3.GROUP BY和DISTINCT是两个非常不同的子句,它们是不可互换的6.骑士值6.1.返回一个结果集,其中包括每个员工的姓名、部门、工资、入职时间以及每一个部门里最近入职的那个员工的工资6.2.DB26.3.SQL Server6.4.窗口函数MAX OVER
select deptno, ename, sal, hiredate, max(latest_sal)over(partition by deptno) latest_sal from ( select deptno, ename, sal, hiredate, case when hiredate = max(hiredate)over(partition by deptno) then sal else 0 end latest_sal from emp ) x order by 1, 4 desc
6.5.Oracle
select deptno, ename, sal, hiredate, max(sal) keep(dense_rank last order by hiredate) over(partition by deptno) latest_sal from emp order by 1, 4 desc
6.6.PostgreSQL6.7.MySQL6.8.两层嵌套的标量子查询
select e.deptno, e.ename, e.sal, e.hiredate, (select max(d.sal) from emp d where d.deptno = e.deptno and d.hiredate = (select max(f.hiredate) from emp f where f.deptno = e.deptno)) as latest_sal from emp e order by 1, 4 desc