关联子查询+嵌套子查询

关联子查询
定义
1引用外部的一列或多列
2将外部查询的每一行都传递给子查询,子查询依次读取传递过来的每一行的值,并将其使用到子查询上,直到外部查询的所有行都处理完为止,然后返回子查询的结果

获取员工工资低于所在部门的平均工资的员工信息
select empno,ename,sal,deptno from emp out
where sal <(
select avg(sal) from emp inner
where inner.deptno=out.deptno
)
这里写图片描述

上面等价于

select  out.empno,out.ename,out.sal,out.deptno from emp out, 
(
select avg(sal) avgSal ,deptno from emp 
group by deptno
) inner
where inner.deptno=out.deptno
and out.sal<inner.avgSal

这里写图片描述

解释
1外部查询(select empno,ename,sal,deptno from emp)的的每一行记录传递给子查询
(select avg(sal) from emp inner
where inner.deptno=out.deptno)
2.子查询读取读取外部传过来的值,最后返回部门平均工资的列(隐藏分组deptno)

简单的理解就是:

select out.empno,out.ename,out.sal,out.deptno from emp out,
(
select avg(sal) avgSal ,deptno from emp
group by deptno
) inner
where inner.deptno=out.deptno
and out.sal< inner.avgSal
out表关联inner表,在获取小于平均工资的员工

exists在关联子查询的使用

获取80年的员工号信息
select empno,ename,sal,hiredate,substr(hiredate,8,2)
from emp out where exists(
select empno from emp inner
where out.empno=inner.empno
and substr(hiredate,8,2)=’80’);

select empno,ename,sal,hiredate,substr(hiredate,8,2)
from emp out where exists(
select 1 from emp inner
where out.empno=inner.empno
and substr(hiredate,8,2)=’80’);

这里写图片描述

嵌套子查询
子查询内部嵌套子查询,嵌套子查询层数最大255层

根据工作地点在'NEW YORK','CHICAGO'的2个部门,根据2个部门平均工资的最大值,获取工资大于这个最大值的员工信息
select empno,ename,ename,sal,deptno from emp
where sal>(
            select  max (avg(sal)) from emp where deptno in
                    (
                    select deptno from dept
                    where loc in ('NEW YORK','CHICAGO')
                    )
            group by deptno
          );

这里写图片描述

解释
1 (
select deptno from dept
where loc in (‘NEW YORK’,’CHICAGO’)
)
获取工作地点在’NEW YORK’,’CHICAGO’的2个部门

2select max (avg(sal)) from emp where deptno in
(部门集合 )
group by deptno
获取 部门的平均工资,在获取平均工资的最大值

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的嵌套子查询和相关子查询在执行过程中可能会导致不走索引的情况。下面分别介绍这两种子查询的执行过程。 1. 嵌套子查询的执行过程 嵌套子查询是指在一个查询语句中嵌套了另一个查询语句。例如: ``` SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2 WHERE column3 = 'value'); ``` 在执行这条语句时,MySQL会先执行内部的子查询,得到一个结果集,然后再将这个结果集作为外部查询的条件,去匹配表1中的数据。由于内部查询的结果集不是一个常量值,而是一个列表,因此MySQL无法使用索引来优化外部查询的执行。 如果内部查询返回的结果集很大,那么外部查询的性能就会受到影响。为了避免这种情况,可以使用关联查询来代替嵌套子查询: ``` SELECT * FROM table1 t1 JOIN table2 t2 ON t1.column1=t2.column2 WHERE t2.column3='value'; ``` 这样就可以避免嵌套子查询导致的性能问题。 2. 相关子查询的执行过程 相关子查询是指在一个查询语句中嵌套了一个与外部查询相关的子查询。例如: ``` SELECT * FROM table1 WHERE column1 > (SELECT AVG(column2) FROM table2 WHERE column3 = 'value'); ``` 在执行这条语句时,MySQL会先执行内部的子查询,得到一个常量值,然后再将这个常量值作为外部查询的条件,去匹配表1中的数据。由于内部查询返回的是一个常量值,而不是一个列表,因此MySQL可以使用索引来优化外部查询的执行。 然而,如果内部查询中使用了与外部查询相关的字段,那么MySQL就无法使用索引来优化内部查询的执行。例如: ``` SELECT * FROM table1 WHERE column1 > (SELECT AVG(column2) FROM table2 WHERE column3 = table1.column4); ``` 在这个查询中,内部查询中的WHERE条件使用了外部查询的字段,因此MySQL无法使用索引来优化内部查询的执行。为了避免这种情况,可以使用JOIN来代替相关子查询: ``` SELECT t1.* FROM table1 t1 JOIN table2 t2 ON t1.column4=t2.column3 WHERE t1.column1 > AVG(t2.column2); ``` 这样就可以避免相关子查询导致的性能问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值