SQL常用函数

常用的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;
相关推荐
道长没有道观1 小时前
mysql database learn
数据库·mysql
code_li1 小时前
多数据高性能 同步 到本地数据库表里
数据库
一个天蝎座 白勺 程序猿1 小时前
Apache IoTDB(18):IoTDB时序数据库的数据同步之Pipe机制与插件同步指南
数据库·apache·时序数据库·iotdb
颜颜yan_1 小时前
告别“子查询性能陷阱“:金仓数据库智能下推优化器的设计与实测
数据库·oracle
sdanss1 小时前
MySQL——表的约束
数据库·mysql
吾诺1 小时前
MySQL远程连接错误解决:“Host is not allowed to connect to this MySQL server”详解
数据库·mysql
耶叶1 小时前
Android开发:用户注册和登录的数据库代码详细解释
android·数据库·kotlin
xuansec2 小时前
【PortSwigger】SQL注入第一题:WHERE 子句注入漏洞利用 —— 检索隐藏数据
数据库·sql
艾莉丝努力练剑2 小时前
【MYSQL】MYSQL学习的一大重点:MYSQL数据类型
android·linux·数据库·人工智能·学习·mysql·网络安全