您的位置:首页 > 数据库 > Oracle

Oracle-TOP-N和分页问题

2014-01-24 16:01 344 查看
SQL> --第一题  行号 rownum(伪列)
SQL> select rownum,empno,ename,sal
2  from emp;

ROWNUM      EMPNO ENAME        SAL
---------- ---------- ---------- -----
1       7369 SMITH        800
2       7499 ALLEN       1600
3       7521 WARD        1250
4       7566 JONES       2975
5       7654 MARTIN      1250
6       7698 BLAKE       2850
7       7782 CLARK       2450
8       7788 SCOTT       3000
9       7839 KING        5000
10       7844 TURNER      1500
11       7876 ADAMS       1100

ROWNUM      EMPNO ENAME        SAL
---------- ---------- ---------- -----
12       7900 JAMES        950
13       7902 FORD        3000
14       7934 MILLER      1300

已选择14行。

SQL> select rownum,empno,ename,sal
2  from emp
3  where rownum<=3
4  order by sal desc;

ROWNUM      EMPNO ENAME        SAL
---------- ---------- ---------- -----
2       7499 ALLEN       1600
3       7521 WARD        1250
1       7369 SMITH        800

SQL> /*
SQL> 注意的问题:
SQL> 1. 行号永远按照默认的顺序生成
SQL> 2. 行号只能使用< <=,不能使用> >=
SQL> */
SQL> select rownum,empno,ename,sal
2  from emp
3  order by sal desc;

ROWNUM      EMPNO ENAME        SAL
---------- ---------- ---------- -----
9       7839 KING        5000
13       7902 FORD        3000
8       7788 SCOTT       3000
4       7566 JONES       2975
6       7698 BLAKE       2850
7       7782 CLARK       2450
2       7499 ALLEN       1600
10       7844 TURNER      1500
14       7934 MILLER      1300
3       7521 WARD        1250
5       7654 MARTIN      1250

ROWNUM      EMPNO ENAME        SAL
---------- ---------- ---------- -----
11       7876 ADAMS       1100
12       7900 JAMES        950
1       7369 SMITH        800

已选择14行。

SQL> select rownum,empno,ename,sal
2  from emp
3  where rownum>=5 and rownum<=8;

未选定行

SQL> --rownum永远从1开始

分页

SQL> --第一题
SQL> select rownum,empno,ename,sal
2  from  (select * from emp order by sal desc)
3  where rownum<=3;

ROWNUM      EMPNO ENAME        SAL
---------- ---------- ---------- -----
1       7839 KING        5000
2       7788 SCOTT       3000
3       7902 FORD        3000

SQL> select *
2  from 	(select rownum r,e1.*
3  	 from (select * from emp order by sal) e1
4  	 where rownum <=8
5  	)
6  where r >=5;

R      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ----- ---------- ----------
5       7654 MARTIN     SALESMAN        7698 28-9月 -81      1250       1400         30
6       7934 MILLER     CLERK           7782 23-1月 -82      1300                    10
7       7844 TURNER     SALESMAN        7698 08-9月 -81      1500          0         30
8       7499 ALLEN      SALESMAN        7698 20-2月 -81      1600        300         30


SQL> --第二题
SQL> select empno,ename,sal,avgsal
2  from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) d
3  where e.deptno=d.deptno and e.sal>d.avgsal;

SQL> --相关子查询
SQL> --            : 将主查询中的某个值作为参数传递给子查询
SQL> select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
2  from emp e
3  where sal > (select avg(sal) from emp where deptno=e.deptno);

EMPNO ENAME        SAL     AVGSAL
---------- ---------- ----- ----------
7499 ALLEN       1600 1566.66667
7566 JONES       2975       2175
7698 BLAKE       2850 1566.66667
7788 SCOTT       3000       2175
7839 KING        5000 2916.66667
7902 FORD        3000       2175

已选择6行。


行转列函数

SQL> --wm_concat 行转列 (组函数)
SQL> select deptno,wm_concat(ename) names
2  from emp
3  group by deptno;

DEPTNO NAMES
------ --------------------------------------------------
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD


SQL> select count(*) Total,sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) "1980",
2                        sum(decode(to_char(hiredate,'yyyy'),'1981',1,0)) "1981",
3                        sum(decode(to_char(hiredate,'yyyy'),'1982',1,0)) "1982",
4                        sum(decode(to_char(hiredate,'yyyy'),'1987',1,0)) "1987"
5  from emp;

TOTAL       1980       1981       1982       1987
---------- ---------- ---------- ---------- ----------
14          1         10          1          2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: