限时手写 ②:多表连接与子查询专场
第二场手写专项:多表、子查询、集合运算。
规则
练 · 120 min
- 60 分钟闭卷手写 8 题(多表 + 子查询 + 集合运算)
参考答案
多表题第一步永远是画连接链(哪几张表、按什么键、几对几);集合运算题先确认两边的输出列同型。反连接三写法的口径差异要能口述:NOT IN 怕 NULL,另两个不怕。
-- 三大家族题型示例: -- ① 多表聚合报表(先画连接链,再写 FROM) -- ② 反连接 / 半连接(EXISTS、LEFT JOIN ... IS NULL、IN 三写法) -- ③ 集合运算(UNION / UNION ALL / EXCEPT / INTERSECT) -- ① 按一级类目统计 GMV(明细 -> 商品 -> 二级类目 -> 一级类目连三级) select top.name as 一级类目, sum(oi.qty * oi.unit_price) as gmv from order_items oi join products p on p.id = oi.product_id join categories c on c.id = p.category_id join categories top on top.id = coalesce(c.parent_id, c.id) group by 1 order by gmv desc; -- ② 从未下过单的用户(两种等价写法;NOT IN 遇 user_id 为 NULL 会整题翻车) select u.id from users u where not exists (select 1 from orders o where o.user_id = u.id); select u.id from users u left join orders o on o.user_id = u.id where o.id is null; -- ③ 集合运算:近 30 天下过单、却从未登录过的用户 select distinct user_id from orders where created_at >= current_date - 30 except select user_id from user_logins where login_at >= current_date - 30; - 上机验证并订正
参考答案
验证顺序:先用宽松条件 count 核对量级(多表连接少一条 join 条件行数会暴涨,量级立刻暴露),再抽查具体行;集合运算题把两半分别跑一遍,确认差集真的该差。
- 把 D53 和今天的错题合并成一张「临场易错清单」
参考答案
清单条目四件套:场景 -> 错误写法 -> 正确写法 -> 触发词。只收 D53 和今天两场里真错过的题,不收「可能会错」的--那是知识大全,不是易错清单。
- 清单控制在一页纸内,面试前 10 分钟只看它
参考答案
一页纸 = 最多 15 条。超过就先砍只错过一次的:清单越长,面试前 10 分钟越看不完,等于没有。
- 对着清单再默写一遍最容易错的 3 条
参考答案
默写标准是白板级别:不运行、不看任何提示直接写对。最该进前三的候选:NOT IN 遇 NULL、left join 后 count 错列(该 count 右表主键)、窗口函数结果做筛选必须包子查询。