SQL 函数记不住?一张表全收好(高频 18 个,覆盖 80% 场景)
做了十年数据分析SQL 函数我天天用但说真的——没人能全记住。真要用的时候都是翻笔记。所以这篇就是我给自己、也是给你整理的高频函数速查表按聚合 / 字符串 / 日期 / 条件 / 数值分成 5 组每个给一句话用途 最常用写法。建议先收藏写 SQL 时对着抄用着用着就熟了。「SQL 从入门到精通」系列持续更新中关注我不迷路每篇都是实战干货——踩坑、速查、基础、进阶全覆盖。⚠️ 小提示MySQL / Oracle / PostgreSQL 在函数名上略有差异文末标了同一句在不同库可能要微调。 练习表复制即可建表随时练手本系列所有文章都用这 4 张表建一次就能跟着全系列练。DROPTABLEIFEXISTS员工表;CREATETABLE员工表(员工idINTPRIMARYKEY,姓名VARCHAR(20),部门VARCHAR(20),工资DECIMAL(10,2),邮箱VARCHAR(50),手机VARCHAR(20),入职日期DATE);INSERTINTO员工表(员工id,姓名,部门,工资,邮箱,手机,入职日期)VALUES(1,张三,技术部,9000.00,zhangsandemo.com,13800000001,2019-03-01),(2,李四,技术部,9000.00,lisidemo.com,13800000002,2020-07-15),(3,王五,销售部,9200.00,wangwudemo.com,13800000003,2018-01-10),(4,赵六,销售部,9200.00,zhaoliudemo.com,13800000004,2021-05-20);DROPTABLEIFEXISTS订单表;CREATETABLE订单表(订单idINTPRIMARYKEY,员工idINT,订单金额DECIMAL(10,2),下单时间DATETIME,付款时间DATETIME,状态VARCHAR(20));INSERTINTO订单表(订单id,员工id,订单金额,下单时间,付款时间,状态)VALUES(101,1,3000.00,2026-01-10 10:00:00,2026-01-10 10:05:00,已付款),(102,1,2500.00,2026-02-15 14:00:00,2026-02-15 14:10:00,已付款),(103,3,4000.00,2026-03-20 09:30:00,2026-03-20 09:40:00,已付款),(104,2,1500.00,2026-04-05 16:00:00,NULL,待付款);DROPTABLEIFEXISTS用户表;CREATETABLE用户表(用户idINTPRIMARYKEY,姓名VARCHAR(20),手机VARCHAR(20),邮箱VARCHAR(50),地址VARCHAR(100));INSERTINTO用户表(用户id,姓名,手机,邮箱,地址)VALUES(1,张三,13900000001,zhangsandemo.com,北京市朝阳区),(2,李四,13900000002,lisidemo.com,上海市浦东新区),(3,王五,13900000003,wangwudemo.com,广州市天河区);DROPTABLEIFEXISTS任务表;CREATETABLE任务表(任务idINTPRIMARYKEY,员工idINT,备注VARCHAR(100),状态VARCHAR(20));INSERTINTO任务表(任务id,员工id,备注,状态)VALUES(1,1,完成需求评审,已完成),(2,2,NULL,进行中),(3,3,修复线上bug,已完成),(4,4,NULL,待分配);一、聚合函数分组统计必用函数用途示例COUNT(*)数行数含 NULL 行SELECT COUNT(*) FROM 员工表COUNT(列)数某列非 NULL值SELECT COUNT(邮箱) FROM 员工表SUM(列)求和SELECT SUM(工资) FROM 员工表AVG(列)平均值忽略 NULLSELECT AVG(工资) FROM 员工表MAX(列)/MIN(列)最大 / 最小值SELECT MAX(工资) FROM 员工表踩坑提醒AVG和COUNT(列)都跳过 NULL算占比时容易算错先想清楚要不要把 NULL 算进去。二、字符串函数清洗文本用得最多函数用途示例CONCAT(a,b)拼接字符串SELECT CONCAT(姓名,部门) FROM 员工表SUBSTR(s,n,len)截取子串Oracle/PG 用SUBSTRINGSELECT SUBSTR(手机,1,3) FROM 用户表LENGTH(s)字符串长度SELECT LENGTH(姓名) FROM 员工表TRIM(s)去首尾空格SELECT TRIM(姓名) FROM 员工表REPLACE(s,a,b)把 a 替换成 bSELECT REPLACE(地址,市,) FROM 用户表UPPER(s)/LOWER(s)转大写 / 小写SELECT UPPER(姓名) FROM 员工表经验脏数据八成是空格和大小写搞的鬼进库前TRIMUPPER先洗一遍后面少踩坑。三、日期函数按时间统计绕不开函数用途示例MySQL 写法NOW()/CURDATE()当前时间 / 今天SELECT CURDATE()DATE(时间列)取日期部分SELECT DATE(下单时间) FROM 订单表DATEDIFF(a,b)两日期相差天数SELECT DATEDIFF(付款时间,下单时间) FROM 订单表DATE_FORMAT(d,%Y-%m)格式化MySQLSELECT DATE_FORMAT(下单时间,%Y-%m) FROM 订单表差异Oracle 用SYSDATE和TO_CHAR(d,YYYY-MM)PostgreSQL 用CURRENT_DATE和TO_CHAR(d,YYYY-MM)。换库记得改写法。四、条件函数分组打标签神器函数用途示例CASE WHEN ... THEN ... ELSE ... END多条件分支最常用SELECT CASE WHEN 工资10000 THEN 高 ELSE 普通 END FROM 员工表IF(条件,真,假)二选一MySQLSELECT IF(工资10000,高,普通) FROM 员工表COALESCE(a,b,...)返回第一个非 NULL 值SELECT COALESCE(手机,邮箱,无) FROM 用户表CASE WHEN是万能的所有分层 / 打标 / 区间需求都靠它务必练熟。五、数值函数算账用函数用途示例ROUND(x,n)四舍五入保留 n 位SELECT ROUND(工资/30,1) FROM 员工表ABS(x)绝对值SELECT ABS(工资-10000) FROM 员工表CEIL(x)/FLOOR(x)向上 / 向下取整SELECT CEIL(订单金额/1000) FROM 订单表 站队时间CASE WHEN vs IF你平时写哪个我站CASE WHEN——原因很简单IF 只有 MySQL 能用。当年我从 MySQL 迁移到 Oracle几百个IF(条件,a,b)全得改成CASE WHEN ... END改了整整一周改完眼睛都花了 。如果你只用 MySQLIF 确实写着短但万一以后换 Oracle/PostgreSQL/SQL Server全得重来。你呢评论区站个队A 队CASE WHEN 党跨库无忧B 队IF 党MySQL 专属写着爽C 队我两个都用过有故事要说 文末签名栏 我是Hello_world12131十年数据分析经验。这篇有用的话点个赞 收藏顺便关注我——SQL 避坑、速查表、基础教程持续更新关注不迷路。系列目录SQL 从入门到精通 - 完整路线图建议收藏相关推荐新手学 SQL 最常踩的 3 个坑附避坑清单SQL 多表关联查询入门INNER / LEFT / RIGHT JOIN⏭️下篇预告《篇03_ORDER BY_GROUP BY_HAVING_排序分组筛选》——基础篇第三弹搞定查询的最后三块拼图