分页查询 -集合操作

分页查询

--分页查询 ROWNUM
  SELECT ROWNUM,ENAME,SAL,DEPTNO
  FROM EMP
  WHERE ROWNUM BETWEEN 6 AND 10;

上面的分页查询 已经查询了数据但是为什么查询不出数据?

答:--这个是查询不出任何数据的.因为rownum>1 后 rownum从1开始 但是他的值一直大于一 

--rownum不可以自增1 所以导致数据不能向下走 数据不可以被查出来。

                                                                                                                           上面昨日遗留问题                                 

分页查询案例
--
把rownum 加进去的当做一张表查询 查询6-10 之间的值 SELECT * FROM (SELECT ROWNUM AS IDD ,ENAME,SAL,DEPTNO FROM EMP ) WHERE IDD BETWEEN 6 AND 10;
--注意这里一定要给别名 否则数据库不认为 是要查询该表里面字段
 --题目:查找公司工资排名的6-10名
  SELECT *FROM
  (SELECT ROWNUM AS ISS ,ENAME,SAL FROM (SELECT ENAME,SAL FROM EMP
 ORDER BY SAL DESC) )
 WHERE ISS BETWEEN 6 AND 10;
--最里面的一层查询 是排序  外面的一层是 加rownum   只要排序就需要两层查询
  --题目:查找公司工资排名的6-10名
  SELECT *FROM
  (SELECT ROWNUM AS ISS ,ENAME,SAL FROM (SELECT ENAME,SAL FROM EMP
 ORDER BY SAL DESC) 
 WHERE ROWNUM <=10)
 WHERE ISS >=6;

DECODE函数(参数,参数,参数...)

可以实现分支结构

 --DECODE函数   可以实现分支结构
 SELECT ENAME,JOB,SAL,DECODE(
  JOB,
  'MANAGER',SAL*10,
  'ANALYST',SAL*5,
  'CLERK',sal*2,
  sal
 ) 工资
 FROM EMP;
 --DECODE函数   可以实现分支结构
  SELECT ENAME,JOB,SAL,DECODE(
  JOB,
  'MANAGER',SAL*10,
  'ANALYST',SAL*5,
  'CLERK',sal*2
  
 ) 工资
 FROM EMP;
 --如果没有default条件  不满足条件的填null
 --利用decode函数将MANAGER,ANALYST划分为一组
 SELECT COUNT(*),DECODE(
 JOB,
 'MANAGER','VIP',
 'ANALYST','VIP',
 'OTHER'
 )
 FROM EMP
 GROUP BY DECODE(
 JOB,
 'MANAGER','VIP',
 'ANALYST','VIP',
 'OTHER'
 ) 
--利用decode函数将想要按自己的排序进去操作
 SELECT DISTINCT DEPTNO,DNAME FROM DEPT
 ORDER BY DECODE(
 DNAME,
 'ACCOUNTING',1,
 'OPERATIONS',2,
 'RESEARCE',3,
 4
 );

CASE语句

与DECODE函数用法相似

--case语句
   SELECT ENAME,JOB,SAL,CASE
  JOB
  WHEN 'MANAGER' THEN SAL*10
  WHEN 'ANALYST'THEN SAL*5
  WHEN 'CLERK' THEN sal*2
  ELSE SAL END
  工资
 from EMP;

 

排序函数

排序函数允许对结果集按照指定的字段分组在组内要按照指定的字段排序,最终生成组内编号

1.ROW_NUMBER()  OVER(

PARTITON BY 字段名

)

--利用排序函数ROW_NUMBER()函数  查看每个部门的工资排名
 SELECT DEPTNO,ENAME,SAL,ROW_NUMBER() OVER(
 PARTITION BY DEPTNO
 ORDER BY SAL DESC
 ) SORTT
 FROM EMP

2.RANK函数

生成组内个连续也不唯一的数字,同组内排序字段值一样的记录,生成的数字也一样

 --RANK函数   生成组内不连续也不唯一的数字,同组内排序字段一样的记录,生成的数字也一样
 SELECT DEPTNO,ENAME,RANK() OVER(
 PARTITION BY DEPTNO
 ORDER BY SAL DESC 
 ) SORTT
 FROM EMP

注意 这里重复了4 没有按照顺序出现5.

集合操作

并集、交集、差集

1.并集(两个条件都要兼顾 只要有一个 结果就会显示)

UNION

 SELECT ENAME,JOB,SAL FROM EMP
 WHERE JOB='MANAGER'
 UNION
 SELECT ENAME,JOB,SAL FROM EMP
 WHERE SAL>2500;

UNION ALL

 SELECT ENAME,JOB,SAL FROM EMP
 WHERE JOB='MANAGER'
 UNION ALL
 SELECT ENAME,JOB,SAL FROM EMP
 WHERE SAL>2500;

UNION和UNION ALL 最大的区别:第一个 不会将重复的显示出来,第二个会将重复的显示出来

2.交集(显示两者都满足的条件的数据)

关键字:

INTERSECT
--交集(取结果集内共有的记录)
  SELECT ENAME,JOB,SAL FROM EMP
 WHERE JOB='MANAGER'
 INTERSECT
 SELECT ENAME,JOB,SAL FROM EMP
 WHERE SAL>2500;

3.差集(满足上边但不满足下边)

关键字:

 MINUS
 --差集  满足上边条件但是不满足下边
  SELECT ENAME,JOB,SAL FROM EMP
 WHERE JOB='MANAGER'
  MINUS
 SELECT ENAME,JOB,SAL FROM EMP
 WHERE SAL>=2500;

高级分组函数

主要用于GROUP up中

1.ROLLUP()

分组原则,参数逐渐递减,一直到所有参数都没有,每一种分组统计一次结果,并在一个结果集内显示。

 --查看每天每月每年 以及总共的营业额
 SELECT year_id,month_id,day_id,sum(sales_value)
 FROM sales_tab
 GROUP BY ROLLUP(year_id,month_id,day_id)

结果:最后参数再逐渐递减直到没有

2.CUBE()

每种组合分一次组,分组的次数是2的参数个数次方

 SELECT year_id,month_id,day_id,sum(sales_value)
 FROM sales_tab
 GROUP BY CUBE(year_id,month_id,day_id)

这个函数不过是把参数组合的所有情况都显示出来。

3.GROUPING SETS ()

每个参数是一种分组方式,然后将这些分组统计后并在一个结果集内显示

 --GROUPING SETS   只看 相同日相同月的(自己可定义)  可以满足
  SELECT year_id,month_id,day_id,sum(sales_value)
 FROM sales_tab
 GROUP BY GROUPING SETS((year_id,month_id,day_id), (year_id,month_id))

参数自己可以定义自己想看的结果。

猜你喜欢

转载自www.cnblogs.com/lchh/p/9331083.html