当前位置: 代码迷 >> 综合 >> Oracle数据库(六)子查询
  详细解决方案

Oracle数据库(六)子查询

热度:37   发布时间:2023-09-20 22:39:52.0
SQL> --查询工资比SCOTT高的员工信息
SQL> --1. SCOTT的工资
SQL> select sal from emp where ename='SCOTT';SAL                                                                      
----------                                                                      3000                                                                      SQL> --2. 比3000高的员工
SQL> set linesize 200
SQL> select * from emp where sal > 3000;EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              SQL> --子查询所要解决的问题:不能一步求解
SQL> select *2  from emp3  where sal > (select sal4               from emp5               where ename='SCOTT');EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              SQL> /*
SQL> 注意的问题:
SQL> 1. 括号
SQL> 2. 合理的书写风格
SQL> 3. 可以在主查询的where  select having from后面都可以放置子查询
SQL> 4. 不可以在group by放置子查询
SQL> 5. 强调from后面的子查询
SQL> 6. 主查询和子查询可以不是同一张表;只要子查询返回的结果主查询可以使用即可
SQL> 7. 一般不在子查询排序;但在top-n分析问题中,必须对子查询排序
SQL> 8. 一般先执行子查询,再执行主查询;但相关子查询例外
SQL> 9. 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
SQL> 10. 子查询中的null,若子查询的结果中含有null值,则不能使用not in来判断,可以使用in判断
SQL> */
SQL> --3. 可以在主查询的where  select having from后面都可以放置子查询
SQL> select empno,ename,sal,(select job from emp where empno=7839) 第四列2  from emp;EMPNO ENAME             SAL 第四列                                                                                                                                                                 
---------- ---------- ---------- ---------                                                                                                                                                              7369 SMITH             800 PRESIDENT                                                                                                                                                              7499 ALLEN            1600 PRESIDENT                                                                                                                                                              7521 WARD             1250 PRESIDENT                                                                                                                                                              7566 JONES            2975 PRESIDENT                                                                                                                                                              7654 MARTIN           1250 PRESIDENT                                                                                                                                                              7698 BLAKE            2850 PRESIDENT                                                                                                                                                              7782 CLARK            2450 PRESIDENT                                                                                                                                                              7788 SCOTT            3000 PRESIDENT                                                                                                                                                              7839 KING             5000 PRESIDENT                                                                                                                                                              7844 TURNER           1500 PRESIDENT                                                                                                                                                              7876 ADAMS            1100 PRESIDENT                                                                                                                                                              EMPNO ENAME             SAL 第四列                                                                                                                                                                 
---------- ---------- ---------- ---------                                                                                                                                                              7900 JAMES             950 PRESIDENT                                                                                                                                                              7902 FORD             3000 PRESIDENT                                                                                                                                                              7934 MILLER           1300 PRESIDENT                                                                                                                                                              已选择 14 行。SQL> --5. 强调from后面的子查询
SQL> --查询员工信息:员工号 姓名 月薪
SQL> select *2  from (select empno,ename,sal from emp);EMPNO ENAME             SAL                                                                                                                                                                        
---------- ---------- ----------                                                                                                                                                                        7369 SMITH             800                                                                                                                                                                        7499 ALLEN            1600                                                                                                                                                                        7521 WARD             1250                                                                                                                                                                        7566 JONES            2975                                                                                                                                                                        7654 MARTIN           1250                                                                                                                                                                        7698 BLAKE            2850                                                                                                                                                                        7782 CLARK            2450                                                                                                                                                                        7788 SCOTT            3000                                                                                                                                                                        7839 KING             5000                                                                                                                                                                        7844 TURNER           1500                                                                                                                                                                        7876 ADAMS            1100                                                                                                                                                                        EMPNO ENAME             SAL                                                                                                                                                                        
---------- ---------- ----------                                                                                                                                                                        7900 JAMES             950                                                                                                                                                                        7902 FORD             3000                                                                                                                                                                        7934 MILLER           1300                                                                                                                                                                        已选择 14 行。SQL> --查询员工信息:员工号 姓名 月薪 年薪
SQL> ed
已写入 file afiedt.buf1  select *2* from (select empno,ename,sal,sal*12 annsal from emp)
SQL> /EMPNO ENAME             SAL     ANNSAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             7369 SMITH             800       9600                                                                                                                                                             7499 ALLEN            1600      19200                                                                                                                                                             7521 WARD             1250      15000                                                                                                                                                             7566 JONES            2975      35700                                                                                                                                                             7654 MARTIN           1250      15000                                                                                                                                                             7698 BLAKE            2850      34200                                                                                                                                                             7782 CLARK            2450      29400                                                                                                                                                             7788 SCOTT            3000      36000                                                                                                                                                             7839 KING             5000      60000                                                                                                                                                             7844 TURNER           1500      18000                                                                                                                                                             7876 ADAMS            1100      13200                                                                                                                                                             EMPNO ENAME             SAL     ANNSAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             7900 JAMES             950      11400                                                                                                                                                             7902 FORD             3000      36000                                                                                                                                                             7934 MILLER           1300      15600                                                                                                                                                             已选择 14 行。SQL> --6. 主查询和子查询可以不是同一张表;只要子查询返回的结果主查询可以使用即可
SQL> --查询部门名称是SALES的员工信息
SQL> select *2  from emp3  where deptno=(select deptno4                from dept5                where dname='SALES');EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7900 JAMES      CLERK           7698 03-12月-81            950                    30                                                                                                              已选择 6 行。SQL> select e.*2  from emp e,dept d3  where e.deptno=d.deptno and d.dname='SALES';EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7900 JAMES      CLERK           7698 03-12月-81            950                    30                                                                                                              已选择 6 行。SQL> --SQL优化 4: 理论上,尽量使用多表查询
SQL> host clsSQL> --in 在集合中
SQL> --查询部门名称是SALES和ACCOUNTING的员工
SQL> select *2  from emp3  where deptno in (select deptno frmo dept where dname='SALES' or dname='ACCOUNTING');
where deptno in (select deptno frmo dept where dname='SALES' or dname='ACCOUNTING')*
第 3 行出现错误: 
ORA-00923: 未找到要求的 FROM 关键字 SQL> ed
已写入 file afiedt.buf1  select *2  from emp3* where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING')
SQL> /EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7900 JAMES      CLERK           7698 03-12月-81            950                    30                                                                                                              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              已选择 9 行。SQL> select e.*2  from emp e,dept d3  where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING');EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7900 JAMES      CLERK           7698 03-12月-81            950                    30                                                                                                              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              已选择 9 行。SQL> host clsSQL> --any: 和集合中任意一个值比较
SQL> --查询工资比30号部门任意一个员工高的员工信息
SQL> select *2  from emp3  where sal > any (select sal from emp where deptno=30);EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20                                                                                                              已选择 12 行。SQL> ed
已写入 file afiedt.buf1  select *2  from emp3* where sal > (select min(sal) from emp where deptno=30)
SQL> /EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20                                                                                                              7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              已选择 12 行。SQL> --all: 和集合中的所有值比较
SQL>  --查询工资比30号部门所有员工高的员工信息
SQL> select *2  from emp3  where sal > all (select sal from emp where deptno=30);EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              SQL> ed
已写入 file afiedt.buf1  select *2  from emp3* where sal > (select max(sal) from emp where deptno=30)
SQL> /EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              SQL> host clsSQL> --多行子查询中的null
SQL> --not in (10,20,null)
SQL> --查询不是老板的员工
SQL> select * from emp;EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7369 SMITH      CLERK           7902 17-12月-80            800                    20                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20                                                                                                              EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7900 JAMES      CLERK           7698 03-12月-81            950                    30                                                                                                              7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              已选择 14 行。SQL> select *2  from emp3  where empno not in (select mgr from emp);未选定行SQL> --查询是老板的员工
SQL> ed
已写入 file afiedt.buf1  select *2  from emp3* where empno in (select mgr from emp)
SQL> /EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30                                                                                                              7839 KING       PRESIDENT            17-11月-81           5000                    10                                                                                                              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20                                                                                                              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20                                                                                                              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10                                                                                                              已选择 6 行。SQL> select *2  from emp3  where empno not in (select mgr from emp where mgr is not null);EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO                                                                                                              
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------                                                                                                              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30                                                                                                              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30                                                                                                              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30                                                                                                              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30                                                                                                              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              7369 SMITH      CLERK           7902 17-12月-80            800                    20                                                                                                              7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20                                                                                                              7900 JAMES      CLERK           7698 03-12月-81            950                    30                                                                                                              已选择 8 行。SQL> spool off

