每天一道大厂SQL题【Day07】教育领域SQL实战
大家好,我是Maynor。相信大家和我一样,都有一个大厂梦
,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题
,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。
一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!
本题共有10道小题,有基础的小伙伴可直接从第8题开始写~
每日语录
今天说早安,她温柔的回了一句傻B,我好开心,她肯定一直在关心我。不然怎么会说我是傻baby呢?
第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');
思路分析
- 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