Mysql中的子查询

子查询

子查询就是select语句中嵌套select语句,被嵌套的select语句称为子查询,可以理解为子查询是一张表

子查询都可以出现的位置

  • select …(select)…
  • from …(select)…
  • where…(select)…

在where语句中使用子查询,也就是在where语句中加入select语句

查询哪些人的薪水高于员工的平均薪水,需要显示员工编号,员工姓名,薪水

取得平均薪水: select avg(sal) from emp;

合并取得大于平均薪水的员工

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

**查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名 **

首先取得管理者的编号,去除重复的: select distinct mgr from emp where mgr is not null;

查询员工编号包含管理者编号的

select empno, ename from emp where empno in(select mgr from emp where mgr is not null);

在这里插入图片描述

在from语句中使用子查询,可以将该子查询看做一张表

查询各个部门的平均薪水所属等级,需要显示部门编号,平均薪水,等级编号

第一步: 首先取得各个部门的平均薪水: select deptno, avg(sal) avg_sal from emp group by deptno;

第二步:克服心理障碍,把查询的即结果部门的平均薪水作为一张真实存在的表与薪水等级表建立连接

select 
	a.deptno,a.avg_sal,g.grade 
from 
	(select deptno,avg(sal) avg_sal from emp group by deptno ) a
join 
	salgrade g 
on 
	a.avg_sal between g.losal and hisal;

在这里插入图片描述

**查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名 **

首先取得管理者的编号,去除重复的: select distinct mgr from emp where mgr is not null;

将以上查询作为一张表,放到 from 语句的后面

--使用 92 语法:
select 
	e.empno, e.ename 
from 
	emp e, (select distinct mgr from emp where mgr is not null) m 
where 
	e.empno=m.mgr;

--使用 99 语法
select 
	e.empno, e.ename 
from 
	emp e 
join 
	(select distinct mgr from emp where mgr is not null) m 
on 
	e.empno=m.mgr;

在这里插入图片描述

在select 语句中使用子查询(了解)

对于select后面的子查询来说,这个子查询只能一次返回1条结果,多于1条就报错: :ERROR 1242 (21000): Subquery returns more than 1 row

select 
	--前面的select只能查到一条记录, 后面的select没有加连接条件查到的就是多条记录 ,就会报错
	e.ename,e.deptno,(select dname from dept) as dname
from
	emp e;

查询员工信息,并显示出员工所属的部门名称

第一种做法,将员工表和部门表连接

第二种做法,在 select 语句中再次嵌套 select 语句完成部分名称的查询

--第一种做法,将员工表和部门表连接
select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;

--第二种做法,在 select 语句中再次嵌套 select 语句完成部分名称的查询
select e.ename, (select d.dname from dept d where e.deptno=d.deptno) as dname from emp e;

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值