1-5练习题-SQL进阶教程

练习题1-5-1 :先连接还是先聚合
在“在交叉表里制作嵌套式表侧栏”部分里,我们通过聚合将DATA视图和MASTER视图转换为一对一的关系之后进行了连接操作。采用这种做法时,代码的确比较好理解,但是这就需要创建两个临时视图,性能并不是很好。请想办法改善一下代码,尽量减少临时视图
在这里插入图片描述
在这里插入图片描述

select MASTER.age_class age_class,MASTER.sex_cd sex_cd,
sum(case when pref_name in('青森','秋田') then population else null end) pop_tohoku,
sum(case when pref_name in('东京','千叶') then population else null end) pop_kanto
from(select age_class,sex_cd from TblAge cross join TblSex) MASTER
left join TblPop DATA
on MASTER.age_class=DATA.age_class
and MASTER.sex_cd=DATA.sex_cd
group by MASTER.age_class,MASTER.sex_cd;

练习题1-5-2 :请留意孩子的人数
在“用外连接进行行列转换 (1)(列→行):汇总重复项于一列”部分,我们求得了以员工为单位的员工子女列表。有了这个列表后,对员工进行一下聚合很容易就可以知道每个员工抚养了几个孩子
请修改一下正文中的 SQL,求每个员工抚养的孩子的人数。这里,输出结果如下所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select P.employee,count(C.child) child_cnt
from Personnel P
left join Children C
on C.child in(P.child_1,P.child_2,P.child_3)
group by P.employee;

练习题1-5-3 :全外连接和merge运算符
在这里插入图片描述
在这里插入图片描述
处理逻辑是在表 Class_A 中查询表 Class_B 里的“id(编号)”列,如果存在则更新名字,如果不存在则插入。因此,两张表中同名的 1号“田中”,以及表 Class_B 中不存在的 3 号“伊集院”没有变化,两张表中编号相同名字却不同的 2 号“铃木”被更新成“内海”,表 Class_A中不存在的新同学“西园寺”被添加进表中

merge into Class_A
using(select * from Class_B) B
on A.id=B.id
when matched then update set A.name=B.name
when not matched then insert(id,name) values(B.id,B.name);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值