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> host cls
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> host cls
SQL> –第二题
SQL> select empno,ename,sal,avgsal
2 from emp e, (select deptno,avg(sal) avgsal from emp group deptno) d
3 where e.deptno=d.deptno and e.sal>d.avgsal;
from emp e, (select deptno,avg(sal) avgsal from emp group deptno) d
*
第 2 行出现错误:
ORA-00924: 缺失 BY 关键字
SQL> ed
已写入 file afiedt.buf
1 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> /
EMPNO ENAME SAL AVGSAL
7698 BLAKE 2850 1566.66667
7499 ALLEN 1600 1566.66667
7902 FORD 3000 2175
7788 SCOTT 3000 2175
7566 JONES 2975 2175
7839 KING 5000 2916.66667
已选择6行。
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> host cls
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> set linesize 150
SQL> col deptno for 99
SQL> /
DEPTNO
NAMES
10
CLARK,KING,MILLER
20
SMITH,FORD,ADAMS,SCOTT,JONES
30
ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
SQL> col names for a50
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> host cls
SQL> –第三题
SQL> –81年为例
SQL> select hiredate from emp;
HIREDATE
17-12月-80
20-2月 -81
22-2月 -81
02-4月 -81
28-9月 -81
01-5月 -81
09-6月 -81
13-7月 -87
17-11月-81
08-9月 -81
13-7月 -87
HIREDATE
03-12月-81
03-12月-81
23-1月 -82
已选择14行。
SQL> /*
SQL> HIREDATE count81=0
SQL> ———————-
SQL> 17-12月-80 0
SQL> 20-2月 -81 1
SQL> 22-2月 -81 1
SQL> 02-4月 -81 1
SQL> 28-9月 -81 1
SQL> 01-5月 -81 1
SQL> 09-6月 -81 1
SQL> 13-7月 -87 0
SQL> 17-11月-81 1
SQL> 08-9月 -81 1
SQL> 13-7月 -87 0
SQL> 03-12月-81 1
SQL> 03-12月-81 1
SQL> 23-1月 -82 0
SQL> =========================
SQL> 10
SQL>
SQL> sum(if hiredate=1981 then 1 else 0)
SQL> */
SQL> spool off