每天一道大厂SQL题【Day07】教育领域SQL实战

时间:2023-02-09 18:53:09

每天一道大厂SQL题【Day07】教育领域SQL实战

大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。

一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!

本题共有10道小题,有基础的小伙伴可直接从第8题开始写~

每日语录

今天说早安,她温柔的回了一句傻B,我好开心,她肯定一直在关心我。不然怎么会说我是傻baby呢?

每天一道大厂SQL题【Day07】教育领域SQL实战

第7题:电商购买金额统计实战

1.1 需求

现有图书管理数据库的三个数据模型如下: 图书(数据表名:BOOK)

序号 字段名称 字段描述 字段类型
1 BOOK_ID 总编号 文本
2 SORT 分类号 文本
3 BOOK_NAME 书名 文本
4 WRITER 作者 文本
5 OUTPUT 出版单位 文本
6 PRICE 单价 数值(保留小数点后2位)

读者(数据表名:READER)

序号 字段名称 字段描述 字段类型
1 READER_ID 借书证号 文本
2 COMPANY 单位 文本
3 NAME 姓名 文本
4 SEX 性别 文本
5 GRADE 职称 文本
6 ADDR 地址 文本

借阅记录(数据表名:BORROW LOG)

序号 字段名称 字段描述 字段类型
1 READER_ID 借书证号 文本
2 BOOK_ID 总编号 文本
3 BORROW_DATE 借书日期 日期

(1) 创建图书管理库的图书、读者和借阅三个基本表的表结构。请写出建表语句。

(2) 找出姓李的读者姓名(NAME)和所在单位(COMPANY)。

(3) 查找“高等教育出版社”的所有图书名称(BOOK_NAME)及单价(PRICE),结果按单价降序排序。

(4) 查找价格介于10元和20元之间的图书种类(SORT)出版单位(OUTPUT)和单价(PRICE),结果按出版单位(OUTPUT)和单价(PRICE)升序排序。

(5) 查找所有借了书的读者的姓名(NAME)及所在单位(COMPANY)。

(6) 求”科学出版社”图书的最高单价、最低单价、平均单价。

(7) 找出当前至少借阅了2本图书(大于等于2本)的读者姓名及其所在单位。

(8) 考虑到数据安全的需要,需定时将“借阅记录”中数据进行备份,请使用一条SQL语句,在备份用户bak下创建与“借阅记录”表结构完全一致的数据表BORROW_LOG_BAK.井且将“借阅记录”中现有数据全部复制到BORROW_L0G_ BAK中。

(9) 现在需要将原Oracle数据库中数据迁移至Hive仓库,请写出“图书”在Hive中的建表语句(Hive实现,提示: 列分隔符|;数据表数据需要外部导入:分区分别以month_part、day_part 命名)

(10) Hive中有表A,现在需要将表A的月分区 201505 中 user_id为20000的user_dinner字段更新为bonc8920,其他用户user_dinner字段数据不变,请列出更新的方法步骤。(Hive实现,提示:Hlive中无update 语法,请通过其他办法进行数据更新)

实现

数据准备

(1)-- 创建图书表book

CREATE TABLE test_sql.book(book_id string,
`SORT` string, book_name string, writer string, OUTPUT string, price decimal(10,2));
INSERT INTO TABLE test_sql.book VALUES ('001','TP391','信息处理','author1','机械工业出版社','20'); INSERT INTO TABLE test_sql.book VALUES ('002','TP392','数据库','author12','科学出版社','15');
INSERT INTO TABLE test_sql.book VALUES ('003','TP393','计算机网络','author3','机械工业出版社','29'); INSERT INTO TABLE test_sql.book VALUES ('004','TP399',' 微 机 原 理 ','author4',' 科 学 出 版 社 ','39'); INSERT INTO TABLE test_sql.book VALUES ('005','C931','管理信息系统','author5','机械工业出版社','40'); INSERT INTO TABLE test_sql.book VALUES ('006','C932','运筹学','author6','科学出版社','55');

