MySQL函数

掌握MySQL内置函数的使用方法

MySQL函数概述

MySQL提供了丰富的内置函数,用于处理数据、执行计算和转换数据格式。函数可以简化SQL语句,提高开发效率。

函数的重要性

MySQL函数能够简化复杂的SQL操作,提高查询效率,增强数据处理能力。合理使用函数可以减少应用程序代码量,将数据处理逻辑下推到数据库层面。

函数分类

  • 字符串函数 - 处理文本数据
  • 数值函数 - 执行数学运算
  • 日期和时间函数 - 处理日期和时间
  • 聚合函数 - 对一组值执行计算并返回单个值
  • 控制流函数 - 实现条件逻辑
  • 系统信息函数 - 返回数据库系统信息
  • 加密函数 - 提供数据加密功能
  • JSON函数 - 处理JSON格式数据

字符串函数

字符串函数用于操作文本数据,如连接、截取、替换等。这些函数对于数据清洗、格式化和转换非常有用。

常用字符串函数

函数 描述 示例 返回值
CONCAT() 连接字符串 CONCAT('Hello', ' ', 'World') 'Hello World'
SUBSTRING() 截取子字符串 SUBSTRING('MySQL', 1, 2) 'My'
LENGTH() 返回字符串长度 LENGTH('MySQL') 5
UPPER() / LOWER() 转换为大写/小写 UPPER('mysql') 'MYSQL'
TRIM() 去除首尾空格 TRIM(' MySQL ') 'MySQL'
REPLACE() 替换字符串 REPLACE('MySQL', 'SQL', 'Database') 'MyDatabase'
LEFT() / RIGHT() 返回左/右侧指定长度字符串 LEFT('MySQL', 2) 'My'
LOCATE() 返回子字符串位置 LOCATE('SQL', 'MySQL') 3
REVERSE() 反转字符串 REVERSE('MySQL') 'LQSyM'
FORMAT() 格式化数字为字符串 FORMAT(12345.6789, 2) '12,345.68'

字符串函数示例

SQL示例
-- 连接字符串
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

-- 截取字符串
SELECT SUBSTRING(email, 1, 5) AS username FROM users;

-- 替换字符串
SELECT REPLACE(description, 'old', 'new') FROM products;

-- 格式化数字
SELECT product_name, FORMAT(price, 2) AS formatted_price FROM products;

-- 提取域名
SELECT email, SUBSTRING(email, LOCATE('@', email) + 1) AS domain FROM users;

数值函数

数值函数用于执行数学运算,如四舍五入、绝对值、取整等。这些函数对于财务计算、统计分析等场景非常有用。

常用数值函数

函数 描述 示例 返回值
ROUND() 四舍五入 ROUND(123.456, 2) 123.46
CEIL() / FLOOR() 向上/向下取整 CEIL(123.45) 124
ABS() 绝对值 ABS(-123) 123
POWER() 幂运算 POWER(2, 3) 8
MOD() 取模运算 MOD(10, 3) 1
RAND() 生成随机数 RAND() 0.0-1.0之间的随机数
SQRT() 平方根 SQRT(16) 4
EXP() 指数函数 EXP(1) 2.718281828459045
LOG() / LOG10() 自然对数/常用对数 LOG(EXP(1)) 1
SIN() / COS() / TAN() 三角函数 SIN(PI()/2) 1

数值函数示例

SQL示例
-- 四舍五入
SELECT ROUND(price, 2) AS rounded_price FROM products;

-- 计算平均值并四舍五入
SELECT ROUND(AVG(salary), 0) AS avg_salary FROM employees;

-- 随机排序
SELECT * FROM products ORDER BY RAND() LIMIT 5;

-- 计算几何平均值
SELECT EXP(AVG(LOG(price))) AS geometric_mean FROM products;

日期和时间函数

日期和时间函数用于处理日期和时间数据,如提取日期部分、计算日期差等。这些函数对于时间序列分析、报表生成等场景非常重要。

常用日期函数

函数 描述 示例 返回值
NOW() 返回当前日期和时间 NOW() 2023-10-15 14:30:00
CURDATE() / CURTIME() 返回当前日期/时间 CURDATE() 2023-10-15
DATE() / TIME() 提取日期/时间部分 DATE('2023-10-15 14:30:00') 2023-10-15
YEAR() / MONTH() / DAY() 提取年/月/日 YEAR('2023-10-15') 2023
DATEDIFF() 计算日期差 DATEDIFF('2023-10-20', '2023-10-15') 5
DATE_ADD() / DATE_SUB() 日期加减 DATE_ADD('2023-10-15', INTERVAL 7 DAY) 2023-10-22
DAYNAME() / MONTHNAME() 返回星期/月份名称 DAYNAME('2023-10-15') 'Sunday'
WEEK() / QUARTER() 返回周数/季度 WEEK('2023-10-15') 41
DATE_FORMAT() 格式化日期 DATE_FORMAT(NOW(), '%Y-%m-%d') '2023-10-15'
STR_TO_DATE() 字符串转日期 STR_TO_DATE('15,10,2023', '%d,%m,%Y') 2023-10-15

日期函数示例

SQL示例
-- 获取当前日期和时间
SELECT NOW() AS current_datetime;

-- 提取年份
SELECT YEAR(birth_date) AS birth_year FROM employees;

-- 计算年龄
SELECT name, YEAR(CURDATE()) - YEAR(birth_date) AS age FROM employees;

-- 查询最近7天的订单
SELECT * FROM orders 
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);

-- 格式化日期
SELECT order_id, DATE_FORMAT(order_date, '%Y年%m月%d日') AS formatted_date FROM orders;

