数据璐SQL零基础入门教程学习第八天主知识点七:表连接

  • 【知识点引入】
    • 接下来让我们一起学习表连接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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值