这是我参与更文挑战的第16天,活动详情查看:更文挑战
作者:可乐
来源:可乐的数据分析之路
转载请联系授权(微信ID:data_cola)
表连接可以用来联合多张表进行查询,也就是将多张表横向整合成为一张表,类似Excel中的vlookup函数,表连接用到JOIN命令,JOIN之于SQL的重要性就如同vlookup函数之于Excel的重要性。
表连接的前提:
- 有两个或两个以上的表
- 几个表有相同的列字段
- 表中有其他表没有的字段
如下图所示,我们要用到的两张表,student表和sc表,都有相同的snum字段,感觉大家好像不太喜欢MySQL的界面,于是我就换成了SQL Server,大家都用什么数据库比较多,评论区留言哦~
01 where子句创建连接
--语法
Select 列 from 表1,表2 where 表1.列x = 表2.列x
Q1:查询学生的姓名、学号、学科号以及成绩。
--代码
select sc.snum,sc.cnum,sc.score,student.sname
from sc,student
where sc.snum = student.snum
解释:姓名在student表中,学号、学科号和成绩在sc表中,查询时需要将两个表连接起来,观察发现两个表都有一个公共列字段snum,关键在于where子句后连接sc表的snum和student表的snum,注意限定列名。
02 内连接
--语法
Select 列 from 表1 INNER JOIN 表2 ON 表1.列x = 表2.列x
内连接不用where子句来创建,用inner join …on来连接两个表,取出的结果是两个表公共的部分。
select sc.snum,sc.cnum,sc.score,student.sname
from sc inner join student
on sc.snum = student.snum
练习一下得到的结果和使用where子句是一样的
03 左连接
--语法
Select 列 from 表1 LEFT JOIN 表2 ON 表1.列x = 表2.列x
LEFT JOIN…ON,以左表为底,将右表中的所有值匹配过来,若右表中没有匹配,则返回空值。取出的结果是左表所有的值,这些值里有部分是和右表有重叠的。
Q2:在sc表基础上新增一列对应学生姓名。
select sc.snum,sc.cnum,sc.score,student.sname
from sc left join student
on sc.snum = student.snum
解析:sc表左连接student表,sc表为底,sc表中的所有行都会被匹配上student表中的值。
好,我们用Excel来还原一下这个问题,就是在sc表上增加一列student表中的sname嘛,用vlookup函数“=VLOOKUP(A2,student!A:B,2,0)”。
Q3:在student表的基础上,新增cnum,score两列
select student.snum,student.sname,student.sage,student.sex,sc.cnum,sc.score
from student left join sc
on sc.snum = student.snum
解析:student表左连接sc表,student表中的所有行都会被匹配一个值,没有值的则返回NULL,如snum=8时,sc表中没有学号为8的学生成绩,因此返回空值。
这个例子想了一下,感觉没法用Excel来解释,用vlookup函数做,得到的是以下结果,我们知道一个snum对应了>=1个的cnum,一个cnum对应一个score,用snum去匹配cnum,相当于一对多查询,这在Excel里去完成有些复杂了,需要建立辅助列,这里就不展开了。其实本例的重点是那个匹配不上的错误值。
04 右连接
--语法
Select 列 from 表1 RIGHT JOIN 表2 ON 表1.列x = 表2.列x
RIGHT JOIN…ON,以右表为底,将左表中的所有值匹配过来,若左表中没有匹配,则返回空值。取出的结果是右表所有的值,这些值中同样有部分是和左表重叠的。
select student.snum,student.sname,student.sage,student.sex,sc.cnum,sc.score
from student right join sc
on sc.snum = student.snum
解析:student表右连接sc表,以sc表为底,sc表中的所有行都将被匹配上一个值,若左表中没有匹配则返回空值。实际上student表右连接sc表的结果和sc表左连接student表是一样的。大家可以自行练习一下sc右连接student表。
Q4:查询学生的总成绩,包含学号、姓名、总成绩3列
select student.snum,
student.sname,
sum(sc.score) as t_score
from student left join sc
on sc.snum = student.snum
group by student.snum,student.sname
解析:聚合函数和表连接的结合使用,sum(sc.score)用来计算总成绩,group by子句用来分组。