在 SQL 数据处理中,函数是提升效率的关键工具。它们能够对数据进行转换、计算和逻辑判断,让复杂的操作变得简洁高效。
字符串函数:数据格式化的利器
字符串函数主要用于处理文本类型的数据,在数据清洗、格式统一和信息提取中发挥重要作用。
函数 | 功能 |
---|---|
CONCAT(s1, s2, ..., sn) | 字符串拼接,将 s1, s2, ..., sn 拼接成一个字符串 |
LOWER(str) | 将字符串全部转为小写 |
UPPER(str) | 将字符串全部转为大写 |
LPAD(str, n, pad) | 左填充,用字符串 pad 对 str 的左边进行填充,达到 n 个字符串长度 |
RPAD(str, n, pad) | 右填充,用字符串 pad 对 str 的右边进行填充,达到 n 个字符串长度 |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str, start, len) | 返回从字符串 str 从 start 位置起的 len 个长度的字符串 |
REPLACE(column, source, replace) | 替换字符串 |
CONCAT 函数用于将多个字符串拼接成一个整体。例如,在员工信息表中,若需要将姓和名合并为完整姓名,可使用SELECT CONCAT(last_name, first_name) AS full_name FROM employees;。该函数在生成报表标题、组合地址信息等场景中频繁使用。
LOWER 和 UPPER 函数分别将字符串转为全小写和全大写。在用户注册系统中,为避免因大小写差异导致的重复账户,可通过SELECT LOWER(username) FROM user_registrations;统一用户名格式。
LPAD 和 RPAD 函数实现字符串的填充功能。以订单编号处理为例,若需将短编号统一为 8 位长度,可使用SELECT LPAD(order_id, 8, '0') AS formatted_id FROM orders;,这样 "123" 就会变成 "00000123",便于数据排序和展示。
TRIM 函数用于去除字符串首尾的空格。在处理用户输入的搜索关键词时,SELECT TRIM(search_term) FROM user_searches;能避免因误输入空格导致的查询结果偏差。
SUBSTRING 函数可从字符串中截取指定长度的子串。比如从身份证号码中提取出生年份,SELECT SUBSTRING(id_card, 7, 4) AS birth_year FROM residents;就能快速获取相关信息。
REPLACE 函数用于替换字符串中的特定内容。当需要统一产品名称中的 "公司" 为 " Corp" 时,SELECT REPLACE(product_name, '公司', ' Corp') FROM products;能批量完成修改。
数值函数:精准计算的保障
数值函数专注于数学运算,在金融分析、数据统计等领域不可或缺。
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x, y) | 返回 x/y 的模 |
RAND() | 返回 0~1 内的随机数 |
ROUND(x, y) | 求参数 x 的四舍五入值,保留 y 位小数 |
CEIL 和 FLOOR 函数分别实现向上取整和向下取整。在计算包裹运费时,若按重量向上取整收费,SELECT CEIL(weight) AS charged_weight FROM packages;可确保费用计算准确。
MOD 函数返回两个数相除的余数,常用于判断数字的奇偶性,如SELECT MOD(number, 2) AS is_odd FROM numbers;,结果为 1 表示奇数,0 表示偶数。
RAND 函数生成 0 到 1 之间的随机数,在抽样调查中非常实用。例如从客户列表中随机选取 10% 的样本,SELECT * FROM customers WHERE RAND() < 0.1;就能快速实现。
ROUND 函数对数值进行四舍五入并保留指定小数位数。在处理商品价格时,SELECT ROUND(price, 2) AS rounded_price FROM products;可将价格统一保留两位小数,符合货币展示规范。
日期函数:时间维度的数据分析
日期函数用于处理时间相关数据,为基于时间的分析提供支持。
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定 date 的年份 |
MONTH(date) | 获取指定 date 的月份 |
DAY(date) | 获取指定 date 的日期 |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期 / 时间值加上一个时间间隔 expr 后的时间值 |
DATEDIFF(date1, date2) | 返回起始时间 date1 和结束时间 date2 之间的天数 |
CURDATE、CURTIME 和 NOW 函数分别返回当前日期、当前时间和当前日期时间。在记录操作日志时,INSERT INTO operation_logs (action, operate_time) VALUES ('login', NOW());能准确记录事件发生的时间点。
YEAR、MONTH 和 DAY 函数从日期中提取年、月、日信息。在按月份统计销售额时,SELECT MONTH(sale_date) AS sale_month, SUM(amount) AS total_sales FROM sales GROUP BY sale_month;可清晰呈现各月销售情况。
DATE_ADD 函数用于日期的增减运算。计算会员到期日时,若会员有效期为 1 年,SELECT DATE_ADD(join_date, INTERVAL 1 YEAR) AS expiry_date FROM members;能自动得出到期时间。
DATEDIFF 函数计算两个日期之间的天数差。在计算员工工龄时,SELECT DATEDIFF(CURDATE(), hire_date) / 365 AS work_years FROM employees;可快速获取工作年限。
流程函数:逻辑判断的实现
流程函数能够根据条件返回不同结果,实现数据的分类和筛选。
函数 | 功能 |
---|---|
IF(value, t, f) | 如果 value 为 true,则返回 t,否则返回 f |
IFNULL(value1, value2) | 如果 value1 不为空,返回 value1,否则返回 value2 |
CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果 val1 为 true,返回 res1,... 否则返回 default 默认值 |
CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果 expr 的值等于 val1,返回 res1,... 否则返回 default 默认值 |
IF 函数根据条件返回两个值中的一个。判断学生成绩是否及格时,SELECT student_name, IF(score >= 60, '及格', '不及格') AS result FROM exam_scores;简洁明了。
IFNULL 函数用于处理空值。在计算用户平均评分时,为避免空值影响结果,SELECT IFNULL(average_rating, 0) AS rating FROM users;可将空值替换为 0。
CASE 函数提供更复杂的条件判断功能。在对员工进行年龄段划分时,
sql
SELECT name,
CASE
WHEN age < 25 THEN '青年'
WHEN age BETWEEN 25 AND 45 THEN '中年'
ELSE '老年'
END AS age_group
FROM employees;
能清晰呈现不同的年龄群体分布。另一种 CASE 函数形式可用于多值匹配,如判断工作地址所属城市级别:
sql
SELECT name,
CASE workaddress
WHEN '北京市' THEN '一线城市'
WHEN '上海市' THEN '一线城市'
ELSE '二线城市'
END AS address_level
FROM employee;