0Pricing
Coding Interview Prep · 课时

计算列与表达式优先级

了解 SELECT 列表中的算术、连接和运算符优先级

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

SELECT 中的计算列

计算列是 SELECT 中通过表达式推导出值的列,而不是直接读取某个值,例如 price * quantity。请始终为它指定清晰的别名。

SELECT product,
       price,
       quantity,
       price * quantity AS line_total
FROM order_items;

算术运算符

SQL 提供了您所期待的数学运算符:+, -, *, /,以及取模运算。结果的类型取决于操作数,而下一个陷阱就隐藏在这里。

SELECT 7 + 3 AS sum_val,
       7 - 3 AS diff_val,
       7 * 3 AS prod_val,
       7 % 3 AS remainder;

整数除法陷阱

请注意:两个整数相除会执行整数除法,因此 5 / 2 的结果是 2,而不是 2.5。您可以将其中一侧转换为十进制类型,或乘以 1.0 来修复。

SELECT 5 / 2          AS int_div,    -- 2
       5 * 1.0 / 2    AS real_div,   -- 2.5
       CAST(5 AS DECIMAL) / 2 AS cast_div; -- 2.5

运算符优先级

SQL 遵循通常的数学优先级:* 和 / 先于 + 和 - 执行。因此,2 + 3 * 4 的结果是 14,而不是 20。括号会覆盖其他所有优先级规则。

SELECT 2 + 3 * 4      AS no_parens,  -- 14
       (2 + 3) * 4    AS with_parens; -- 20

实际折扣查询中的优先级

优先级错误很容易潜入业务逻辑。对于折后价格,price - price * rate 是正确的,因为 * 会先执行。请始终检查引擎实际采用的分组方式是否符合预期。

SELECT price,
       discount_rate,
       price - price * discount_rate / 100 AS net_price
FROM products;

字符串拼接

拼接文本的方式取决于数据库:Postgres 和标准 SQL 使用|| ,SQL Server 使用 +,MySQL 使用 CONCAT()。CONCAT() 是安全且具有可移植性的选择。

-- Postgres / standard
SELECT first_name || ' ' || last_name AS full_name
FROM employees;

-- Portable
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;

NULL 会污染算术运算

这是一个重要问题:任何包含 NULL 的数学运算都会得到 NULL。因此,对于缺少 bonus 的人员,base_salary + bonus 的结果是 NULL。请用 COALESCE 包装有风险的列,以提供默认值。

SELECT base_salary,
       bonus,
       base_salary + bonus            AS unsafe_total,
       base_salary + COALESCE(bonus,0) AS safe_total
FROM employees;

不同方言中拼接与 NULL 的处理

NULL 也会影响文本,而且不同方言的处理方式不同:Postgres 会让整个字符串消失,而 SQL Server 的 CONCAT 会将 NULL 视为空字符串。请用 COALESCE 包装每个片段,以获得可预测的输出。

SELECT COALESCE(first_name,'') || ' ' || COALESCE(last_name,'') AS full_name
FROM employees;

表达式中的函数

计算列可以轻松包装 ROUND、ABS 或 UPPER 等函数。函数调用本身就是另一种表达式,因此您可以直接在算术运算中嵌套它。

SELECT product,
       ROUND(price * quantity * 1.0, 2) AS line_total,
       UPPER(product)                   AS product_caps
FROM order_items;

类型强制转换与 CAST

当操作数类型不同时,SQL 会执行可能令人意外的隐式强制转换。请使用 CAST(expr AS type) 明确指定类型——面试官会将其视为谨慎且具有防御性的代码。

SELECT 'Order #' || CAST(order_id AS VARCHAR) AS label
FROM orders;

作为列的布尔表达式

像 price > 100 这样的比较本身就是一个表达式。Postgres 可以将其选择为 true/false,但具有可移植性的写法是使用 CASE,输出 1/0 或某个标签。

-- Portable
SELECT product,
       CASE WHEN price > 100 THEN 1 ELSE 0 END AS is_pricey
FROM products;

快速检查

计算该表达式。

回顾

回顾:请为计算列创建别名。使用类型转换来进行十进制除法,注意优先级,使用 CONCAT() 来实现可移植的文本拼接——还要记住 NULL 会污染数学运算,因此请用 COALESCE 保护它。

常见问题解答

「计算列与表达式优先级」课时是免费的吗?

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

「计算列与表达式优先级」这节课中我会学到什么?

了解 SELECT 列表中的算术、连接和运算符优先级 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「计算列与表达式优先级」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 列投影与别名陷阱
  2. 计算列与表达式优先级
  3. DISTINCT 与 GROUP BY 的去重比较
  4. SELECT 中的 CASE 表达式
← 返回 Coding Interview Prep