Mysql常用函数解析

字符串函数

CONCAT(str1, str2, ...)

将多个字符串连接成一个字符串。

sql 复制代码
SELECT CONCAT('Hello', ' ', 'World'); -- 输出: Hello World

​​SUBSTRING(str, start, length)

截取字符串的子串(起始位置从1开始)。

sql 复制代码
SELECT SUBSTRING('MySQL', 3, 2); -- 输出: 'SQ'

​​LENGTH(str)

返回字符串的字节数(注意字符集影响)。

sql 复制代码
SELECT LENGTH('数据库'); -- UTF-8下输出: 9(每个中文3字节)

CHAR_LENGTH(str)

返回字符串的字符数(忽略字节)。

sql 复制代码
SELECT CHAR_LENGTH('数据库'); -- 输出: 3

​TRIM([LEADING|TRAILING|BOTH] 'char' FROM str)

去除字符串两端(或指定方向)的指定字符。

sql 复制代码
SELECT TRIM('   MySQL   '); -- 输出: 'MySQL'

数值函数

​​​ROUND(num, decimals)​​

四舍五入到指定小数位数。

sql 复制代码
SELECT ROUND(3.1415, 2); -- 输出: 3.14

​​​CEIL(num)​​ 和 ​​FLOOR(num)

向上取整和向下取整。

sql 复制代码
SELECT CEIL(3.2), FLOOR(3.8); -- 输出: 4, 3

​​​​​RAND()

生成0到1之间的随机浮点数。

sql 复制代码
SELECT FLOOR(RAND() * 100); -- 生成0-99的随机整数

​​​​​​​ABS(num)

返回绝对值。

sql 复制代码
SELECT ABS(-10); -- 输出: 10

日期时间函数​

​​​​​​​​​NOW()

返回当前日期和时间(格式:YYYY-MM-DD HH:MM:SS)。

sql 复制代码
SELECT NOW(); -- 输出: 2023-10-01 14:30:00

​​​​​​​​​​​DATE_FORMAT(date, format)

格式化日期时间。

sql 复制代码
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 输出: 2023年10月01日

​​DATEDIFF(date1, date2)

计算两个日期之间的天数差。

sql 复制代码
SELECT DATEDIFF('2023-10-10', '2023-10-01'); -- 输出: 9

TIMESTAMPDIFF(unit, start, end)

计算两个日期的时间差(单位:DAY/MONTH/YEAR等)。

sql 复制代码
SELECT TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-10-01'); -- 输出: 9
-- 若 end_time 早于 start_time,结果为负数。

支持的 unit 参数值:

单位 说明 示例
MICROSECOND 微秒差(1秒=1,000,000微秒) TIMESTAMPDIFF(MICROSECOND, '08:00:00', '08:00:00.123456') → 123456
SECOND 整数秒差(忽略微秒部分) TIMESTAMPDIFF(SECOND, '08:00:00', '08:01:30') → 90
MINUTE 整数分钟差(基于秒差向下取整) TIMESTAMPDIFF(MINUTE, '08:00:00', '08:01:30') → 1
HOUR 整数小时差(基于分钟差向下取整) TIMESTAMPDIFF(HOUR, '08:15:00', '12:30:00') → 4
DAY 整数天数差(基于时间差计算完整天数) TIMESTAMPDIFF(DAY, '2023-10-01', '2023-10-05') → 4
WEEK 整数周差(等同于 FLOOR(TIMESTAMPDIFF(DAY, ...) / 7)) TIMESTAMPDIFF(WEEK, '2023-10-01', '2023-10-15') → 2
MONTH 整数月差(基于日历月,忽略天数差异) TIMESTAMPDIFF(MONTH, '2023-01-15', '2023-03-10') → 2
QUARTER 整数季度差(1季度=3个月) TIMESTAMPDIFF(QUARTER, '2023-01-01', '2023-10-01') → 3
YEAR 整数年差(基于日历年,忽略月内天数) TIMESTAMPDIFF(YEAR, '2020-02-29', '2023-02-28') → 3

