oracle 11g 007 sql 第6章 子查询(补充)
子查询就是查询中又嵌套的查询,嵌套的级数随各数据库厂商的设定而有所不同,一般最大嵌套数不超过15级, 实际应用中,一般不要超过2级,否则代码难以理解.一般来说,所有嵌套子查询都可改写为非嵌套的查询,但是 这样将导致代码量增大.子查询就如递归函数一样,有时侯使用起来能达到事半功倍之效,只是其执行效率同 样较低,有时用自身连接可代替某些子查询,另外,某些相关子查询也可改写成非相关子查询. 子查询常用于复杂的SQL操作中,包括select,insert,delete,update等语句中都可嵌套子查询. 子查询分为两种:相关子查询和不相关子查询,顾名思义,相关子查询不能独自运行,必须依赖于外部父查询提供某些值才能运行.
子查询可以返回:结果集,逻辑值.仅当使用exists子句时,子查询才不返回结果集,而只返回true或false这样的逻辑值. 可用于子查询的关键字有:IN,ANY(任一),ALL等.具体的说,子查询可返回单值,元组(即两个或两个以上值),及多值结果集.(以上是转载子查询意思)
下面举一些例子来说明子查询的使用:
SQL> select * from strom_00702_d; A B ---------- - 1 A 3 B 5 C 8 D SQL> update strom_00702_d set A=A+2 where B in ('A'); 1 row updated SQL> select * from strom_00702_d; A B ---------- - 3 A 3 B 5 C 8 D SQL> commit; Commit complete 以上有两个值是一样的该如何使用Update更新一条记录呢??
解决思路:用相关子查询和自身连接即可,下面是实现的SQL语句
SQL> delete from strom_00702_d where B in( 2 select B from strom_00702_d where b=('A')); 1 row deleted
SQL> commit; Commit complete SQL> select * from strom_00702_d; A B ---------- - 3 B 5 C 8 D 多行子查询:子查询语句返回多行单列的结果,即返回一系列值。
1.多行子查询可以使用多行运算符:in(等于列表中的任何一个值),any(与子查询返回的每一个值进行比较), all(与子查询返回的所有值进行比较)。
2.any运算符表示与子查询中的每一个值进行比较。这时,需要把单行比较运算符与该运算符组合起来使用, 并且返回行只需匹配子查询的任一个结果即可。与单行比较运算符组合之后的any运算符的结果是如下:
1)<any,表示小于最大值。
2)=any,与in运算符等价。
3)>any,表示大于最小值。
3.all表示与子查询所有值进行比较这时,需要把单行比较运算符与该运算符组合起来使用。与单行比较运算符组合之后的all运算符的结果是如下:
1)<all,表示小于最小值。
2)>all,表示大于最大值。
注意:all和any操作符不能单独使用,而只能与单行比较符(=,< ,>,<=,>=,<>,)结合使用。
举例:
一:在多行子查询中使用in操作符举例
例1:求哪些人是经理
select last_name ,title from s_emp where id in (select manager_id from s_emp)
例2:*求哪些人是普通员工
select first_name from s_emp where id not in (select manager_id from s_emp
where manager_id is not null)
例3:查询和42部门员工职位相同的所有员工的姓名
SELECT TITLE,LAST_NAME||' '||FIRST_NAME FROM S_EMP WHERE TITLE IN(SELECT TITLE FROM S_EMP WHERE DEPT_ID=42)
例4:显示匹配于10岗位的雇员名,岗位,工资,部门名。
select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10);
二:在多行子查询中使用any操作符举例
例1:显示工资高于部门30的任意雇员工资的雇员名,工资和部门号。
select e name,sal,deptno from emp where sal >any (select sal from emp where deptno=30);
三:在多行子查询中使用all操作符举例
例1:显示高于部门30的所有雇员工资的雇员名,工资和部门号。
select e name,sal,deptno from emp where sal >all (select sal from emp where deptno=30);
|