oracle复杂查询语句的使用.doc
文本预览下载声明
复杂查询语句的使用
在关系数据库中,select 语句是使用最频繁的语句。它的处理复杂程度可依据业务的要求的不同而不同。它是程序员和管理员必需的语句。前面已经进行过介绍,但下面从较为复杂的程度来介绍它的使用情况。
§7.1 复杂查询语句的使用
使用SELECT语句和子查询(SUBQUERY)可以从一个或多个表、视图、实体视图中返回数据。
§7.1.1 相关子查询
可以将子查询(前面提到的 as subquery )或In 或 exists当成 where 的一个条件的一部分,这样的查询称作子查询。
where中可以包含一个select语句子查询;
where中可以包含IN, EXISTS 语句;
最多可嵌套16层;
层数过多会影响性能。
例:比如一个查询是否有专家既以研究所的名义申请基金项目又以大学系为单位申请项目(按规定只能以一个单位来申请):
SQLselect name,per_id,dept_name from univ_subjects
Where per_id in ( select per_id from colle_subjects );
§7.1.2 外连接
招生中,如果所有学生的信息放在 students 表中,而部分有特长的学生在另一个表student_skill 中同样有该学生信息。现在要全部列出所有学生,如果某个学生在表student_skill 中有其特长信息,就显示特长内容,如果某个学生没有特长(在表student_skill 中无其特长信息)就显示特长为空:
SQLselect a.st_id, name, age,skill from students a, student_skill b
Where a.st_id=b.st_id(+)
Order by a.name;
Students 结构为:
St_id varchar(20),
Name varchar2(10),
Age number(2),
Tot_score number(3),
... ...
Student_skill 结构为:
St_id varchar(20),
Skill varchar2(20),
... ...
Students 的记录,Student_skill的记录少。上面的“+”跟在记录少的表后面,它表示当没有与a.st_id 匹配时就为 b.st_id增加一空行。
St_id name tot_score skill
---------- ---------- ------------- ------------------
1111 aaaa 600 足球
2222 bbbb 590 篮球
3333 cccc 620
4444 dddd 610 跳高
... ...
§7.1.3 自我连接
自我连接是在同一个表或视图内进行条件连接。下面语句返回的是每个雇员的名字及该雇员的经理的名字:
SELECT e1.ename||’ works for ’||e2.ename
Employees and their Managers
FROM emp e1, emp e2 WHERE e1.mgr = e2.empno;
Employees and their Managers
-------------------------------
BLAKE works for KING
CLARK works for KING
JONES works for KING
FORD works for JONES
SMITH works for FORD
ALLEN works for BLAKE
WARD works for BLAKE
MARTIN works for BLAKE
SCOTT works for JONES
TURNER works for BLAKE
ADAMS works for SCOTT
JAMES works for BLAKE
MILLER works for CLARK
连接条件是 e1.mgr = e2.empno
§7.1.4 UNION,INTERSECT及MINUS
有时需要从多个表中组合具有一种相似类型的信息。Union 可以完成将两个以上的表的相类似的查询结果合并在一起,并且相同的只取其一;如果union all 则表示返回所有行(不管是否重复)。Interse
显示全部