流程控制函数​

​​IF(condition, value_if_true, value_if_false)

简单条件判断。

sql 复制代码
SELECT IF(score >= 60, '及格', '不及格') AS result FROM students;

​​CASE WHEN

多条件分支处理。

sql 复制代码
SELECT 
  CASE 
    WHEN salary > 10000 THEN '高薪'
    WHEN salary > 5000 THEN '中薪'
    ELSE '低薪'
  END AS level
FROM employees;

聚合函数​

​​​​SUM(column)

计算某列的总和。

sql 复制代码
SELECT SUM(salary) FROM employees;

​​​​​​AVG(column)

计算平均值。

sql 复制代码
SELECT AVG(score) FROM exams;

​​​​​​​COUNT(column)

统计行数(注意:COUNT(*)包含NULL,COUNT(column)忽略NULL)。

sql 复制代码
SELECT COUNT(*) FROM users; -- 统计所有行数

​​​​​​​GROUP_CONCAT(column SEPARATOR 'sep')

将分组后的多行数据合并为一个字符串。

sql 复制代码
SELECT department, GROUP_CONCAT(name SEPARATOR ', ') 
FROM employees 
GROUP BY department;

空值函数

​​​​​​​COALESCE(value1, value2, ...)​​

返回第一个非NULL的值。

sql 复制代码
SELECT COALESCE(NULL, '备用值'); -- 输出: '备用值'

​​​​​​​​​IFNULL(value, default)

如果值为NULL,返回默认值。

sql 复制代码
SELECT IFNULL(email, '未填写') FROM users;

JSON操作函数

JSON 路径语法​

$ 表示根节点。

$.key 访问对象的键。

$[index] 访问数组元素(索引从 0 开始)。

$.* 匹配所有成员。

$.a.b 嵌套访问。

​​​​​​​​​JSON 创建与修改​

​​JSON_ARRAY([value1, value2, ...])​​

创建 JSON 数组。

sql 复制代码
SELECT JSON_ARRAY('a', 1, TRUE, NULL); 
-- 输出: ["a", 1, true, null]

​​​​JSON_OBJECT([key1, value1, key2, value2, ...])

创建 JSON 对象。

sql 复制代码
SELECT JSON_OBJECT('name', 'Alice', 'age', 25);
-- 输出: {"name": "Alice", "age": 25}

​​​​JSON_SET(json_doc, path, val [, path, val]...)

插入或更新 JSON 中的字段(若路径存在则更新,不存在则插入)。

sql 复制代码
SELECT JSON_SET('{"a": 1}', '$.b', 2); 
-- 输出: {"a": 1, "b": 2}

​​​​JSON_INSERT(json_doc, path, val [, path, val]...)

仅在路径不存在时插入新字段。

sql 复制代码
SELECT JSON_INSERT('{"a": 1}', '$.a', 100, '$.b', 2); 
-- 输出: {"a": 1, "b": 2} (仅插入不存在的路径)

​JSON_REPLACE(json_doc, path, val [, path, val]...)

仅更新已存在的路径。

sql 复制代码
SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.a', 100, '$.c', 3);
-- 输出: {"a": 100, "b": 2} (仅更新存在的路径)

​​JSON_REMOVE(json_doc, path [, path]...)

删除 JSON 中的指定路径。

sql 复制代码
SELECT JSON_REMOVE('{"a": 1, "b": 2}', '$.a'); 
-- 输出: {"b": 2}

JSON 查询与提取​

JSON_EXTRACT(json_doc, path)​​ 或 ​​->​​ 操作符

提取 JSON 中的值(支持路径表达式)。

sql 复制代码
SELECT JSON_EXTRACT('{"user": {"name": "Alice", "age": 25}}', '$.user.name');
-- 输出: "Alice"

