【知识点引入】 接下来让我们一起学习表连接join,通过两个或多个表中的列之间的关系连接,再从连接的表中跨表查询数据 【基础语法】 内连接 select 字段名 from 表格名1 inner join 表格名2 on 表格名1.字段名 = 表格名2.字段名 注意内连接inner可以省略,直接使用join默认为内连接 左连接 select 字段名 from 表格名1 left join 表格名2 on 表格名1.字段名 = 表格名2.字段名 右连接 select 字段名 from 表格名1 right join 表格名2 on 表格名1.字段名 = 表格名2.字段名 【语法解释】 join表连接通过on 表格名1.字段名 = 表格名2.字段名,将两个表格各自的字段等值连接来匹配连接,无法匹配的填充null值 【Excel演示】
inner join内连接,连接两个表留下同时互相匹配上的行得到新表 【Excel演示】
left join左连接,左边的表返回所有行,右边的表只留下匹配上的行得到新表 【Excel演示】
right join右连接,右边的表返回所有行,左边的表只留下匹配上的行得到新表 【Excel演示】
from 表1 left join 表2 on 表1.字段A = 表2.字段B 等价于 from 表2 right join 表1 on 表1.字段A = 表2.字段B 【例题讲解】 【表与表连接】 点击链接The JOIN operation - SQLZOO第四题 【题目】 查询有球员名叫Mario进球的队伍1(team1),队伍2(team2)及球员姓名 先来看给的三张表示例 表一:game赛事表。记录的每一场赛事的编号(id),赛事的举办时间(mdate),赛事举办的场地(stadium),参加本场比赛的两个队伍(team1,team2)
表二:goal得分表。记录了球员进球的赛事编号(matchid),队伍编号(teamid),球员名字(player)及进球时间(gtime)
表三:eteam队伍表。记录了每个队伍的编号(id),队伍名字(teamname)和队伍的教练名字(coach)
题目要查询队伍1,队伍2和球员姓名,队伍1和队伍2来自game表,球员姓名来自goal表,来自不同的表但是要同时查询此时对两张表进行连接,连接键为赛事编号在game表中为id列,在goal表中为matchid列,连接表时可以为表格起别名,如果select中查询的字段名在联查的表中都有一摸一样的名字,就必须要指定该字段来源于哪一张表,如果查询的字段在联查的表中名字唯一,可以不指定字段来源于哪一张表格。 写出代码 select a.team1 ,a.team2 ,b.player from game a join goal b on a.id = b.matchid 同时还要查询球员名字为Mario的,添加代码where b.player like 'Mario%'; 【运行代码】 select a.team1 ,a.team2 ,b.player from game a join goal b on a.id = b.matchid where b.player like 'Mario%' 【运行结果】
【多表连结】 点击链接More JOIN operations - SQLZOO第九题 【题目】 查询演员Harrison Ford出演过的他不是第1主角的电影 首先看这道题涉及的几张表 分别是记录了编号id,电影名title,首影年份yr,导演director,制作费budget,票房收入gross的电影表。记录了演员编号id,演员名字name的演员表。记录了电影编号movieid,演员编号actorid,角色次序ord的角色表。角色次序为1,代表第1主角,角色次序为2,代表第2主角,依次类推。
这道题最终查询电影名title,字段来源于movie表,条件是演员名为Harrison Ford,且出演的角色不是第一主角,涉及到字段name和ord分别来自actor和casting表 movie中的id字段和casting表中的movieid可以匹配连接,actor表中的id字段和casting表中的actorid可以匹配连接,因此需要对三张表进行连接 写出相对应的代码 【运行代码】 select title from actor a join casting b on a.id = b.actorid join movie c on c.id = b.movieid where name = 'Harrison Ford' and ord != 1 【运行结果】
【子查询与表连接】 点击链接More JOIN operations - SQLZOO第十三题 【题目】 查询至少出演过第1主角15次的演员名 首先演员名,第1主角涉及到表actor和casting 先通过where ord = 1筛选出casting表中所有第1主演的记录 再对casing表根据字段actorid分组计数,对聚合后的数据筛选数量大于等于15的数据 组合写出代码 【运行代码】 select actorid ,count(movieid) mid from casting where ord = 1 group by actorid having count(movieid)>=15 【运行结果】 得到多行多列的查询结果
我们最后查询的是演员名,可以把该子查询作为处理后的表与actor表连接得到与actorid一一对应的演员名称name 【运行代码】 select name from ( select actorid ,count(movieid) mid from casting where ord = 1 group by actorid having count(movieid)>=15 ) a join actor on a.actorid = actor.id 【运行结果】
【总结】 【内连接inner join语法】 select 字段名 from 表格名1 inner join 表格名2 on 表格名1.字段名 = 表格名2.字段名 注意内连接inner可以省略,直接使用join默认为内连接 【左连接left join语法】 select 字段名 from 表格名1 left join 表格名2 on 表格名1.字段名 = 表格名2.字段名 【右连接right join语法】 select 字段名 from 表格名1 right join 表格名2 on 表格名1.字段名 = 表格名2.字段名 【练习题】 【1】More JOIN operations - SQLZOO第十一题 【题目】 查询演员Rock Hudson每年出演超过2部电影的年份和这些年他出演电影的数量。
【参考答案】 select m.yr ,count(m.title) from movie m join casting c on m.id=c.movieid join actor a on a.id=c.actorid where a.name = 'Rock Hudson' group by m.yr having count(m.title)>2 【2】More JOIN operations - SQLZOO第十二题 【题目】 查询Julie Andrews出演过的所有电影的电影名和该电影的主演
【参考答案】 select m.title ,a.name from movie m join casting c on m.id = c.movieid join actor a on a.id = c.actorid where c.ord = 1 and c.movieid in ( select c.movieid from actor a join casting c on a.id = c.actorid join movie m on c.movieid = m.id where a.name = 'Julie Andrews' ) 【3】More JOIN operations - SQLZOO第十三题 【题目】 查询至少出演过第1主角15次的演员名 和例题讲解的题目一样,尝试不使用子查询完成
【参考答案】 select name from casting c join actor a on c.actorid = a.id where ord = 1 group by name having count(movieid)>=15 ———————————————— 版权声明:本文为CSDN博主「数据璐(大数据分析岗位推荐师)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/shujlu0908/article/details/124296802