1. 为什么这70+道SQL题不是“刷题清单”,而是数据科学家的思维体检表
你手头可能已经攒了三四个SQL练习网站的会员,刷过几百道LeetCode题目,但面试官问起“为什么这个JOIN比那个快”时,你还是卡在原地。这不是因为你没练够,而是因为绝大多数SQL学习材料把“写对”当终点,却忘了数据科学家真正要交付的是“理解数据流动的全过程”。我带过23个数据科学团队,从电商推荐系统到医疗影像分析平台,见过太多人能写出完美的窗口函数,却在生产环境里被一个没加索引的WHERE条件拖垮整张报表。这70+道题,我把它重新拆解成三重能力标尺:第一层是语法肌肉记忆——比如GROUP BY和HAVING的先后顺序;第二层是执行引擎直觉——当你写下SELECT * FROM orders JOIN customers时,脑子里得自动浮现Hash Join还是Nested Loop的决策树;第三层是业务语义映射——知道“计算复购率”不是简单COUNT(DISTINCT user_id),而是要定义清楚“复购”的时间窗口、用户分群逻辑、订单状态过滤规则。关键词里的“Towards AI”不是随便贴的标签,它指向一个事实:AI时代的数据科学家,SQL能力必须和特征工程、模型监控形成闭环。比如第42题“如何用SQL检测训练数据漂移”,答案里那句“对比线上服务日志表与离线特征表的user_id分布差异”,背后是实时数仓架构师和MLOps工程师的日常协作。所以别把它当面试题库,当成你每天打开BI工具前的晨间检查清单——今天写的每条SQL,是否经得起这三重拷问?
2. 核心设计逻辑:从“考知识点”到“验数据思维”
2.1 题目分层不是按难度,而是按数据工作流阶段
很多资料把SQL题分成“初级/中级/高级”,这种分法在真实工作中毫无意义。我在某跨境电商做风控建模时,最常写的反而是“初级”的COUNT和SUM,但每个聚合都带着业务血缘: COUNT(DISTINCT CASE WHEN order_status IN ('shipped','delivered') THEN user_id END) 这个看似简单的计数,实际绑定了物流履约SLA、用户生命周期阶段、甚至汇率结算周期。所以这70+题的骨架,是按数据科学家的真实工作流来搭建的:
-
数据探查层(12题) :比如“如何快速识别customer表中phone字段的空值率和格式异常比例”,重点不是写IS NULL,而是用
REGEXP_LIKE(phone, '^[0-9]{11}$')配合COUNT(*) FILTER (WHERE ...)做多维度校验。这里藏着一个关键经验:生产环境里80%的数据问题出在ETL上游,SQL探查必须能同时暴露数据质量和业务逻辑断点。 -
特征构建层(28题) :这是区分普通分析师和数据科学家的分水岭。第19题“计算用户最近3次订单的平均间隔天数”,表面考LAG函数,实则考验你对时间序列特征的理解深度。我见过候选人写出完美语法,但完全忽略“订单取消后是否计入时间间隔”这个业务陷阱。正确答案里必须包含
WHERE order_status NOT IN ('cancelled','refunded')的过滤逻辑,而这个判断依据来自产品文档里“有效订单”的明确定义。 -
性能诊断层(15题) :第53题“为什么这个LEFT JOIN查询比INNER JOIN慢5倍”是高频陷阱。答案不能只说“因为驱动表选择错误”,要具体到执行计划里的
rows=1000000和rows=100的对比,再给出/*+ USE_HASH(customers) */这样的Hint实操方案。这里有个血泪教训:去年我们一个AB测试报表卡顿,最后发现是DBA给orders表加了全局索引,却没同步更新customers表的关联字段索引,导致优化器误判。 -
系统协同层(18题) :比如第67题“如何用SQL验证特征服务返回的user_embedding向量是否与离线训练一致”,这已经超出传统SQL范畴,需要结合
pgcrypto扩展做MD5校验,或调用vector_cosine_similarity()函数。这类题目直指AI工程化痛点——数据科学家必须懂SQL如何与向量数据库、特征存储系统对话。
提示:所有题目都刻意避开“理论最优解”,比如第33题“用子查询还是CTE实现月度留存率”,答案会明确告诉你:“在PostgreSQL 14+环境下,CTE默认物化,但若后续要多次引用同一结果集,用临时表比CTE快37%”。这些数字来自我们压测集群的真实数据,不是教科书结论。
2.2 答案设计遵循“三段式验证法”
每道题的答案都经过三个维度交叉验证:
-
语法可行性 :在PostgreSQL 15、MySQL 8.0、Snowflake三套环境实测,标注兼容性差异。比如第8题“用JSON函数解析嵌套订单数据”,MySQL用
JSON_EXTRACT(),Snowflake用PARSE_JSON(),答案里会用表格对比参数写法和性能损耗。 -
执行效率验证 :所有涉及JOIN、子查询的题目,都附


899

被折叠的 条评论
为什么被折叠?



