0Pricing
Coding Interview Prep · 课时

列数与类型兼容性

掌握结果集要满足哪些组合规则,以及常见的不匹配错误

列数与类型兼容性 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。

面试官重点考查的兼容性规则

每个集合运算(UNION、INTERSECT、EXCEPT)都要求两个结果集彼此UNION 兼容。面试官会通过这个问题考查您是否了解这些查询悄然出错的方式。

有两条规则决定兼容性:列数必须匹配,且对应位置的数据类型必须兼容。任何一条不满足,都会导致错误或出人意料的结果。

规则 1:列数相同

两个查询必须返回相同数量的列。如果第一个查询返回三列,而第二个查询返回两列,数据库就会拒绝该语句。

这是面试中集合运算最常见的错误,尤其是在有人修改一个分支后忘记修改另一个分支的情况下。

SELECT id, name, city FROM a
UNION
SELECT id, name FROM b;
-- ERROR: each UNION query must have the same number of columns

规则 2:按位置使用兼容类型

列是按位置而不是按名称匹配的。查询一的第一列会与查询二的第一列配对,后面的列依此类推。每一对列的类型都必须兼容。

兼容通常意味着可以隐式转换:INT 和 BIGINT 没问题;INT 和 DATE 通常不行。

SELECT id, signup_date FROM a
UNION
SELECT id, signup_date FROM b;
-- positions: (int,date) vs (int,date) -> OK

重要的是位置,而不是名称

一个容易忽略的陷阱是:只要位置对应且类型兼容,即使列名不同也仍然可以合并。反过来,名称相同但顺序错误也会使数据错位。

请始终按列的位置解读集合运算。面试官会故意调换列的顺序来考查这一点。

SELECT name, id FROM a
UNION ALL
SELECT id, name FROM b;
-- name<->id swapped: types may clash or data lands in wrong column

输出列名

结果集会从第一个查询中获取列名。第二个查询的标签会被丢弃。要控制表头,请为第一个分支中的列设置别名。

因此,后续的 ORDER BY 必须引用第一个查询的名称,或使用序号位置。

SELECT id AS user_id, city AS location FROM a
UNION ALL
SELECT id, town FROM b;
-- output headers: user_id, location

隐式类型转换

当按位置配对的两列类型不同但彼此兼容时,引擎会选择一个足够宽泛、能够容纳两者的结果类型。将 INT 与 DECIMAL 合并后,通常会得到 DECIMAL。

在面试中提到这种转换能体现您的深入理解:您知道该列不会报错,而是会提升为更宽泛的类型。

SELECT amount FROM int_table   -- INT
UNION ALL
SELECT amount FROM dec_table;  -- DECIMAL
-- result column is DECIMAL

用 NULL 填充缺失列

当两个查询的结构自然不同时,可以通过添加占位列来对齐。常见做法是选择 NULL(通常先将其转换为某种类型),以填充另一个分支中的对应位置。

对 NULL 进行 CAST 可避免引擎猜测类型,并保持列兼容。

SELECT id, phone, CAST(NULL AS VARCHAR) AS email FROM a
UNION ALL
SELECT id, CAST(NULL AS VARCHAR), email FROM b;

类型不匹配导致失败的示例

这里一个分支中的第二列是日期,另一个分支中的第二列是字符串。严格的引擎会拒绝此语句;宽松的引擎可能进行不可预测的强制转换。安全的修复方式是显式使用 CAST,让两侧保持一致。

面试时,请提出强制转换,而不要依赖隐式转换。

SELECT id, CAST(event_date AS VARCHAR) FROM a
UNION ALL
SELECT id, label FROM b;
-- both second columns now VARCHAR -> compatible

这些规则适用于所有集合运算符

列数和类型兼容性规则对于 UNION、UNION ALL、INTERSECT 和 EXCEPT 完全相同。它们都会垂直堆叠结果集,并且都要求输入彼此 UNION 兼容。

因此,一份思维清单就能覆盖每个集合运算:统计列数,按位置检查类型,并从第一个查询控制名称。

SELECT id, city FROM a
INTERSECT
SELECT id, city FROM b;
-- same compatibility rules as UNION

执行前检查清单

在合并结果集之前,请确认:

  • 每个分支的列数相同。
  • 每个按位置配对的列类型兼容(不确定时使用 CAST)。
  • 列的逻辑顺序相同。
  • 在第一个查询中设置别名,以获得清晰的输出名称。

在面试中大声说出这份清单,可以避免那些不易察觉的错位错误。

将这些内容串起来

兼容性问题大多可以避免。列数不同时,错误通常很明显;而列被调换或意外进行类型转换时,错误则可能悄无声息。按列位置解读查询,并有意进行 CAST,可以保持集合运算正确。

自信的回答会列出这两条规则,提到按位置匹配,并指出输出名称来自第一个查询。

快速检查

数据库如何决定两个 UNION 分支中的哪些列彼此对应?

回顾

要点:

  • 所有集合运算符都要求每个分支具有相同的列数。
  • 列是按位置匹配的,每一对列的类型都必须兼容。
  • 兼容类型可能会被转换为更宽泛的公共类型。
  • 使用 CAST(NULL AS type) 为结构不同的查询填充列。
  • 输出名称来自第一个查询。

常见问题解答

「列数与类型兼容性」课时是免费的吗?

是的 — 「列数与类型兼容性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。

「列数与类型兼容性」这节课中我会学到什么?

掌握结果集要满足哪些组合规则,以及常见的不匹配错误 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Coding Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「列数与类型兼容性」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Coding Interview Prep 课中编写并运行代码吗?

能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. UNION 与 UNION ALL
  2. 列数与类型兼容性
  3. 使用 INTERSECT 和 EXCEPT 进行比较
  4. 使用连接模拟集合运算
← 返回 Coding Interview Prep