SQL表达式是数据库中用于计算、处理和转换数据的核心工具,它可以嵌入到查询语句的各个部分,实现复杂的数据处理逻辑,避免将数据全部取回应用层再进行运算,降低系统开销。

SQL表达式的基础概念
SQL表达式是由列名、常量、运算符、函数等组合而成的式子,最终会返回一个具体的值。它可以在SELECT、WHERE、ORDER BY、UPDATE等子句中使用,常见的表达式类型包括算术表达式、条件表达式、字符串表达式、日期表达式等。
算术表达式的灵活使用
算术表达式可以对数值类型的列进行加减乘除等运算,适合处理价格计算、数量统计等场景。比如在订单表中计算订单的总金额,就可以直接在查询中使用算术表达式。
-- 计算订单总金额,单价乘以数量再减去折扣
SELECT
order_id,
unit_price * quantity - discount AS total_amount
FROM order_detail;
也可以在更新语句中使用算术表达式批量修改数据,比如给所有商品的价格上调10%:
-- 商品价格上调10% UPDATE product SET price = price * 1.1 WHERE status = 1;
条件表达式的灵活使用
条件表达式可以根据不同的条件返回不同的结果,最常用的就是CASE WHEN表达式,适合处理状态转换、分级统计等场景。比如把用户的状态值转换为对应的中文描述:
-- 将用户状态转换为中文描述
SELECT
user_id,
user_name,
CASE user_status
WHEN 0 THEN '未激活'
WHEN 1 THEN '正常'
WHEN 2 THEN '冻结'
ELSE '未知状态'
END AS status_desc
FROM user_info;
条件表达式还可以结合聚合函数使用,实现分组统计的灵活计算,比如统计不同分数段的学生数量:
-- 统计各分数段的学生数量
SELECT
SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS excellent_count,
SUM(CASE WHEN score >= 60 AND score < 90 THEN 1 ELSE 0 END) AS pass_count,
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS fail_count
FROM student_score;
字符串表达式的灵活使用
字符串表达式可以对文本类型的列进行拼接、截取、转换等操作,适合处理姓名组合、地址格式化等场景。比如拼接用户的姓和名得到完整姓名:
-- 拼接姓和名得到完整姓名
SELECT
user_id,
CONCAT(last_name, first_name) AS full_name
FROM user_info;
也可以结合条件表达式处理空值情况,比如当用户昵称为空时显示默认昵称:
-- 昵称为空时显示默认昵称
SELECT
user_id,
COALESCE(nickname, '默认用户') AS display_name
FROM user_info;
日期表达式的灵活使用
日期表达式可以对日期类型的列进行加减、格式转换、间隔计算等操作,适合处理有效期判断、时间差计算等场景。比如查询最近7天内的新增订单:
-- 查询最近7天的新增订单
SELECT
order_id,
order_time
FROM order_info
WHERE order_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
还可以计算用户的注册时长,以天为单位展示:
-- 计算用户注册天数
SELECT
user_id,
DATEDIFF(CURDATE(), register_time) AS register_days
FROM user_info;
SQL表达式的使用注意事项
- 在
WHERE子句中使用表达式可能会导致索引失效,比如对列进行函数运算后再判断,尽量把表达式放在条件的一侧,避免对列直接运算。 - 表达式的返回值类型要和上下文匹配,比如字符串表达式不能用于数值比较的场景。
- 复杂表达式可以拆分成多个简单的表达式,提升可读性和维护性,避免单条SQL过于冗长。