当前位置: 首页 > news >正文

SQL:MySQL 函数

目录

为什么存在 MySQL 函数?

举个具体例子 

字符串函数(String Functions)

 🧵 字符串拼接函数(Concatenation)

✂️ 字符串截取器:SUBSTRING() 函数

 🔠 字符大小写转换器——UPPER() 和 LOWER()

日期时间函数(Date Functions)

📅 把“日期+时间”简化成“日期”——DATE()

 📆 MONTH() & YEAR() —— 从日期中提取“月份”和“年份”


为什么存在 MySQL 函数?

我们先问个问题:

“如果数据库只负责存数据,那我们每次都得把数据拉出来,再用程序处理,那数据库岂不是很傻?”

为了解决这个问题,SQL 提供了“函数”,让我们在数据库内部就可以:

  • 清洗字符串(比如把名字变大写)

  • 拼接文字(比如名字+后缀)

也就是说:函数是数据库里的“工具箱”,让我们在查数据时就能做很多变形、提取、处理,而不用拉到程序里再搞。

它们的本质是:
输入一些值(参数) → ✅ 输出一个处理结果(返回值) 

🗂️ SQL 函数的类型非常多,大致可以分成几类:

类别作用
数学函数(Math Functions)加减乘除、开方、取整等
字符串函数(String Functions)处理文字,如拼接、替换、截取
日期时间函数(Date Functions)处理时间,如获取年份、计算日期差
聚合函数(Aggregate Functions)汇总一组数据,如求平均、计数、求最大最小值
流程控制函数(Control Flow Functions)条件判断、返回不同值
加密/解密函数(Encryption Functions)做哈希、加密操作等

 你可以在 MySQL 官网查看所有函数的详细说明和示例:

MySQL :: MySQL 8.0 Reference Manual :: 14 Functions and Operatorshttps://dev.mysql.com/doc/refman/8.0/en/functions.html

(适用于 MySQL 8.0,其他版本可在页面切换)

举个具体例子 

在众多 SQL 函数中,字符串函数(String Functions)日期时间函数(Date Functions) 是最常用的两类,特别是在处理用户信息、日志记录、订单数据等日常业务时尤为重要。

比如你会遇到这样的需求:

  • 把用户姓名格式化为统一格式(如全大写)

  • 从邮箱中提取用户名

这些问题都不是通过简单的 SELECT 查询能解决的,而是需要借助 字符串函数 和 日期函数 来“加工”数据。


字符串函数(String Functions)

📌 作用:处理文字、邮箱、名字、路径等文字型数据。

🔧 常见字符串函数

函数中文名用法示例说明
UPPER(str)转大写UPPER('abc') → 'ABC'全部字母变大写
LOWER(str)转小写LOWER('ABC') → 'abc'全部字母变小写
LENGTH(str)获取长度(字节数)LENGTH('abc') → 3多字节字符如中文是 3
CHAR_LENGTH(str)获取字符数CHAR_LENGTH('张三') → 2不按字节,而按“几个字”算
CONCAT(a, b)拼接字符串CONCAT('张', '三') → '张三'多个字段拼一起
SUBSTRING(str, start, len)截取字符串SUBSTRING('hello', 2, 3) → 'ell'从第 2 个字符起,取 3 个
LEFT(str, n)从左取LEFT('abcdef', 3) → 'abc'取前 n 个字符
RIGHT(str, n)从右取RIGHT('abcdef', 3) → 'def'取后 n 个字符
REPLACE(str, from, to)替换子串REPLACE('abcabc', 'a', 'x') → 'xbcxbc'

 🧵 字符串拼接函数(Concatenation)

什么是 Concatenation?

Concatenation 中文叫做“拼接”,意思是把两个或多个字符串连起来,形成一个更长的字符串。

在生活中我们经常干这个事,比如:

把姓和名拼成全名:"赵" + "又廷""赵又廷"

把路径拼成地址:"www." + "baidu" + ".com""www.baidu.com"

在 SQL 里怎么拼接字符串?

✅ 用 CONCAT() 函数

这是 SQL 中最常用、最标准的拼接方式。

CONCAT(str1, str2, ..., strN)
  • 每个参数都是你想拼的内容。

  • 可以是字符串、字段、常量。

  • 空字符串不会影响拼接,但 NULL 会让整个结果变 NULL(这一点很重要!)。

示例 :拼接姓和名

假设你有这样一个表:

users(id, first_name, last_name)

你想要得到完整姓名:

SELECT CONCAT(first_name, last_name) AS full_name
FROM users;

 如果 first_name 是 "赵",last_name 是 "又廷",结果就是 "赵又廷"

我们把空格也当作一个字符串参与拼接。 

SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM users;

 ⚠️ NULL 的陷阱

SELECT CONCAT('hello', NULL, 'world');
-- 结果是 NULL!不是 'helloworld'

🤹‍♂️ 实战场景举几个:

业务需求拼接方式
显示用户全名CONCAT(first_name, ' ', last_name)
构造个性化用户名CONCAT('user_', id)
拼接图片路径CONCAT('https://cdn.xxx.com/', file_name)
拼接手机号掩码CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4))

✂️ 字符串截取器:SUBSTRING() 函数

什么是 SUBSTRING()

SUBSTRING(中文叫“子字符串”)的作用是:

从一个字符串里,截取出一段你感兴趣的部分。

基本语法: 

