WEEK 01 0 / 7 天
入职第一周:老板的第一张表
公司刚成立半年,只有十来个人,你是第一个和数据沾边的人。老板把后台导出的订单表丢给你:「咱全部的生意都在里面。」你的任务:把它变成一个能查的库,然后开始接老板一个接一个的问题。
目标:零基础起步,周五闭卷完成 30 道单表查询题;任何单表需求不查文档能写对。
剧情 入职第一天,老板发来订单导出文件:「明天告诉我昨天卖了多少。」你环顾四周--公司连个数据库都没有。
学 · 40 min
练 · 65 min
- Docker 起
pg16,建库shop并连进去 - 建 orders 表:字段类型自己定,定完对照本页下方的结构检查
- 跑 seed.sql 的「D01」段灌入 5 万行
\dt和\d orders看结构,输出贴进 notes.md- 开
\timing,跑select count(*) from orders,记下行数与耗时
过关库里有且只有 orders 一张表、5 万行;能不看结构说出每个字段的业务含义。
剧情 老板在工位后面喊:「昨天有多少单?」--你人生第一条业务查询。
学 · 40 min
练 · 65 min
select * from orders limit 10先看看数据长什么样- 查昨天的订单数(先手写日期字面量,再想怎么不硬编码)
- 查金额 > 1000 的订单数
- 按金额从大到小取前 10 单;再按 created_at 取最新 10 单
LIMIT 10不加ORDER BY连跑 5 次,观察差异并解释
过关不查文档写出「日期范围 + 排序 + 取前 N」的查询。
剧情 你汇报「非已支付状态的订单」时数字对不上--运营说还有一批 status 为空的脏数据,而
status <> 2 把它们全漏掉了。 学 · 40 min
练 · 65 min
- 用
select null = null, null <> null, not null验证三值逻辑,做出 AND/OR 真值表 - 查 status 为空的订单数;对比
status <> 2的行数,解释差额来自哪 - 对比
count(*)/count(status)/count(paid_at)三个数字,解释差异 - paid_at 为 NULL 的订单在业务上是什么含义?写一句话进 notes.md
- 用
coalesce(status, '未知')把脏数据标出来,统计各状态订单数
过关能解释「
col <> 'A' 为什么查不到 col 为 NULL 的行」,并写出正确写法。 剧情 老板不想一个数字一个数字地问:「订单按状态分个类,各多少单、多少钱,顺便告诉我每档金额的分布。」
学 · 40 min
练 · 65 min
- 按状态统计订单数和总金额
- 算每种状态的订单占比(总单数用子查询再除)
- 用 CASE 把状态映射成中文标签(如「已支付」「待支付」)再分组
- 按金额分档(0–100 / 100–500 / 500+)统计订单数与占比
- 用 HAVING 找出订单数 > 100 的日期,并解释为什么这题不能用 WHERE
过关一条 SQL 输出「状态 | 订单数 | 金额 | 占比%」完整报表。
剧情 导数据时埋的雷陆续爆了:金额有负数、有的订单 paid_at 比 created_at 还早。老板:「能不能清洗成能看的样子?」
学 · 35 min
练 · 70 min
- 找出负金额订单,用
greatest(total_amount, 0)修正展示 - 查出 paid_at 早于 created_at 的异常单(数据里埋了,找出几条)
- 金额四舍五入到十位(
round(x, -1)),统计各档订单数 - 用
row_number()按时间顺序给订单编号,再拼出「ORD-000001」格式的业务单号(lpad) - 用
split_part把第 4 题的单号反解回数字,验证与编号一致
过关负金额、时间倒挂、空状态三类脏数据各有处理办法,能说出为什么不直接改原表。
剧情 老板周五要看「近 30 天每天卖多少」。你发现没有订单的日期在报表里整行消失;顺便,是时候搞清楚一条 SQL 到底按什么顺序执行了。
学 · 40 min
练 · 65 min
- 近 30 天每日订单数和 GMV,没有订单的日期要补 0(generate_series 左连接)
- 按周统计订单数与 GMV(
date_trunc('week')) - 查「上周」的订单,不许硬编码日期
- 写一条包含全部九个子句的查询,在注释里标注每步之后大约剩多少行
- 故意在 WHERE 里用 SELECT 定义的别名,记下报错并解释原因
过关白纸默写出九步顺序;补零日报完整无缺行。
剧情 第一周结束。老板要一份「本周经营周报」,你就用它来验收自己这周学的一切。
复盘 · 10 min
测评 + 周报 · 110 min
- 70 分钟闭卷做 30 道单表查询题(LeetCode 简单难度 + 自出题)
- 错题全部重写一遍,写进 mistakes.md
- 错题归因:分成「没懂概念 / 记不住语法 / 看错题意」三类统计
- 写出给老板的周报:总单量 / GMV / 状态分布 / 近 7 天趋势(每日一行,缺日补 0)
- 把「逻辑执行顺序」和「NULL 三值逻辑」各写成 5 句话的口述稿
过关30 题正确 ≥ 24 题;周报里每个数字都能对应到一条你写过的查询。