牛客网sql刷题
牛客网SQL题库里那道“查找所有员工入职以来薪水涨幅超过5000的牛客部门”我做了三遍才过。第一遍忘了按部门分组取最大薪水,刷题第二遍把涨幅算成了绝对值,牛客第三遍才意识到得用窗口函数先排个序。刷题这种题在牛客上不算最难的牛客,但特别典型——它逼你把聚合、刷题子查询、牛客窗口函数串起来想,刷题少一环就报错。牛客
我刷牛客SQL大概是刷题从去年秋天开始的。当时刚学完SELECT基础,牛客觉得自己会写JOIN就差不多了,刷题结果点开“SQL篇”的牛客题单,第一题就卡住。刷题题目给两张表,牛客一张员工表一张部门表,要求查出每个部门薪水最高的员工姓名。我本能地写了GROUP BY department_id加MAX(salary),但姓名列没法直接带出来。后来看讨论区才知道,得用子查询或者窗口函数ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)。这种“知道要分组但带不出明细”的坑,几乎每个新手都会踩一次。
牛客的SQL题库有个好处:题号从易到难排得清楚。前二十道基本是单表查询和简单聚合,三十到五十开始涉及多表连接和子查询,再往后就是窗口函数、CTE、日期函数这些进阶内容。我自己的节奏是每天刷五道,不贪多。遇到卡壳超过十五分钟的,直接看讨论区——不是抄答案,是看别人怎么拆解逻辑。有个ID叫“SQL不加班”的用户,解题思路写得特别细,连WHERE和HAVING的执行顺序都会标出来。跟着他的思路走一遍,比看教科书快得多。
说个具体的。有一道“连续三天登录的用户”的题,我第一反应是用自连接,把登录表自己连自己两次,条件写date2 = date1 + 1 AND date3 = date2 + 1。写出来能跑,但数据量一大就慢得离谱。讨论区里有人用LEAD窗口函数,三行就搞定,逻辑还更清晰。那之后我养成了一个习惯:每道题做完,不管过没过,都去翻一下讨论区的前三个答案。经常能发现“原来还能这么写”的写法,比如用ROW_NUMBER()做差值来识别连续区间,或者用SUM() OVER()算累计值。
牛客的在线编辑器有个小细节:它不自动补全关键字,也不高亮语法错误。刚开始觉得难用,后来反而觉得是好事——逼你记住GROUP BY后面不能跟WHERE,ORDER BY默认升序,NULL参与比较时要用IS NULL而不是= NULL。这些细节在IDE里可能被提示掩盖,但在牛客上写错一次就报错一次,记不住也得记住。
刷到大概八十题的时候,我回头做第一道“部门最高薪水”的题,两分钟就写完了。用的窗口函数,一次过。那种感觉挺实在的——不是突然变聪明了,是肌肉记忆形成了。现在看到“每个分组取前N条”就知道该上ROW_NUMBER,看到“连续N天”就想到用日期减行号,看到“涨幅”“同比”就条件反射去写自连接或者LAG。
如果你也在刷牛客SQL,我的建议就一条:别按题号顺序死磕。先刷“SQL必知必会”那个题单,把基础聚合和连接练熟,再跳去“SQL进阶挑战”做窗口函数专项。中间遇到卡住的题,直接看讨论区,别跟自己较劲。刷题不是考试,目的是把别人的解法变成自己的条件反射。我现在的进度是到一百二十题左右,窗口函数那章还没刷完,但至少看到“排名”“累计”“连续”这些词,手不会慌了。
(责任编辑:知识)













