Hive 基础测试(一)

准备数据

  • 学生表student
         学号sid,姓名sname,性别ssex,年龄sage,系 department
         95001,李勇,男,20,CS
         95002,刘晨,女,19,IS
         95003,王敏,女,22,MA
         95004,张立,男,19,IS
         95005,刘刚,男,18,MA
         95006,赵丽,女,20,CS
  • 成绩表score
         学生编号sid,课程编号cid,成绩sscore 
         95001,1,81
         95001,2,85
         95001,3,88
         95001,4,70
         95002,1,90
         95002,2,80
         95002,3,90
         95002,4,80
         95003,1,70
         95003,2,78
         95003,3,65
         95003,4,65
         95004,1,70
         95004,2,90
         95004,3,85
         95004,4,90
         95005,1,70
         95005,2,90
         95005,3,70
         95005,4,90
         95006,1,70
         95006,2,90
         95006,3,70
         95006,4,90
  • 课程表course
         课程编号cid,课程名cname
         1,数据库
         2,数学
         3,信息系统
         4,操作系统

需求1: 创建三个外部表,并分别给外部表加载数据

  • student:学号sid,姓名sname,性别ssex,年龄sage,系 department
          --建库
          create database db_exam;
          use db_exam;
          --建表
          create external table if not exists student(
           sid string,
           sname string,
           ssex string,
           sage int,
           department string
          ) row format delimited fields terminated by ',';
          --加载
          load data local inpath '/export/data/student.txt' into table student;
  • score :学生编号sid,课程编号cid,成绩sscore
           --建表
           create external table if not exists score(
            sid string,
            cid string,
            sscore int
           ) row format delimited fields terminated by ',';
           --加载
           load data local inpath '/export/data/score.txt' into table score;
  • course:课程编号cid,课程名cname
           --建表
           create external table if not exists course(
            cid string,
            cname string
           ) row format delimited fields terminated by ',';
           --加载
           load data local inpath '/export/data/course.txt' into table course;

需求2:查询各课的平均成绩,要求对平均成绩降序排序,并且小数保留2位,考虑四舍五入

  • step1:先看结果
    科目		平均成绩
   select 课程,平均成绩 from score 
  • step2:有没有行的过滤?

    • 有where
  • step3:有没有分组

    • group by cid
    • 聚合:round(avg(sscore),2)
  • step4:有没有聚合的过滤

    • 没有having
  • step5:有没有排序

    • order by avgscore desc
         select cid,round(avg(sscore),2) as avgscore from score group by cid order by avgscore desc;

需求3: 查询CS系中数学成绩最高的学生的信息,包括学生的学号和名字(考虑成绩相同情况)

  • step1:结果
           学号	名字
           select * from student  ;
  • step2:条件

    • CS系:student

    • 数学:course

    • 成绩:score

             select
             a.sid,
                 a.sname,
                 a.department,
                 b.cid,
                 b.sscore,
                 c.cname
             from student a join score b on a.sid = b.sid
             join course c on b.cid = c.cid 
             where a.department = 'CS' and c.cname = '数学';
  • 考虑成绩相同情况:dense_rank

        select sid,sname from (
        select 
          a.sid,
          a.sname,
          a.department,
          b.cid,
          b.sscore,
          c.cname,
          dense_rank() over (partition by department,cname order by sscore desc) as rn
        from student a join score b on a.sid = b.sid
        join course c on b.cid = c.cid
        where a.department = 'CS' and c.cname = '数学' ) t where t.rn < 2;
    

需求4:查询数学成绩比数据库成绩高的学生信息和分数

         select c.*,a.sscore,b.sscore from 
         (
         --取出所有学生的数学成绩
         select 
           sid,
           cid,
           sscore
         from score where cid in (select cid from course where cname = '数学')
         ) a
         join
         (
         --取出所有学生的数据库成绩
         select 
           sid,
           cid,
           sscore
         from score where cid in (select cid from course where cname = '数据库')
         ) b
         on a.sid = b.sid
         join student c on a.sid = c.sid where a.sscore > b.sscore;

需求5: 求每个课程分数最高的前三名学生(考虑分数相同的情况)

         select * from (
         select 
           a.sid,
           a.sname,
           a.department,
           b.cid,
           b.sscore,
           c.cname,
           dense_rank() over (partition by cname order by sscore desc) as rn
         from student a join score b on a.sid = b.sid
         join course c on b.cid = c.cid
         ) t where t.rn < 4;
  • 规律

    • 需求的结果中出现多张表字段:join

    • 需求中的结果是一张表的字段,条件是另外一张表的字段:子查询、join

    • 如果数据由多到少:过滤或者聚合

    • 如果数据由少到多:join,union

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间清醒vv子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值