SUBSTRING(string, start_position, length)
  • string:你要处理的字符串,可以是字段、常量或拼接结果。

  • start_position:从第几个字符开始(从 1 开始数,不是 0!也可以取为负数,表示从字符串的末端开始计数

  • length:截取多长(可选)

示例 :截取姓名的前两个字 

SELECT SUBSTRING('赵又廷', 1, 2); 
-- 输出:'赵又'

 示例 :截取邮箱的用户名部分

SELECT SUBSTRING(email, 1, LOCATE('@', email) - 1) AS username
FROM customers;

 如果邮箱是 "zhaoyouting@example.com",就会输出 "zhaoyouting"

注意点

  • 起始位置从 1 开始

  • 如果 start_position 超过了字符串长度,会返回空字符串

  • 如果你用的是 UTF-8 中文环境,1 个汉字 = 1 个字符(不是 3 字节!)

实战案例参考:

场景截取方式
取邮箱用户名SUBSTRING(email, 1, LOCATE('@', email) - 1)
手机号后四位RIGHT(phone, 4)SUBSTRING(phone, LENGTH(phone)-3, 4)
学号的入学年份SUBSTRING(student_id, 1, 4)
路径中的文件名SUBSTRING_INDEX(path, '/', -1)(这个是高级点的)

 🔠 字符大小写转换器——UPPER()LOWER()

基本功能:

  • UPPER(str):把字符串中的字母全变成 大写

  • LOWER(str):把字符串中的字母全变成 小写

它们只对 英文字母 起作用,中文字符、数字、符号都不变。

示例 :统一邮箱格式 

SELECT LOWER('ZhaoYouTing@Example.COM');
-- 输出:'zhaoyouting@example.com'

 对中文/拼音字段也适用

SELECT UPPER('赵又廷 zhaoyouting');
-- 输出:'赵又廷 ZHAOYOUTING'

 


日期时间函数(Date Functions)

📌 作用:处理生日、注册时间、登录时间等字段

🔧 常用日期函数

函数中文名用法示例说明
NOW()当前时间NOW() → '2025-04-25 14:35:00'
CURDATE()当前日期CURDATE() → '2025-04-25'不含时间
YEAR(date)提取年份YEAR('2001-05-12') → 2001
MONTH(date)提取月份MONTH('2001-05-12') → 5
DAY(date)提取日DAY('2001-05-12') → 12
DATEDIFF(date1, date2)计算天数差DATEDIFF('2025-04-25', '2025-04-01') → 24
TIMESTAMPDIFF(unit, d1, d2)计算差值(年、月等)TIMESTAMPDIFF(YEAR, '2000-01-01', NOW()) → 年龄计算
DATE_FORMAT(date, format)自定义格式DATE_FORMAT(NOW(), '%Y年%m月%d日') → ‘2025年04月25日’

📅 把“日期+时间”简化成“日期”——DATE()

SQL 中有一种常见的数据类型叫 DATETIME,它长得像这样:

2025-04-26 19:30:00

这个字段里既包含了“年月日”,也有“时分秒”。

有时候你只关心“是哪天”,比如:

  • 今天有哪些场次?

  • 哪天有放映,不关心几点

这个时候就用 DATE() ——
它会把 DATETIME 值截断,只保留“年月日”部分。

示例 :查看放映时间是哪天 

SELECT start_time,DATE(start_time) AS play_date
FROM screenings;

假设 start_time = '2025-04-26 19:30:00'
输出的 play_date 就是:2025-04-26 

 📆 MONTH() & YEAR() —— 从日期中提取“月份”和“年份”

它们是干嘛的?

  • YEAR(date_or_datetime) 👉 提取出“年份”

  • MONTH(date_or_datetime) 👉 提取出“月份”(1 到 12)

适用于任何带日期的字段,比如 DATETIMEDATE

示例 :提取电影场次的年份和月份 

SELECT start_time,YEAR(start_time) AS play_year,MONTH(start_time) AS play_month
FROM screenings;

如果 start_time = '2025-04-26 19:30:00'
输出就是:

start_timeplay_yearplay_month
2025-04-26 19:30:0020254

相关文章:

  • 【生成式AI】从原理到实践的创造性革命
  • HackMyVM - Chromee靶机
  • 【Linux】web服务器的部署和优化
  • 嵌入式硬件开发工具---万用表---示波器---仿真器
  • Pygame物理模拟:实现重力、弹跳与简单物理引擎
  • 【Redis】基础2:作为缓存
  • Java在云计算、大数据、云原生下的应用和优势 - 面试实战
  • 【摩尔定律】
  • HTTP, AMQP, MQTT之间的区别和联系是什么?华为云如何适配?
  • 青少年CTF-贪吃蛇
  • Maven的聚合工程与继承
  • 机器学习:逻辑回归实现二元分类
  • Linux扩展
  • 开源AI智能名片链动2+1模式S2B2C商城小程序源码赋能下的社交电商创业者技能跃迁与价值重构
  • 毕业项目-基于java的入侵检测与防御系统
  • 联想笔记本电脑在Windows下通过联想驱动实现风扇控制
  • MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点
  • 40岁的苦与乐
  • 硅谷甄选41集-71集
  • 百度AI开发者大会:连发多款AI应用,覆盖AI数字人等热门赛道
  • 伊朗最大港口爆炸:26公里外都能听到,超七百人受伤,原因指向化学品储存
  • 他比李白接地气,比杜甫乐观,比白居易刚毅
  • 韩国京畿道骊州市市长率团访问菏泽:想和菏泽一起办牡丹节
  • 审议民营经济促进法草案等,十四届全国人大常委会第十五次会议将举行
  • 上海4-6月文博美展、剧目演出不断,将开设直播推出文旅优惠套餐
  • 厚植民营企业家成长土壤是民营经济高质量发展的关键