oracle中子查詢

SQL> set linesize 200
SQL> --查詢工資比SCOTT高的員工信息
SQL> --1. SCOTT的工資
SQL> select sal from emp where ename='SCOTT';

       SAL                                                                                                                                                                                              
----------                                                                                                                                                                                              
      3000                                                                                                                                                                                              

SQL> --2. 查詢比3000高的員工
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 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> /*
SQL> 注意的問題:1
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
SQL> */
SQL> --3、可以在主查詢的where select having  from 後面使用子查詢
    


	--select語句後的單行子查詢,不能使用多行子查詢:
	--原因oracle是一個關係型數據庫,使用行和列保存數據,行與列的值一一對應
	--hadoop中的hbase能使用多行子查詢,怎麼識別在一列中插入的多條數據,(插入數據前用時間戳記錄 )
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後面的子查詢
     --from後接子查詢代表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.buf

  1  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 emp
  3  where deptno=(select deptno from dept 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 d
  3  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優化 3、儘量使用多表查詢
SQL> --SQL執行計劃
SQL> host cls

SQL> --in 在集合中
SQL> --查詢部門名稱是SALES和ACCOUNTING的員工
SQL> select *
  2  from emp
  3  where deptno in (select deptno from dept where dname='SALES' or 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> select e.*
  2  from emp e,dept d
  3  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> --any: 和集合中的任意一個值比較
SQL> --查詢工資比30號部門任意一個員工高的員工信息
SQL> select *
  2  from emp
  3  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.buf

  1  select *
  2  from emp
  3* where sal > (select	 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 emp
  3  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.buf

  1  select *
  2  from emp
  3* 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 cls










SQL> -多行子查詢中的null
SP2-0734: 未知的命令開頭 "-多行子查..." - 忽略了剩餘的行。
SQL> --多行子查詢中的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 emp
  3  where empno not in (select mgr from emp);

	
未選定行 --子查詢中有一個值返回的是空值,所有值與空值比較都返回是空

SQL> --查詢是老闆的員工信息
SQL> ed
已寫入 file afiedt.buf

  1  select *
  2  from emp
  3* 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 行。
    --解決多行子查詢中使用not in時存在空值的問題
SQL> select *
  2  from emp
  3  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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章