Oracle子查询
SQL> --問(wèn)題:要查詢工資比SCOTT高的員工信息
SQL> --1. 查詢SCOTT的工資
SQL> select sal from emp where ename='SCOTT';
?????? SAL?????????????????????????????????????????????????????????????????????
----------?????????????????????????????????????????????????????????????????????
????? 3000?????????????????????????????????????????????????????????????????????
SQL> --2.? 查詢比3000 高的
SQL> select *
? 2? from emp
? 3? where sal >3000;
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE????????????? SAL?????? COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
??? DEPTNO?????????????????????????????????????????????????????????????????????
----------?????????????????????????????????????????????????????????????????????
????? 7839 KING?????? PRESIDENT??????????? 17-11月-81?????????? 5000???????????
??????? 10?????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????
SQL> set linesize 120
SQL> col sal for 9999
SQL> /
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7839 KING?????? PRESIDENT??????????? 17-11月-81????? 5000??????????????????? 10??????????????????????????????????
SQL> --子查詢解決上面的問(wèn)題
SQL> select *
? 2? from emp
? 3? where sal > ( select sal
? 4??????????????? from emp
? 5??????????????? where ename='SCOTT');
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7839 KING?????? PRESIDENT??????????? 17-11月-81????? 5000??????????????????? 10??????????????????????????????????
SQL> --書寫子查詢的注意事項(xiàng):
SQL> /*
SQL> 1. 將子查詢放入括號(hào)中
SQL> 2. 將子查詢往右放
SQL> 3. 一般子查詢不使用order by 但是在Top-n分析和分頁(yè)中需要
SQL> 4. group by后,不能使用子查詢
SQL> 5. select, from, where后面可以使用
SQL> 6. 主查詢和子查詢可以不是一張表,只要子查詢返回的結(jié)果主查詢可以使用 就OK
SQL> 7. 可以將子查詢視為一張新表.
SQL> */
SQL> --在from后面使用子查詢
SQL> --查詢部門名稱為SALES的員工信息
SQL> select e.empno,e.ename
? 2? from emp e,dept d
? 3? where e.deptno=d.deptno
? 4? and d.dname='SALES';
???? EMPNO ENAME???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- ----------??????????????????????????????????????????????????????????????????????????????????????????????????
????? 7499 ALLEN???????????????????????????????????????????????????????????????????????????????????????????????????????
????? 7521 WARD????????????????????????????????????????????????????????????????????????????????????????????????????????
????? 7654 MARTIN??????????????????????????????????????????????????????????????????????????????????????????????????????
????? 7698 BLAKE???????????????????????????????????????????????????????????????????????????????????????????????????????
????? 7844 TURNER??????????????????????????????????????????????????????????????????????????????????????????????????????
????? 7900 JAMES???????????????????????????????????????????????????????????????????????????????????????????????????????
已選擇6行。
SQL> select *
? 2? from emp
? 3? where deptno= (select deptno
? 4???????????????? from dept
? 5???????????????? 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> -- 查詢員工的名字和工資
SQL> select ename,sal
? 2? from emp;
ENAME??????? SAL???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- -----???????????????????????????????????????????????????????????????????????????????????????????????????????
SMITH??????? 800???????????????????????????????????????????????????????????????????????????????????????????????????????
ALLEN?????? 1600???????????????????????????????????????????????????????????????????????????????????????????????????????
WARD??????? 1250???????????????????????????????????????????????????????????????????????????????????????????????????????
JONES?????? 2975???????????????????????????????????????????????????????????????????????????????????????????????????????
MARTIN????? 1250???????????????????????????????????????????????????????????????????????????????????????????????????????
BLAKE?????? 2850???????????????????????????????????????????????????????????????????????????????????????????????????????
CLARK?????? 2450???????????????????????????????????????????????????????????????????????????????????????????????????????
SCOTT?????? 3000???????????????????????????????????????????????????????????????????????????????????????????????????????
KING??????? 5000???????????????????????????????????????????????????????????????????????????????????????????????????????
TURNER????? 1500???????????????????????????????????????????????????????????????????????????????????????????????????????
ADAMS?????? 1100???????????????????????????????????????????????????????????????????????????????????????????????????????
ENAME??????? SAL???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- -----???????????????????????????????????????????????????????????????????????????????????????????????????????
JAMES??????? 950???????????????????????????????????????????????????????????????????????????????????????????????????????
FORD??????? 3000???????????????????????????????????????????????????????????????????????????????????????????????????????
MILLER????? 1300???????????????????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
SQL> select *
? 2? from (select ename,sal)
? 3? ;
from (select ename,sal)
????????????????????? *
第 2 行出現(xiàn)錯(cuò)誤:
ORA-00923: 未找到要求的 FROM 關(guān)鍵字
SQL> ed
已寫入 file afiedt.buf
? 1? select *
? 2* from (select ename,sal from emp)
? 3? ;
ENAME??????? SAL???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- -----???????????????????????????????????????????????????????????????????????????????????????????????????????
SMITH??????? 800???????????????????????????????????????????????????????????????????????????????????????????????????????
ALLEN?????? 1600???????????????????????????????????????????????????????????????????????????????????????????????????????
WARD??????? 1250???????????????????????????????????????????????????????????????????????????????????????????????????????
JONES?????? 2975???????????????????????????????????????????????????????????????????????????????????????????????????????
MARTIN????? 1250???????????????????????????????????????????????????????????????????????????????????????????????????????
BLAKE?????? 2850???????????????????????????????????????????????????????????????????????????????????????????????????????
CLARK?????? 2450???????????????????????????????????????????????????????????????????????????????????????????????????????
SCOTT?????? 3000???????????????????????????????????????????????????????????????????????????????????????????????????????
KING??????? 5000???????????????????????????????????????????????????????????????????????????????????????????????????????
TURNER????? 1500???????????????????????????????????????????????????????????????????????????????????????????????????????
ADAMS?????? 1100???????????????????????????????????????????????????????????????????????????????????????????????????????
ENAME??????? SAL???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- -----???????????????????????????????????????????????????????????????????????????????????????????????????????
JAMES??????? 950???????????????????????????????????????????????????????????????????????????????????????????????????????
FORD??????? 3000???????????????????????????????????????????????????????????????????????????????????????????????????????
MILLER????? 1300???????????????????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
SQL> --select后面跟子查詢
SQL> select (select dname from deptno where deptno=10),ename
? 2? from emp;
select (select dname from deptno where deptno=10),ename
????????????????????????? *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00942: 表或視圖不存在
SQL> select (select dname from dept where deptno=10),ename
? 2? from emp;
(SELECTDNAMEFR ENAME???????????????????????????????????????????????????????????????????????????????????????????????????
-------------- ----------??????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? SMITH???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? ALLEN???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? WARD????????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? JONES???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? MARTIN??????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? BLAKE???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? CLARK???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? SCOTT???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? KING????????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? TURNER??????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? ADAMS???????????????????????????????????????????????????????????????????????????????????????????????????
(SELECTDNAMEFR ENAME???????????????????????????????????????????????????????????????????????????????????????????????????
-------------- ----------??????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? JAMES???????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? FORD????????????????????????????????????????????????????????????????????????????????????????????????????
ACCOUNTING???? MILLER??????????????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
SQL> --可以將子查詢視為新表
SQL> select e.ename,e.sal
? 2? from (select ename,sal from emp) e;
ENAME??????? SAL???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- -----???????????????????????????????????????????????????????????????????????????????????????????????????????
SMITH??????? 800???????????????????????????????????????????????????????????????????????????????????????????????????????
ALLEN?????? 1600???????????????????????????????????????????????????????????????????????????????????????????????????????
WARD??????? 1250???????????????????????????????????????????????????????????????????????????????????????????????????????
JONES?????? 2975???????????????????????????????????????????????????????????????????????????????????????????????????????
MARTIN????? 1250???????????????????????????????????????????????????????????????????????????????????????????????????????
BLAKE?????? 2850???????????????????????????????????????????????????????????????????????????????????????????????????????
CLARK?????? 2450???????????????????????????????????????????????????????????????????????????????????????????????????????
SCOTT?????? 3000???????????????????????????????????????????????????????????????????????????????????????????????????????
KING??????? 5000???????????????????????????????????????????????????????????????????????????????????????????????????????
TURNER????? 1500???????????????????????????????????????????????????????????????????????????????????????????????????????
ADAMS?????? 1100???????????????????????????????????????????????????????????????????????????????????????????????????????
ENAME??????? SAL???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- -----???????????????????????????????????????????????????????????????????????????????????????????????????????
JAMES??????? 950???????????????????????????????????????????????????????????????????????????????????????????????????????
FORD??????? 3000???????????????????????????????????????????????????????????????????????????????????????????????????????
MILLER????? 1300???????????????????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
SQL> --8.可以有多個(gè)子查詢
SQL> --多行子查詢
SQL> --查詢部門名稱為SALES和ACCOUNTING的員工信息
SQL> select *
? 2? from emp
? 3? where deptno=(select deptno
? 4??????????????? from dept
? 5??????????????? where dname='SALES' or dname='ACCOUTING');
???? 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> ed
已寫入 file afiedt.buf
? 1? select *
? 2? from emp
? 3? where deptno in (select deptno
? 4??????????????? from dept
? 5*?????????????? where dname='SALES' or dname='ACCOUTING')
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??????????????????????????????????
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81????? 1500????????? 0???????? 30??????????????????????????????????
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81?????? 950??????????????????? 30??????????????????????????????????
已選擇6行。
SQL> --查詢工資最低的員工信息
SQL> select *
? 2? from emp
? 3? where sal = (select min(sal)
? 4?????????????? from emp);
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????? 800??????????????????? 20??????????????????????????????????
SQL> select *
? 2? from emp
? 3? where sal = ( select min(sal)
? 4??????????????? from emp
? 5??????????????? group by deptno);
where sal = ( select min(sal)
????????????? *
第 3 行出現(xiàn)錯(cuò)誤:
ORA-01427: 單行子查詢返回多個(gè)行
SQL> -- 關(guān)于null
SQL> host cls
SQL> --查詢不是經(jīng)理的員工的信息
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 13-7月 -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 13-7月 -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 emp
? 3? where empno not in? (select mgr? from emp)
? 4? ;
未選定行
SQL> ed
已寫入 file afiedt.buf
? 1? select *
? 2? from emp
? 3* where empno not in? (select mgr? from emp where mgr is not null)
? 4? ;
???? 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??????????????????????????????????
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81????? 1250?????? 1400???????? 30??????????????????????????????????
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81????? 1500????????? 0???????? 30??????????????????????????????????
????? 7876 ADAMS????? CLERK?????????? 7788 13-7月 -87????? 1100??????????????????? 20??????????????????????????????????
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81?????? 950??????????????????? 30??????????????????????????????????
????? 7934 MILLER???? CLERK?????????? 7782 23-1月 -82????? 1300??????????????????? 10??????????????????????????????????
已選擇8行。
SQL> --如果子查詢中,包含null,類似表達(dá)式,會(huì)導(dǎo)致整個(gè)集合為null
SQL> host cls
SQL> -any的使用
SP2-0042: 未知命令 "-any的使用" - 其余行忽略。
SQL> --any的使用
SQL> --問(wèn)題: 查詢工資比10號(hào)部門員工中任意一個(gè)低的員工信息
SQL> select *
? 2? from emp
? 3? where sal < any (select sal from emp where deptno=10);
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????? 800??????????????????? 20??????????????????????????????????
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81?????? 950??????????????????? 30??????????????????????????????????
????? 7876 ADAMS????? CLERK?????????? 7788 13-7月 -87????? 1100??????????????????? 20??????????????????????????????????
????? 7521 WARD?????? SALESMAN??????? 7698 22-2月 -81????? 1250??????? 500???????? 30??????????????????????????????????
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81????? 1250?????? 1400???????? 30??????????????????????????????????
????? 7934 MILLER???? CLERK?????????? 7782 23-1月 -82????? 1300??????????????????? 10??????????????????????????????????
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81????? 1500????????? 0???????? 30??????????????????????????????????
????? 7499 ALLEN????? SALESMAN??????? 7698 20-2月 -81????? 1600??????? 300???????? 30??????????????????????????????????
????? 7782 CLARK????? MANAGER???????? 7839 09-6月 -81????? 2450??????????????????? 10??????????????????????????????????
????? 7698 BLAKE????? MANAGER???????? 7839 01-5月 -81????? 2850??????????????????? 30??????????????????????????????????
????? 7566 JONES????? MANAGER???????? 7839 02-4月 -81????? 2975??????????????????? 20??????????????????????????????????
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7788 SCOTT????? ANALYST???????? 7566 13-7月 -87????? 3000??????????????????? 20??????????????????????????????????
????? 7902 FORD?????? ANALYST???????? 7566 03-12月-81????? 3000??????????????????? 20??????????????????????????????????
已選擇13行。
SQL> --等同于
SQL> select *
? 2? from emp
? 3? where sal < (select max(sal) from emp where deptno=10);
???? 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 13-7月 -87????? 3000??????????????????? 20??????????????????????????????????
????? 7844 TURNER???? SALESMAN??????? 7698 08-9月 -81????? 1500????????? 0???????? 30??????????????????????????????????
????? 7876 ADAMS????? CLERK?????????? 7788 13-7月 -87????? 1100??????????????????? 20??????????????????????????????????
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81?????? 950??????????????????? 30??????????????????????????????????
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7902 FORD?????? ANALYST???????? 7566 03-12月-81????? 3000??????????????????? 20??????????????????????????????????
????? 7934 MILLER???? CLERK?????????? 7782 23-1月 -82????? 1300??????????????????? 10??????????????????????????????????
已選擇13行。
SQL> --all的使用
SQL> --查詢工資比10號(hào)部門都要低的員工信息
SQL> select *
? 2? from emp
? 3? where sal < all (select sal from emp where deptno=10);
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????? 800??????????????????? 20??????????????????????????????????
????? 7521 WARD?????? SALESMAN??????? 7698 22-2月 -81????? 1250??????? 500???????? 30??????????????????????????????????
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81????? 1250?????? 1400???????? 30??????????????????????????????????
????? 7876 ADAMS????? CLERK?????????? 7788 13-7月 -87????? 1100??????????????????? 20??????????????????????????????????
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81?????? 950??????????????????? 30??????????????????????????????????
SQL> --等同于
SQL> ed
已寫入 file afiedt.buf
? 1? select *
? 2? from emp
? 3* where sal <? (select min(sal) from emp where deptno=10)
SQL> /
???? EMPNO ENAME????? JOB????????????? MGR HIREDATE???????? SAL?????? COMM???? DEPTNO??????????????????????????????????
---------- ---------- --------- ---------- -------------- ----- ---------- ----------??????????????????????????????????
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????? 800??????????????????? 20??????????????????????????????????
????? 7521 WARD?????? SALESMAN??????? 7698 22-2月 -81????? 1250??????? 500???????? 30??????????????????????????????????
????? 7654 MARTIN???? SALESMAN??????? 7698 28-9月 -81????? 1250?????? 1400???????? 30??????????????????????????????????
????? 7876 ADAMS????? CLERK?????????? 7788 13-7月 -87????? 1100??????????????????? 20??????????????????????????????????
????? 7900 JAMES????? CLERK?????????? 7698 03-12月-81?????? 950??????????????????? 30??????????????????????????????????
SQL> spool off
SQL> --課堂練習(xí)
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 13-7月 -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 13-7月 -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> -- rownum:行號(hào)
SQL> select rownum,empno,ename from emp;
??? ROWNUM????? EMPNO ENAME????????????????????????????????????????????????????????????????????????????????????????????
---------- ---------- ----------???????????????????????????????????????????????????????????????????????????????????????
???????? 1?????? 7369 SMITH????????????????????????????????????????????????????????????????????????????????????????????
???????? 2?????? 7499 ALLEN????????????????????????????????????????????????????????????????????????????????????????????
???????? 3?????? 7521 WARD?????????????????????????????????????????????????????????????????????????????????????????????
???????? 4?????? 7566 JONES????????????????????????????????????????????????????????????????????????????????????????????
???????? 5?????? 7654 MARTIN???????????????????????????????????????????????????????????????????????????????????????????
???????? 6?????? 7698 BLAKE????????????????????????????????????????????????????????????????????????????????????????????
???????? 7?????? 7782 CLARK????????????????????????????????????????????????????????????????????????????????????????????
???????? 8?????? 7788 SCOTT????????????????????????????????????????????????????????????????????????????????????????????
???????? 9?????? 7839 KING?????????????????????????????????????????????????????????????????????????????????????????????
??????? 10?????? 7844 TURNER???????????????????????????????????????????????????????????????????????????????????????????
??????? 11?????? 7876 ADAMS????????????????????????????????????????????????????????????????????????????????????????????
??? ROWNUM????? EMPNO ENAME????????????????????????????????????????????????????????????????????????????????????????????
---------- ---------- ----------???????????????????????????????????????????????????????????????????????????????????????
??????? 12?????? 7900 JAMES????????????????????????????????????????????????????????????????????????????????????????????
??????? 13?????? 7902 FORD?????????????????????????????????????????????????????????????????????????????????????????????
??????? 14?????? 7934 MILLER???????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
SQL> --關(guān)于rownum的注意事項(xiàng):
SQL> --1. rownum一旦生成就不變
SQL> --2. rownum只能使用<=,不能使用>=
SQL> select rownum,ename
? 2? from emp
? 3? order by sal;
??? ROWNUM ENAME???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- ----------??????????????????????????????????????????????????????????????????????????????????????????????????
???????? 1 SMITH???????????????????????????????????????????????????????????????????????????????????????????????????????
??????? 12 JAMES???????????????????????????????????????????????????????????????????????????????????????????????????????
??????? 11 ADAMS???????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 3 WARD????????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 5 MARTIN??????????????????????????????????????????????????????????????????????????????????????????????????????
??????? 14 MILLER??????????????????????????????????????????????????????????????????????????????????????????????????????
??????? 10 TURNER??????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 2 ALLEN???????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 7 CLARK???????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 6 BLAKE???????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 4 JONES???????????????????????????????????????????????????????????????????????????????????????????????????????
??? ROWNUM ENAME???????????????????????????????????????????????????????????????????????????????????????????????????????
---------- ----------??????????????????????????????????????????????????????????????????????????????????????????????????
???????? 8 SCOTT???????????????????????????????????????????????????????????????????????????????????????????????????????
??????? 13 FORD????????????????????????????????????????????????????????????????????????????????????????????????????????
???????? 9 KING????????????????????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
SQL> select *
? 2? from emp
? 3? where rownum<=3
? 4? orber by sal desc;
orber by sal desc
*
第 4 行出現(xiàn)錯(cuò)誤:
ORA-00933: SQL 命令未正確結(jié)束
SQL> ed
已寫入 file afiedt.buf
? 1? select *
? 2? from emp
? 3? where rownum<=3
? 4* order by sal desc
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??????????????????????????????????
????? 7369 SMITH????? CLERK?????????? 7902 17-12月-80?????? 800??????????????????? 20??????????????????????????????????
SQL> host cls
SQL> select rownum,ename,sal
? 2? from emp
? 3? where rownum<3;
??? ROWNUM ENAME??????? SAL????????????????????????????????????????????????????????????????????????????????????????????
---------- ---------- -----????????????????????????????????????????????????????????????????????????????????????????????
???????? 1 SMITH??????? 800????????????????????????????????????????????????????????????????????????????????????????????
???????? 2 ALLEN?????? 1600????????????????????????????????????????????????????????????????????????????????????????????
SQL> ed
已寫入 file afiedt.buf
? 1? select rownum,ename,sal
? 2? from emp
? 3* where rownum>3
SQL> /
未選定行
SQL> --關(guān)于rownum的生成機(jī)制:必須從依次取出,然后付到記錄上
SQL> --第二題:將子查詢結(jié)果集視為新表
SQL> --第三題:
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> --假設(shè):我們已知道入職的年份有: 80 81 82 87
SQL> -- 第一題
SQL> select rownum,ename,sal
? 2? from? (select * from emp order by sal desc)
? 3? where rownum<=3;
??? ROWNUM ENAME??????? SAL????????????????????????????????????????????????????????????????????????????????????????????
---------- ---------- -----????????????????????????????????????????????????????????????????????????????????????????????
???????? 1 KING??????? 5000????????????????????????????????????????????????????????????????????????????????????????????
???????? 2 SCOTT?????? 3000????????????????????????????????????????????????????????????????????????????????????????????
???????? 3 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> select e.empno,e.ename,e.sal,d.avgsal
? 2? from emp e,(select deptno, avg(sal) avgsal from emp group by deptno) d
? 3? where e.deptno=d.deptno
? 4? and e.sal>d.avgsal;
???? 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> --第三題
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> select to_char(hiredate,'yyyy') from emp;
TO_C???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
----???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1980???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1987???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1987???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
TO_C???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
----???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1981???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
1982???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
已選擇14行。
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;
?????? sum(decode(to_char(hiredate,'yyyy'),'1981',1,0)) "1981"
?????? *
第 3 行出現(xiàn)錯(cuò)誤:
ORA-00923: 未找到要求的 FROM 關(guān)鍵字
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?????????????????????????????????????????????????????????????????
SQL> spool off
總結(jié)
- 上一篇: Oracle集合运算
- 下一篇: Oracle数据处理