牛客题霸SQL篇
_努力努力再努力_
如果你吃不了学习的苦,那就只能吃生活的苦
展开
-
SQL88 最差是第几名(二)
题目链接:https://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1?tpId=82&&tqId=37926&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking虽然已经做过并且已经写过博客了,可是每次再做的时候还是会忘记,干脆再写一遍题解,加深一下印象:题目中要求根据 grade 求出中位数,中位数的性质:无论从前往后还是从后往前数,都是最中间的数,因原创 2021-09-26 08:50:53 · 127 阅读 · 0 评论 -
SQL83 牛客的课程订单分析(七)
题目链接:https://www.nowcoder.com/practice/d6f4a37f966145da8900ba9edcc4c068?tpId=82&&tqId=37921&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking本题和之前做过的差不多,需要注意的是,case 语句的用法,case when a = b then xxx else xxxx end source 意思是,当 a = b 的时候,赋值 xxx原创 2021-09-20 08:38:35 · 137 阅读 · 0 评论 -
SQL90 获得积分最多的人(二)
题目链接:https://www.nowcoder.com/practice/b6248d075d2d4213948b2e768080dc92?tpId=82&&tqId=38360&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking本题,看似很简单,但是连表太难了,首先,根据 用户 id 分组查出 grade 的总值,然后,通过 总值,查询出 排名,然后输出排名是 1 的人即可,很多嵌套,所以不好理解,代码也不好读,建议花时原创 2021-09-19 09:51:38 · 168 阅读 · 0 评论 -
SQL80 牛客的课程订单分析(四)
题目链接:https://www.nowcoder.com/practice/c93d2079282f4943a3771ca6fd081c23?tpId=82&&tqId=37918&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking本题我一开始用的连表(之前的题做怕了)结果发现根本不需要,通过一张表,一个 group by 语句,一个 having 约束,一堆查询条件即可作出本题,题目难度应该在中等左右select use原创 2021-09-18 08:53:35 · 116 阅读 · 0 评论 -
SQL88 最差是第几名(二)
题目链接:https://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1?tpId=82&&tqId=37926&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking大佬的解法,中位数的性质:无论从前往后还是从后往前,中位数的位置都处在总数除以二之外,举个例子,如果是长度为三,那么中位数的位置就是二(从 一 开始),所以,我们可以通过 sum()over(or原创 2021-09-18 08:51:28 · 169 阅读 · 0 评论 -
SQL75 考试分数(四)
题目链接:https://www.nowcoder.com/practice/502fb6e2b1ad4e56aa2e0dd90c6edf3c?tpId=82&&tqId=35495&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking本题学习 sql 语法的 floor 函数,此函数的意思是,向下取整,舍弃所有的小数部分,如果结果是 1.7,那么 floor 以后的结果就变成了 1 了,此题就是一个求中位数,只需让 总数加一除原创 2021-09-17 12:41:38 · 88 阅读 · 0 评论 -
SQL74 考试分数(三)
原题链接:https://www.nowcoder.com/practice/b83f8b0e7e934d95a56c24f047260d91?tpId=82&&tqId=35494&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking通过窗口函数根据科目选择出排名,再选出前两名即可本题需要复盘select ll.id, name, scorefrom language l join (select id, langua原创 2021-09-16 09:18:27 · 95 阅读 · 0 评论 -
SQL71 牛客每个人最近的登录日期(六)
题目链接:https://www.nowcoder.com/practice/572a027e52804c058e1f8b0c5e8a65b4?tpId=82&&tqId=35089&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking本题使用窗口函数进行求解,窗口函数的本质是 分组不去重合并吗,语句主要就是sum(------)over(partition by ------),over 在 sum 之前执行,除了用 sum原创 2021-09-16 08:45:41 · 102 阅读 · 0 评论 -
SQL69 牛客每个人最近的登录日期(四)
原题链接:https://www.nowcoder.com/practice/e524dc7450234395aa21c75303a42b0a?tpId=82&&tqId=35087&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking 较难等级的登陆日期确实都好难啊呜呜,此题虽说也是看解析做出来的,不过有明显感觉,有思路了:题目要求查找每天登录的新用户的个数,首先,新用户就是登录日期最小的那个,选择出所有不重复的 date原创 2021-09-15 15:51:50 · 126 阅读 · 0 评论 -
SQL68 牛客每个人最近的登录日期(三)
题目链接:https://www.nowcoder.com/practice/16d41af206cd4066a06a3a0aa585ad3d?tpId=82&&tqId=35086&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking*第一天登陆以后,第二天继续登陆的概率,第一天其实就是该用户最小的登陆 date,第二题就是最小的 date 加上 1 day。使用 mysql 提供的函数 date_add(date 列, i原创 2021-09-14 18:16:11 · 198 阅读 · 0 评论 -
SQL65 异常的邮件概率
原题链接:https://www.nowcoder.com/practice/d6dd656483b545159d3aa89b4c26004e?tpId=82&&tqId=35083&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking两次连表,而且连的都是同一张表,我最开始想的是 where 直接 not in 黑名单,但是还是之前那个问题,选择出的不一定与其他数据保持在同一行,所以必须要连表,round 函数进行除法运算,后原创 2021-09-13 09:38:08 · 63 阅读 · 0 评论 -
SQL67 牛客每个人最近的登录日期(二)
https://www.nowcoder.com/practice/7cc3c814329546e89e71bb45c805c9ad?tpId=82&&tqId=35085&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking一开始我是怎么写的,但是结果不对select user.name, client.name, max(date)from login, user, clientwhere login.client_i原创 2021-09-13 09:14:29 · 119 阅读 · 0 评论 -
SQL60 统计salary的累计和running_total
题目链接:https://www.nowcoder.com/practice/58824cd644ea47d7b2b670c506a159a6?tpId=82&&tqId=29828&rp=1&ru=/ta/sql&qru=/ta/sql/question-rankingover 函数,通过 emp_no 升序的规则逐步相加,有点像 dense_rank()over 语句,看来sql 里面的函数还挺多select emp_no, salary, sum(sala原创 2021-09-11 09:09:49 · 66 阅读 · 0 评论 -
SQL59 获取有奖金的员工相关信息。
题目链接:https://www.nowcoder.com/practice/5cdbf1dcbe8d4c689020b6b2743820bf?tpId=82&&tqId=29827&rp=1&ru=/ta/sql&qru=/ta/sql/question-rankingcase 语句的使用,case -> when -> then相当于 Switch -> if -> 结果举个例子,如果 salary 的值小于 1000,加 100原创 2021-09-11 09:04:49 · 273 阅读 · 0 评论 -
SQL23 对所有员工的薪水按照salary降序进行1-N的排名
原题链接:https://www.nowcoder.com/practice/b9068bfe5df74276bd015b9729eec4bf?tpId=82&&tqId=29775&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking又是 rank 函数的使用,排名用 dense_rank 进行排名,相同分数的话排名一致,此时相同分数只需按照学号升序进行输出即可select emp_no, salary, dense_ran原创 2021-09-10 14:44:13 · 152 阅读 · 0 评论 -
SQL24 获取所有非manager员工当前的薪水情况
题目链接:https://www.nowcoder.com/practice/b9068bfe5df74276bd015b9729eec4bf?tpId=82&&tqId=29775&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking可以说是目前为止牛课上我做过的最繁琐的一个题了,题目涉及四张表,每张表都有不同的信息,以下是分析:1、首先通过 inner join 的方式将雇员表,工资表和部门雇员关联表联合(先随便找两个表进原创 2021-09-10 14:38:22 · 96 阅读 · 0 评论 -
SQL18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
原题连接:https://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719?tpId=82&&tqId=29770&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking此题有点意思,不让用 order by 函数,那么只能多重嵌套查值了,从里往外看,最里层的 select 是选择出最大的薪水,外面的 select 是选择出第二大的薪水,再让薪水等于第二大薪水即可原创 2021-09-09 08:46:21 · 140 阅读 · 0 评论 -
SQL46 在audit表上创建外键约束,其emp_no对应employees_test表的主键id
题目链接:https://www.nowcoder.com/practice/aeaa116185f24f209ca4fa40e226de48?tpId=82&&tqId=29814&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking创建外键约束,第一种方法是直接把表删掉,然后重新创建有外键约束的表,还有一种方法是直接创建约束:alter table + 表名add constraint(约束) foreign key (原创 2021-09-09 08:33:32 · 83 阅读 · 0 评论 -
SQL50 将employees表中的所有员工的last_name和first_name通过引号连接起来。
题目链接:https://www.nowcoder.com/practice/810bf4ee3ac64949b08983aa66ec7bee?tpId=82&&tqId=29818&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking连接字符串的方式,此题要求中间以单引号进行连接,所以要使用双引号兜住,要么使用 \' 的转义字符select concat(last_name, "'", first_name)from em原创 2021-09-09 08:27:01 · 204 阅读 · 0 评论 -
SQL48 将所有获取奖金的员工当前的薪水增加10%
题目链接:https://www.nowcoder.com/practice/d3b058dcc94147e09352eb76f93b3274?tpId=82&&tqId=29816&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking连表的更新操作,只有再 emp_bonus 里的员工才是要加薪水的,所以使用嵌套查询,选择出符合条件的 emp_no 然后进行更新操作。update salariesset salary =原创 2021-09-07 15:02:16 · 356 阅读 · 0 评论 -
SQL51 查找字符串 10,A,B 中逗号,出现的次数cnt
题目链接:https://www.nowcoder.com/practice/e3870bd5d6744109a902db43c105bd50?tpId=82&&tqId=29819&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking思路:首先算出 “10,A,B” 的长度,然后使用 replace 函数替换掉逗号,然后计算差值就是逗号的次数:select (length("10,A,B") - length(replac原创 2021-09-07 14:56:25 · 89 阅读 · 0 评论 -
SQL57 使用含有关键字exists查找未分配具体部门的员工的所有信
题目链接:https://www.nowcoder.com/practice/c39cbfbd111a4d92b221acec1c7c1484?tpId=82&&tqId=29825&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking使用 not exists 语句通过相关子查询选择出分配了部门的人的人的 emp_no 然后使用 not exists 选择出没有分配的人,得出结果。select * from employee原创 2021-09-06 08:50:04 · 93 阅读 · 0 评论 -
SQL54 查找排除当前最大、最小salary之后的员工的平均工资avg_salary
题目链接:https://www.nowcoder.com/practice/95078e5e1fba4438b85d9f11240bc591?tpId=82&&tqId=29822&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking去掉一个最高的,就是减去 max 去掉一个最低的,就是减去一个 min,再除以总数减二,即可得出平均数。select (sum(salary) - max(salary) - min(salar原创 2021-09-06 08:42:15 · 471 阅读 · 0 评论 -
SQL53 按照dept_no进行汇总
题目链接:https://www.nowcoder.com/practice/6e86365af15e49d8abe2c3d4b5126e87?tpId=82&&tqId=29821&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking使用聚合函数,group_concat 此函数必须和 group by 函数匹配使用group_concat(x, y) x 是要聚合的字段,y 是分割符号,可以不写,默认是逗号,此题:先通过原创 2021-09-05 09:01:19 · 70 阅读 · 0 评论 -
SQL52 获取Employees中的first_name
题目链接:https://www.nowcoder.com/practice/74d90728827e44e2864cce8b26882105?tpId=82&&tqId=29820&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking使用 mysql 提供的 right 函数,right(column, number) 取某一列从右开始的 number 位,举个例子:取出的是右边的两位,满足条件select right(f原创 2021-09-04 17:50:09 · 96 阅读 · 0 评论 -
SQL63 刷题通过的题目排名
原题链接:https://www.nowcoder.com/practice/cd2e10a588dc4c1db0407d0bf63394f3?tpId=82&&tqId=35080&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking排序的函数:dense_rank():按值排序,值相等的时候会跳,可能存在多个第二名或第三名那种,类似比赛的排序。rank():按值排序,值相等的时候不会跳,继续排序,可能存在相同分数不同排名原创 2021-09-04 14:27:52 · 52 阅读 · 0 评论 -
SQL39 针对上面的salaries表emp_no字段创建索引idx_emp_no
题目链接:https://www.nowcoder.com/practice/f9fa9dc1a1fc4130b08e26c22c7a1e5f?tpId=82&&tqId=29807&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking使用强制索引,select from 后面使用 force + index(索引名称)即可select * from salariesforce index(idx_emp_no)whe原创 2021-09-04 14:01:31 · 74 阅读 · 0 评论 -
SQL38 针对actor表创建视图actor_name_view
题目链接:https://www.nowcoder.com/practice/b9db784b5e3d488cbd30bd78fdb2a862?tpId=82&&tqId=29806&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking创建视图的语句:create viewas 后面加视图的内容create view actor_name_view asselect first_name as first_name_v,原创 2021-09-01 14:30:15 · 75 阅读 · 0 评论 -
SQL37 对first_name创建唯一索引uniq_idx_firstname
原文链接:https://www.nowcoder.com/practice/e1824daa0c49404aa602cf0cb34bdd75?tpId=82&&tqId=29805&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking添加索引的两种方式:第一种 create index + 索引弥名字 on 表 (表列)第二种 alter table + 表 + add 索引 索引名字 (表列)# 添加唯一索引CREAT原创 2021-09-01 10:01:46 · 172 阅读 · 0 评论 -
SQL36 创建一个actor_name表
题目链接:https://www.nowcoder.com/practice/881385f388cf4fe98b2ed9f8897846df?tpId=82&&tqId=29804&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking先创建表,然后插入数据,创建表使用 if not exists 判断是否表存在,如果存在,直接执行插入即可create table if not exists actor_name( f原创 2021-09-01 09:49:39 · 74 阅读 · 0 评论 -
SQL35 批量插入数据,不使用replace操作
题目链接:https://www.nowcoder.com/practice/153c8a8e7805400ba8e384e03acc6b3e?tpId=82&&tqId=29803&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking使用 insert ignore 语句,如果数组库中已经存在当前记录,那么就忽略当前数据,还是用以前的数据,相反 replace into 是使用当前数据,将老数据替换掉insert ignor原创 2021-09-01 09:38:51 · 65 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6原创 2021-08-27 20:27:14 · 277 阅读 · 0 评论 -
SQL78 牛客的课程订单分析(三)
https://www.nowcoder.com/practice/4ae8cff2505f4d7cb68fb0ec7cf80c57?tpId=82&&tqId=37917&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking同上一题,多了一个子查询,查询 user_id 等于查询条件的select *from order_infowhere date > '2025-10-15' and product_name i原创 2021-08-27 10:16:02 · 137 阅读 · 0 评论 -
SQL78 牛客的课程订单分析(二)
https://www.nowcoder.com/practice/4ca4137cb490420cad06d2147ae67456?tpId=82&&tqId=37916&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking不难的题,单表查询,只需要把条件都列好就行:第一个条件,2025-10-15以后所以只需要 date > ‘2025-10-15’第二个条件,用户下单2个以及2个以上 只需要根据 user_id 分原创 2021-08-27 10:02:52 · 200 阅读 · 0 评论 -
SQL73 考试分数(二)
https://www.nowcoder.com/practice/f456dedf88a64f169aadd648491a27c1?tpId=82&&tqId=35493&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking先分组再求平均值比较的题目,使用内连接,然后让连接条件是分组条件,即可select g.id, g.job, g.scorefrom grade g inner join ( select job原创 2021-08-26 11:09:08 · 58 阅读 · 0 评论 -
SQL85 实习广场投递简历分析(二)
题目链接:https://www.nowcoder.com/practice/d323a4c97d1945e0aabe94e4d0bbb25d?tpId=82&&tqId=37923&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking此题考察了一个日期格式化的工具,date_format常用的格式有:%Y 年份%m 月份数值%M 月份名称%k 小时select job, date_format(d原创 2021-08-26 10:24:16 · 138 阅读 · 0 评论 -
SQL87 最差是第几名(一)
题目链接:https://www.nowcoder.com/practice/ae5e8273e73b4413823b676081bd355c?tpId=82&&tqId=37925&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking考察了一个我不会用的函数 over 意思是根据某一属性进行排名,如果写 order by grade 那么就是根据 grade,进行排名select grade, sum(number) over原创 2021-08-26 09:34:47 · 103 阅读 · 0 评论 -
SQL89 获得积分最多的人(一)
题目链接:https://www.nowcoder.com/practice/1bfe3870034e4efeb4b4aa6711316c3b?tpId=82&&tqId=38359&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking其实就是连表查询,只不过此题只要求选择第一名,所以需要 limit 语句,0,1 表示从第 0 条记录开始选, 选择 1 条select name, sum(grade_num) sunfrom原创 2021-08-25 10:30:10 · 252 阅读 · 0 评论 -
SQL33 创建一个actor表,包含如下列信息
题目链接:https://www.nowcoder.com/practice/ac233de508ef4849b0eeb4f38dcf09cf?tpId=82&&tqId=29801&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking简单的建表操作create table actor(actor_id smallint(5) primary key,first_name varchar(45) not null,last原创 2021-08-25 10:08:55 · 79 阅读 · 0 评论 -
SQL30 使用子查询的方式找出属于Action分类的所有电
题目链接:https://www.nowcoder.com/practice/2f2e556d335d469f96b91b212c4c203e?tpId=82&&tqId=29782&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking使用子查询,就比较简单了,先从电影表选出要求字段,然后让 film_id 与 关联表 id 对应的同时,让类型等于 Actionselect title, description from fi原创 2021-08-25 10:00:37 · 72 阅读 · 0 评论