【夯实基础第一天 2022-8-5】

找了好几个实习都没有成功,今天听了曹老板的悉心教导,痛定思痛,觉得好好夯实java基础,从今天开始,每天学习java相关的基础知识

1.数据库篇

1.1牛客入门SQL23 统计每个学校各难度的用户平均刷题数

1.1.1题目

请你写一个SQL查询,计算不同学校、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
请你写一个SQL查询,计算不同学校、不同难度的用户平均答题量

1.1.2题解

题意明确

计算每个学校用户不同难度下的用户平均答题题目数

问题分解

限定条件:无;
每个学校:按学校分组group by university
不同难度:按难度分组group by difficult_level
平均答题数:总答题数除以总人数count(qpd.question_id) / count(distinct qpd.device_id)
来自上面信息三个表,需要联表,up与qpd用device_id连接,qd与qpd用question_id连接。

细节问题

表头重命名:as
平均值精度:保留4位小数round(x, 4)

1.1.3SQL语句

select 
    up.university,
    qd.difficult_level,
    round(count(qpd.question_id) / count(distinct qpd.device_id),4) as avg_answer_cnt
    from question_practice_detail as qpd
    left join user_profile as up
    on up.device_id=qpd.device_id 
    inner join question_detail as qd
    on qd.question_id=qpd.question_id
    group by university,difficult_level;

1.2 入门24SQL24 统计每个用户的平均刷题数

1.2.1 题目

数据库表和上题相同遂免去展示

请你写一个SQL查询,计算山东、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):

1.2.2 题解

问题分解:
限定条件:山东大学的用户 up.university=“山东大学”;
不同难度:按难度分组group by difficult_level
平均答题数:总答题数除以总人数count(qpd.question_id) / count(distinct qpd.device_id) 来自上面信息三个表,需要联表,up与qpd用device_id连接并限定大学,qd与qpd用question_id连接。
细节问题:
表头重命名:as
平均值精度未明确要求,忽略

1.2.3 SQL语句

select 
    university,
    difficult_level,
    round(count(qpd.device_id) / count( distinct qpd.question_id),4) as avg_answer_cnt
    from user_profile as up
    left join question_practice_detail as qpd
    on up.device_id = qpd.device_id
    inner join question_detail as qd
    on qpd.question_id=qd.question_id
    where university="山东大学"
    group by difficult_level;

1.3 SQL25 查找山东大学或者性别为男生的信息

1.3.1 题目

这个题只有一个表
现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,请取出相应结果,结果不去重。

在这里插入图片描述

1.3.2 题解

问题分解:
限定条件:学校为山东大学或者性别为男性的用户:university=‘山东大学’, gender=‘male’;
分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行,要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重
细节问题:
不去重:union all

1.3.3 SQL语句

select 
    device_id,gender,age,gpa
    from user_profile
    where university="山东大学"
union all
select
    device_id,gender,age,gpa
    from user_profile
    where gender="male";

1.4union和union all的区别

union去重并排序,union all直接返回合并的结果,不去重也不排序;
union all比union性能好;

1.5SQL语句中ON和Where的区别

① on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

② where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

1.6SQL语句inner join 和left join的效率

①大家都知道,sql尽量使用数据量小的表做主表,这样效率高,如果使用数据量大的表做主表,此时使用left join 就会比较慢,即使关联条件有索引。但如果使用inner join速度就较快。因为inner join 在执行的时候回自动选择最小的表做基础表,效率高,总之相比之下inner join不管从效率还是速度上都优于left join,毕竟left join 会多一部分逻辑运算
②选择inner join还有个好处,不会产生null,有些表我们在定义的时候某些字段不允许存在null,如果用left join就可能会产生null,此时软件就会报错,而inner join可以避免

③在实际运用中选择inner join还是left join这个需要根据实际场景进行选择,并不是所有的地方都能用inner join的,建议能用则用
————————————————
版权声明:本文为CSDN博主「striver_dl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/striver_dl/article/details/111868760

1.7SQL优化

SQL优化链接

明天搞算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值