子查询
一般而言在一个查询中,可以嵌套另一个查询,即在一个SELECT查询内在嵌入另一个SELECT查询 ,外层的SELECT语句较外部查询,内层的SELECT语句叫子查询,子查询可以嵌套多层,但每层需要用“()”括起来,子查询可以用在SELECT语句中,还可以用在INSERT,UPDATE,DELETE语句中 .子查询是一个完整的的SELECT语句,是其他SOL语句的一部分,大部分子查询是在SELECT语句的WHERE字句中实现的,也可以放在FROM字句中当虚拟表。
示例数据表如图:
departments表:
employees表:
1.单行子查询
指子查询单列单行数据,即只返回一个值,也可以成为单值子查询。可以使用运算符=,>,<,<=,>=,<>,经常用在SELECT,UPDATE,DELETE语句的WHERE字句中充当条件。
eg:查询在销售部工作的员工信息。
eg2:查询工资低于平均工资的雇员信息。
2.多行子查询
指子查询返回单列多行查询,即一组数据。当子查询是单列多行子查询时,必须使用多行比较运算符,包括IN,NOT IN ,ANY,ALL,SOME.IN 和NOT IN 可以独立使用,但ANY,和ALL必须与单行运算符组合起来使用:
<ANY:表示小于任何一个,即小于最大值即可。
=ANY:表示等于任何一个,与IN相似。
>ANY:表示大于任何一个,即大于最小值即可。
<ALL:表示小于所有值,即小于最小值。
>ALL:表示大于所有值,即大于最大值。
3.多列子查询
多列子查询获得的是多列任意行数据,当多列子查询返回当行数据时相当于单行子查询使用单行运算符(>,<,=等),返回多行数据时,在WHERE子句必须使用多行比较符(IN,NOT IN,ALL,ANY等)
eg:利用emp表查询编号为7369的雇员的部门和工作岗位完全相同的所有雇员。(成对比较)
使用子查询比较多列时,既可以使用成对比较也可以使用非成对比较 。成对比较要求多个列的数据必须同时匹配,非成对比较则不要求多个列的数据同时匹配,此时是单独写得查询条件,各个条件之间是必须独立的。
eg:利用emp表查询编号为7369的雇员的部门和工作岗位完全相同的所有雇员。(非成对比较)
4.相关子查询
内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。
执行过程:
- 从外部查询中取出一个元组,将元组相关列的值传给内层查询。
- 执行内层查询,得到子查询操作的值
- 外查询根据子查询返回的结果或结果集得到满足的条件的行。
- 然后外层查询取下一个元组重复上述步骤,直到外层的元组全部处理完毕。
eg1:查询所有部门人数
语句1:连接查询
eg2:相关子查询
eg2:查询各部门的部门号,部门名和平均工资。
语句1:连接查询
语句2:相关查询
:
eg3:查询在北京工作的员工信息
语句1:连接查询
语句2:IN
eg4:带EXISTS的相关子查询
是通过EXISTS运算符实现的查询,EXISTS用于测试子查询的结果是否为空,如果子查询的结果不为空,则EXISTS发挥TRUE,否则返回false,与EXSITS相对应的有EXISTS.