SQL大师之路 12 函数基础

函数是封装了特定逻辑的程序,你不需要关心内部逻辑如何实现,它接受输入参数,经处理后返回输出结果。本文介绍了MySQL中常用函数类型,并演示如何查找全部函数的帮助示例。


文章目录

  • [一、 系统函数](#一、 系统函数)
  • [二、 字符串函数](#二、 字符串函数)
    • [2.1 常用字符串函数](#2.1 常用字符串函数)
    • [2.2 案例:姓名格式化 (CONCAT & UPPER)](#2.2 案例:姓名格式化 (CONCAT & UPPER))
    • [2.3 案例:字符串截取(substr)](#2.3 案例:字符串截取(substr))
    • [2.3 案例:信息替换 (REPLACE)](#2.3 案例:信息替换 (REPLACE))
  • [三、 数学函数](#三、 数学函数)
    • [3.1 常用数学函数](#3.1 常用数学函数)
    • [3.1 案例:奖金计算 (ROUND & CEIL)](#3.1 案例:奖金计算 (ROUND & CEIL))
  • [四、 时间日期函数](#四、 时间日期函数)
    • [4.1 常用日期函数](#4.1 常用日期函数)
    • [4.2 案例:计算工龄(DATEDIFF & ROUND)](#4.2 案例:计算工龄(DATEDIFF & ROUND))
  • 五、查看函数列表及帮助
  • [六、 性能提示](#六、 性能提示)

一、 系统函数

系统函数返回系统信息,这类函数在 MySQL 中主要用于环境审计权限确认。当你准备执行大批量数据操作前,通常会先通过这些函数确认当前的身份和环境。

常用系统函数:

函数 说明 示例查询 典型输出内容
DATABASE() 返回当前会话所连接的默认数据库名。如果没有选择数据库,则返回 NULL SELECT DATABASE(); employees
USER() 返回当前 MySQL 会话的用户名和主机名。 SELECT USER(); root@localhost
VERSION() 返回当前 MySQL 服务器的版本。 SELECT VERSION(); 8.0.32
sql 复制代码
SELECT 
    USER() AS "当前用户", 
    DATABASE() AS "当前数据库", 
    VERSION() AS "服务器版本";

二、 字符串函数

字符串函数是使用频率最高的一类工具。它们不仅能帮助我们清洗不规范的录入数据,还能在生成结果时对字段进行格式化。

2.1 常用字符串函数

函数 功能描述 语法示例
CONCAT() 合并两个或多个字符串 CONCAT(s1, s2, ...)
UPPER()/LOWER() 将字符串转换为全大写/小写 UPPER(str)/LOWER(str)
SUBSTRING() 截取字符串(索引从 1 开始) SUBSTRING(str, start, len)
LENGTH() 返回字符串的字节长度 LENGTH(str)
TRIM() 去除字符串左右两侧的空格 TRIM(str)
REPLACE() 替换字符串中的指定子串 REPLACE(str, from, to)

2.2 案例:姓名格式化 (CONCAT & UPPER)

需求:在 employees 表中,名字分两列存储,可以将其合并,并统一格式(例如姓氏大写,名字首字母大写)。

sql 复制代码
SELECT 
    emp_no 员工号,
    CONCAT(first_name, ' ', UPPER(last_name)) 全名
FROM employees;

2.3 案例:字符串截取(substr)

需求:根据员工入职年份和编号后三位生成一个识别码。

这里需要用到字符串截取函数substr,其语法是 SUBSTRING(str, start, len),其中截取长度len可以省略:

sql 复制代码
SELECT 
    emp_no,
    CONCAT(substr(hire_date, 1), '-', SUBSTRING(emp_no, -3)) 识别码
FROM employees;

2.3 案例:信息替换 (REPLACE)

需求:导出数据时,对员工编号进行部分遮掩。

sql 复制代码
SELECT 
    first_name,
    REPLACE(emp_no, '10', '**') 员工号
FROM employees;

三、 数学函数

数字函数主要用于处理数值计算,例如绩效奖金计算、平均薪资取整以及生成随机抽奖名单。

3.1 常用数学函数

函数 功能描述 语法示例 结果示例
ABS() 返回绝对值 ABS(-10) 10
CEIL() 向上取整(进一法) CEIL(1.1) 2
FLOOR() 向下取整(去尾法) FLOOR(1.9) 1
ROUND() 四舍五入,可指定小数位 ROUND(1.58, 1) 1.6
TRUNCATE() 截断,不进行四舍五入 TRUNCATE(1.58, 1) 1.5
MOD() 取模(求余数) MOD(10, 3) 1
RAND() 生成 0 到 1 之间的随机数 RAND() 0.723...
POW() / POWER() 指数运算(次幂) POW(2, 3) 8
SQRT() 开平方根 SQRT(16) 4

3.1 案例:奖金计算 (ROUND & CEIL)

需求:为每个员工发放工资额5%的奖金。

sql 复制代码
SELECT 
    emp_no, 
    salary 工资,
    ROUND(salary * 0.05, 2) 奖金-- 计算 5% 的奖金并四舍五入保留两位小数
FROM salaries;

四、 时间日期函数

日期函数也是使用率极高的函数类型,它能够将数据库中"时间"转化为你需要的格式,还可以进行时间差计算。

4.1 常用日期函数

函数 功能描述 语法示例 结果示例
NOW() 返回当前的日期和时间 NOW() 2026-03-17 21:35:00
CURDATE() 返回当前日期(不含时间) CURDATE() 2026-03-17
CURTIME() 返回当前时间(不含日期) CURTIME() 21:35:00
YEAR() 提取日期的年份 YEAR('2026-03-17') 2026
MONTH() 提取日期的月份 (1-12) MONTH('2026-03-17') 3
DAY() 提取日期的天数 (1-31) DAY('2026-03-17') 17
DATEDIFF() 计算两个日期之间的天数差 DATEDIFF('2026-03-20', '2026-03-17') 3
DATE_ADD() 对日期增加指定的时间间隔 DATE_ADD('2026-03-17', INTERVAL 1 MONTH) 2026-04-17
DATE_FORMAT() 按指定格式输出日期(转为字符串) DATE_FORMAT(NOW(), '%Y-%m-%d') 2026-03-17
LAST_DAY() 返回该月最后一天的日期 LAST_DAY('2026-02-01') 2026-02-28

4.2 案例:计算工龄(DATEDIFF & ROUND)

需求:统计员工入职至今的天数,并估算工龄(年)。

sql 复制代码
SELECT 
    emp_no, 
    hire_date, 
    DATEDIFF(CURDATE(), hire_date) AS total_days,
    ROUND(DATEDIFF(CURDATE(), hire_date) / 365, 1) AS years_of_service
FROM employees ;

五、查看函数列表及帮助

MySQL 内置了函数帮助手册,当你不知道某函数具体用法时,通过help语句即可查阅语法及示例:

  1. 查看分类 :输入 help functions; 查看所有可用的函数分类。
  2. 查看具体类目 :输入 help 'string functions'; 获取所有字符函数列表。
  3. 精准查阅语法 :如果你不记得某个函数怎么用,直接输入 help 函数名;,MySQL 会直接给出语法定义和演示代码。
sql 复制代码
help functions;

help 'string functions';

help CONCAT;

六、 性能提示

如果某列上没有基于函数的索引,尽量避免在 WHERE 子句中对该列使用函数,这会导致 MySQL 无法利用索引,从而引发全表扫描。

以下两条查询,其中hire_date上有索引:

  • 慢查询(索引失效)MySQL 对每一行记录运行 YEAR() 函数,无法使用索引。
    SELECT * FROM employees WHERE YEAR(hire_date) = 1985;

  • 快查询(利用索引) : 直接在索引树上搜索范围,速度极快。
    SELECT * FROM employees WHERE hire_date BETWEEN '1985-01-01' AND '1985-12-31';

相关推荐
焚 城2 小时前
SQL PARTITION BY用法
数据库·sql
剑锋所指,所向披靡!2 小时前
设计数据库
数据库
暮冬-  Gentle°2 小时前
Python内存管理机制:垃圾回收与引用计数
jvm·数据库·python
城数派2 小时前
中国地形地势分布+地貌矢量数据shp
信息可视化·数据分析
阿贵---2 小时前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
wertyuytrewm2 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
koping_wu2 小时前
常用中间件面试汇总:Mysql、Mq、Redis、操作系统、Nacos、Es、Mybatis
mysql·中间件·面试
mldlds3 小时前
MySQL四种备份表的方式
mysql·adb·oracle
一叶飘零_sweeeet3 小时前
MySQL高可用生产落地全解:主从同步、MGR集群、读写分离从原理到实战
数据库·mysql·架构·mysql高可用