-- 等效写法(MySQL 5.7+):
SELECT data->'$.user.age' FROM users;

JSON_UNQUOTE(json_val)

去除 JSON 字符串的引号。

sql 复制代码
SELECT JSON_UNQUOTE(JSON_EXTRACT('{"name": "Alice"}', '$.name')); 
-- 输出: Alice

JSON_CONTAINS(json_doc, val [, path])

检查 JSON 中是否包含指定值。

sql 复制代码
SELECT JSON_CONTAINS('{"a": [1, 2, 3]}', '2', '$.a'); 
-- 输出: 1 (true)

JSON_SEARCH(json_doc, 'one|all', search_str)

查找包含指定字符串的路径。

sql 复制代码
SELECT JSON_SEARCH('{"user": {"name": "Alice"}}', 'one', 'Alice');
-- 输出: "$.user.name"

JSON 聚合与转换​

​​JSON_ARRAYAGG(expr)

将多行数据聚合为 JSON 数组。

sql 复制代码
SELECT JSON_ARRAYAGG(name) FROM users; 
-- 输出: ["Alice", "Bob", "Charlie"]

​​​​JSON_OBJECTAGG(key, value)

将键值对聚合为 JSON 对象。

sql 复制代码
SELECT JSON_OBJECTAGG(id, name) FROM users; 
-- 输出: {"1": "Alice", "2": "Bob"}

JSON_TYPE(json_val)​​

返回 JSON 值的类型(如 OBJECT, ARRAY, STRING, INTEGER)。

sql 复制代码
SELECT JSON_TYPE(JSON_EXTRACT('{"a": [1, "b"]}', '$.a')); 
-- 输出: ARRAY

子查询

子查询类型

标量子查询(Scalar Subquery)​​

返回单个值(一行一列)。

常用在 ​​SELECT​​、​​WHERE​​ 或 ​​HAVING​​ 中。

sql 复制代码
-- 示例:查询工资高于平均工资的员工
SELECT name, salary 
FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);

行子查询(Row Subquery)​​

返回单行多列。

sql 复制代码
-- 示例:查询工资高于平均工资的员工
-- 示例:查询与指定员工部门和职位相同的其他员工
SELECT name 
FROM employees 
WHERE (department, job_title) = (
    SELECT department, job_title 
    FROM employees 
    WHERE name = 'Alice'
);

列子查询(Column Subquery)​​

返回多行单列。

常与 ​​IN​​、​​ANY​​、​​ALL​​ 等操作符搭配使用。

sql 复制代码
-- 示例:查询所有在销售部或技术部的员工
SELECT name 
FROM employees 
WHERE department IN (
    SELECT department 
    FROM departments 
    WHERE location = 'New York'
);

表子查询(Table Subquery)​​

返回多行多列。

通常作为派生表(Derived Table)出现在 ​​FROM​​ 子句。

sql 复制代码
-- 示例:查询每个部门的平均工资,并与公司平均工资比较
SELECT department, AVG(salary) AS dept_avg,
    (SELECT AVG(salary) FROM employees) AS company_avg
FROM employees 
GROUP BY department;

子查询与操作符​

IN / NOT IN​

sql 复制代码
-- 示例:查询购买了某产品的客户
SELECT customer_name 
FROM customers 
WHERE customer_id IN (
    SELECT customer_id 
    FROM orders 
    WHERE product_id = 1001
);

ANY / SOME​

与比较符(>、<、= 等)搭配,表示满足任一结果。

sql 复制代码
-- 示例:查询工资高于技术部任一员工的员工
SELECT name 
FROM employees 
WHERE salary > ANY (
    SELECT salary 
    FROM employees 
    WHERE department = '技术部'
);

​ALL​

表示满足所有结果。

sql 复制代码
-- 示例:查询工资高于所有技术部员工的员工
SELECT name 
FROM employees 
WHERE salary > ALL (
    SELECT salary 
    FROM employees 
    WHERE department = '技术部'
);

