Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24360
  • 博文数量: 11
  • 博客积分: 240
  • 博客等级: 二等列兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 14:18
文章分类
文章存档

2011年(11)

我的朋友

分类: Oracle

2011-04-06 16:30:12

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)
2)=any,与in运算符等价。
3)>any,表示大于最小值。
3.all表示与子查询所有值进行比较这时,需要把单行比较运算符与该运算符组合起来使用。与单行比较运算符组合之后的all运算符的结果是如下:
1)
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);
 
阅读(677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~