Oracle⼦查询(复杂select语句)
在执⾏数据操作时,如果某个操作需要依赖于另外⼀个 select语句的查询结果,那么就可以把 select 语句迁⼊到该操作语句中,这样就形成了⼀个⼦查询。实际应⽤中,表与表之间相互关联,相互依存,这样就可以根据数据之间的关系使⽤相应的⼦查询,从⽽实现复杂的查询。
⼀、⼦查询
⼦查询是在 SQL 语句内的另外⼀条 select 语句,也被称为内查询或是内select语句。在select、insert、update 或delete 命令中允许是⼀个表达式的地⽅都可以包含⼦查询,⼦查询也可以包含在另外⼀个⼦查询⾥⾯中。
EG:
SQL > select empno,ename,job from emp
where deptno = (select deptno from dept where dname="research");
表⽰在emp表中查询部门名称为(dname)为“research” 的员⼯信息。
分析:原来在 emp 表中不存在 dname 字段,但 emp 表中存在 depno字段(部门代码);dname 字段原本存在 dept
表中,并且 deptno 字段也存在 dept表中,所有 deptno 为两个表之间的关联字段,这样就可以通过多表关联查询来实现。等同于下⾯的多表查询:
SQL > select empno,ename,job from emp join dept on emp.deptno = dept.deptno
where dept.dname = 'research';
从上可以看出,相⽐于多表关联查询,⼦查询更加灵活、功能更强⼤,⽽且更容易理解。但是多表关联查询的效率要⾼于⼦查询。
在执⾏⼦查询操作的语句中,⼦查询也称为内查询,包含⼦查询的查询语句也被称为外查询或主查询。
在执⾏查询时,外查询语句检索⼀⾏,⼦查询语句需要检索⼀遍数据,然后判断外查询语句的条件是否满⾜。如果满⾜,则外查询语句将检索到数据⾏添加到结果集中,如果条件不满⾜,则外查询语句继续检索下⼀⾏数据,所有⼦查询相对多表关联查询要慢。
注意:
⼦查询语句必须⽤括号 "()" 括起来。
⼦查询中不能包括 order by ⼦句。
⼦查询运⾏嵌套多层,但不能超过255层。
⼆、单⾏⼦查询
单⾏⼦查询是指返回⼀⾏数据的⼦查询语句。当在 where ⼦句中引⽤单⾏⼦查询时,可以使⽤当⾏⽐较运算符(=、>、<、>=、<=和<>)。
EG:
SQL > select empno,ename,sal from emp
where sal > (select min(sal) from emp) and sal < (select max(sal) from emp);
注意:
内层⼦查询的执⾏结果如果为空值,那么外层的 where ⼦句就始终不会满⾜条件,这样的查询结果就必然为空值执⾏单⾏⼦查询时,要注意⼦查询的返回结果必须是⼀⾏数据,否则 Oracle 系统会提⽰
⽆法执⾏。
⼦查询中不能包含 order by ⼦句,如果⾮要进⾏排序的话,那么只能在外查询语句中使⽤ order by ⼦句。
三、多⾏⼦查询
多⾏⼦查询是指返回多⾏数据的⼦查询语句。当在 where ⼦句中使⽤多⾏⼦查询时,必须使⽤多⾏运算符(in、any、all)。
1、使⽤ in 运算符
当在多⾏⼦查询中使⽤ in 运算符时,外查询会尝试与⼦查询结果中的任何⼀个结果进⾏匹配,只要有⼀个匹配成功,则
外查询返回当前检索的记录。
EG:
SQL > select empno,ename,job
from emp where deptno in
(select deptno from dept where dname<>'sales');
2、使⽤ any 运算符
any 运算符必须与单⾏⽐较运算符结合使⽤,并且返回⾏只要匹配⼦查询的任何⼀个结果即可。
EG:
SQL > select deptno,ename,sal from emp where sal > any
(select sal from emp where deptno = 10) and deptno <> 10;
表⽰从emp表中,查询⼯资⼤于部门编号为10的任意⼀个员⼯⼯资即可的其他部门的员⼯信息。
3、使⽤ all 运算符
all 运算符必须与单⾏运算符结合使⽤,并且返回⾏必须匹配所有⼦查询结果。
EG:
SQL > select deptno,ename,sal from emp where sal > all
(select sal from emp where deptno = 30);
表⽰从emp表中,查询⼯资⼤于部门编号为 30 的所有员⼯⼯资的员⼯信息。
四、关联⼦查询
在单⾏⼦查询和多⾏⼦查询中,内查询和外查询是分开执⾏的,也就是说内查询的执⾏与外查询的执⾏时没有关系的,外查询仅仅是使⽤内查询的最终结果。在⼀些特殊需求的⼦查询中,内查询的执⾏需要借助于外查询,⽽外查询的执⾏⼜离不开内查询的执⾏,这时,内查询和外查询是相互关联的,这种⼦查询就被称为关联⼦查询。
EG:
SQL > select empno,ename,sal from emp f
where sal > (select avg(sal) from emp where job = f.job)
order by job;
表⽰在emp表中,使⽤“关联⼦查询”检索⼯资⼤于同职位的平均⼯资的员⼯信息。
注意:
在执⾏关联⼦查询的过程中,必须遍历数据表中的每条记录,因此如果被遍历的数据表中有⼤量的数据记录,则关联⼦查询的执⾏速度会⽐较慢。
select语句查询日期关联字查询不仅仅可以作为 select 语句的⼦查询,也可以作为 insert 、 update或 delete 语句的关联⼦查询。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论