🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 3.2 · 阅读时间:~8 分钟

在本课程中,您将学习 SQL 字符串函数,这些函数有助于在查询中直接清理和转换文本。我们将讨论何时使用 UPPERLOWERTRIMSUBSTRINGCONCAT 和其他函数,并通过实际示例进行讲解。到课程结束时,您将能够自信地处理实际任务中的文本字段。

SQL 中的核心字符串函数

在上一课中,您了解了 SQL 内置函数的整体概念。现在我们将重点关注字符串函数,因为文本字段通常需要额外的处理:大小写规范化、去除不必要的字符、组合值和提取片段。

这些操作在分析、报告和数据准备中很常见。您对字符串函数的了解越深入,您在 SQL 之外所需的手动后处理就越少。


字符串函数是什么

字符串函数处理文本并返回一个字符串、一个数字或一个子字符串位置。当您需要时,它们非常有用:

  • 将文本格式化为一致的格式;
  • 清理嘈杂的值;
  • 提取字符串的一部分(例如,电子邮件域);
  • 为报告构建可读的输出。

基本语法

FUNCTION_NAME(string_expression, ...)

在大多数情况下,参数是表列、字符串字面量或另一个函数的结果。


核心字符串函数

UPPER()LOWER()

用于规范化文本大小写。

SELECT
   customer_id,
   UPPER(last_name) AS last_name_upper,
   LOWER(first_name) AS first_name_lower
FROM customer
LIMIT 5;

结果:姓氏以大写显示,名字以小写显示。

CHAR_LENGTH()LENGTH()

这两个函数测量字符串长度,但不总是以相同的方式:

  • CHAR_LENGTH() 通常返回字符计数;
  • LENGTH() 在 MySQL 中返回字节计数。
SELECT
   title,
   CHAR_LENGTH(title) AS title_chars,
   LENGTH(title) AS title_bytes
FROM film
LIMIT 5;

注意:对于多字节字符,字节计数可能大于字符计数。

SUBSTRING()LEFT()RIGHT()

这些函数提取字符串的一部分。

SELECT
   email,
   SUBSTRING(email, 1, 5) AS email_start,
   LEFT(email, 3) AS first_3,
   RIGHT(email, 10) AS last_10
FROM customer
LIMIT 5;

结果:提取不同的电子邮件片段以进行分析和格式检查。

CONCAT()CONCAT_WS()

这些函数将多个值组合成一个字符串:

  • CONCAT() 直接连接参数;
  • CONCAT_WS(separator, ...) 插入分隔符,通常在报告中更实用。
SELECT
   customer_id,
   CONCAT(first_name, ' ', last_name) AS full_name,
   CONCAT_WS(' | ', first_name, last_name, email) AS customer_label
FROM customer
LIMIT 5;

注意:与 NULL 的行为取决于 DBMS,因此请始终检查您的系统文档。

TRIM()REPLACE()

用于清理文本值。

SELECT
   address,
   TRIM(address) AS address_trimmed,
   REPLACE(address, 'Street', 'St.') AS address_short
FROM address
LIMIT 5;

结果:去除多余的空格并替换重复的文本模式。

子字符串搜索:POSITION() / INSTR() / CHARINDEX()

函数名称取决于 DBMS,但思路是相同的:查找字符串内部的子字符串位置。

SELECT
   email,
   INSTR(email, '@') AS at_pos
FROM customer
LIMIT 5;

结果:返回 @ 的位置,这对于电子邮件验证很有用。


注意事项

  • 检查 DBMS 差异:函数名称和行为可能会有所不同。
  • 小心处理 NULL:它通常会改变字符串表达式的结果。
  • 对于西里尔字母和表情符号文本,选择长度函数时要有意识(字符与字节)。
  • 避免在一个查询中深度嵌套过多函数;尽可能将逻辑分解为多个步骤。

实际示例:为电子邮件活动准备客户数据

以下查询准备一个干净的客户列表:规范化姓名、规范化电子邮件并提取域名。

SELECT
   c.customer_id,
   TRIM(CONCAT_WS(' ', c.first_name, c.last_name)) AS full_name,
   LOWER(TRIM(c.email)) AS email_normalized,
   SUBSTRING_INDEX(LOWER(TRIM(c.email)), '@', -1) AS email_domain
FROM customer AS c
WHERE c.email IS NOT NULL
ORDER BY c.customer_id
LIMIT 20;

结果:您将获得一组干净、一致的文本字段,准备进行分析或导出。


本课的关键要点:

  • SQL 字符串函数帮助直接在查询中清理、规范化和格式化文本。
  • UPPERLOWERTRIMREPLACESUBSTRINGLEFTRIGHTCONCAT 涵盖了大多数常见任务。
  • 对于字符串长度,区分字符和字节非常重要。
  • 在组合字符串时,请考虑 DBMS 中的 NULL 行为。
  • 字符串函数的实际价值在于真实的数据准备工作流中最为明显。

面试问题

CHAR_LENGTH()LENGTH() 之间有什么区别,为什么这很重要?

CHAR_LENGTH() 通常返回 字符 的数量,而 LENGTH() 在 MySQL 中返回 字节 的数量。对于西里尔字母和其他多字节字符,结果可能会有所不同。这在验证字段长度和强制业务规则时很重要。

如果一个字段可能为 NULL,您将如何安全地构建全名?

CONCAT_WS() 通常更受欢迎,因为它在用分隔符组合字符串时更实用。通常还会显式处理空值,使用 COALESCE() 以在不同场景中获得可预测的输出。

在分析之前,您会使用哪些字符串函数来清理电子邮件值?

一种常见的方法是 TRIM() + LOWER() 来去除多余的空格并规范化大小写。要验证结构,您还可以使用 INSTR() 或其在您的 DBMS 中的等效函数检查 @

在下一课中,我们将转向 SQL 数学函数,学习如何在查询中执行数值计算。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 识别回文名字
  2. 从电子邮件中提取地址和域名
  3. 匹配客户的首字母
  4. 员工电话簿
  5. 格式化客户姓名