SQL MID() 函数(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在数据操作的日常场景中,字符串处理是一个高频需求。无论是提取用户手机号的后四位,还是从订单号中截取特定部分,开发者都需要一种灵活且高效的方法。此时,SQL MID() 函数便成为数据库操作中的重要工具。本文将从基础到进阶,结合实际案例,全面解析这一函数的功能、语法及应用场景,帮助读者掌握其核心逻辑,并理解如何在实际项目中灵活运用。

MID() 函数是 SQL 中用于从字符串中提取子串的核心工具。它的工作原理类似于“在字符串中定位起点,然后截取指定长度的字符”。形象地说,可以将字符串比作一条珍珠项链,MID() 函数就像一位精准的工匠,能够根据指定的“起始位置”和“截取长度”,从项链中取出特定的一段珍珠。

例如,假设有一个字符串 "Hello World",若想提取从第 7 个字符开始的 5 个字符,结果应为 "World"。此时,MID() 函数的作用便一目了然。

需要注意的是,不同数据库系统对 MID() 函数的命名可能略有差异。例如:

  • MySQLMariaDB 使用 SUBSTRING()MID()
  • SQL Server 使用 SUBSTRING()
  • PostgreSQL 使用 SUBSTR()SUBSTRING()

尽管名称不同,但核心逻辑一致。本文将以 MID() 函数为统一名称展开讲解,同时标注不同数据库的兼容写法。


MID() 函数的标准语法为:

MID(字符串, 起始位置, 截取长度)  

或在某些数据库中写为:

SUBSTRING(字符串 FROM 起始位置 FOR 截取长度)  

参数说明

参数说明
字符串需要处理的目标字符串,可以是列名、变量或直接的字符串值。
起始位置截取的起始位置,从 1 开始计数。若为 0 或负数,行为可能因数据库而异。
截取长度需要截取的字符数。若超出字符串长度,函数会自动截断至字符串末尾。若省略,则截取到结尾。

1. 基础用法:提取固定位置的子串

案例:从用户表中提取邮箱地址的域名部分。假设表 users 包含 email 列,格式为 "username@example.com"

SELECT MID(email, INSTR(email, '@') + 1) AS domain  
FROM users;  

这里通过 INSTR() 函数找到 @ 符号的位置,然后从其后一位开始截取,即可获取域名。

2. 变量长度处理:动态计算截取范围

案例:从订单号中提取年份。假设订单号格式为 YYYYMMDD-XXXX,例如 "20230115-1234"

SELECT MID(order_id, 1, 4) AS year  
FROM orders;  

此例中,固定从第 1 位开始截取 4 个字符,即可得到年份 2023

3. 负数与省略参数的特殊用法

案例:从右侧截取字符串。例如,从手机号 "13812345678" 中提取后四位。

SELECT MID(phone, -4) AS last_four_digits  
FROM customers;  

这里使用负数 -4 表示从右向左数第 4 位开始,截取到字符串末尾。


1. 结合 LENGTH() 函数处理动态长度

当需要截取字符串末尾的固定长度时,可结合 LENGTH()

-- 提取字符串最后 3 个字符  
SELECT MID(text_column, LENGTH(text_column) - 2, 3)  
FROM table_name;  

2. 处理多语言字符:区分字符与字节

在支持 Unicode 的数据库中,MID() 函数通常按字符而非字节计数。例如,中文字符 "你好" 的长度为 2,而非 6 字节。

3. 处理 NULL 值与空字符串

若目标字符串为 NULL 或空字符串,MID() 会直接返回 NULL。可通过 COALESCE() 函数处理:

SELECT COALESCE(MID(info, 1, 10), 'N/A') AS snippet  
FROM documents;  

Q1: 起始位置超过字符串长度会怎样?

如果起始位置大于字符串长度,例如 MID('ABC', 4, 2),则返回空字符串。

Q2: 如何从右侧开始截取?

使用负数表示起始位置,例如:

SELECT MID('Hello', -3) -- 返回 'llo'  

Q3: 不同数据库的兼容写法有哪些?

数据库MID() 的等效写法
MySQLSUBSTRING(str FROM pos FOR len)
SQL ServerSUBSTRING(str, pos, len)
PostgreSQLSUBSTR(str FROM pos FOR len)

案例:从混合格式的订单号中提取信息

假设订单号格式为 YYMMDD-XXXX-XXXX,例如 "230115-ABCD-1234",需要提取年份、月份、订单类型(前缀 ABCD)和序列号(后缀 1234)。

SELECT  
  MID(order_no, 1, 2) AS year_part,       -- 提取年份(23)  
  MID(order_no, 3, 2) AS month_part,      -- 提取月份(01)  
  MID(order_no, 7, 4) AS order_type,      -- 提取前缀(ABCD)  
  MID(order_no, -4) AS sequence_number    -- 提取后四位(1234)  
FROM orders;  

通过组合使用固定和动态位置,可以高效解析复杂字符串。


SQL MID() 函数是字符串处理的利器,其核心价值在于灵活定位和截取字符。无论是基础的子串提取,还是与其它函数的组合应用,都能显著提升数据操作的效率。

对于初学者,建议从固定参数的简单案例入手,逐步过渡到结合其他函数的复杂场景。中级开发者则可深入探索动态计算起始位置、多语言支持等进阶技巧。

掌握这一函数后,读者可以更从容地处理用户信息解析、日志分析、数据清洗等实际问题,为构建高效、健壮的数据库应用奠定基础。

(全文约 1680 字)

最新发布