SQL> --rownum 伪列 行号
SQL> select rownum,empno,ename,sal 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,sal2  from emp3  where rownum<=34  order by sal desc;ROWNUM      EMPNO ENAME             SAL                                                                                                                                                             
---------- ---------- ---------- ----------                                                                                                                                                             2       7499 ALLEN            1600                                                                                                                                                             3       7521 WARD             1250                                                                                                                                                             1       7369 SMITH             800                                                                                                                                                             SQL> /*
SQL> 关于rownum
SQL> 1. rownum永远按照默认的顺序生成
SQL> 2. rownum只能使用< <=;不能使用> >=
SQL> */
SQL>  select rownum,empno,ename,sal from emp 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,sal2  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> -- 2. rownum只能使用< <=;不能使用> >=
SQL> select rownum,empno,ename,sal from emp where rownum>=5 and rownum<=8;未选定行SQL> select rownum,empno,ename,sal from emp where rownum>=5;未选定行SQL> select rownum,empno,ename,sal from emp where rownum<=8;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                                                                                                                                                             已选择 8 行。SQL>  select *2   from 	(select rownum r,e1.*3  	 from (select * from emp order by sal) e14   	 where rownum <=85  	)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> --create global temporary table ******
SQL> --特点:当事务或者会话结束的时候,表中的数据自动删除
SQL> create global temporary table test12  (tid number,3   tname varchar2(20))4  on commit delete rows;表已创建。SQL> insert into test1 values(1,'Tom');已创建 1 行。SQL> select * from test1;TID TNAME                                                                                                                                                                                        
---------- --------------------                                                                                                                                                                         1 Tom                                                                                                                                                                                          SQL> commit;提交完成。SQL> select * from test1;未选定行SQL> 
SQL> create global temporary table test22  (tid number,3   tname varchar2(20))4  on commit reserve rows;
on commit reserve rows*
第 4 行出现错误: 
ORA-00901: 无效 CREATE 命令 SQL> create global temporary table test22  (tid number,3   tname varchar2(20))4  on commit preserve rows;表已创建。SQL> insert into test2 values(1,'Tom');已创建 1 行。SQL> commit;提交完成。SQL> select * from test2;TID TNAME                                                                                                                                                                                        
---------- --------------------                                                                                                                                                                         1 Tom                                                                                                                                                                                          SQL> exit
SQL> host clsSQL> --第二题
SQL> select e.empno,e.ename,e.sal,d.avgsal2  from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) d3  where e.deptno=d.deptno and e.sal> d.avgsal;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> select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal2  from emp e3  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 clsSQL> --第三题
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                                                                      
19-4月 -87                                                                      
17-11月-81                                                                      
08-9月 -81                                                                      
23-5月 -87                                                                      HIREDATE                                                                        
--------------                                                                  
03-12月-81                                                                      
03-12月-81                                                                      
23-1月 -82                                                                      已选择 14 行。SQL> /*
SQL> select count(*) Total,
SQL> 
SQL>        sum(if 是81年 then +1 else +0) "1981",
SQL> from emp;
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> 19-4月 -87           0
SQL> 17-11月-81           1
SQL> 08-9月 -81           1
SQL> 23-5月 -87           0
SQL> 03-12月-81           1
SQL> 03-12月-81           1
SQL> 23-1月 -82           0
SQL> -----------------------------
SQL>                     10
SQL> */
SQL> host clsSQL> --行转列
SQL> -- wm_concat(字符串)  组函数
SQL> select deptno,wm_concat(ename) nameslist2  from emp3  group by deptno;DEPTNO                                                                      
----------                                                                      
NAMESLIST                                                                       
--------------------------------------------------------------------------------10                                                                      
CLARK,KING,MILLER                                                               20                                                                      
SMITH,FORD,ADAMS,SCOTT,JONES                                                    30                                                                      
ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD                                            SQL> col NAMESLIST for a60
SQL> select deptno,wm_concat(ename) nameslist2  from emp3  group by deptno;DEPTNO NAMESLIST                                                            
---------- ------------------------------------------------------------         10 CLARK,KING,MILLER                                                    20 SMITH,FORD,ADAMS,SCOTT,JONES                                         30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD                                 SQL> spool off

 --oracle分页select *from 	(select rownum r,e1.*from (select * from emp order by sal) e1where rownum <=8)where r >=5;

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

  相关解决方案