苏州新区做网站公司,营销推广案例,wordpress 更改插件样式,基于网站优化的搜索引擎推广方法一、什么是子查询 子查询是在SQL语句内的另外一条select语句#xff0c;也被称为内查询活着内select语句。在select、insert、update、delete命令中允许是一个表达式的地方都可以包含子查询#xff0c;子查询也可以包含在另一个子查询中。
【例1.1】在Scott模式下#xff0… 一、什么是子查询 子查询是在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语句的子查询也可以作为insertupdatedelete语句的关联子查询。