Oracle入门之子查询
为什么有子查询对于一个问题,1步不能求解,需要多步
通过子查询求解,子查询的本质是select语句的嵌套 select * from emp where sal > (select sal from emp where ename='SCOTT' ) 基本语法注意事项
select ...可以放置子查询 (必须要放单行子查询)
from .... 可以放置子查询
where ... 可以放置子查询
group by .... 不
having .... 可以放置子查询 ppt例子
order by ... 不
子查询的分类
单行子查询
在子查询中使用组函数
SQL> select ename,empno,sal
2 from emp
3 where sal =
4 (select min(sal)
5 from emp)
6 ;
ENAME EMPNO SAL
---------- ---------- ----------
SMITH 7369 800
HAVING 子句使用子查询求各个部门编号 和部门的最低工资 (这个最低工资要比20号部门的最低工资要高) SQL> select deptno,min(sal)
2 from emp
3 group by deptno
4 having min(sal) >
5 (select min(sal)
6 from emp
7 where deptno = 20)
8 ;
DEPTNO MIN(SAL)
---------- ----------
30 950
10 1300
SQL>
select 放置子查询 (必须要放单行子查询)
1 select empno,ename,sal,(select ename from emp where deptno = 10) "十号部门员工" 2* from emp SQL> / select empno,(select ename from emp where deptno = 10) "十号部门员工" * ERROR at line 1: ORA-01427: single-row subquery returns more than one row
1 select empno,(select ename from emp where deptno=10 and ename='CLARK') "十号部" 2* from emp SQL> / EMPNO ENAME SAL 十号部 ---------- ---------- ---------- ---------- 1 tom_abc 8000 CLARK 7369 SMITH 800 CLARK 7499 ALLEN 1600 CLARK 7521 WARD 1250 CLARK 7566 JONES 2975 CLARK 7654 MARTIN 1250 CLARK 7698 BLAKE 2850 CLARK 7782 CLARK 2450 CLARK 7788 SCOTT 3000 CLARK 7839 KING 5000 CLARK 7844 TURNER 1500 CLARK 7876 ADAMS 1100 CLARK 7900 JAMES 950 CLARK 7902 FORD 3000 CLARK 7934 MILLER 1300 CLARK 15 rows selected.
from后面放置子查询–多行子查询
求员工编号和员工姓名,只能显示这2列,开头必须是 SQL> select *
2 from
3 (select empno,ename
4 from emp);
EMPNO ENAME
---------- ----------
1 tom_abc
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
15 rows selected.
where 放置子查询查询部门名称是SALES 的员工信息 。 部门表-》部门编号-》利用编号在员工表中获取对应部门的员工信息: SQL> select *
2 from emp
3 where deptno =
4 (select deptno
5 from dept
6 where dname = 'SALES')
7 ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
6 rows selected.
多行子查询
在多行子查询中使用 IN 操作符
select * from emp
2 where deptno in
3 (select deptno
4 from dept
5* where dname='SALES' or dname='ACCOUNTING')
6 /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1 tom_abc 8000 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
10 rows selected.
多表查询的方式: 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
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1 tom_abc 8000 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
10 rows selected.
在多行子查询中使用 ANY操作符
1 select * from emp
2 where sal >
3 any(select sal from emp
4* where deptno = 30)
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1 tom_abc 8000 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
13 rows selected.
在多行子查询中使用 ALL操作符
select * 2 from emp 3 where sal > 4* all(select sal from emp where deptno=30) SQL> / EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7566 JONES MANAGER 7839 02-APR-81 2975 20 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 1 tom_abc 8000 10
子查询中的空值问题
*思路 先按照: 查询是经理的员工信息–把所有的经理id给查找出来,形成一个集合供in操作。
SQL> ed
Wrote 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
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-APR-81 2975 20
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7902 FORD ANALYST 7566 03-DEC-81 3000 20
6 rows selected.
SQL> ed
Wrote file afiedt.buf
1 select *
2 from emp
3* where empno not in (select mgr from emp where mgr is not null)
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
1 tom_abc 8000 10
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7934 MILLER CLERK 7782 23-JAN-82 1300 10
9 rows selected.
非法使用子查询补充:
1 select ename,sysdate
2 from
3 (select empno,ename
4* from emp)
SQL> /
ENAME SYSDATE
---------- ---------
tom_abc 06-JAN-17
SMITH 06-JAN-17
ALLEN 06-JAN-17
WARD 06-JAN-17
JONES 06-JAN-17
MARTIN 06-JAN-17
BLAKE 06-JAN-17
CLARK 06-JAN-17
SCOTT 06-JAN-17
KING 06-JAN-17
TURNER 06-JAN-17
ADAMS 06-JAN-17
JAMES 06-JAN-17
FORD 06-JAN-17
MILLER 06-JAN-17
15 rows selected.
The reason is that all conditions that compare a null value result in a null.
Deptno In(10,20);
解释为: Deptno =10 || deptno=20 ||deptno=null
Deptno not In(10,20,null);
解释为:Deptno!=10 && Deptno!=20 && deptno!=null (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |