SQL——子查询

子查询

一般而言在一个查询中,可以嵌套另一个查询,即在一个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.

 

 

 

 

  • 39
    点赞
  • 216
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值