SQL> -- 查詢工資比scott用戶高的所有的用戶信息
SQL> select sal f
2 ;
*
第 2 行出現錯誤:
ORA-00923: 未找到要求的 FROM 關鍵字
SQL> select sal
2 from emp
3 where ename='SCOTT';
SAL
----------
3000
SQL> select * from
2 emp
3 where sal > 3000;
EMPNO ENAME JOB MGR HIREDATE
---------- -------------------- ------------------ ---------- --------------
SAL COMM DEPTNO
---------- ---------- ----------
7839 KING PRESIDENT 17-11月-81
5000 10
SQL> set linesize 200;
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
SQL> select * from
2 emp where sal > (
3 select sal from emp where ename = 'SCOTT'
4 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
SQL> /*
SQL> 子查詢解決什么問題: 一個查詢查詢不到結果的時候,可以使用子查詢來豐富查詢的條件
SQL> 子查詢的格式: 用一個小括號包含,然后在里面寫sql語句
SQL> 子查詢的注意事項:
SQL> 1. 一定要有小括號
SQL> 2. 一定要注意你的書寫格式
SQL> 3. 子查詢可以放在select,from ,where having,order by 后面
SQL> 4. 子查詢一定不能放在group by的后面
SQL> 5. 子查詢和主查詢可以不是同一張表,只要子查詢的結果在主查詢中能用就可以
SQL> 5. 子查詢中一般都不排序,但是在TOP-N中需要排序
SQL> 7. 一般是先執行子查詢操作,在執行主查詢操作,但是在相關子查詢中先執行主查詢,在執行子查詢
SQL> 8. 對于子查詢的結果,如果是單行只能用單行操作符,如果是多行,只能用多行操作符
SQL> 9. 自查中的null處理
SQL> *、
SQL> */
SQL> -- 子查詢放在select后面
SQL> select ename,job,(select sal from emp where empno=7566) 子查詢 from emp;
ENAME JOB 子查詢
-------------------- ------------------ ----------
SMITH CLERK 2975
ALLEN SALESMAN 2975
WARD SALESMAN 2975
JONES MANAGER 2975
MARTIN SALESMAN 2975
BLAKE MANAGER 2975
CLARK MANAGER 2975
SCOTT ANALYST 2975
KING PRESIDENT 2975
TURNER SALESMAN 2975
ADAMS CLERK 2975
ENAME JOB 子查詢
-------------------- ------------------ ----------
JAMES CLERK 2975
FORD ANALYST 2975
MILLER CLERK 2975
已選擇14行。
SQL> select ename,job,(select sal from emp) 子查詢 from emp;
select ename,job,(select sal from emp) 子查詢 from emp
*
第 1 行出現錯誤:
ORA-01427: 單行子查詢返回多個行
SQL> -- 放在select后面的時候結果只能是單行的
SQL> desc emp;
名稱 是否為空? 類型
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> desc dept;
名稱 是否為空? 類型
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> -- from后面放置子查詢 重點要掌握的
SQL> -- 查詢員工的姓名 工資 job
SQL> select ename,sal,job from emp;
ENAME SAL JOB
-------------------- ---------- ------------------
SMITH 800 CLERK
ALLEN 1600 SALESMAN
WARD 1250 SALESMAN
JONES 2975 MANAGER
MARTIN 1250 SALESMAN
BLAKE 2850 MANAGER
CLARK 2450 MANAGER
SCOTT 3000 ANALYST
KING 5000 PRESIDENT
TURNER 1500 SALESMAN
ADAMS 1100 CLERK
ENAME SAL JOB
-------------------- ---------- ------------------
JAMES 950 CLERK
FORD 3000 ANALYST
MILLER 1300 CLERK
已選擇14行。
SQL> select * from (
2 select ename,job,sal from emp
3 );
ENAME JOB SAL
-------------------- ------------------ ----------
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
TURNER SALESMAN 1500
ADAMS CLERK 1100
ENAME JOB SAL
-------------------- ------------------ ----------
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300
已選擇14行。
SQL> -- where 后面跟子查詢
SQL> select * from
2 emp where sal > (
3 select sal from emp where ename = (
4 select ename from emp where empno = 7566;
select sal from emp where ename = (
*
第 3 行出現錯誤:
ORA-00921: 意外的 SQL 命令結尾
SQL> )
SP2-0042: 未知命令 ")" - 其余行忽略。
SQL> ); select * from
SP2-0734: 未知的命令開頭 "); select ..." - 忽略了剩余的行。
SQL> emp where sal > (
SP2-0734: 未知的命令開頭 "emp where ..." - 忽略了剩余的行。
SQL> select sal from emp where ename = (
2 select ename from emp where empno = 7566
3 )
4 );
)
*
第 4 行出現錯誤:
ORA-00933: SQL 命令未正確結束
SQL> select * from
2 emp where sal > (
3 select sal from emp where ename = (
4 select ename from emp where empno = 7566
5 )
6 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
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> -- 一定要注意的地方: 子查詢不能過多的去嵌套,一般嵌套三層,加多了就影響性能
SQL> -- order by 后面跟子查詢
SQL> -- 一般在order
SQL> -- 一般在Order by 后面不跟子查詢
SQL> select * from emp order by (select count(*) from emp where ename='SCOTT');
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
7934 MILLER CLERK 7782 23-1月 -82 1300 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
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
已選擇14行。
SQL> select * from emp order by (select empno from emp where ename='SCOTT');
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
7934 MILLER CLERK 7782 23-1月 -82 1300 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
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
已選擇14行。
SQL> select * from emp order by (select empno from emp where ename='SCOTT') desc;
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
7934 MILLER CLERK 7782 23-1月 -82 1300 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
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
已選擇14行。
SQL> select * from emp order by (select count(*) from emp where ename='SCOTT') desc;
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
7934 MILLER CLERK 7782 23-1月 -82 1300 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
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
已選擇14行。
SQL> -- order by 后面不能跟子查詢,語法上是可以跟的,但是跟了不起作用
SQL> -- group by 后面不能跟子查詢
SQL> -- 5. 子查詢和主查詢可以不是同一張表,只要子查詢的結果在主查詢中能用就可以
SQL> -- 查詢部門名稱為SAL的所有的員工信息
SQL> desc dept;
名稱 是否為空? 類型
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> desc emp;
名稱 是否為空? 類型
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> select *
2 from emp
3 where deptno = (
4 select deptno from dept where dname='SAL'
5 );
未選定行
SQL> select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> 4
SP2-0226: 行號 無效
SQL> select *
2 from emp
3 where deptno=(
4 select deptno from dept where dname='SALES'
5 );
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 rownum,empno,sal from emp;
ROWNUM EMPNO SAL
---------- ---------- ----------
1 7369 800
2 7499 1600
3 7521 1250
4 7566 2975
5 7654 1250
6 7698 2850
7 7782 2450
8 7788 3000
9 7839 5000
10 7844 1500
11 7876 1100
ROWNUM EMPNO SAL
---------- ---------- ----------
12 7900 950
13 7902 3000
14 7934 1300
已選擇14行。
SQL> desc emp;
名稱 是否為空? 類型
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> select rownum,sal,empno from emp order by sal;
ROWNUM SAL EMPNO
---------- ---------- ----------
1 800 7369
12 950 7900
11 1100 7876
3 1250 7521
5 1250 7654
14 1300 7934
10 1500 7844
2 1600 7499
7 2450 7782
6 2850 7698
4 2975 7566
ROWNUM SAL EMPNO
---------- ---------- ----------
8 3000 7788
13 3000 7902
9 5000 7839
已選擇14行。
SQL> -- 行號: 一連串,不間斷的數列
SQL> --8. 對于子查詢的結果,如果是單行只能用單行操作符,如果是多行,只能用多行操作符
SQL> -- 單行操作符
SQL> -- 單行操作符: ><= <= !=
SQL> -- 查詢部門號不等于30的所有員工信息
SQL> select * from
2 emp where deptno != 30;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
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
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已選擇8行。
SQL> select *
2 from emp
3 where deptno != (
4 select deptno from emp where deptno = 30
5 );
select deptno from emp where deptno = 30
*
第 4 行出現錯誤:
ORA-01427: 單行子查詢返回多個行
SQL> select deptno from emp;
DEPTNO
----------
20
30
30
20
30
30
10
20
10
30
20
DEPTNO
----------
30
20
10
已選擇14行。
SQL> select empno,ename from emp where deptno=30;
EMPNO ENAME
---------- --------------------
7499 ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7844 TURNER
7900 JAMES
已選擇6行。
SQL> -- 查詢部門號不為30的員工信息
SQL> select * from (select * from emp where deptno != 30);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
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
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已選擇8行。
SQL> select * from (select * from emp where deptno >< 30);
select * from (select * from emp where deptno >< 30)
*
第 1 行出現錯誤:
ORA-00936: 缺失表達式
SQL> select * from (select * from emp where deptno <> 30);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
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
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已選擇8行。
SQL> -- <> 用來表示不等于
SQL> -- 多行操作符 int not in any all
SQL> -- 查詢和SCOTT用戶和CLARK用戶共同部門的所有員工
SQL> select * from emp where deptno in(
2 select deptno from emp where ename='SCOTT' or ename='CLARK'
3 );
)
*
第 3 行出現錯誤:
ORA-00911: 無效字符
SQL> select * from emp where deptno in(
2 select deptno from emp where ename='SCOTT' or ename='CLARK'
3 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7839 KING PRESIDENT 17-11月-81 5000 10
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7369 SMITH CLERK 7902 17-12月-80 800 20
已選擇8行。
SQL> select * from emp where deptno not in(
2 select deptno from emp where ename='SCOTT' or ename='CLARK'
3 );
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> -- 查詢比30號部門員工工資高的員工信息
SQL>
SQL> select * from emp where sal > any(
2 select sal from emp where deptno = 30
3 );
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>
SQL> select * from emp where sal > (
2 select min(sal) from emp where deptno = 30
3 );
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> -- 查找比30號部門所有員工工資都高的員工信息
SQL> select * from emp where sal > (
2 select max(sal) from emp where deptno = 30
3 );
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> select * from emp where sal > all(
2 select sal from emp where deptno = 30
3 );
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> -- 9. 子查中的null處理
SQL> -- 查詢所有部門領導的信息
SQL> desc emp;
名稱 是否為空? 類型
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> select * from
2 emp
3 where empno in(
4 select mgr from emp
5 );
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> -- 查詢所有不是領導的員工
SQL> select *
2 from emp
3 where empno not in(
4 select mgr from emp
5 );
未選定行
SQL> select mgr from emp where mgr is not null;
MGR
----------
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
MGR
----------
7566
7782
已選擇13行。
SQL> select mgr,ename from emp where mgr is not null;
MGR ENAME
---------- --------------------
7902 SMITH
7698 ALLEN
7698 WARD
7839 JONES
7698 MARTIN
7839 BLAKE
7839 CLARK
7566 SCOTT
7698 TURNER
7788 ADAMS
7698 JAMES
MGR ENAME
---------- --------------------
7566 FORD
7782 MILLER
已選擇13行。
SQL> select *
2 from emp
3 where empno not in(
4 select mgr,ename from emp where mgr is not null
5 );
select mgr,ename from emp where mgr is not null
*
第 4 行出現錯誤:
ORA-00913: 值過多
SQL> select *
2 from emp
3 where empno not in(
4 select mgr from emp where mgr is not null
5 );
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;
文章列表