-- 计算工作日(排除周末)
SELECT 
    start_date,
    end_date,
    DATEDIFF(end_date, start_date) - 
    FLOOR(DATEDIFF(end_date, start_date) / 7) * 2 -
    (CASE WHEN DAYOFWEEK(start_date) = 1 THEN 1 ELSE 0 END) -
    (CASE WHEN DAYOFWEEK(end_date) = 7 THEN 1 ELSE 0 END) AS work_days
FROM projects;

聚合函数

聚合函数对一组值执行计算并返回单个值,通常与GROUP BY子句一起使用。这些函数对于数据汇总和统计分析至关重要。

常用聚合函数

函数 描述 示例 返回值
COUNT() 计算行数 COUNT(*) 记录总数
SUM() 计算总和 SUM(salary) 薪资总和
AVG() 计算平均值 AVG(salary) 平均薪资
MAX() / MIN() 返回最大/最小值 MAX(salary) 最高薪资
GROUP_CONCAT() 将多行合并为字符串 GROUP_CONCAT(name) 所有姓名的逗号分隔列表
VARIANCE() / STDDEV() 计算方差/标准差 VARIANCE(salary) 薪资方差
BIT_AND() / BIT_OR() 位与/位或运算 BIT_AND(permissions) 权限的位与结果

聚合函数示例

SQL示例
-- 统计员工总数
SELECT COUNT(*) AS total_employees FROM employees;

-- 计算各部门平均薪资
SELECT department, AVG(salary) AS avg_salary 
FROM employees 
GROUP BY department;

-- 获取每个部门的员工姓名列表
SELECT department, GROUP_CONCAT(name) AS employees 
FROM employees 
GROUP BY department;

-- 计算薪资统计信息
SELECT 
    COUNT(*) AS employee_count,
    AVG(salary) AS average_salary,
    MIN(salary) AS min_salary,
    MAX(salary) AS max_salary,
    STDDEV(salary) AS salary_stddev
FROM employees;
使用建议:聚合函数通常与GROUP BY子句一起使用,但COUNT(*)也可以单独使用统计总行数。注意NULL值在聚合函数中的处理方式:COUNT(column)会忽略NULL值,而COUNT(*)不会。

控制流函数

控制流函数用于在SQL中实现条件逻辑,类似于编程语言中的if-else语句。这些函数对于数据转换和条件处理非常有用。

常用控制流函数

函数 描述 示例 返回值
IF() 条件判断 IF(score >= 60, '及格', '不及格') '及格' 或 '不及格'
CASE 多条件判断 CASE WHEN score >= 90 THEN '优秀' ... END 根据条件返回不同值
IFNULL() / COALESCE() 处理NULL值 IFNULL(salary, 0) salary或0
NULLIF() 比较两个表达式 NULLIF(column1, column2) NULL或column1

控制流函数示例

SQL示例
-- 使用IF函数
SELECT name, score, 
       IF(score >= 60, '及格', '不及格') AS result 
FROM students;

-- 使用CASE语句
SELECT name, score,
       CASE
           WHEN score >= 90 THEN '优秀'
           WHEN score >= 80 THEN '良好'
           WHEN score >= 60 THEN '及格'
           ELSE '不及格'
       END AS grade
FROM students;

-- 处理NULL值
SELECT name, IFNULL(bonus, 0) AS bonus_amount 
FROM employees;

-- 使用COALESCE处理多个可能的NULL值
SELECT name, COALESCE(phone, mobile, '无联系方式') AS contact 
FROM customers;

-- 搜索式CASE语句
SELECT product_name, category_id,
       CASE category_id
           WHEN 1 THEN '电子产品'
           WHEN 2 THEN '家居用品'
           WHEN 3 THEN '服装'
           ELSE '其他'
       END AS category_name
FROM products;

系统信息函数

系统信息函数用于获取数据库和连接的相关信息,对于调试和监控非常有用。

常用系统信息函数

函数 描述 示例
VERSION() 返回MySQL版本 VERSION()
DATABASE() 返回当前数据库名 DATABASE()
USER() 返回当前用户名 USER()
CONNECTION_ID() 返回连接ID CONNECTION_ID()
LAST_INSERT_ID() 返回最后插入的AUTO_INCREMENT值 LAST_INSERT_ID()
ROW_COUNT() 返回受影响的行数 ROW_COUNT()

JSON函数

MySQL 5.7及以上版本提供了丰富的JSON函数,用于处理JSON格式的数据。

常用JSON函数

函数 描述 示例
JSON_EXTRACT() 提取JSON数据 JSON_EXTRACT(data, '$.name')
JSON_OBJECT() 创建JSON对象 JSON_OBJECT('name', 'John', 'age', 30)
JSON_ARRAY() 创建JSON数组 JSON_ARRAY(1, 2, 3)
JSON_SEARCH() 搜索JSON数据 JSON_SEARCH(data, 'one', 'John')

函数性能优化建议

  • 避免在WHERE子句中对列使用函数,这会使索引失效
  • 对于复杂的计算,考虑在应用程序层面处理
  • 合理使用存储过程封装复杂的函数逻辑
  • 注意函数的返回值类型,避免隐式类型转换
  • 使用EXPLAIN分析包含函数的查询性能

下一步学习

掌握了MySQL函数后,您可以继续学习:

  • 连接查询 - 学习如何连接多个表进行查询
  • 子查询 - 了解在查询中嵌套其他查询
  • 视图 - 学习如何创建和使用视图简化复杂查询
  • 存储过程 - 学习创建可重用的SQL代码块