– 创建读者表reader

CREATE TABLE test_sql.reader (reader_id string,
company string, name string, sex string, grade string, addr string);
INSERT INTO TABLE test_sql.reader VALUES ('0001','阿里巴巴','jack','男','vp','addr1');
INSERT INTO TABLE test_sql.reader VALUES ('0002',' 百 度 ','robin',' 男 ','vp','addr2'); INSERT INTO TABLE test_sql.reader VALUES ('0003',' 腾 讯 ','tony',' 男 ','vp','addr3'); INSERT INTO TABLE test_sql.reader VALUES ('0004',' 京 东 ','jasper',' 男 ','cfo','addr4'); INSERT INTO TABLE test_sql.reader VALUES ('0005','网易','zhangsan','女','ceo','addr5'); INSERT INTO TABLE test_sql.reader VALUES ('0006','搜狐','lisi','女','ceo','addr6');

– 创建借阅记录表borrow_log

CREATE TABLE test_sql.borrow_log(reader_id string,
book_id string, borrow_date string);

INSERT INTO TABLE test_sql.borrow_log VALUES ('0001','002','2019-10-14'); INSERT INTO TABLE test_sql.borrow_log VALUES ('0002','001','2019-10-13'); INSERT INTO TABLE test_sql.borrow_log VALUES ('0003','005','2019-09-14'); INSERT INTO TABLE test_sql.borrow_log VALUES ('0004','006','2019-08-15'); INSERT INTO TABLE test_sql.borrow_log VALUES ('0005','003','2019-10-10'); INSERT INTO TABLE test_sql.borrow_log VALUES ('0006','004','2019-17-13');

思路分析

  1. create table as select …

9.在Hive中创建表 “book”,该表有以下列:book_id,book_name,price,author,publish_date。导出Oracle数据库中的"图书"数据并存为一个列分隔的文本文件。

10.使用CREATE TABLE AS SELECT语句,将需要修改的数据复制到一个新表中 ,将需要修改的数据加入到新表中,删除原表A的数据,重命名新表为A,添加月分区

答案获取

建议你先动脑思考,动手写一写再对照看下答案,如果实在不懂可以点击下方卡片,回复:大厂sql 即可。
参考答案适用HQL,SparkSQL,FlinkSQL,即大数据组件,其他SQL需自行修改。

加技术群讨论

点击下方卡片关注 联系我进群

或者直接私信我进群

文末SQL小技巧

提高SQL功底的思路。
1、造数据。因为有数据支撑,会方便我们根据数据结果去不断调整SQL的写法。
造数据语法既可以create table再insert into,也可以用下面的create temporary view xx as values语句,更简单。
其中create temporary view xx as values语句,SparkSQL语法支持,hive不支持。
2、先将结果表画出来,包括结果字段名有哪些,数据量也画几条。这是分析他要什么。
从源表到结果表,一路可能要走多个步骤,其实就是可能需要多个子查询,过程多就用with as来重构提高可读性。
3、要由简单过度到复杂,不要一下子就写一个很复杂的。
先写简单的select * from table…,每个中间步骤都执行打印结果,看是否符合预期, 根据中间结果,进一步调整修饰SQL语句,再执行,直到接近结果表。
4、数据量要小,工具要快,如果用hive,就设置set hive.exec.mode.local.auto=true;如果是SparkSQL,就设置合适的shuffle并行度,set spark.sql.shuffle.partitions=4;

后记

????博客主页:https://manor.blog.csdn.net

????欢迎点赞 ???? 收藏 ⭐留言 ???? 如有错误敬请指正!
????本文由 Maynor 原创,首发于 CSDN博客????
????不能老盯着手机屏幕,要不时地抬起头,看看老板的位置⭐
????专栏持续更新,欢迎订阅:https://blog.csdn.net/xianyu120/category_12182595.html