查看原文
其他

数据治理 | 如何实现SQL数据库的横向匹配

企研数据 数据Seminar 2022-12-31

我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块:

  1. 计算机基础知识

(1)社科研究软硬件体系搭建——虚拟化技术概述与实践

  1. 编程基础

(1)数据治理 | 带你学Python之环境搭建与基础数据类型介绍篇

(2)数据治理 | 带你学Python之控制结构与函数

(3)数据治理 | 带你学Python之面向对象编程基础

(4)数据治理 | 还在用Excel做数据分析呢?SQL它不香吗

(5)数据治理 | 普通社科人如何学习SQL?一篇文章给您说明白

(6)本期内容:数据治理 |  如何实现SQL数据库的横向匹配

  1. 数据采集
  2. 数据存储

(1)安装篇 数据治理 | 遇到海量数据stata卡死怎么办?这一数据处理利器要掌握

(2)管理篇 数据治理 | 多人协同处理数据担心不安全?学会这一招,轻松管理你的数据团队

(3)数据导入数据治理 | “把大象装进冰箱的第二步”:海量微观数据如何“塞进”数据库?

(4) 数据治理|Stata如何直连关系型数据库

  1. 数据清洗
  2. 数据实验室搭建

Part1前言

数据的横向匹配是社科研究过程中重要的数据处理环节。在Excel中通常使用VLOOKUP函数进行数据的横向匹配,在SQL中数据的横向匹配又叫做多表联结,前面的系列推文中,我们已经讲解了SQL的基础语法,本文我们通过对比Excel与SQL在数据横向匹配方面的操作区别,帮助大家深入了解SQL在数据横向匹配上的优势。

Part2示例表

首先,设定两张表,作为讲解表联结的操作对象。
table_1
table_2

Part3Excel常用的匹配方法:vlookup

我们来回顾一下Excel匹配数据的方法,具体见上期推文数据治理|还在用EXCEL做数据分析呢?SQL它不香吗
我们得到了两张表(table_1和table_2),现在将两张表的数据匹配后合并,我们需要扩展table_1中的数据,可以使用VLOOKUP函数来实现:

结果:

可以看到在table_1中城市为嘉兴市的数据没有匹配到,面对这种情况,我们还需要对这些未匹配的数据做特殊的操作,比较的麻烦。但是在数据库中,只需要修改SQL语句,就能轻松的匹配,而且功能要比Excel要强大。

Part4SQL的数据匹配方法:

(一)什么是表联结

我们需要匹配多张表中的数据,通常会使用表联结的方式。简单来说,就是将其他表中的数据添加过来,进行添加列的运算。该操作通常用于无法从一张表中获取期望数据,我们在前面讲述的SQL基础中,都只对一张表选取数据,但实际上期望得到的数据往往会分散在不同表中,使用联结就可以从多张以上的表中选取数据。

(二)笛卡尔积

笛卡尔积就是在查询的时候会将两个表中的每一条数据都交叉相乘的结果展示给我们,简单的说就是两个集合相乘的结果。
我们根据示例的表,来示例笛卡尔积,运行SQL语句:
select * from table_1, table_2;
笛卡尔积执行过程:左表的每一行都匹配上右表的所有行。

结果:

(三)内联结

内联结也称为等值联结,返回两张表都满足条件的部分(交集),使用关键词 INNER JOIN 就可以将两张表联结在一起了,t1和t2分别是两张表的别名,别名并不是必须的,遇到一些表名太长的情况下,推荐使用别名,这样增加SQL语句的可读性:
我们需在table_1和table_2中都包含的数据,可以使用内联结inner join来实现:
select *
from table_1 as t1
inner join table_2 as t2  on t1.城市 = t2.城市;

执行结果:

城市   | 生产总值       | 城市   | 人均生产总值 |
- - - + - - - - - - - + - - - + - - - - - -  
杭州市 | 15373.05亿元   | 杭州市 | 152465元   |
宁波市 | 11985.12亿元   | 宁波市 | 143157元   |
温州市 | 6606.11亿元    | 温州市 | 71225元    |

说明:

使用inner join联结表,数据库会先创建笛卡尔积,ON后面定义了满足条件的数据,这边以城市为联结键,可以根据下图加深理解:

上述的SQL语句使用的 * 查询了所有的列,我们通过执行结果,可以看出城市列重复,在实际的需求中,这列是我们不需要的,所以我们对上面的SQL语句优化一下:
select t1.城市, 生产总值, 人均生产总值
from table_1 as t1
inner join table_2 as t2
on t1.城市 = t2.城市;

执行结果:

城市   | 生产总值     | 人均生产总值  |
- - - + - - - - - - + - - - - - - +
杭州市 | 15373.05亿元 | 152465元    |
宁波市 | 11985.12亿元 | 143157元    |
温州市 | 6606.11亿元  | 71225元     |

TIPS:

由于多张表联结时,某个列到底属于那张表比较容易混乱,例如两个示例表中都含有城市列,所以需要采用“<表名>.<列名>”的形式来指定列,用来告诉SQL语句去那张表中找指定列。
我们可以在ON之后指定两张表联结所使用的列(联结键),需要指定多个键时,同样可以使用AND、OR。

(四)外联结

我们以左联结为例子,来讲解外联结。外联结也是通过 ON 子句的联结键将两张表进行联结,但是不同的是,外联结分主表和从表,在内联结里,是将两表可以联结的数据列出来,但是外联结会把主表中的数据全部列出来,如果从表中没有对应的数据,就设置为null。
例如我们需要在table_1中匹配table_2中的数据,并且要保留table_1中的数据,可以使用左外联结left outer join来实现:
select t1.城市, 生产总值, 人均生产总值
from table_1 as t1
left outer join table_2 as t2  -- 也可以简写成 left join
on t1.城市 = t2.城市;

执行结果:

城市   | 生产总值     | 人均生产总值 |
- - - + - - - - - - + - - - - - - 
杭州市 | 15373.05亿元 | 152465元   |
宁波市 | 11985.12亿元 | 143157元   |
温州市 | 6606.11亿元  | 71225元    |
嘉兴市 |             | 112751元   |

说明:

上面的SQL语句table_1为主表,table_2为从表,主表(table_1)的记录将会全部表示出来,而从表(table_2)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。




星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


统计计量 | 经济学实证研究路在何方?

付定享优惠 转发得数据

软件应用 | 给你的图形化个妆:Stata绘图常用选项汇总-下篇

付定享优惠 转发得数据

软件应用 | 给你的图形化个妆:Stata绘图常用选项汇总-上篇

软件应用 | Stata:面板数据缺失值与多重补漏分析-twofold

热点资讯 | 北京大学国家发展研究院博士后招聘启事





数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文  | 《大数据时代社科研究数据治理实务手册》


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存