sql 计算单行数据字段空值比例_对比Excel学习SQL(6):表连接

本文是对比Excel学习SQL系列第6篇文章,之前5篇传送门在此:《分组和子查询》、《计算字段》、《对行和列的操作》、《库/表/记录的增查删改》、《写给小白的SQL学习文章》。

表连接可以用来联合多张表进行查询,也就是将多张表横向整合成为一张表,类似Excel中的vlookup函数,表连接用到JOIN命令,JOIN之于SQL的重要性就如同vlookup函数之于Excel的重要性。

表连接的前提:

  1. 有两个或两个以上的表

  2. 几个表有相同的列字段

  3. 表中有其他表没有的字段

如下图所示,我们要用到的两张表,student表和sc表,都有相同的snum字段,感觉大家好像不太喜欢MySQL的界面,于是我就换成了SQL Server,大家都用什么数据库比较多,评论区留言哦~

987d6c5bf77a7b22d1997b71d64ad572.png

01 where子句创建连接

--语法Select 列 from 表1,表2 where 表1.列x = 表2.列x

Q1:查询学生的姓名、学号、学科号以及成绩。

select sc.snum,sc.cnum,sc.score,student.snamefrom sc,studentwhere sc.snum = student.snum

解释:姓名在student表中,学号、学科号和成绩在sc表中,查询时需要将两个表连接起来,观察发现两个表都有一个公共列字段snum,关键在于where子句后连接sc表的snum和student表的snum,注意限定列名。

8a27a2404b8a71d1a433337815ec4659.png

02 内连接

--语法Select 列 from 表1 INNER JOIN 表2 ON 表1.列x = 表2.列x

内连接不用where子句来创建,用innerjoin …on来连接两个表,取出的结果是两个表公共的部分。

c49ed2e005fbe94ee80aa0a0c60baf2e.png

图片来源:zeroturnaround.com

select sc.snum,sc.cnum,sc.score,student.snamefrom sc innerjoin studenton sc.snum = student.snum

练习一下得到的结果和使用where子句是一样的

133cda293898a92a9f30b7eb85d35859.png

03 左连接

--语法Select 列 from 表1 LEFT JOIN 表2 ON 表1.列x = 表2.列x

LEFT JOIN…ON,以左表为底,将右表中的所有值匹配过来,若右表中没有匹配,则返回空值。取出的结果是左表所有的值,这些值里有部分是和右表有重叠的。

70b268beb3fd67df49d35c8f37ce8fbe.png

图片来源:zeroturnaround.com

Q2:在sc表基础上新增一列对应学生姓名。

select sc.snum,sc.cnum,sc.score,student.snamefrom sc leftjoin studenton sc.snum = student.snum

解析:sc表左连接student表,sc表为底,sc表中的所有行都会被匹配上student表中的值。

22eed5cfb94b08bf8e4ba447a2602d44.png

好,我们用Excel来还原一下这个问题,就是在sc表上增加一列student表中的sname嘛,用vlookup函数“=VLOOKUP(A2,student!A:B,2,0)”。

633e46052ee620527071f3709d6a23e6.png

Q3:在student表的基础上,新增cnum,score两列

select student.snum,student.sname,student.sage,student.sex,sc.cnum,sc.scorefrom studentleftjoin scon sc.snum = student.snum

解析:student表左连接sc表,student表中的所有行都会被匹配一个值,没有值的则返回NULL,如snum=8时,sc表中没有学号为8的学生成绩,因此返回空值。

0a6c7425b97229adbb08bb6860bde73e.png

这个例子想了一下,感觉没法用Excel来解释,用vlookup函数做,得到的是以下结果,我们知道一个snum对应了>=1个的cnum,一个cnum对应一个score,用snum去匹配cnum,相当于一对多查询,这在Excel里去完成有些复杂了,需要建立辅助列,这里就不展开了。其实本例的重点是那个匹配不上的错误值。

12d5901ad2287b575674f463ffed93bb.png

04 右连接

--语法Select 列 from 表1 RIGHT JOIN 表2 ON 表1.列x = 表2.列x

RIGHT JOIN…ON,以右表为底,将左表中的所有值匹配过来,若左表中没有匹配,则返回空值。取出的结果是右表所有的值,这些值中同样有部分是和左表重叠的。

26c36eae724213190c261a15961abef6.png

图片来源:zeroturnaround.com

select student.snum,student.sname,student.sage,student.sex,sc.cnum,sc.scorefrom studentrightjoin scon sc.snum = student.snum

解析:student表右连接sc表,以sc表为底,sc表中的所有行都将被匹配上一个值,若左表中没有匹配则返回空值。实际上student表右连接sc表的结果和sc表左连接student表是一样的。大家可以自行练习一下sc右连接student表。

21a09004c05912f49e30c3ec056b8738.png

d894aec410ff63957e516e877c20d7ac.png

Q4:查询学生的总成绩,包含学号、姓名、总成绩3列

select student.snum,       student.sname,       sum(sc.score)as t_scorefrom studentleftjoin scon sc.snum = student.snumgroupby student.snum,student.sname

解析:聚合函数和表连接的结合使用,sum(sc.score)用来计算总成绩,group by子句用来分组。

ebe6baa6ebb72bbada52572d645c2022.png

表连接就到这了。

提供入门级数据分析的学习路线规划,分享从Excel到统计学的干货。数据分析是一项技能,希望人人都能分析数据。

cda396eb196805dda482557a1f8e5922.png

相关内容:

SQL学习:MySQL入门 | 库/表/记录的增查删改 | 对行和列的操作 | 计算字段 | 分组和子查询

Excel分析方法:RFM分析 | 综合指标分析 | 平均和交叉 | 分组 | 对比 | 时间序列分析 | 回归分析 | 描述性统计分析 | 相关性分析 

Excel图表:数据地图 | 数据透视表 | 5个基本图 | 13个进阶图 | 直方图 | 控制图 | 排列图

Excel函数:日期文本函数 | 查找引用函数 | if函数 | 统计函数

用Excel进行数据分析:数据获取 | 数据处理 

方法论:如何系统地学习Excel | 数据分析学习 | Excel相见恨晚的技巧 

码字不易,喜欢就点个右下角 在看 呗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值