select into语法
in是用于向另外的数据库插入,插入同样数据库时无需使用
12.获取每个部门最高薪水的相关信息
此题极容易直接使用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)
多重嵌套,注意逻辑层和表别名,容易乱!以及再次注意max和别的信息一起select 时,不一定匹配!。
三表联结
目前认为三表联结时,需使用同一联结方式,不能前面leftjoin后面innerjoin!
28.二次分组问题
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也只剩下一个!(附上最初的错误思路代码)
后来只筛选出>=5的name,再在where中使用in就能筛选出这些name来,同时注意,只有是临时表需要或临时表中有同名的字段时,临时表或字段需要别名!像此题中直接select name和上题中select max均不需要别名!起了别名会运行失败!
33.创建表
注意表名和列名无需加引号
34.一个insert插入多条数据
48.更新薪水
将表联结后进行更新
51.计算字符串中逗号个数
复习length和replace用法
52.截取字符串
直接在order by中使用right函数
53.分组拼接
新函数group_concat(字段 separator 分隔符号),只写字段时默认用逗号分隔
54.去除最大值最小值
不同情况不同考虑
65.求异常概率
没啥特别的地方,注意求概率时多层嵌套不要乱了
68.求留存率!!!
TAT 法1是自己想了好久想出来的,虽然能pass但是一看讨论区的比起自己的简洁好多TT法2的高明之处在于直接使用了min窗口函数,这样可以直接对date列和min列进行日期比较,避免了自联结的使用,然后再用where来得到连续的两天!
70.每日新增登录用户数
经典sum case组合,确实好用
73.查询多个组内大于该组平均值的数据
太妙了,刷了那么多感觉最妙的,对联结有了新的认知
81.count窗口函数使用
对分组中的个数进行计数
91.查询最高积分(多个)用户
with as 函数太好用了!!相当于在一开始创建临时表,后面可以多次使用!