mysql多表查询笔试题_MySQL多表查询[3题]

原始表如下:

6769ddc1c18d

emp

6769ddc1c18d

dept

第1题,3.4查找只存在于一个表中的数据(差集)

例:找出在dept表中存在,而在emp表中不存在的部门编号(如果有的话)

需要最终结果:

6769ddc1c18d

答:

#方法一:

select distinct deptno

from dept

where deptno not in (select deptno from emp)

#方法二:

select deptno

from dept d

where not exists (select null

from emp e

where e.deptno = d.deptno)

(注意此处方法一用not in的原因是因为emp表中deptno没有空值,如果有的话,就只能用方法二,否则not in()中包含null将查不到任何值)

延伸:如果要查找存在于A但不存在于B & 存在于B但不参在于A的内容,可以使用上述代码2次,并做union all 处理

第2题,3.10组合使用外连接查询与聚合函数

例:计算出部门编号为10的员工的工资总额以及奖金总额

(type=1,奖金=工资*0.1;type=2,奖金=工资*0.2)

奖金表如下:

6769ddc1c18d

emp_bonus

需要最终结果:

6769ddc1c18d

答:

#1.将两表连接起来,找出需要的字段

create table d1 as

select e.empno, e.ename, e.sal, e.deptno,

e.sal * case when eb.type is null then 0

when eb.type =1 then 0.1

when eb.type =2 then 0.2

end as bonus

from emp e left join emp_bonus eb

on e.empno = eb.empno

where e.deptno = 10

#2.做相应的聚合运算,sal去重避免重复计算,bonus做加总

create table d2 as

select empno, avg(sal) sal, sum(bonus) bonus from d1

group by empno

#3.最后加总显示所需要的结果

create table d3 as

select 10 deptno, sum(sal) sal_total, sum(bonus) bonus_total from d2

得到:

6769ddc1c18d

步骤1

6769ddc1c18d

步骤2

6769ddc1c18d

步骤3

第3题,3.12在运算和比较中使用null

例:找出emp表中业务提成(comm列)比员工WARD低的所有员工

需要最终结果:

6769ddc1c18d

答:

select ename, comm

from emp

where coalesce(comm,0) < (select comm from emp where ename='WARD')

用coalesce()处理null值,如果不处理的话,只能返回符合条件有数字的行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值