WEEK 01

入职第一周:老板的第一张表

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