计算列与表达式优先级
了解 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 反馈 — 无需本地设置。