​​EXISTS / NOT EXISTS​

检查子查询是否返回结果(更高效,常用于关联子查询)。

sql 复制代码
-- 示例:查询至少有一个订单的客户
SELECT customer_name 
FROM customers c 
WHERE EXISTS (
    SELECT 1 
    FROM orders o 
    WHERE o.customer_id = c.customer_id
);

类型转换函数

CAST(expr AS type)​

​功能​​:将表达式转换为指定类型。

​​支持类型​​:

BINARY(二进制)

CHAR(字符串)

DATE、DATETIME、TIME

DECIMAL

SIGNED(有符号整数)、UNSIGNED(无符号整数)

sql 复制代码
-- 字符串转整数
SELECT CAST('123' AS SIGNED);  -- 输出: 123

-- 浮点数转 DECIMAL(控制精度)
SELECT CAST(3.1415 AS DECIMAL(5,2));  -- 输出: 3.14 (总位数 5,小数位 2)

-- 时间戳转日期
SELECT CAST(NOW() AS DATE);  -- 输出: 2023-10-01

CONVERT(expr, type)​​ 或 ​​CONVERT(expr USING charset)

功能​​:

转换数据类型(同 CAST)。

转换字符集(如 utf8mb4 转 latin1)。

sql 复制代码
-- 字符串转整数
SELECT CONVERT('456', SIGNED);  -- 输出: 456

-- 转换字符集
SELECT CONVERT('你好' USING latin1);  -- 输出可能为乱码(如字符集不支持)

with as 子句

sql 复制代码
WITH dept_avg AS (
    SELECT department, AVG(salary) AS avg_salary 
    FROM employees 
    GROUP BY department
)
SELECT * FROM dept_avg WHERE avg_salary > 10000;

union

sql 复制代码
SELECT column1, column2 FROM table1
UNION [ALL | DISTINCT]
SELECT column1, column2 FROM table2
[ORDER BY column1]
[LIMIT N];

​UNION DISTINCT​​:默认行为,合并结果并去重。

​​UNION ALL​​:保留所有重复行。

​​ORDER BY​​ 和 ​​LIMIT​​:对整个合并后的结果集生效(非单个查询)。

group by having

对分组后的结果进行过滤(类似于 WHERE,但作用于分组后的数据)。

sql 复制代码
SELECT column1, aggregate_function(column2)
FROM table
GROUP BY column1
HAVING condition;

GROUP BY 与 WHERE 的区别​​:

​​WHERE​​:在分组前过滤数据(作用于原始数据行)。

​​HAVING​​:在分组后过滤数据(作用于聚合结果)。

sql 复制代码
SELECT employee_id, COUNT(*) AS order_count
FROM orders
WHERE department = '销售部'  -- 先过滤部门
GROUP BY employee_id
HAVING order_count > 50;    -- 再过滤分组结果
相关推荐
wang6021252181 分钟前
FastAPI框架为什么在启动时建表
数据库
男孩李3 分钟前
linux下如何执行postgres数据库的sql文件
数据库·sql·postgresql
zwjapple7 分钟前
MySQL SQL 面试核心考点与注意事项总结
数据库·sql·mysql
乐韵天城8 分钟前
SpringBoot中如何手动开启数据库事务
数据库·spring boot
05大叔14 分钟前
Spring Day02
数据库·sql·spring
默默前行的虫虫20 分钟前
nicegui中多次调用数据库操作总结
数据库·python
鸽鸽程序猿26 分钟前
【Redis】事务
数据库·redis·缓存
Knight_AL1 小时前
MySQL 分区表应用案例:优化数据管理与性能
数据库·mysql
luoluoal1 小时前
基于python的爬虫的贵州菜价可视化系统(源码+文档)
python·mysql·django·毕业设计·源码
老华带你飞1 小时前
考试管理系统|基于java+ vue考试管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端