SQL中可直接在SELECT中用算术运算符计算列或常量并用AS命名动态列,支持行级实时计算、NULL处理(如COALESCE)、类型转换(CAST/TRY_CAST)及函数组合(ROUND、CEILING、CASE),但WHERE中不可用计算列别名。

在SQL中,你可以直接在SELECT语句中使用算术运算符(+、-、*、/、%)对列或常量进行计算,并用别名(AS)为结果命名,从而生成动态计算列——它不存储在表中,只在查询时实时计算。
基本算术运算与别名定义
最常用的方式是在SELECT后写出表达式,并用AS指定列名。数据库会按行逐条计算,支持列间运算、列与常量混合运算。
-
例如:计算商品销售毛利 = 售价 - 成本
SELECT product_name, price, cost, (price - cost) AS gross_profit FROM products; -
例如:计算年销售额 = 月均销售额 × 12
SELECT name, monthly_sales, (monthly_sales * 12) AS annual_sales FROM departments; - 注意:除法可能产生NULL(如除零),部分数据库(如PostgreSQL)会报错,MySQL默认返回NULL;建议配合CASE或COALESCE处理异常
处理空值与数据类型隐式转换
参与运算的列若含NULL,整个表达式结果为NULL;数值与字符串混用时,不同数据库行为不同(如MySQL尝试转数字,SQL Server可能报错)。
- 用
COALESCE(column, 0)把NULL转为0再参与计算,避免结果全为NULL - 显式转换更安全:如
CAST(quantity AS DECIMAL(10,2)) * unit_price - 字符串转数推荐用
TRY_CAST()(SQL Server)或SAFE_CAST()(BigQuery),失败时返回NULL而非报错
结合函数增强计算能力
算术运算常与内置函数组合,实现四舍五入、取整、条件计算等。
- 保留两位小数:ROUND(price * 1.1, 2) AS tax_included
- 向上取整发货箱数:CEILING(quantity / 24.0) AS boxes_needed
- 条件定价:CASE WHEN discount > 0 THEN price * (1 - discount) ELSE price END AS final_price
在WHERE或ORDER BY中使用计算列
计算列可直接用于过滤和排序,但不能在WHERE中用其别名(因执行顺序:WHERE早于SELECT),需重复表达式或用子查询/CTE。
- ✅ 正确(重复表达式):
WHERE (price - cost) > 10 - ✅ 正确(子查询):
SELECT * FROM (SELECT *, (price - cost) AS profit FROM products) t WHERE profit > 10; - ❌ 错误:
SELECT (price - cost) AS profit FROM products WHERE profit > 10;(多数数据库报“列不存在”)










