翼度科技»论坛 编程开发 mysql 查看内容

选读SQL经典实例笔记10_高级查询

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15

1. 结果集分页

1.1. 只有做过了排序,才有可能准确地从结果集中返回指定区间的记录

1.2. DB2

1.3. Oracle

1.4. SQL Server

1.5. sql
  1. select sal
  2.   from (
  3. select row_number() over (order by sal) as rn,
  4.        sal
  5.   from emp
  6.        ) x
  7. where rn between 1 and 5
  8. SAL
  9. ----
  10. 800
  11. 950
  12. 1100
  13. 1250
  14. 1250
复制代码
1.5.2. sql
  1. select sal
  2.   from (
  3. select row_number() over (order by sal) as rn,
  4.        sal
  5.   from emp
  6.        ) x
  7. where rn between 6 and 10
  8. SAL
  9. -----
  10. 1300
  11. 1500
  12. 1600
  13. 2450
  14. 2850
复制代码
1.6. PostgreSQL

1.7. MySQL

1.8. sql
  1. select sal
  2.   from emp
  3. order by sal limit 5 offset 0
  4. SAL
  5. ------
  6.    800
  7.    950
  8.   1100
  9.   1250
  10.   1250
复制代码
1.8.2. sql
  1. select sal
  2.   from emp
  3. order by sal limit 5 offset 5
  4. SAL
  5. -----
  6. 1300
  7. 1500
  8. 1600
  9. 2450
  10. 2850
复制代码
2. 跳过n行记录

2.1. 获得第一个员工、第三个员工,等等

2.2. DB2

2.3. Oracle

2.4. SQL Server

2.5. 使用窗口函数ROW_NUMBER OVER为每一行分配一个序号
  1. select ename
  2.     from (
  3.   select row_number() over (order by ename) rn,
  4.          ename
  5.     from emp
  6.          ) x
  7.    where mod(rn,2) = 1
复制代码
2.6. PostgreSQL

2.7. MySQL

2.8. 使用标量子查询
  1. select x.ename
  2.     from (
  3.   select a.ename,
  4.          (select count(*)
  5.             from emp b
  6.            where b.ename <= a.ename) as rn
  7.     from emp a
  8.          )x
  9.    where mod(x.rn,2) = 1
复制代码
3. 提取最靠前的n行记录

3.1. 基于某种排序方式从结果集中提取出限定数目的记录

3.2. DB2

3.3. Oracle

3.4. SQL Server

3.5. DENSE_RANK函数
  1. select ename,sal
  2.    from (
  3. select ename, sal,
  4.         dense_rank() over (order by sal desc) dr
  5.    from emp
  6.         ) x
  7.   where dr <= 5
复制代码
3.6. PostgreSQL

3.7. MySQL

3.8. 使用标量子查询
  1. select ename,sal
  2.     from (
  3.   select (select count(distinct b.sal)
  4.             from emp b
  5.            where a.sal <= b.sal) as rnk,
  6.           a.sal,
  7.           a.ename
  8.     from emp a
  9.          )
  10.    where rnk <= 5
复制代码
4. 对结果排序

4.1. DB2

4.2. Oracle

4.3. SQL Server

4.4. 窗口函数DENSE_RANK OVER
  1. select dense_rank() over(order by sal) rnk, sal
  2.    from emp
复制代码
4.5. PostgreSQL

4.6. MySQL

4.7. 标量子查询
  1. select (select count(distinct b.sal)
  2.             from emp b
  3.            where b.sal <= a.sal) as rnk,
  4.          a.sal
  5.     from emp a
复制代码
5. 删除重复项

5.1. DB2

5.2. Oracle

5.3. SQL Server

5.4. 窗口函数ROW_NUMBER OVER
  1. select job
  2.     from (
  3.   select job,
  4.          row_number()over(partition by job order by job) rn
  5.     from emp
  6.          )x
  7.    where rn = 1
复制代码
5.5. PostgreSQL

5.6. MySQL

5.7. sql
  1. select distinct job
  2.   from emp
  3. select job
  4.   from emp
  5. group by job
复制代码
5.7.3. GROUP BY和DISTINCT是两个非常不同的子句,它们是不可互换的

6. 骑士值

6.1. 返回一个结果集,其中包括每个员工的姓名、部门、工资、入职时间以及每一个部门里最近入职的那个员工的工资

6.2. DB2

6.3. SQL Server

6.4. 窗口函数MAX OVER
  1. select deptno,
  2.         ename,
  3.         sal,
  4.         hiredate,
  5.         max(latest_sal)over(partition by deptno) latest_sal
  6.    from (
  7. select deptno,
  8.         ename,
  9.         sal,
  10.         hiredate,
  11.         case
  12.           when hiredate = max(hiredate)over(partition by deptno)
  13.           then sal else 0
  14.         end latest_sal
  15.    from emp
  16.         ) x
  17.   order by 1, 4 desc
复制代码
6.5. Oracle
  1. select deptno,
  2.         ename,
  3.         sal,
  4.         hiredate,
  5.         max(sal)
  6.           keep(dense_rank last order by hiredate)
  7.           over(partition by deptno) latest_sal
  8.    from emp
  9.   order by 1, 4 desc
复制代码
6.6. PostgreSQL

6.7. MySQL

6.8. 两层嵌套的标量子查询
  1. select e.deptno,
  2.          e.ename,
  3.          e.sal,
  4.          e.hiredate,
  5.          (select max(d.sal)
  6.             from emp d
  7.            where d.deptno  = e.deptno
  8.              and d.hiredate =
  9.                  (select max(f.hiredate)
  10.                     from emp f
  11.                    where f.deptno = e.deptno)) as latest_sal
  12.     from emp e
  13.    order by 1, 4 desc
复制代码
来源:https://www.cnblogs.com/lying7/p/17565552.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具