08 子查询

1 什么是子查询?

select语句中嵌套select语句,被嵌套的select语句称为子查询。

2 子查询都可以出现在哪里呢?

    select
		..(select).
	from
		..(select).
	where
		..(select).

3 where子句中的子查询

(1)案例:找出比最低工资高的员工姓名和工资?
(2)实现思路:
第一步:查询最低工资是多少

select min(sal) from emp;

第二步:找出>800的

select ename,sal from emp where sal > 800;

第三步:合并

select ename,sal from emp where sal > (select min(sal) from emp);

4 from子句中的子查询

(1)注意:from后面的子查询,可以将子查询的查询结果当做一张临时表。(技巧)

(2)案例:找出每个岗位的平均工资的薪资等级。
第一步:找出每个岗位的平均工资(按照岗位分组求平均值)

select job,avg(sal) from emp group by job;

第二步:克服心理障碍,把以上的查询结果就当做一张真实存在的表t。

mysql> select * from salgrade; s表

t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal;

        select 
			t.*, s.grade
		from
			(select job,avg(sal) as avgsal from emp group by job) t
		join
			salgrade s
		on
			t.avgsal between s.losal and s.hisal;

在这里插入图片描述

5 select后面出现的子查询(这个内容不需要掌握,了解即可!!!)

案例:找出每个员工的部门名称,要求显示员工名,部门名?

    select 
		e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname 
	from 
		emp e;

在这里插入图片描述### 6 union合并查询结果集
(1) 案例:查询工作岗位是MANAGER和SALESMAN的员工?

  select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
  select ename,job from emp where job in('MANAGER','SALESMAN');

在这里插入图片描述

    select ename,job from emp where job = 'MANAGER'
	union
	select ename,job from emp where job = 'SALESMAN';

在这里插入图片描述
union的效率要高一些。对于表连接来说,每连接一次新表,
则匹配的次数满足笛卡尔积,成倍的翻。。。
但是union可以减少匹配的次数。在减少匹配次数的情况下,
还可以完成两个结果集的拼接。

a 连接 b 连接 c
a 10条记录
b 10条记录
c 10条记录
匹配次数是:1000

a 连接 b一个结果:10 * 10 --> 100次
a 连接 c一个结果:10 * 10 --> 100次
使用union的话是:100次 + 100次 = 200次。(union把乘法变成了加法运算)

(2)union在使用的时候有注意事项吗?

//错误的:union在进行结果集合并的时候,要求两个结果集的列数相同。
select ename,job from emp where job = 'MANAGER'
union
select ename from emp where job = 'SALESMAN';

// MYSQL可以,oracle语法严格 ,不可以,报错。要求:结果集合并时列和列的数据类型也要一致。
select ename,job from emp where job = 'MANAGER'
union
select ename,sal from emp where job = 'SALESMAN';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值