常用的SQL函数可以分为几大类:
一、聚合函数(分组统计)
-- 基本聚合
COUNT() -- 计数
SUM() -- 求和
AVG() -- 平均值
MAX() -- 最大值
MIN() -- 最小值
-- 高级聚合
GROUP_CONCAT() -- 分组连接字符串(MySQL)
STRING_AGG() -- 分组连接字符串(SQL Server/PostgreSQL)
示例:
SELECT
department_id,
COUNT(*) AS 员工数,
AVG(salary) AS 平均工资,
MAX(salary) AS 最高工资,
STRING_AGG(name, ',') AS 员工列表
FROM employees
GROUP BY department_id;
二、字符串函数
-- 拼接
CONCAT(str1, str2, ...) -- 连接字符串
CONCAT_WS(separator, str1, ...) -- 用分隔符连接
-- 截取
SUBSTRING(str, start, length) -- 截取子串
LEFT(str, length) -- 左边截取
RIGHT(str, length) -- 右边截取
-- 处理
TRIM(str) -- 去空格
LTRIM(str) -- 去左边空格
RTRIM(str) -- 去右边空格
LOWER(str) -- 转小写
UPPER(str) -- 转大写
REPLACE(str, from, to) -- 替换
-- 查找
CHAR_LENGTH(str) -- 字符数
LENGTH(str) -- 字节数
INSTR(str, substring) -- 查找位置
LIKE '%pattern%' -- 模糊匹配
示例:
SELECT
CONCAT(first_name, ' ', last_name) AS 姓名,
LOWER(email) AS 邮箱,
SUBSTRING(phone, 1, 3) AS 区号,
REPLACE(address, '市', 'City') AS 地址
FROM users;
三、数值函数
-- 计算
ABS(x) -- 绝对值
ROUND(x, d) -- 四舍五入
CEIL(x) -- 向上取整
FLOOR(x) -- 向下取整
MOD(x, y) -- 取余
POWER(x, y) -- 幂运算
SQRT(x) -- 平方根
-- 随机
RAND() -- 随机数0-1
RAND() * 100 -- 随机数0-100
-- 符号
SIGN(x) -- 符号函数
示例:
SELECT
salary,
ROUND(salary * 1.1, 2) AS 涨薪10%后,
CEIL(salary / 1000) * 1000 AS 千位取整,
MOD(salary, 1000) AS 零头
FROM employees;
四、日期时间函数
-- 获取当前
NOW() -- 当前日期时间
CURDATE() -- 当前日期
CURTIME() -- 当前时间
SYSDATE() -- 系统时间
-- 提取部分
YEAR(date) -- 年
MONTH(date) -- 月
DAY(date) -- 日
HOUR(time) -- 时
MINUTE(time) -- 分
SECOND(time) -- 秒
DAYOFWEEK(date) -- 星期几
DAYOFYEAR(date) -- 一年中的第几天
-- 计算
DATE_ADD(date, INTERVAL 1 DAY) -- 加1天
DATE_SUB(date, INTERVAL 1 MONTH) -- 减1月
DATEDIFF(date1, date2) -- 相差天数
TIMESTAMPDIFF(unit, start, end) -- 时间差
-- 格式化
DATE_FORMAT(date, '%Y-%m-%d') -- 格式化日期
STR_TO_DATE(str, format) -- 字符串转日期
示例:
SELECT
name,
DATE_FORMAT(birthday, '%Y年%m月%d日') AS 生日,
YEAR(NOW()) - YEAR(birthday) AS 年龄,
DATE_ADD(hire_date, INTERVAL 1 YEAR) AS 转正日期
FROM employees;
五、条件函数
-- 判断
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END
-- 简单判断
IF(condition, true_value, false_value)
IFNULL(expr1, expr2) -- 如果expr1为NULL返回expr2
COALESCE(expr1, expr2, ...) -- 返回第一个非NULL值
NULLIF(expr1, expr2) -- 相等返回NULL,否则返回expr1
示例:
SELECT
name,
salary,
CASE
WHEN salary >= 10000 THEN '高薪'
WHEN salary >= 5000 THEN '中薪'
ELSE '低薪'
END AS 薪资等级,
COALESCE(bonus, 0) AS 奖金
FROM employees;
六、窗口函数(分析函数)
-- 排名
ROW_NUMBER() -- 连续编号
RANK() -- 排名(有间隔)
DENSE_RANK() -- 密集排名
-- 前后值
LAG(col, n) -- 前n行的值
LEAD(col, n) -- 后n行的值
FIRST_VALUE(col) -- 分组第一个值
LAST_VALUE(col) -- 分组最后一个值
-- 聚合
SUM(col) OVER (PARTITION BY ...)
AVG(col) OVER (PARTITION BY ...)
COUNT(col) OVER (PARTITION BY ...)
示例:
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS 部门排名,
LAG(salary, 1) OVER (ORDER BY salary) AS 前一人工资
FROM employees;
七、JSON函数(现代数据库)
-- MySQL
JSON_EXTRACT(json, path) -- 提取
JSON_OBJECT(key, val, ...) -- 创建对象
JSON_ARRAY(val1, val2, ...) -- 创建数组
JSON_CONTAINS(json, val) -- 是否包含
-- PostgreSQL
jsonb_extract_path_text()
jsonb_build_object()
八、系统信息函数
VERSION() -- 数据库版本
DATABASE() -- 当前数据库
USER() -- 当前用户
LAST_INSERT_ID() -- 最后插入的ID
UUID() -- 生成UUID
常用组合技巧:
-- 1. 分页查询
SELECT * FROM table LIMIT 20 OFFSET 40; -- 第3页,每页20条
-- 2. 去重计数
SELECT COUNT(DISTINCT column) FROM table;
-- 3. 分组TOP N
SELECT * FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
FROM employees
) t WHERE rn <= 3;
-- 4. 存在性检查
SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE A.id = B.aid);
-- 5. NULL处理
SELECT COALESCE(name, '未知') AS 姓名,
IFNULL(score, 0) AS 分数
FROM students;