【Mysql】牛客网刷题笔记

437 阅读3分钟

select into语法

微信截图_20210812165124.png

in是用于向另外的数据库插入,插入同样数据库时无需使用

12.获取每个部门最高薪水的相关信息

微信截图_20210814160809.png

此题极容易直接使用max和group by来解决而获得错误答案,原因是select出来的emp_no(会查询出部门中的随机一个)和max函数得到的最高薪水不一定匹配!!! 使用窗口函数可以解决:

select dept_no,emp_no,salary
from (select a.emp_no,dept_no,salary,
(rank() over(partition by dept_no order by salary desc)) as ranking
from dept_emp as a inner join salaries as b
on a.emp_no = b.emp_no) as c
where ranking = 1

18.查找第二高数据(不使用order by)

微信截图_20210814173137.png

多重嵌套,注意逻辑层和表别名,容易乱!以及再次注意max和别的信息一起select 时,不一定匹配!。

三表联结

目前认为三表联结时,需使用同一联结方式,不能前面leftjoin后面innerjoin!

28.二次分组问题

微信截图_20210814212357.png

微信截图_20210814212405.png

微信截图_20210814212417.png

微信截图_20210814212431.png

select name,count(*)
from film_category as a inner join category as b
on a.category_id = b.category_id
inner join film as c on a.film_id = c.film_id
where description like '%robot%'
and name in (select name
from category as d inner join film_category as e on d.category_id = e.category_id 
group by name having count(*) >= 5) #此处注意!一个字段不用别名!
group by name

此题是近些天来刷的题中耗时最久的一题!题目表述比较复杂,需要两次分组,刚开始的时候想直接建立一个临时表,在临时表里筛选出>=5的name和包含电影的description,结果最后运行失败,原因是groupby后,临时表中的每个name只剩一个,包含的电影的description也只剩下一个!(附上最初的错误思路代码)

微信截图_20210814213409.png

后来只筛选出>=5的name,再在where中使用in就能筛选出这些name来,同时注意,只有是临时表需要或临时表中有同名的字段时,临时表或字段需要别名!像此题中直接select name和上题中select max均不需要别名!起了别名会运行失败!

33.创建表

微信截图_20210815161952.png

注意表名和列名无需加引号

34.一个insert插入多条数据

微信截图_20210815170017.png

48.更新薪水

微信截图_20210815171352.png

将表联结后进行更新

51.计算字符串中逗号个数

微信截图_20210815173040.png

复习length和replace用法

52.截取字符串

微信截图_20210815202958.png

直接在order by中使用right函数

53.分组拼接

微信截图_20210816145425.png

新函数group_concat(字段 separator 分隔符号),只写字段时默认用逗号分隔

54.去除最大值最小值

微信截图_20210816155932.png

不同情况不同考虑

65.求异常概率

微信截图_20210817203621.png

微信截图_20210817203639.png

微信截图_20210817203702.png

没啥特别的地方,注意求概率时多层嵌套不要乱了

68.求留存率!!!

微信截图_20210818201320.png

TAT 法1是自己想了好久想出来的,虽然能pass但是一看讨论区的比起自己的简洁好多TT法2的高明之处在于直接使用了min窗口函数,这样可以直接对date列和min列进行日期比较,避免了自联结的使用,然后再用where来得到连续的两天!

70.每日新增登录用户数

微信截图_20210823214255.png

经典sum case组合,确实好用

73.查询多个组内大于该组平均值的数据

微信截图_20210824211123.png

太妙了,刷了那么多感觉最妙的,对联结有了新的认知

81.count窗口函数使用

微信图片_20210906174057.png

对分组中的个数进行计数

91.查询最高积分(多个)用户

微信图片_20210907151255.png

with as 函数太好用了!!相当于在一开始创建临时表,后面可以多次使用!