4.6 数据库子查询

本次课程来学习子查询的具体内容。子查询,就是在查询语句里边嵌套其他的查询语句。普通查询语句分为select子句、from子句where子句。这些子句里边都是可以定义子查询的,但是唯独推荐使用from子句的子查询。

接下来咱们看一个例子,要求你查询底薪超过公司平均底薪的员工信息。之前我们用表连接的方式做过这道题。这次咱们看看子查询应该怎么写。下面就是这道题的sql语句,各位同学请看。那么正常情况下,把聚合函数作为判断条件写在where里面是不行的,但是我把这个子查询这个定义出来以后,把这个员工表里边的平均底薪给计算出来。计算出来以后,是一个具体的数据了。所以在where里边做条件判断就没有问题了。where子句里边定义的一个子查询,是查询员工表的平均的底薪。在where子句里面去判断谁的底薪大于等于这个平均底薪,把这样的这个人的信息给打印出来就可以了。

 查询底薪超过公司平均底薪的员工信息

where子句的子查询是不推荐使用的,但是他在执行的过程中是没有语法错误的

select
empno,ename,sal
from t_emp
where sal>(select avg(sal) from t_emp)

一、子查询的分类

子查询除了写在where子句里边,他还可以写在from子句和select子句里边。where子查询和select子查询都会执行多次,所以在效率上并不占优势,只有from查询才最为推荐

二、WHERE 子查询(查询效率低)

在书写sql语句的时候,where子查询最符合我们的思考逻辑,但是子查询的效率确实是最低的。

就拿刚才执行过的查询来说,where子查询去拿每条员工的记录与子查询做比较的时候,子查询都要重新执行一次。如果员工表有1万条记录,那么子查询就要执行1万次,效率很低

三、FROM子查询

在查询语句里面from子句只会执行一次,它跟where子句是不同的,where子句在筛选数据的时候,每筛选一条数据,where子句里面的条件就要执行一次。所以我们把子查询写在where子句里边的话,它执行的次数就有很多次了,所以查询的效率非常的低。但是我们把子查询写在from子句里面,那么这个子查询只会执行一次。所以from子查询,不是相关子查询。

  查询底薪超过公司平均底薪的员工信息用 FROM 子句写

首先是按照部门编号去分组,然后统计一下每个部门的编号和这个部门对应平均的底薪。把这个查询的结果集作为一张临时表和员工表做连接。连接的条件是员工的部门编号,等于结果集的部门编号,并且员工的底薪要大于他所在部门的平均的底薪。然后select子句里面写上要显示的字段就行了

select
e.empno,e.ename,e.sal,t.avg

from t_emp e join
(select deptno,avg(sal) as avg from t_emp group by deptno) t
on e.deptno=t.deptno and e.sal>t.avg

四、SELECT子查询(查询效率低)

lect子查询的是相关子查询,它也会反复的执行

查询一下每一个员工的部门信息

select
e.empno,
e.ename,
(select dname from t_dept where deptno=e.deptno)
from t_emp e

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值