- 【知识点引入】
- 接下来让我们一起学习表连接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演示】
- 【Excel演示】
- inner join内连接,连接两个表留下同时互相匹配上的行得到新表
- 【Excel演示】
- 【Excel演示】
- left join左连接,左边的表返回所有行,右边的表只留下匹配上的行得到新表
- 【Excel演示】
- 【Excel演示】
- right join右连接,右边的表返回所有行,左边的表只留下匹配上的行得到新表
- 【Excel演示】
- 【Excel演示】
- from 表1 left join 表2 on 表1.字段A = 表2.字段B 等价于 from 表2 right join 表1 on 表1.字段A = 表2.字段B
- join表连接通过on 表格名1.字段名 = 表格名2.字段名,将两个表格各自的字段等值连接来匹配连接,无法匹配的填充null值
- 【基础语法】
- 接下来让我们一起学习表连接join,通过两个或多个表中的列之间的关系连接,再从连接的表中跨表查询数据
- 【例题讲解】
- 【表与表连接】
- 点击链接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%'
- 【运行结果】
- 【题目】
- 点击链接The JOIN operation - SQLZOO第四题
- 【多表连结】
- 点击链接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第九题
- 【子查询与表连接】
- 点击链接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
- 【运行结果】
- 【题目】
- 点击链接More JOIN operations - SQLZOO第十三题
- 【表与表连接】
- 【总结】
- 【内连接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.字段名
- 【内连接inner join语法】
- 【练习题】
- 【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
- 【题目】
- 【1】More JOIN operations - SQLZOO第十一题
数据璐SQL零基础入门教程学习第八天主知识点七:表连接
最新推荐文章于 2024-07-15 20:23:14 发布