💡 收藏这篇就够了!最全的MySQL函数速查,新手必备!
大家好呀!我是数据库小学妹👋
写SQL的时候,是不是经常遇到这种情况:
- 想把两个字段的内容拼在一起?→ 找函数
- 想把字符串转成大写?→ 找函数
- 想算两个日期的天数差?→ 找函数
每次都要去搜,太浪费时间了。今天我把自己整理的MySQL常用函数速查表分享出来,建议收藏!
一、字符串函数:处理文本数据
💡 常用字符串函数速查
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| CONCAT | CONCAT(str1, str2, ...) | 连接字符串 | CONCAT('Hello', ' ', 'World') → 'Hello World' |
| CONCAT_WS | CONCAT_WS(sep, str1, str2, ...) | 用分隔符连接 | CONCAT_WS('-', '2024', '01', '15') → '2024-01-15' |
| SUBSTRING | SUBSTRING(str, pos, len) | 截取子串 | SUBSTRING('Hello World', 1, 5) → 'Hello' |
| LEFT | LEFT(str, len) | 左侧截取 | LEFT('Hello World', 5) → 'Hello' |
| RIGHT | RIGHT(str, len) | 右侧截取 | RIGHT('Hello World', 5) → 'World' |
| LENGTH | LENGTH(str) | 字符串长度 | LENGTH('Hello') → 5 |
| TRIM | TRIM(str) | 去除空格 | TRIM(' Hello ') → 'Hello' |
| LTRIM | LTRIM(str) | 去除左侧空格 | LTRIM(' Hello') → 'Hello' |
| RTRIM | RTRIM(str) | 去除右侧空格 | RTRIM('Hello ') → 'Hello' |
| UPPER | UPPER(str) | 转大写 | UPPER('hello') → 'HELLO' |
| LOWER | LOWER(str) | 转小写 | LOWER('HELLO') → 'hello' |
| REPLACE | REPLACE(str, old, new) | 替换字符串 | REPLACE('Hello World', 'World', 'MySQL') → 'Hello MySQL' |
| INSTR | INSTR(str, substr) | 查找子串位置 | INSTR('Hello World', 'World') → 7 |
| LOCATE | LOCATE(substr, str) | 查找子串位置 | LOCATE('World', 'Hello World') → 7 |
| REVERSE | REVERSE(str) | 反转字符串 | REVERSE('Hello') → 'olleH' |
💡 字符串函数实战案例
-- 1. 拼接姓名和邮箱
SELECT CONCAT(first_name, ' ', last_name, ' <', email, '>') as full_info
FROM users;
-- 2. 提取邮箱域名
SELECT email, SUBSTRING(email, INSTR(email, '@') + 1) as domain
FROM users;
-- 3. 格式化电话号码
SELECT CONCAT_WS('-', LEFT(phone, 3), SUBSTRING(phone, 4, 4), RIGHT(phone, 4)) as formatted_phone
FROM users;
-- 4. 统计用户名长度
SELECT username, LENGTH(username) as username_length
FROM users
ORDER BY username_length DESC;
-- 5. 替换敏感信息
SELECT CONCAT(LEFT(email, 3), '***', SUBSTRING(email, INSTR(email, '@'))) as masked_email
FROM users;
二、数学函数
💡 常用数学函数速查
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ABS | ABS(x) | 绝对值 | ABS(-10) → 10 |
| CEIL | CEIL(x) | 向上取整 | CEIL(3.14) → 4 |
| FLOOR | FLOOR(x) | 向下取整 | FLOOR(3.14) → 3 |
| ROUND | ROUND(x, d) | 四舍五入 | ROUND(3.14159, 2) → 3.14 |
| TRUNCATE | TRUNCATE(x, d) | 截断小数 | TRUNCATE(3.14159, 2) → 3.14 |
| RAND | RAND() | 随机数 | RAND() → 0.123456 |
| POW | POW(x, y) | 幂运算 | POW(2, 3) → 8 |
| SQRT | SQRT(x) | 平方根 | SQRT(16) → 4 |
| MOD | MOD(x, y) | 取模 | MOD(10, 3) → 1 |
| SIGN | SIGN(x) | 符号 | SIGN(-5) → -1, SIGN(0) → 0, SIGN(5) → 1 |
💡 数学函数实战案例
-- 1. 计算订单折扣价
SELECT
product_name,
price,
discount_rate,
ROUND(price * (1 - discount_rate), 2) as discounted_price
FROM products;
-- 2. 统计订单金额分布
SELECT
FLOOR(amount / 100) * 100 as amount_range,
COUNT(*) as order_count
FROM orders
GROUP BY FLOOR(amount / 100)
ORDER BY amount_range;
-- 3. 随机抽取10个用户
SELECT * FROM users
ORDER BY RAND()
LIMIT 10;
-- 4. 计算商品评分(四舍五入到1位小数)
SELECT
product_name,
AVG(rating) as avg_rating,
ROUND(AVG(rating), 1) as avg_rating_rounded
FROM product_reviews
GROUP BY product_id;
-- 5. 判断订单金额奇偶
SELECT
id,
amount,
CASE WHEN MOD(amount, 2) = 0 THEN '偶数' ELSE '奇数' END as parity
FROM orders;
三、日期时间函数(写报表必备)
💡 常用日期函数速查
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| NOW | NOW() | 当前日期时间 | NOW() → '2024-01-15 14:30:00' |
| CURDATE | CURDATE() | 当前日期 | CURDATE() → '2024-01-15' |
| CURTIME | CURTIME() | 当前时间 | CURTIME() → '14:30:00' |
| DATE | DATE(expr) | 提取日期部分 | DATE('2024-01-15 14:30:00') → '2024-01-15' |
| TIME | TIME(expr) | 提取时间部分 | TIME('2024-01-15 14:30:00') → '14:30:00' |
| YEAR | YEAR(date) | 提取年份 | YEAR('2024-01-15') → 2024 |
| MONTH | MONTH(date) | 提取月份 | MONTH('2024-01-15') → 1 |
| DAY | DAY(date) | 提取日期 | DAY('2024-01-15') → 15 |
| HOUR | HOUR(time) | 提取小时 | HOUR('14:30:00') → 14 |
| MINUTE | MINUTE(time) | 提取分钟 | MINUTE('14:30:00') → 30 |
| SECOND | SECOND(time) | 提取秒 | SECOND('14:30:00') → 0 |
| DATE_ADD | DATE_ADD(date, INTERVAL expr unit) | 日期加法 | DATE_ADD('2024-01-15', INTERVAL 7 DAY) → '2024-01-22' |
| DATE_SUB | DATE_SUB(date, INTERVAL expr unit) | 日期减法 | DATE_SUB('2024-01-15', INTERVAL 7 DAY) → '2024-01-08' |
| DATEDIFF | DATEDIFF(date1, date2) | 日期差(天) | DATEDIFF('2024-01-15', '2024-01-01') → 14 |
| TIMESTAMPDIFF | TIMESTAMPDIFF(unit, datetime1, datetime2) | 时间差 | TIMESTAMPDIFF(HOUR, '2024-01-15 10:00:00', '2024-01-15 14:00:00') → 4 |
| DATE_FORMAT | DATE_FORMAT(date, format) | 格式化日期 | DATE_FORMAT('2024-01-15', '%Y年%m月%d日') → '2024年01月15日' |
💡 日期函数实战案例
-- 1. 查询最近7天的订单
SELECT * FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
-- 2. 统计每月订单数
SELECT
DATE_FORMAT(order_date, '%Y-%m') as month,
COUNT(*) as order_count,
SUM(amount) as total_amount
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month DESC;
-- 3. 计算用户注册天数
SELECT
username,
created_at,
DATEDIFF(CURDATE(), created_at) as days_since_register
FROM users;
-- 4. 格式化生日
SELECT
name,
birthday,
DATE_FORMAT(birthday, '%m月%d日') as birthday_formatted
FROM users;
-- 5. 查询本周订单
SELECT * FROM orders
WHERE YEARWEEK(order_date, 1) = YEARWEEK(CURDATE(), 1);
四、聚合函数
💡 常用聚合函数速查
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| COUNT | COUNT(expr) | 计数 | COUNT(*) → 总行数 |
| SUM | SUM(expr) | 求和 | SUM(amount) → 总金额 |
| AVG | AVG(expr) | 平均值 | AVG(score) → 平均分 |
| MAX | MAX(expr) | 最大值 | MAX(price) → 最高价格 |
| MIN | MIN(expr) | 最小值 | MIN(price) → 最低价格 |
| GROUP_CONCAT | GROUP_CONCAT(expr) | 分组连接 | GROUP_CONCAT(name) → '张三,李四,王五' |
💡 聚合函数实战案例
-- 1. 统计每个用户的订单数和总金额
SELECT
user_id,
COUNT(*) as order_count,
SUM(amount) as total_amount,
AVG(amount) as avg_amount,
MAX(amount) as max_amount,
MIN(amount) as min_amount
FROM orders
GROUP BY user_id;
-- 2. 统计每个类别的商品数量和平均价格
SELECT
category_id,
COUNT(*) as product_count,
AVG(price) as avg_price,
MAX(price) as max_price,
MIN(price) as min_price
FROM products
GROUP BY category_id;
-- 3. 拼接每个用户的订单ID
SELECT
user_id,
GROUP_CONCAT(order_id ORDER BY order_date DESC SEPARATOR ', ') as order_ids
FROM orders
GROUP BY user_id;
-- 4. 统计每个年龄段的用户数
SELECT
FLOOR(age / 10) * 10 as age_group,
COUNT(*) as user_count
FROM users
GROUP BY FLOOR(age / 10)
ORDER BY age_group;
五、条件函数
💡 常用条件函数速查
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| IF | IF(expr, true_val, false_val) | 简单条件判断 | IF(score >= 60, '及格', '不及格') |
| IFNULL | IFNULL(expr1, expr2) | 空值替换 | IFNULL(phone, '未填写') |
| NULLIF | NULLIF(expr1, expr2) | 相等返回NULL | NULLIF(0, 0) → NULL |
| CASE | CASE WHEN ... THEN ... ELSE ... END | 多条件判断 | CASE WHEN score >= 90 THEN '优秀' WHEN score >= 60 THEN '及格' ELSE '不及格' END |
| COALESCE | COALESCE(expr1, expr2, ...) | 返回第一个非空值 | COALESCE(phone1, phone2, '无') |
💡 条件函数实战案例
-- 1. 根据分数评级
SELECT
student_name,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END as grade
FROM scores;
-- 2. 处理空值
SELECT
username,
IFNULL(email, '未填写') as email,
IFNULL(phone, '未填写') as phone
FROM users;
-- 3. 计算订单状态
SELECT
id,
amount,
status,
IF(status = 'paid', '已支付', '未支付') as status_text
FROM orders;
-- 4. 优先使用第一个非空联系方式
SELECT
username,
COALESCE(phone1, phone2, phone3, '无联系方式') as contact_phone
FROM users;
-- 5. 计算折扣(满1000打9折)
SELECT
product_name,
price,
IF(price >= 1000, price * 0.9, price) as final_price
FROM products;
六、类型转换函数
💡 常用类型转换函数速查
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| CAST | CAST(expr AS type) | 类型转换 | CAST('123' AS SIGNED) → 123 |
| CONVERT | CONVERT(expr, type) | 类型转换 | CONVERT('123', SIGNED) → 123 |
| DATE | DATE(expr) | 转日期 | DATE('2024-01-15 14:30:00') → '2024-01-15' |
| TIME | TIME(expr) | 转时间 | TIME('2024-01-15 14:30:00') → '14:30:00' |
💡 类型转换实战案例
-- 1. 字符串转数字
SELECT
product_name,
price_str,
CAST(price_str AS DECIMAL(10,2)) as price_num
FROM products;
-- 2. 数字转字符串
SELECT
id,
amount,
CONCAT('¥', CAST(amount AS CHAR)) as amount_text
FROM orders;
-- 3. 日期字符串转日期类型
SELECT
order_date_str,
CAST(order_date_str AS DATE) as order_date
FROM orders_temp;
-- 4. 时间戳转日期时间
SELECT
timestamp_col,
FROM_UNIXTIME(timestamp_col) as datetime_col
FROM logs;
-- 5. 处理混合类型比较
SELECT * FROM products
WHERE CAST(price AS DECIMAL(10,2)) > 1000;
七、新手避坑指南(⚠️常见错误)
| 错误 | 后果 | 正确做法 |
|---|---|---|
| 忘记NULL处理 | 结果为NULL | 使用IFNULL或COALESCE |
| 字符串比较不区分大小写 | 逻辑错误 | 使用BINARY关键字 |
| 日期格式错误 | 查询失败 | 使用DATE_FORMAT统一格式 |
| 浮点数精度问题 | 计算错误 | 使用DECIMAL类型 |
| 函数嵌套过深 | 难以维护 | 适当拆分逻辑 |
八、函数速查表完整版

九、学习心得
📝 核心总结(三句话):
1️⃣ 函数是SQL的灵魂:掌握常用函数,让查询更强大
2️⃣ 分类记忆更高效:按功能分类,快速查找
3️⃣ 实践出真知:多写多练,熟能生巧
👋 我是数据库小学妹一个用设计师思维学数据库的转行人。我们一起,把复杂的技术变得简单有趣!💕---
本文为个人学习整理,函数均基于MySQL 8.0版本,其他数据库可能略有差异。