SDET / SWE · Technical Fundamentals

TikTok SQL Join:匹配、保留行、NULL 与过滤位置

通过重复key和NULL例子区分inner/outer/cross,并解释WHERE为什么会消掉左连接未匹配行。

题目重点:通过重复key和NULL例子区分inner/outer/cross,并解释WHERE为什么会消掉左连接未匹配行。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练SQL相等条件JOIN,NULL按三值逻辑;不假定key唯一。
  • right/full支持依具体数据库版本,逻辑语义单独讨论。

解题路线

  1. INNER JOIN只保留条件为True的配对,LEFT保留所有左行并给未匹配右列NULL,RIGHT对称,FULL保留两侧未匹配行,CROSS返回所有笛卡尔配对。
  2. 重复key会一对多或多对多展开,不是根据key自动去重。左一行匹配右两行便输出两行,COUNT与SUM会相应增长,业务汇总需先明确粒度。
  3. NULL=NULL不是True,因此普通等值JOIN不把两个NULL匹配;未匹配LEFT输出的NULL与右表原始NULL可能难区分,应使用非空标识或匹配标记判断。
  4. ON决定哪些配对能匹配,WHERE在连接后过滤。LEFT JOIN后WHERE右表status=active会剔除补NULL行,可能使结果像inner;若要保留无匹配左行,应把适当条件放ON并核对需求。
  5. 逻辑JOIN类型与物理算法分开:nested loop、hash join、merge join由索引、排序和规模决定。不能把INNER JOIN一概说O(NM),也不能忽略输出可能本身就为N·M。
  6. 测试无匹配、重复key、NULL、空表与过滤位置。用小表手算配对数,再查执行结果,避免只在一对一干净样本上验证。

手动走一遍

左id=[1,2,NULL],右=[2,2,3,NULL]:inner两行(2,2);left另加(1,NULL)和(NULL,NULL),共4。left后WHERE b.id=2只剩两行;cross有3×4=12行。SQL例子已实际执行核对。

规模与取舍

输出R行至少Ω(R);物理nested loop粗O(NM),hash等值常见期望O(N+M+R)加内存,merge需已有排序或排序成本。

易错点与追问

容易失分的边界

  • JOIN按key自动去重。
  • NULL相等会匹配。
  • LEFT后右条件WHERE仍保留全部左行。

继续深挖

  • 如何表达anti/semi join?
  • 如何避免汇总重复放大?
  • ON与WHERE等价需要什么条件?

技术参考

✓已复制微信号!