最近看到牛客的MySQL更新了,做了几道从后数的,和大家分享下。
SQL76 考试分数(五)
描述
牛客每次考试完,都会有一个成绩表(grade),如下:
第1行表示用户id为1的用户选择了C++岗位并且考了11001分
。。。
第8行表示用户id为8的用户选择了B语言岗位并且考了9999分
请你写一个sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序,结果如下:
解释:
(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round,sqlite不支持floor函数,支持cast(x as integer) 函数,不支持if函数,支持case when ...then ...else ..end函数,sqlite不支持自定义变量)
SELECT id, job, score, ranking FROM (SELECT id, job, score, ROW_NUMBER() OVER(PARTITION BY job ORDER BY score) AS situ1, ROW_NUMBER() OVER(PARTITION BY job ORDER BY score DESC) AS situ2, ROW_NUMBER() OVER(PARTITION BY job) AS ranking, COUNT(*) OVER(PARTITION BY job) AS total FROM grade ORDER BY id) AS t WHERE t.situ1 >= t.total / 2 AND t.situ2 >= t.total / 2 ORDER BY id ;
SQL77 牛客的课程订单分析(一)
描述
有很多同学在牛客购买课程来学习,购买会产生订单存到数据库里。
有一个订单信息表(order_info),简况如下:
第1行表示user_id为557336的用户在2025-10-10的时候使用了client_id为1的客户端下了C++课程的订单,但是状态为没有购买成功。
第2行表示user_id为230173543的用户在2025-10-12的时候使用了client_id为2的客户端下了Python课程的订单,状态为购买成功。
。。。
请你写出一个sql语句查询在2025-10-15以后状态为购买成功的C++课程或者Java课程或者Python的订单,并且按照order_info的id升序排序,以上例子查询结果如下:
SELECT * FROM order_info WHERE date > '2025-10-15' AND product_name IN ('C++','Java','Python') AND status = 'completed' ORDER BY id ASC;
SQL84 实习广场投递简历分析(一)
描述
SELECT job, cnt FROM (SELECT job, sum(num) AS cnt FROM resume_info WHERE YEAR(date) = '2025' GROUP BY job) AS t ORDER BY cnt DESC ;
SQL85 实习广场投递简历分析(二)
描述
SELECT job, month, SUM(num) AS cnt FROM (SELECT job, SUBSTR(date, 1, 7) AS month, num FROM resume_info WHERE YEAR(date) = '2025' ) AS t GROUP BY job, month ORDER BY month DESC, cnt DESC ;
SQL86 实习广场投递简历分析(三)
描述
SELECT t1.job, t1.month, t1.cnt, t2.month, t2.cnt FROM (SELECT job, SUBSTR(date,1,7) AS month, sum(num) AS cnt FROM resume_info WHERE YEAR(date) = '2025' GROUP BY job, SUBSTR(date,1,7) ORDER BY SUBSTR(date,1,7) DESC, job DESC) AS t1 LEFT JOIN (SELECT job, SUBSTR(date,1,7) AS month, sum(num) AS cnt FROM resume_info WHERE YEAR(date) = '2026' GROUP BY job, SUBSTR(date,1,7) ORDER BY SUBSTR(date,1,7) DESC, job DESC) AS t2 ON t1.job = t2.job AND SUBSTR(t1.month,6,2) = SUBSTR(t2.month,6,2) ;
SQL87 最差是第几名(一)
描述
第4行表示,学生成绩为D的知道自己最差为第7名
解题:
SELECT
grade,
SUM(number) OVER(ORDER BY grade) AS t_rank
FROM
class_grade
;
SQL88 最差是第几名(二)
描述
总体学生成绩排序如下:A, A, B, B, B, B, C, C, C, C, D, D,总共12个数,取中间的2个,取6,7为:B,C
解题:
方案一:构造一个区间
SELECT grade FROM (SELECT t1.grade, t1.number, @my_num AS my_beg, @my_num := @my_num + number AS my_end FROM class_grade AS t1, (SELECT @my_num := 0) AS init ORDER BY t1.grade) AS t WHERE my_beg <= @my_num / 2 AND my_end >= @my_num / 2; ;
方案二:正反排序来找中间
SELECT t.grade FROM (SELECT grade, SUM(number) OVER(ORDER BY grade) AS situ1, SUM(number) OVER(ORDER BY grade DESC) AS situ2, SUM(number) OVER() AS total FROM class_grade ORDER BY grade) AS t WHERE t.situ1 >= t.total / 2 AND t.situ2 >= t.total / 2;
SQL89 获得积分最多的人(一)
描述
SELECT name, MAX(score) FROM (SELECT a1.name, SUM(a2.grade_num) AS score FROM user AS a1 INNER JOIN grade_info AS a2 ON a1.id = a2.user_id WHERE a2.type = 'add' GROUP BY a2.user_id ORDER BY score DESC LIMIT 1) AS t;
方案二:窗口函数
SELECT name, score AS grade_sum FROM (SELECT name, SUM(grade_num) OVER(PARTITION BY user_id) AS score FROM grade_info AS a2 INNER JOIN user AS a1 ON a1.id = a2.user_id WHERE a2.type = 'add') AS t ORDER BY score DESC LIMIT 1;
SQL90 获得积分最多的人(二)
描述
user_id为1和3的2个人,积分都为4,都要输出
解题:使用常规方法
SELECT id, name, score FROM (SELECT a1.id, a1.name, SUM(a2.grade_num) AS score FROM user AS a1 INNER JOIN grade_info AS a2 ON a1.id = a2.user_id WHERE a2.type = 'add' GROUP BY a2.user_id) AS t WHERE score = (SELECT MAX(score) FROM (SELECT a1.id, a1.name, SUM(a2.grade_num) AS score FROM user AS a1 INNER JOIN grade_info AS a2 ON a1.id = a2.user_id WHERE a2.type = 'add' GROUP BY a2.user_id) AS t1 );
SQL91 获得积分最多的人(三)
描述
SELECT id, name, score FROM (SELECT t1.id, t1.name, COALESCE(t1.score_add, 0) - COALESCE(t2.score_reduce, 0) AS score FROM (SELECT a1.id, a1.name, SUM(a2.grade_num) AS score_add FROM user AS a1 INNER JOIN grade_info AS a2 ON a1.id = a2.user_id WHERE a2.type = 'add' GROUP BY a2.user_id) AS t1 LEFT JOIN (SELECT b1.id, b1.name, SUM(b2.grade_num) AS score_reduce FROM user AS b1 INNER JOIN grade_info AS b2 ON b1.id = b2.user_id WHERE b2.type = 'reduce' GROUP BY b2.user_id) AS t2 ON t1.id = t2.id) AS t WHERE t.score = ( SELECT MAX(score) FROM (SELECT t1.id, t1.name, COALESCE(t1.score_add, 0) - COALESCE(t2.score_reduce, 0) AS score FROM (SELECT a1.id, a1.name, SUM(a2.grade_num) AS score_add FROM user AS a1 INNER JOIN grade_info AS a2 ON a1.id = a2.user_id WHERE a2.type = 'add' GROUP BY a2.user_id) AS t1 LEFT JOIN (SELECT b1.id, b1.name, SUM(b2.grade_num) AS score_reduce FROM user AS b1 INNER JOIN grade_info AS b2 ON b1.id = b2.user_id WHERE b2.type = 'reduce' GROUP BY b2.user_id) AS t2 ON t1.id = t2.id) AS t ) ;
晚安,迷茫的日子更应该鼓励自己。
--------------------------------------------------
更新完啦,和之前的联系起来了,一年时间进步了一点点,从之前解题大部分需要看解答到现在可以用第一感觉做出来,还不错。
有收获,勉励一下自己,也勉励每一个努力的人,继续加油!