SQL进阶-7-外连接(outer join)
本文中介绍的SQL中行列转换和嵌套式侧栏的生成,将SQL
语句查询的结果转换成我们想要的结果。
- 行转列,制作交叉表头
- 列转行
实现行列转换(行—>列):制作交叉表
需求
根据下面的表Courses
制作员工和课程的交叉表
生成如下的交叉表:
方法-外连接实现
1 | -- 水平展开求交叉表,使用外连接 |
SQL中指定了名称的表和视图都是相当于是集合
C0-C3
的各自内容如下:
- C0包含了全部的员工
- C1-C3每个课程学习者的集合
name(C0) | name(C1-SQL) | name(C2-UNIX) | name(C3-java) |
---|---|---|---|
赤井 | 赤井 | 赤井 | 工藤 |
工藤 | 工藤 | 吉田 | |
铃木 | 铃木 | ||
吉田 | 渡边 | ||
渡边 |
方法-标量子查询实现
1 | -- 标量子查询实现 |
标量子查询非常方便,如果有需要可以直接添加即可。缺点是性能不太好,性能开销还是比较大的。
方法-嵌套case表达式
1 | -- 嵌套使用case表达式 |
列转成行
需求1
将这张表转成行格式的数据
union all实现
UNION ALL
不会排除重复行的数据,所以即使吉田没有孩子,也会出现3行相关的数据
1 | -- 列转成行:union all |
结果为:
需求2
按照下面的表格生成数据
1 | -- 存储子女列表的视图(孩子主表) |
1 | -- 员工列表为主表进行外连接操作 |
嵌套式表侧栏
在生成统计表的工作中,经常会有制作表头和表侧栏的要求。
需求
根据上面的3张表,生成如下的统计表格:
外连接实现嵌套式表侧栏
1 | -- 外连接实现嵌套式表侧栏 |
乘法运算的连接
需求
商品管理表和商品销售历史管理表,通过商品为单位汇总出各自的销量
方法1
1 | select |
方法2
1 | select |
一对一或者一对多关系的两个集合,在进行联结操作后行数不会增加
外连接的3种类型
- 左外连接(left)
- 右外连接(right)
- 全外连接(full)
全外连接指的是将两个表的数据全部连接起来,如果表中不存在,则用空
1 | -- 使用全连接使用 |
1 | -- 使用左右连接+union合并实现(如果数据库不支持全外连接) |