oracle基础-子查询

一、什么是子查询

        子查询是在SQL语句内的另外一条select语句,也被称为内查询活着内select语句。在select、insert、update、delete命令中允许是一个表达式的地方都可以包含子查询,子查询也可以包含在另一个子查询中。

【例1.1】在Scott模式下,在emp表中查询部门名称(dname)为“RESEARCH”的员工信息。

select * from emp where deptno=(select deptno from dept where dname = 'RESEARCH')

对上面的代码进行分析,原本在emp表中不存在dname字段,但emp表中存在deptno字段。通过deptno字段可以管理两个表。

也可以使用多表关联查询来实现。

从上面两个查询语句可以看出,相比多表查询,子查询更加灵活、功能更加强大,而且容易理解。但是子查询的效率要高于多表关联查询。在一般情况下,外查询语句检索一行,子查询语句就需要检索一遍数据,然后判断外查询语句的条件是否满足。如果条件满足,则外查询语句将检索到的数据行添加到结果集中,如果条件不满足,则外查询语句继续检索下一行数据,所以子查询相对多表关联查询要慢一些。

注意:

1、子查询必须使用()括起来。

2、子查询中不能包括order by 子句。

3、子查询允许嵌套多层,但不能超过255层。

在Oracle 11g中,把子查询细化为单行子查询、多行子查询、关联子查询。

二、单行子查询

        单行子查询是指返回一行数据的子查询语句。当在where子句中引用单行子查询时,可以使用单行比较运算符(=,<,>,>=,<=,<>)。

        【例2.1】在emp表中,查询出既不是最高工资,也不是最低工资的员工信息。

        

select * 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)。

        3.1 使用in运算符

        当在多行子查询中使用in运算符时,外查询会尝试与子查询结果中的任何一个结果进行匹配,只要有一个匹配成功,则外查询返回当前检索的记录。

        【例3.1.1】在emp表中,查询不是销售部门SALES的员工信息

        

select * from emp where deptno in (select deptno from dept where dname <> 'SALES')

        3.2 使用any运算符

        any运算符必须与单行操作符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

        【例3.2.1】在emp表中,查询工资大于10号部门的任意一个员工工资的其他部门的员工信息

        

select * from emp where sal > any(select sal from emp where deptno = 10) and deptno <> 10

 

 3.3 使用all运算符

        all运算符必须与单行运算符结合使用,并且返回行必须匹配所有子查询的结果

        【例3.3.1】在emp表中,查询工资大于部门编号是30的所有员工信息

        

select * from emp where sal > all (select sal from emp where deptno = 30)

 

四、关联子查询

        在单行子查询和多行子查询中,内查询和外查询是分开执行的,也就是说,内查询的执行与外查询的执行没有关系,外查询仅仅是使用内查询的最终结果。在一些特殊需求的子查询中,内查询的执行需要借助外查询,而外查询的执行又离不开内查询的执行,这时,内查询和外查询是相互关联的,这种子查询就是称为关联子查询。

【例4.1】在emp表中,使用关联子查询检索公司大于相同职位的平均公司的员工信息

select * from emp e where sal > (select avg(f.sal) from emp f where e.job = f.job) order by job

注意:在执行关联子查询的过程中,必须遍历数据表中的每条记录,因此如果被遍历的数据表中有大量数据记录,则关联子查询的执行速度会比较缓慢。

        需要补充一点的是,关联子查询不但可以作为select语句的子查询,也可以作为insert,update,delete语句的关联子查询。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Oracle查询练习考试是一种用于测试学生对Oracle数据库查询语言的掌握程度的考试。该考试通常包含一系列的问题和练习题,要求学生使用SQL语言来查询数据库中的数据。 在考试中,学生需要根据提供的数据库模式和题目的要求,编写查询语句来获取相应的数据结果。这些查询语句可能包括基本的SELECT语句,也可能涉及到联接查询、聚合函数、子查询等复杂操作。 考试的题目通常会设计一些真实场景的查询需求,学生需要通过理解问题背景和数据模式,分析题目要求,并运用自己对Oracle查询语言的知识,来编写相应的查询语句。 完成这样的考试对学生来说具有一定的挑战性和难度。学生需要熟悉Oracle数据库查询语言的基本语法和函数,同时还需要理解数据库的结构和关系模式,以及如何运用查询语言来处理和获取数据。 通过Oracle查询练习考试,学生能够加深对Oracle数据库查询语言的理解和实践,提高自己的数据库查询能力和技巧。同时,这样的考试也有助于学生发现自己在查询过程中存在的问题和不足,从而提升自己的学习和进步空间。 总之,通过Oracle查询练习考试,学生可以提高自己在Oracle数据库查询方面的能力和熟练度,为将来的工作和学习打下坚实的基础。同时,这样的考试也能够通过实践和挑战,完善和提升学生的知识,促进他们在数据库领域的专业发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geminigoth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值